From 036c628ba5e27a0624ea21d46d4075a6ce23ecb2 Mon Sep 17 00:00:00 2001
From: Joke Puts <joke.puts@phpro.be>
Date: Tue, 26 Sep 2017 12:28:58 +0200
Subject: [PATCH 001/380] Keep maintenance mode on if it was previously enabled

---
 app/code/Magento/Deploy/Model/Mode.php        | 17 +++++++
 .../Console/Command/ThemeUninstallCommand.php | 47 +++++++++++++++++--
 .../Setup/Console/Command/BackupCommand.php   | 47 +++++++++++++++++--
 .../Command/ModuleUninstallCommand.php        | 47 +++++++++++++++++--
 .../Setup/Console/Command/RollbackCommand.php | 47 +++++++++++++++++--
 5 files changed, 189 insertions(+), 16 deletions(-)

diff --git a/app/code/Magento/Deploy/Model/Mode.php b/app/code/Magento/Deploy/Model/Mode.php
index ba3e8652fd4..e1efc9ff711 100644
--- a/app/code/Magento/Deploy/Model/Mode.php
+++ b/app/code/Magento/Deploy/Model/Mode.php
@@ -78,6 +78,11 @@ class Mode
      */
     private $emulatedAreaProcessor;
 
+    /**
+     * @var bool
+     */
+    private $skipDisableMaintenanceMode;
+
     /**
      * @param InputInterface $input
      * @param OutputInterface $output
@@ -227,7 +232,14 @@ class Mode
      */
     protected function enableMaintenanceMode(OutputInterface $output)
     {
+        if ($this->maintenanceMode->isOn()) {
+            $this->skipDisableMaintenanceMode = true;
+            $output->writeln('Maintenance mode already enabled');
+            return;
+        }
+
         $this->maintenanceMode->set(true);
+        $this->skipDisableMaintenanceMode = false;
         $output->writeln('Enabled maintenance mode');
     }
 
@@ -239,6 +251,11 @@ class Mode
      */
     protected function disableMaintenanceMode(OutputInterface $output)
     {
+        if ($this->skipDisableMaintenanceMode) {
+            $output->writeln('Skipped disabling maintenance mode');
+            return;
+        }
+
         $this->maintenanceMode->set(false);
         $output->writeln('Disabled maintenance mode');
     }
diff --git a/app/code/Magento/Theme/Console/Command/ThemeUninstallCommand.php b/app/code/Magento/Theme/Console/Command/ThemeUninstallCommand.php
index 4c8d6bca52e..9d747799ddb 100644
--- a/app/code/Magento/Theme/Console/Command/ThemeUninstallCommand.php
+++ b/app/code/Magento/Theme/Console/Command/ThemeUninstallCommand.php
@@ -116,6 +116,11 @@ class ThemeUninstallCommand extends Command
      */
     private $themeDependencyChecker;
 
+    /**
+     * @var bool
+     */
+    private $skipDisableMaintenanceMode;
+
     /**
      * Constructor
      *
@@ -215,8 +220,7 @@ class ThemeUninstallCommand extends Command
         }
 
         try {
-            $output->writeln('<info>Enabling maintenance mode</info>');
-            $this->maintenanceMode->set(true);
+            $this->enableMaintenanceMode($output);
             if ($input->getOption(self::INPUT_KEY_BACKUP_CODE)) {
                 $time = time();
                 $codeBackup = $this->backupRollbackFactory->create($output);
@@ -227,8 +231,7 @@ class ThemeUninstallCommand extends Command
             $this->themeUninstaller->uninstallCode($output, $themePaths);
 
             $this->cleanup($input, $output);
-            $output->writeln('<info>Disabling maintenance mode</info>');
-            $this->maintenanceMode->set(false);
+            $this->disableMaintenanceMode($output);
         } catch (\Exception $e) {
             $output->writeln('<error>' . $e->getMessage() . '</error>');
             $output->writeln('<error>Please disable maintenance mode after you resolved above issues</error>');
@@ -375,4 +378,40 @@ class ThemeUninstallCommand extends Command
             );
         }
     }
+
+    /**
+     * Enable maintenance mode
+     *
+     * @param OutputInterface $output
+     * @return void
+     */
+    private function enableMaintenanceMode(OutputInterface $output)
+    {
+        if ($this->maintenanceMode->isOn()) {
+            $this->skipDisableMaintenanceMode = true;
+            $output->writeln('<info>Maintenance mode already enabled</info>');
+            return;
+        }
+
+        $this->maintenanceMode->set(true);
+        $this->skipDisableMaintenanceMode = false;
+        $output->writeln('<info>Enabling maintenance mode</info>');
+    }
+
+    /**
+     * Disable maintenance mode
+     *
+     * @param OutputInterface $output
+     * @return void
+     */
+    private function disableMaintenanceMode(OutputInterface $output)
+    {
+        if ($this->skipDisableMaintenanceMode) {
+            $output->writeln('<info>Skipped disabling maintenance mode</info>');
+            return;
+        }
+
+        $this->maintenanceMode->set(false);
+        $output->writeln('<info>Disabling maintenance mode</info>');
+    }
 }
diff --git a/setup/src/Magento/Setup/Console/Command/BackupCommand.php b/setup/src/Magento/Setup/Console/Command/BackupCommand.php
index fafa47296d3..d85d7d1f8fd 100644
--- a/setup/src/Magento/Setup/Console/Command/BackupCommand.php
+++ b/setup/src/Magento/Setup/Console/Command/BackupCommand.php
@@ -57,6 +57,11 @@ class BackupCommand extends AbstractSetupCommand
      */
     private $deploymentConfig;
 
+    /**
+     * @var bool
+     */
+    private $skipDisableMaintenanceMode;
+
     /**
      * Constructor
      *
@@ -121,8 +126,7 @@ class BackupCommand extends AbstractSetupCommand
         $returnValue = \Magento\Framework\Console\Cli::RETURN_SUCCESS;
         try {
             $inputOptionProvided = false;
-            $output->writeln('<info>Enabling maintenance mode</info>');
-            $this->maintenanceMode->set(true);
+            $this->enableMaintenanceMode($output);
             $time = time();
             $backupHandler = $this->backupRollbackFactory->create($output);
             if ($input->getOption(self::INPUT_KEY_CODE)) {
@@ -147,8 +151,7 @@ class BackupCommand extends AbstractSetupCommand
             $output->writeln('<error>' . $e->getMessage() . '</error>');
             $returnValue =  \Magento\Framework\Console\Cli::RETURN_FAILURE;
         } finally {
-            $output->writeln('<info>Disabling maintenance mode</info>');
-            $this->maintenanceMode->set(false);
+            $this->disableMaintenanceMode($output);
         }
         return $returnValue;
     }
@@ -168,4 +171,40 @@ class BackupCommand extends AbstractSetupCommand
         $configLoader = $this->objectManager->get(\Magento\Framework\ObjectManager\ConfigLoaderInterface::class);
         $this->objectManager->configure($configLoader->load($areaCode));
     }
+
+    /**
+     * Enable maintenance mode
+     *
+     * @param OutputInterface $output
+     * @return void
+     */
+    private function enableMaintenanceMode(OutputInterface $output)
+    {
+        if ($this->maintenanceMode->isOn()) {
+            $this->skipDisableMaintenanceMode = true;
+            $output->writeln('<info>Maintenance mode already enabled</info>');
+            return;
+        }
+
+        $this->maintenanceMode->set(true);
+        $this->skipDisableMaintenanceMode = false;
+        $output->writeln('<info>Enabling maintenance mode</info>');
+    }
+
+    /**
+     * Disable maintenance mode
+     *
+     * @param OutputInterface $output
+     * @return void
+     */
+    private function disableMaintenanceMode(OutputInterface $output)
+    {
+        if ($this->skipDisableMaintenanceMode) {
+            $output->writeln('<info>Skipped disabling maintenance mode</info>');
+            return;
+        }
+
+        $this->maintenanceMode->set(false);
+        $output->writeln('<info>Disabling maintenance mode</info>');
+    }
 }
diff --git a/setup/src/Magento/Setup/Console/Command/ModuleUninstallCommand.php b/setup/src/Magento/Setup/Console/Command/ModuleUninstallCommand.php
index 4e25cf60a56..dd121721f48 100644
--- a/setup/src/Magento/Setup/Console/Command/ModuleUninstallCommand.php
+++ b/setup/src/Magento/Setup/Console/Command/ModuleUninstallCommand.php
@@ -108,6 +108,11 @@ class ModuleUninstallCommand extends AbstractModuleCommand
      */
     private $moduleRegistryUninstaller;
 
+    /**
+     * @var bool
+     */
+    private $skipDisableMaintenanceMode;
+
     /**
      * Constructor
      *
@@ -228,8 +233,7 @@ class ModuleUninstallCommand extends AbstractModuleCommand
             return \Magento\Framework\Console\Cli::RETURN_FAILURE;
         }
         try {
-            $output->writeln('<info>Enabling maintenance mode</info>');
-            $this->maintenanceMode->set(true);
+            $this->enableMaintenanceMode($output);
             $this->takeBackup($input, $output);
             $dbBackupOption = $input->getOption(self::INPUT_KEY_BACKUP_DB);
             if ($input->getOption(self::INPUT_KEY_REMOVE_DATA)) {
@@ -255,8 +259,7 @@ class ModuleUninstallCommand extends AbstractModuleCommand
             $this->moduleRegistryUninstaller->removeModulesFromDeploymentConfig($output, $modules);
             $this->moduleUninstaller->uninstallCode($output, $modules);
             $this->cleanup($input, $output);
-            $output->writeln('<info>Disabling maintenance mode</info>');
-            $this->maintenanceMode->set(false);
+            $this->disableMaintenanceMode($output);
         } catch (\Exception $e) {
             $output->writeln('<error>' . $e->getMessage() . '</error>');
             $output->writeln('<error>Please disable maintenance mode after you resolved above issues</error>');
@@ -378,4 +381,40 @@ class ModuleUninstallCommand extends AbstractModuleCommand
         $configLoader = $this->objectManager->get(\Magento\Framework\ObjectManager\ConfigLoaderInterface::class);
         $this->objectManager->configure($configLoader->load($areaCode));
     }
+
+    /**
+     * Enable maintenance mode
+     *
+     * @param OutputInterface $output
+     * @return void
+     */
+    private function enableMaintenanceMode(OutputInterface $output)
+    {
+        if ($this->maintenanceMode->isOn()) {
+            $this->skipDisableMaintenanceMode = true;
+            $output->writeln('<info>Maintenance mode already enabled</info>');
+            return;
+        }
+
+        $this->maintenanceMode->set(true);
+        $this->skipDisableMaintenanceMode = false;
+        $output->writeln('<info>Enabling maintenance mode</info>');
+    }
+
+    /**
+     * Disable maintenance mode
+     *
+     * @param OutputInterface $output
+     * @return void
+     */
+    private function disableMaintenanceMode(OutputInterface $output)
+    {
+        if ($this->skipDisableMaintenanceMode) {
+            $output->writeln('<info>Skipped disabling maintenance mode</info>');
+            return;
+        }
+
+        $this->maintenanceMode->set(false);
+        $output->writeln('<info>Disabling maintenance mode</info>');
+    }
 }
diff --git a/setup/src/Magento/Setup/Console/Command/RollbackCommand.php b/setup/src/Magento/Setup/Console/Command/RollbackCommand.php
index 2d728e22fa1..50cd8d69bc0 100644
--- a/setup/src/Magento/Setup/Console/Command/RollbackCommand.php
+++ b/setup/src/Magento/Setup/Console/Command/RollbackCommand.php
@@ -54,6 +54,11 @@ class RollbackCommand extends AbstractSetupCommand
      */
     private $deploymentConfig;
 
+    /**
+     * @var bool
+     */
+    private $skipDisableMaintenanceMode;
+
     /**
      * Constructor
      *
@@ -117,8 +122,7 @@ class RollbackCommand extends AbstractSetupCommand
         }
         $returnValue = \Magento\Framework\Console\Cli::RETURN_SUCCESS;
         try {
-            $output->writeln('<info>Enabling maintenance mode</info>');
-            $this->maintenanceMode->set(true);
+            $this->enableMaintenanceMode($output);
             $helper = $this->getHelper('question');
             $question = new ConfirmationQuestion(
                 '<info>You are about to remove current code and/or database tables. Are you sure?[y/N]<info>',
@@ -134,8 +138,7 @@ class RollbackCommand extends AbstractSetupCommand
             // we must have an exit code higher than zero to indicate something was wrong
             $returnValue = \Magento\Framework\Console\Cli::RETURN_FAILURE;
         } finally {
-            $output->writeln('<info>Disabling maintenance mode</info>');
-            $this->maintenanceMode->set(false);
+            $this->disableMaintenanceMode($output);
         }
         return $returnValue;
     }
@@ -187,4 +190,40 @@ class RollbackCommand extends AbstractSetupCommand
         $configLoader = $this->objectManager->get(\Magento\Framework\ObjectManager\ConfigLoaderInterface::class);
         $this->objectManager->configure($configLoader->load($areaCode));
     }
+
+    /**
+     * Enable maintenance mode
+     *
+     * @param OutputInterface $output
+     * @return void
+     */
+    private function enableMaintenanceMode(OutputInterface $output)
+    {
+        if ($this->maintenanceMode->isOn()) {
+            $this->skipDisableMaintenanceMode = true;
+            $output->writeln('<info>Maintenance mode already enabled</info>');
+            return;
+        }
+
+        $this->maintenanceMode->set(true);
+        $this->skipDisableMaintenanceMode = false;
+        $output->writeln('<info>Enabling maintenance mode</info>');
+    }
+
+    /**
+     * Disable maintenance mode
+     *
+     * @param OutputInterface $output
+     * @return void
+     */
+    private function disableMaintenanceMode(OutputInterface $output)
+    {
+        if ($this->skipDisableMaintenanceMode) {
+            $output->writeln('<info>Skipped disabling maintenance mode</info>');
+            return;
+        }
+
+        $this->maintenanceMode->set(false);
+        $output->writeln('<info>Disabling maintenance mode</info>');
+    }
 }
-- 
GitLab


From 729501733e450c1f040298c480389f7c53b9746c Mon Sep 17 00:00:00 2001
From: Joke Puts <joke.puts@phpro.be>
Date: Tue, 26 Sep 2017 16:47:51 +0200
Subject: [PATCH 002/380] Moved all maintenance logic to MaintenanceModeEnabler

---
 app/code/Magento/Deploy/Model/Mode.php        | 53 ++------------
 .../Deploy/Test/Unit/Model/ModeTest.php       |  6 +-
 .../Console/Command/ThemeUninstallCommand.php | 55 ++-------------
 .../Command/ThemeUninstallCommandTest.php     |  4 +-
 .../App/Console/MaintenanceModeEnabler.php    | 70 +++++++++++++++++++
 .../Setup/Console/Command/BackupCommand.php   | 55 ++-------------
 .../Command/ModuleUninstallCommand.php        | 55 ++-------------
 .../Setup/Console/Command/RollbackCommand.php | 53 ++------------
 .../Console/Command/BackupCommandTest.php     |  2 +-
 .../Command/ModuleUninstallCommandTest.php    |  4 +-
 .../Console/Command/RollbackCommandTest.php   |  2 +-
 11 files changed, 109 insertions(+), 250 deletions(-)
 create mode 100644 lib/internal/Magento/Framework/App/Console/MaintenanceModeEnabler.php

diff --git a/app/code/Magento/Deploy/Model/Mode.php b/app/code/Magento/Deploy/Model/Mode.php
index e1efc9ff711..58ffad17fd2 100644
--- a/app/code/Magento/Deploy/Model/Mode.php
+++ b/app/code/Magento/Deploy/Model/Mode.php
@@ -8,10 +8,10 @@ namespace Magento\Deploy\Model;
 
 use Magento\Deploy\App\Mode\ConfigProvider;
 use Magento\Framework\App\Config\ScopeConfigInterface;
+use Magento\Framework\App\Console\MaintenanceModeEnabler;
 use Magento\Framework\App\DeploymentConfig\Reader;
 use Magento\Framework\App\DeploymentConfig\Writer;
 use Magento\Framework\App\Filesystem\DirectoryList;
-use Magento\Framework\App\MaintenanceMode;
 use Magento\Framework\App\State;
 use Magento\Framework\Config\File\ConfigFilePool;
 use Symfony\Component\Console\Input\InputInterface;
@@ -50,7 +50,7 @@ class Mode
     private $reader;
 
     /**
-     * @var MaintenanceMode
+     * @var MaintenanceModeEnabler
      */
     private $maintenanceMode;
 
@@ -78,17 +78,12 @@ class Mode
      */
     private $emulatedAreaProcessor;
 
-    /**
-     * @var bool
-     */
-    private $skipDisableMaintenanceMode;
-
     /**
      * @param InputInterface $input
      * @param OutputInterface $output
      * @param Writer $writer
      * @param Reader $reader
-     * @param MaintenanceMode $maintenanceMode
+     * @param MaintenanceModeEnabler $maintenanceMode
      * @param Filesystem $filesystem
      * @param ConfigProvider $configProvider
      * @param ProcessorFacadeFactory $processorFacadeFactory
@@ -99,7 +94,7 @@ class Mode
         OutputInterface $output,
         Writer $writer,
         Reader $reader,
-        MaintenanceMode $maintenanceMode,
+        MaintenanceModeEnabler $maintenanceMode,
         Filesystem $filesystem,
         ConfigProvider $configProvider = null,
         ProcessorFacadeFactory $processorFacadeFactory = null,
@@ -128,7 +123,7 @@ class Mode
      */
     public function enableProductionMode()
     {
-        $this->enableMaintenanceMode($this->output);
+        $this->maintenanceMode->enableMaintenanceMode($this->output);
         $previousMode = $this->getMode();
         try {
             // We have to turn on production mode before generation.
@@ -140,7 +135,7 @@ class Mode
             $this->setStoreMode($previousMode);
             throw $e;
         }
-        $this->disableMaintenanceMode($this->output);
+        $this->maintenanceMode->disableMaintenanceMode($this->output);
     }
 
     /**
@@ -223,40 +218,4 @@ class Mode
             $this->output->writeln('Config "' . $path . ' = ' . $value . '" has been saved.');
         }
     }
-
-    /**
-     * Enable maintenance mode
-     *
-     * @param OutputInterface $output
-     * @return void
-     */
-    protected function enableMaintenanceMode(OutputInterface $output)
-    {
-        if ($this->maintenanceMode->isOn()) {
-            $this->skipDisableMaintenanceMode = true;
-            $output->writeln('Maintenance mode already enabled');
-            return;
-        }
-
-        $this->maintenanceMode->set(true);
-        $this->skipDisableMaintenanceMode = false;
-        $output->writeln('Enabled maintenance mode');
-    }
-
-    /**
-     * Disable maintenance mode
-     *
-     * @param OutputInterface $output
-     * @return void
-     */
-    protected function disableMaintenanceMode(OutputInterface $output)
-    {
-        if ($this->skipDisableMaintenanceMode) {
-            $output->writeln('Skipped disabling maintenance mode');
-            return;
-        }
-
-        $this->maintenanceMode->set(false);
-        $output->writeln('Disabled maintenance mode');
-    }
 }
diff --git a/app/code/Magento/Deploy/Test/Unit/Model/ModeTest.php b/app/code/Magento/Deploy/Test/Unit/Model/ModeTest.php
index f80c6cb69f1..3a171228a88 100644
--- a/app/code/Magento/Deploy/Test/Unit/Model/ModeTest.php
+++ b/app/code/Magento/Deploy/Test/Unit/Model/ModeTest.php
@@ -12,9 +12,9 @@ use Magento\Deploy\App\Mode\ConfigProvider;
 use Magento\Deploy\Model\Filesystem;
 use Magento\Deploy\Model\Mode;
 use Magento\Framework\App\Config\ScopeConfigInterface;
+use Magento\Framework\App\Console\MaintenanceModeEnabler;
 use Magento\Framework\App\DeploymentConfig\Reader;
 use Magento\Framework\App\DeploymentConfig\Writer;
-use Magento\Framework\App\MaintenanceMode;
 use Magento\Framework\App\State;
 use PHPUnit_Framework_MockObject_MockObject as Mock;
 use Symfony\Component\Console\Input\InputInterface;
@@ -54,7 +54,7 @@ class ModeTest extends \PHPUnit\Framework\TestCase
     private $writerMock;
 
     /**
-     * @var MaintenanceMode|Mock
+     * @var MaintenanceModeEnabler|Mock
      */
     private $maintenanceMock;
 
@@ -95,7 +95,7 @@ class ModeTest extends \PHPUnit\Framework\TestCase
         $this->readerMock = $this->getMockBuilder(Reader::class)
             ->disableOriginalConstructor()
             ->getMock();
-        $this->maintenanceMock = $this->getMockBuilder(MaintenanceMode::class)
+        $this->maintenanceMock = $this->getMockBuilder(MaintenanceModeEnabler::class)
             ->disableOriginalConstructor()
             ->getMock();
         $this->filesystemMock = $this->getMockBuilder(Filesystem::class)
diff --git a/app/code/Magento/Theme/Console/Command/ThemeUninstallCommand.php b/app/code/Magento/Theme/Console/Command/ThemeUninstallCommand.php
index 9d747799ddb..def73c33e8a 100644
--- a/app/code/Magento/Theme/Console/Command/ThemeUninstallCommand.php
+++ b/app/code/Magento/Theme/Console/Command/ThemeUninstallCommand.php
@@ -8,7 +8,7 @@ namespace Magento\Theme\Console\Command;
 
 use Magento\Framework\App\Area;
 use Magento\Framework\App\Cache;
-use Magento\Framework\App\MaintenanceMode;
+use Magento\Framework\App\Console\MaintenanceModeEnabler;
 use Magento\Framework\App\State\CleanupFiles;
 use Magento\Framework\Composer\ComposerInformation;
 use Magento\Framework\Composer\DependencyChecker;
@@ -40,9 +40,7 @@ class ThemeUninstallCommand extends Command
     const INPUT_KEY_CLEAR_STATIC_CONTENT = 'clear-static-content';
 
     /**
-     * Maintenance Mode
-     *
-     * @var MaintenanceMode
+     * @var MaintenanceModeEnabler
      */
     private $maintenanceMode;
 
@@ -116,18 +114,13 @@ class ThemeUninstallCommand extends Command
      */
     private $themeDependencyChecker;
 
-    /**
-     * @var bool
-     */
-    private $skipDisableMaintenanceMode;
-
     /**
      * Constructor
      *
      * @param Cache $cache
      * @param CleanupFiles $cleanupFiles
      * @param ComposerInformation $composer
-     * @param MaintenanceMode $maintenanceMode
+     * @param MaintenanceModeEnabler $maintenanceMode
      * @param DependencyChecker $dependencyChecker
      * @param Collection $themeCollection
      * @param BackupRollbackFactory $backupRollbackFactory
@@ -140,7 +133,7 @@ class ThemeUninstallCommand extends Command
         Cache $cache,
         CleanupFiles $cleanupFiles,
         ComposerInformation $composer,
-        MaintenanceMode $maintenanceMode,
+        MaintenanceModeEnabler $maintenanceMode,
         DependencyChecker $dependencyChecker,
         Collection $themeCollection,
         BackupRollbackFactory $backupRollbackFactory,
@@ -220,7 +213,7 @@ class ThemeUninstallCommand extends Command
         }
 
         try {
-            $this->enableMaintenanceMode($output);
+            $this->maintenanceMode->enableMaintenanceMode($output);
             if ($input->getOption(self::INPUT_KEY_BACKUP_CODE)) {
                 $time = time();
                 $codeBackup = $this->backupRollbackFactory->create($output);
@@ -231,7 +224,7 @@ class ThemeUninstallCommand extends Command
             $this->themeUninstaller->uninstallCode($output, $themePaths);
 
             $this->cleanup($input, $output);
-            $this->disableMaintenanceMode($output);
+            $this->maintenanceMode->disableMaintenanceMode($output);
         } catch (\Exception $e) {
             $output->writeln('<error>' . $e->getMessage() . '</error>');
             $output->writeln('<error>Please disable maintenance mode after you resolved above issues</error>');
@@ -378,40 +371,4 @@ class ThemeUninstallCommand extends Command
             );
         }
     }
-
-    /**
-     * Enable maintenance mode
-     *
-     * @param OutputInterface $output
-     * @return void
-     */
-    private function enableMaintenanceMode(OutputInterface $output)
-    {
-        if ($this->maintenanceMode->isOn()) {
-            $this->skipDisableMaintenanceMode = true;
-            $output->writeln('<info>Maintenance mode already enabled</info>');
-            return;
-        }
-
-        $this->maintenanceMode->set(true);
-        $this->skipDisableMaintenanceMode = false;
-        $output->writeln('<info>Enabling maintenance mode</info>');
-    }
-
-    /**
-     * Disable maintenance mode
-     *
-     * @param OutputInterface $output
-     * @return void
-     */
-    private function disableMaintenanceMode(OutputInterface $output)
-    {
-        if ($this->skipDisableMaintenanceMode) {
-            $output->writeln('<info>Skipped disabling maintenance mode</info>');
-            return;
-        }
-
-        $this->maintenanceMode->set(false);
-        $output->writeln('<info>Disabling maintenance mode</info>');
-    }
 }
diff --git a/app/code/Magento/Theme/Test/Unit/Console/Command/ThemeUninstallCommandTest.php b/app/code/Magento/Theme/Test/Unit/Console/Command/ThemeUninstallCommandTest.php
index abd4c91a7e1..1aa17f990be 100644
--- a/app/code/Magento/Theme/Test/Unit/Console/Command/ThemeUninstallCommandTest.php
+++ b/app/code/Magento/Theme/Test/Unit/Console/Command/ThemeUninstallCommandTest.php
@@ -19,7 +19,7 @@ use Magento\Framework\Setup\BackupRollbackFactory;
 class ThemeUninstallCommandTest extends \PHPUnit\Framework\TestCase
 {
     /**
-     * @var \Magento\Framework\App\MaintenanceMode|\PHPUnit_Framework_MockObject_MockObject
+     * @var \Magento\Framework\App\Console\MaintenanceModeEnabler|\PHPUnit_Framework_MockObject_MockObject
      */
     private $maintenanceMode;
 
@@ -82,7 +82,7 @@ class ThemeUninstallCommandTest extends \PHPUnit\Framework\TestCase
 
     protected function setUp()
     {
-        $this->maintenanceMode = $this->createMock(\Magento\Framework\App\MaintenanceMode::class);
+        $this->maintenanceMode = $this->createMock(\Magento\Framework\App\Console\MaintenanceModeEnabler::class);
         $composerInformation = $this->createMock(\Magento\Framework\Composer\ComposerInformation::class);
         $composerInformation->expects($this->any())
             ->method('getRootRequiredPackages')
diff --git a/lib/internal/Magento/Framework/App/Console/MaintenanceModeEnabler.php b/lib/internal/Magento/Framework/App/Console/MaintenanceModeEnabler.php
new file mode 100644
index 00000000000..f2d106c5d36
--- /dev/null
+++ b/lib/internal/Magento/Framework/App/Console/MaintenanceModeEnabler.php
@@ -0,0 +1,70 @@
+<?php
+/**
+ * Class MaintenanceMode * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Framework\App\Console;
+
+use Magento\Framework\App\MaintenanceMode;
+use Symfony\Component\Console\Output\OutputInterface;
+
+/**
+ * Class MaintenanceModeEnabler
+ * @package Magento\Framework\App\Console
+ */
+class MaintenanceModeEnabler
+{
+    /**
+     * @var MaintenanceMode
+     */
+    private $maintenanceMode;
+
+    /**
+     * @var bool
+     */
+    private $skipDisableMaintenanceMode;
+
+    /**
+     * @param MaintenanceMode $maintenanceMode
+     */
+    public function __construct(MaintenanceMode $maintenanceMode)
+    {
+        $this->maintenanceMode = $maintenanceMode;
+    }
+
+    /**
+     * Enable maintenance mode
+     *
+     * @param OutputInterface $output
+     * @return void
+     */
+    public function enableMaintenanceMode(OutputInterface $output)
+    {
+        if ($this->maintenanceMode->isOn()) {
+            $this->skipDisableMaintenanceMode = true;
+            $output->writeln('<info>Maintenance mode already enabled</info>');
+            return;
+        }
+
+        $this->maintenanceMode->set(true);
+        $this->skipDisableMaintenanceMode = false;
+        $output->writeln('<info>Enabling maintenance mode</info>');
+    }
+
+    /**
+     * Disable maintenance mode
+     *
+     * @param OutputInterface $output
+     * @return void
+     */
+    public function disableMaintenanceMode(OutputInterface $output)
+    {
+        if ($this->skipDisableMaintenanceMode) {
+            $output->writeln('<info>Skipped disabling maintenance mode</info>');
+            return;
+        }
+
+        $this->maintenanceMode->set(false);
+        $output->writeln('<info>Disabling maintenance mode</info>');
+    }
+}
diff --git a/setup/src/Magento/Setup/Console/Command/BackupCommand.php b/setup/src/Magento/Setup/Console/Command/BackupCommand.php
index d85d7d1f8fd..4cf23e4fbe3 100644
--- a/setup/src/Magento/Setup/Console/Command/BackupCommand.php
+++ b/setup/src/Magento/Setup/Console/Command/BackupCommand.php
@@ -5,8 +5,8 @@
  */
 namespace Magento\Setup\Console\Command;
 
+use Magento\Framework\App\Console\MaintenanceModeEnabler;
 use Magento\Framework\App\DeploymentConfig;
-use Magento\Framework\App\MaintenanceMode;
 use Magento\Framework\Backup\Factory;
 use Magento\Framework\ObjectManagerInterface;
 use Magento\Framework\Setup\BackupRollbackFactory;
@@ -37,9 +37,7 @@ class BackupCommand extends AbstractSetupCommand
     private $objectManager;
 
     /**
-     * Handler for maintenance mode
-     *
-     * @var MaintenanceMode
+     * @var MaintenanceModeEnabler
      */
     private $maintenanceMode;
 
@@ -57,21 +55,16 @@ class BackupCommand extends AbstractSetupCommand
      */
     private $deploymentConfig;
 
-    /**
-     * @var bool
-     */
-    private $skipDisableMaintenanceMode;
-
     /**
      * Constructor
      *
      * @param ObjectManagerProvider $objectManagerProvider
-     * @param MaintenanceMode $maintenanceMode
+     * @param MaintenanceModeEnabler $maintenanceMode
      * @param DeploymentConfig $deploymentConfig
      */
     public function __construct(
         ObjectManagerProvider $objectManagerProvider,
-        MaintenanceMode $maintenanceMode,
+        MaintenanceModeEnabler $maintenanceMode,
         DeploymentConfig $deploymentConfig
     ) {
         $this->objectManager = $objectManagerProvider->get();
@@ -126,7 +119,7 @@ class BackupCommand extends AbstractSetupCommand
         $returnValue = \Magento\Framework\Console\Cli::RETURN_SUCCESS;
         try {
             $inputOptionProvided = false;
-            $this->enableMaintenanceMode($output);
+            $this->maintenanceMode->enableMaintenanceMode($output);
             $time = time();
             $backupHandler = $this->backupRollbackFactory->create($output);
             if ($input->getOption(self::INPUT_KEY_CODE)) {
@@ -151,7 +144,7 @@ class BackupCommand extends AbstractSetupCommand
             $output->writeln('<error>' . $e->getMessage() . '</error>');
             $returnValue =  \Magento\Framework\Console\Cli::RETURN_FAILURE;
         } finally {
-            $this->disableMaintenanceMode($output);
+            $this->maintenanceMode->disableMaintenanceMode($output);
         }
         return $returnValue;
     }
@@ -171,40 +164,4 @@ class BackupCommand extends AbstractSetupCommand
         $configLoader = $this->objectManager->get(\Magento\Framework\ObjectManager\ConfigLoaderInterface::class);
         $this->objectManager->configure($configLoader->load($areaCode));
     }
-
-    /**
-     * Enable maintenance mode
-     *
-     * @param OutputInterface $output
-     * @return void
-     */
-    private function enableMaintenanceMode(OutputInterface $output)
-    {
-        if ($this->maintenanceMode->isOn()) {
-            $this->skipDisableMaintenanceMode = true;
-            $output->writeln('<info>Maintenance mode already enabled</info>');
-            return;
-        }
-
-        $this->maintenanceMode->set(true);
-        $this->skipDisableMaintenanceMode = false;
-        $output->writeln('<info>Enabling maintenance mode</info>');
-    }
-
-    /**
-     * Disable maintenance mode
-     *
-     * @param OutputInterface $output
-     * @return void
-     */
-    private function disableMaintenanceMode(OutputInterface $output)
-    {
-        if ($this->skipDisableMaintenanceMode) {
-            $output->writeln('<info>Skipped disabling maintenance mode</info>');
-            return;
-        }
-
-        $this->maintenanceMode->set(false);
-        $output->writeln('<info>Disabling maintenance mode</info>');
-    }
 }
diff --git a/setup/src/Magento/Setup/Console/Command/ModuleUninstallCommand.php b/setup/src/Magento/Setup/Console/Command/ModuleUninstallCommand.php
index dd121721f48..15dee6e2ee3 100644
--- a/setup/src/Magento/Setup/Console/Command/ModuleUninstallCommand.php
+++ b/setup/src/Magento/Setup/Console/Command/ModuleUninstallCommand.php
@@ -5,8 +5,8 @@
  */
 namespace Magento\Setup\Console\Command;
 
+use Magento\Framework\App\Console\MaintenanceModeEnabler;
 use Magento\Framework\App\DeploymentConfig;
-use Magento\Framework\App\MaintenanceMode;
 use Magento\Framework\Backup\Factory;
 use Magento\Framework\Composer\ComposerInformation;
 use Magento\Framework\Module\DependencyChecker;
@@ -39,9 +39,7 @@ class ModuleUninstallCommand extends AbstractModuleCommand
     const INPUT_KEY_BACKUP_DB = 'backup-db';
 
     /**
-     * Maintenance mode
-     *
-     * @var MaintenanceMode
+     * @var MaintenanceModeEnabler
      */
     private $maintenanceMode;
 
@@ -108,18 +106,13 @@ class ModuleUninstallCommand extends AbstractModuleCommand
      */
     private $moduleRegistryUninstaller;
 
-    /**
-     * @var bool
-     */
-    private $skipDisableMaintenanceMode;
-
     /**
      * Constructor
      *
      * @param ComposerInformation $composer
      * @param DeploymentConfig $deploymentConfig
      * @param FullModuleList $fullModuleList
-     * @param MaintenanceMode $maintenanceMode
+     * @param MaintenanceModeEnabler $maintenanceMode
      * @param ObjectManagerProvider $objectManagerProvider
      * @param UninstallCollector $collector
      * @param ModuleUninstaller $moduleUninstaller
@@ -129,7 +122,7 @@ class ModuleUninstallCommand extends AbstractModuleCommand
         ComposerInformation $composer,
         DeploymentConfig $deploymentConfig,
         FullModuleList $fullModuleList,
-        MaintenanceMode $maintenanceMode,
+        MaintenanceModeEnabler $maintenanceMode,
         ObjectManagerProvider $objectManagerProvider,
         UninstallCollector $collector,
         ModuleUninstaller $moduleUninstaller,
@@ -233,7 +226,7 @@ class ModuleUninstallCommand extends AbstractModuleCommand
             return \Magento\Framework\Console\Cli::RETURN_FAILURE;
         }
         try {
-            $this->enableMaintenanceMode($output);
+            $this->maintenanceMode->enableMaintenanceMode($output);
             $this->takeBackup($input, $output);
             $dbBackupOption = $input->getOption(self::INPUT_KEY_BACKUP_DB);
             if ($input->getOption(self::INPUT_KEY_REMOVE_DATA)) {
@@ -259,7 +252,7 @@ class ModuleUninstallCommand extends AbstractModuleCommand
             $this->moduleRegistryUninstaller->removeModulesFromDeploymentConfig($output, $modules);
             $this->moduleUninstaller->uninstallCode($output, $modules);
             $this->cleanup($input, $output);
-            $this->disableMaintenanceMode($output);
+            $this->maintenanceMode->disableMaintenanceMode($output);
         } catch (\Exception $e) {
             $output->writeln('<error>' . $e->getMessage() . '</error>');
             $output->writeln('<error>Please disable maintenance mode after you resolved above issues</error>');
@@ -381,40 +374,4 @@ class ModuleUninstallCommand extends AbstractModuleCommand
         $configLoader = $this->objectManager->get(\Magento\Framework\ObjectManager\ConfigLoaderInterface::class);
         $this->objectManager->configure($configLoader->load($areaCode));
     }
-
-    /**
-     * Enable maintenance mode
-     *
-     * @param OutputInterface $output
-     * @return void
-     */
-    private function enableMaintenanceMode(OutputInterface $output)
-    {
-        if ($this->maintenanceMode->isOn()) {
-            $this->skipDisableMaintenanceMode = true;
-            $output->writeln('<info>Maintenance mode already enabled</info>');
-            return;
-        }
-
-        $this->maintenanceMode->set(true);
-        $this->skipDisableMaintenanceMode = false;
-        $output->writeln('<info>Enabling maintenance mode</info>');
-    }
-
-    /**
-     * Disable maintenance mode
-     *
-     * @param OutputInterface $output
-     * @return void
-     */
-    private function disableMaintenanceMode(OutputInterface $output)
-    {
-        if ($this->skipDisableMaintenanceMode) {
-            $output->writeln('<info>Skipped disabling maintenance mode</info>');
-            return;
-        }
-
-        $this->maintenanceMode->set(false);
-        $output->writeln('<info>Disabling maintenance mode</info>');
-    }
 }
diff --git a/setup/src/Magento/Setup/Console/Command/RollbackCommand.php b/setup/src/Magento/Setup/Console/Command/RollbackCommand.php
index 50cd8d69bc0..afe433d55c1 100644
--- a/setup/src/Magento/Setup/Console/Command/RollbackCommand.php
+++ b/setup/src/Magento/Setup/Console/Command/RollbackCommand.php
@@ -5,8 +5,8 @@
  */
 namespace Magento\Setup\Console\Command;
 
+use Magento\Framework\App\Console\MaintenanceModeEnabler;
 use Magento\Framework\App\DeploymentConfig;
-use Magento\Framework\App\MaintenanceMode;
 use Magento\Framework\Backup\Factory;
 use Magento\Framework\ObjectManagerInterface;
 use Magento\Framework\Setup\BackupRollbackFactory;
@@ -38,7 +38,7 @@ class RollbackCommand extends AbstractSetupCommand
     private $objectManager;
 
     /**
-     * @var MaintenanceMode
+     * @var MaintenanceModeEnabler
      */
     private $maintenanceMode;
 
@@ -54,21 +54,16 @@ class RollbackCommand extends AbstractSetupCommand
      */
     private $deploymentConfig;
 
-    /**
-     * @var bool
-     */
-    private $skipDisableMaintenanceMode;
-
     /**
      * Constructor
      *
      * @param ObjectManagerProvider $objectManagerProvider
-     * @param MaintenanceMode $maintenanceMode
+     * @param MaintenanceModeEnabler $maintenanceMode
      * @param DeploymentConfig $deploymentConfig
      */
     public function __construct(
         ObjectManagerProvider $objectManagerProvider,
-        MaintenanceMode $maintenanceMode,
+        MaintenanceModeEnabler $maintenanceMode,
         DeploymentConfig $deploymentConfig
     ) {
         $this->objectManager = $objectManagerProvider->get();
@@ -122,7 +117,7 @@ class RollbackCommand extends AbstractSetupCommand
         }
         $returnValue = \Magento\Framework\Console\Cli::RETURN_SUCCESS;
         try {
-            $this->enableMaintenanceMode($output);
+            $this->maintenanceMode->enableMaintenanceMode($output);
             $helper = $this->getHelper('question');
             $question = new ConfirmationQuestion(
                 '<info>You are about to remove current code and/or database tables. Are you sure?[y/N]<info>',
@@ -138,7 +133,7 @@ class RollbackCommand extends AbstractSetupCommand
             // we must have an exit code higher than zero to indicate something was wrong
             $returnValue = \Magento\Framework\Console\Cli::RETURN_FAILURE;
         } finally {
-            $this->disableMaintenanceMode($output);
+            $this->maintenanceMode->disableMaintenanceMode($output);
         }
         return $returnValue;
     }
@@ -190,40 +185,4 @@ class RollbackCommand extends AbstractSetupCommand
         $configLoader = $this->objectManager->get(\Magento\Framework\ObjectManager\ConfigLoaderInterface::class);
         $this->objectManager->configure($configLoader->load($areaCode));
     }
-
-    /**
-     * Enable maintenance mode
-     *
-     * @param OutputInterface $output
-     * @return void
-     */
-    private function enableMaintenanceMode(OutputInterface $output)
-    {
-        if ($this->maintenanceMode->isOn()) {
-            $this->skipDisableMaintenanceMode = true;
-            $output->writeln('<info>Maintenance mode already enabled</info>');
-            return;
-        }
-
-        $this->maintenanceMode->set(true);
-        $this->skipDisableMaintenanceMode = false;
-        $output->writeln('<info>Enabling maintenance mode</info>');
-    }
-
-    /**
-     * Disable maintenance mode
-     *
-     * @param OutputInterface $output
-     * @return void
-     */
-    private function disableMaintenanceMode(OutputInterface $output)
-    {
-        if ($this->skipDisableMaintenanceMode) {
-            $output->writeln('<info>Skipped disabling maintenance mode</info>');
-            return;
-        }
-
-        $this->maintenanceMode->set(false);
-        $output->writeln('<info>Disabling maintenance mode</info>');
-    }
 }
diff --git a/setup/src/Magento/Setup/Test/Unit/Console/Command/BackupCommandTest.php b/setup/src/Magento/Setup/Test/Unit/Console/Command/BackupCommandTest.php
index b44dcb12363..7800c59adac 100644
--- a/setup/src/Magento/Setup/Test/Unit/Console/Command/BackupCommandTest.php
+++ b/setup/src/Magento/Setup/Test/Unit/Console/Command/BackupCommandTest.php
@@ -37,7 +37,7 @@ class BackupCommandTest extends \PHPUnit\Framework\TestCase
 
     public function setUp()
     {
-        $maintenanceMode = $this->createMock(\Magento\Framework\App\MaintenanceMode::class);
+        $maintenanceMode = $this->createMock(\Magento\Framework\App\Console\MaintenanceModeEnabler::class);
         $objectManagerProvider = $this->createMock(\Magento\Setup\Model\ObjectManagerProvider::class);
         $this->objectManager = $this->getMockForAbstractClass(
             \Magento\Framework\ObjectManagerInterface::class,
diff --git a/setup/src/Magento/Setup/Test/Unit/Console/Command/ModuleUninstallCommandTest.php b/setup/src/Magento/Setup/Test/Unit/Console/Command/ModuleUninstallCommandTest.php
index affff69d835..50bdce4e425 100644
--- a/setup/src/Magento/Setup/Test/Unit/Console/Command/ModuleUninstallCommandTest.php
+++ b/setup/src/Magento/Setup/Test/Unit/Console/Command/ModuleUninstallCommandTest.php
@@ -26,7 +26,7 @@ class ModuleUninstallCommandTest extends \PHPUnit\Framework\TestCase
     private $fullModuleList;
 
     /**
-     * @var \Magento\Framework\App\MaintenanceMode|\PHPUnit_Framework_MockObject_MockObject
+     * @var \Magento\Framework\App\Console\MaintenanceModeEnabler|\PHPUnit_Framework_MockObject_MockObject
      */
     private $maintenanceMode;
 
@@ -102,7 +102,7 @@ class ModuleUninstallCommandTest extends \PHPUnit\Framework\TestCase
     {
         $this->deploymentConfig = $this->createMock(\Magento\Framework\App\DeploymentConfig::class);
         $this->fullModuleList = $this->createMock(\Magento\Framework\Module\FullModuleList::class);
-        $this->maintenanceMode = $this->createMock(\Magento\Framework\App\MaintenanceMode::class);
+        $this->maintenanceMode = $this->createMock(\Magento\Framework\App\Console\MaintenanceModeEnabler::class);
         $objectManagerProvider = $this->createMock(\Magento\Setup\Model\ObjectManagerProvider::class);
         $objectManager = $this->getMockForAbstractClass(
             \Magento\Framework\ObjectManagerInterface::class,
diff --git a/setup/src/Magento/Setup/Test/Unit/Console/Command/RollbackCommandTest.php b/setup/src/Magento/Setup/Test/Unit/Console/Command/RollbackCommandTest.php
index 6c2e22a9a20..df04fdfa68e 100644
--- a/setup/src/Magento/Setup/Test/Unit/Console/Command/RollbackCommandTest.php
+++ b/setup/src/Magento/Setup/Test/Unit/Console/Command/RollbackCommandTest.php
@@ -53,7 +53,7 @@ class RollbackCommandTest extends \PHPUnit\Framework\TestCase
     public function setUp()
     {
         $this->deploymentConfig = $this->createMock(\Magento\Framework\App\DeploymentConfig::class);
-        $maintenanceMode = $this->createMock(\Magento\Framework\App\MaintenanceMode::class);
+        $maintenanceMode = $this->createMock(\Magento\Framework\App\Console\MaintenanceModeEnabler::class);
         $this->objectManager = $this->getMockForAbstractClass(
             \Magento\Framework\ObjectManagerInterface::class,
             [],
-- 
GitLab


From aa1f29c00f5d3acd64bba8cd4b41092bcb9e745b Mon Sep 17 00:00:00 2001
From: Joke Puts <joke.puts@phpro.be>
Date: Tue, 26 Sep 2017 16:59:52 +0200
Subject: [PATCH 003/380] Updated tests to include the MaintenanceModeEnabler

---
 .../Console/Command/ThemeUninstallCommandTest.php |  8 ++++----
 .../Unit/Console/Command/BackupCommandTest.php    | 15 ++++++++++-----
 .../Unit/Console/Command/RollbackCommandTest.php  | 15 ++++++++++-----
 3 files changed, 24 insertions(+), 14 deletions(-)

diff --git a/app/code/Magento/Theme/Test/Unit/Console/Command/ThemeUninstallCommandTest.php b/app/code/Magento/Theme/Test/Unit/Console/Command/ThemeUninstallCommandTest.php
index 1aa17f990be..ff6a0409487 100644
--- a/app/code/Magento/Theme/Test/Unit/Console/Command/ThemeUninstallCommandTest.php
+++ b/app/code/Magento/Theme/Test/Unit/Console/Command/ThemeUninstallCommandTest.php
@@ -304,9 +304,9 @@ class ThemeUninstallCommandTest extends \PHPUnit\Framework\TestCase
     {
         $this->setUpExecute();
         $this->cleanupFiles->expects($this->never())->method('clearMaterializedViewFiles');
+        $this->maintenanceMode->expects($this->once())->method('enableMaintenanceMode');
+        $this->maintenanceMode->expects($this->once())->method('disableMaintenanceMode');
         $this->tester->execute(['theme' => ['area/vendor/test']]);
-        $this->assertContains('Enabling maintenance mode', $this->tester->getDisplay());
-        $this->assertContains('Disabling maintenance mode', $this->tester->getDisplay());
         $this->assertContains('Alert: Generated static view files were not cleared.', $this->tester->getDisplay());
         $this->assertNotContains('Generated static view files cleared successfully', $this->tester->getDisplay());
     }
@@ -315,9 +315,9 @@ class ThemeUninstallCommandTest extends \PHPUnit\Framework\TestCase
     {
         $this->setUpExecute();
         $this->cleanupFiles->expects($this->once())->method('clearMaterializedViewFiles');
+        $this->maintenanceMode->expects($this->once())->method('enableMaintenanceMode');
+        $this->maintenanceMode->expects($this->once())->method('disableMaintenanceMode');
         $this->tester->execute(['theme' => ['area/vendor/test'], '-c' => true]);
-        $this->assertContains('Enabling maintenance mode', $this->tester->getDisplay());
-        $this->assertContains('Disabling maintenance mode', $this->tester->getDisplay());
         $this->assertNotContains('Alert: Generated static view files were not cleared.', $this->tester->getDisplay());
         $this->assertContains('Generated static view files cleared successfully', $this->tester->getDisplay());
     }
diff --git a/setup/src/Magento/Setup/Test/Unit/Console/Command/BackupCommandTest.php b/setup/src/Magento/Setup/Test/Unit/Console/Command/BackupCommandTest.php
index 7800c59adac..f28d7756f7d 100644
--- a/setup/src/Magento/Setup/Test/Unit/Console/Command/BackupCommandTest.php
+++ b/setup/src/Magento/Setup/Test/Unit/Console/Command/BackupCommandTest.php
@@ -35,9 +35,14 @@ class BackupCommandTest extends \PHPUnit\Framework\TestCase
      */
     private $deploymentConfig;
 
+    /**
+     * @var \Magento\Framework\App\Console\MaintenanceModeEnabler|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $maintenanceMode;
+
     public function setUp()
     {
-        $maintenanceMode = $this->createMock(\Magento\Framework\App\Console\MaintenanceModeEnabler::class);
+        $this->maintenanceMode = $this->createMock(\Magento\Framework\App\Console\MaintenanceModeEnabler::class);
         $objectManagerProvider = $this->createMock(\Magento\Setup\Model\ObjectManagerProvider::class);
         $this->objectManager = $this->getMockForAbstractClass(
             \Magento\Framework\ObjectManagerInterface::class,
@@ -72,7 +77,7 @@ class BackupCommandTest extends \PHPUnit\Framework\TestCase
             );
         $command = new BackupCommand(
             $objectManagerProvider,
-            $maintenanceMode,
+            $this->maintenanceMode,
             $this->deploymentConfig
         );
         $this->tester = new CommandTester($command);
@@ -128,10 +133,10 @@ class BackupCommandTest extends \PHPUnit\Framework\TestCase
         $this->deploymentConfig->expects($this->once())
             ->method('isAvailable')
             ->will($this->returnValue(false));
+        $this->maintenanceMode->expects($this->once())->method('enableMaintenanceMode');
+        $this->maintenanceMode->expects($this->once())->method('disableMaintenanceMode');
         $this->tester->execute([]);
-        $expected = 'Enabling maintenance mode' . PHP_EOL
-            . 'Not enough information provided to take backup.' . PHP_EOL
-            . 'Disabling maintenance mode' . PHP_EOL;
+        $expected = 'Not enough information provided to take backup.' . PHP_EOL;
         $this->assertSame($expected, $this->tester->getDisplay());
     }
 }
diff --git a/setup/src/Magento/Setup/Test/Unit/Console/Command/RollbackCommandTest.php b/setup/src/Magento/Setup/Test/Unit/Console/Command/RollbackCommandTest.php
index df04fdfa68e..300caaa0333 100644
--- a/setup/src/Magento/Setup/Test/Unit/Console/Command/RollbackCommandTest.php
+++ b/setup/src/Magento/Setup/Test/Unit/Console/Command/RollbackCommandTest.php
@@ -50,10 +50,15 @@ class RollbackCommandTest extends \PHPUnit\Framework\TestCase
      */
     private $command;
 
+    /**
+     * @var \Magento\Framework\App\Console\MaintenanceModeEnabler|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $maintenanceMode;
+
     public function setUp()
     {
         $this->deploymentConfig = $this->createMock(\Magento\Framework\App\DeploymentConfig::class);
-        $maintenanceMode = $this->createMock(\Magento\Framework\App\Console\MaintenanceModeEnabler::class);
+        $this->maintenanceMode = $this->createMock(\Magento\Framework\App\Console\MaintenanceModeEnabler::class);
         $this->objectManager = $this->getMockForAbstractClass(
             \Magento\Framework\ObjectManagerInterface::class,
             [],
@@ -95,7 +100,7 @@ class RollbackCommandTest extends \PHPUnit\Framework\TestCase
             ->will($this->returnValue($this->question));
         $this->command = new RollbackCommand(
             $objectManagerProvider,
-            $maintenanceMode,
+            $this->maintenanceMode,
             $this->deploymentConfig
         );
         $this->command->setHelperSet($this->helperSet);
@@ -152,10 +157,10 @@ class RollbackCommandTest extends \PHPUnit\Framework\TestCase
         $this->deploymentConfig->expects($this->once())
             ->method('isAvailable')
             ->will($this->returnValue(true));
+        $this->maintenanceMode->expects($this->once())->method('enableMaintenanceMode');
+        $this->maintenanceMode->expects($this->once())->method('disableMaintenanceMode');
         $this->tester->execute([]);
-        $expected = 'Enabling maintenance mode' . PHP_EOL
-            . 'Not enough information provided to roll back.' . PHP_EOL
-            . 'Disabling maintenance mode' . PHP_EOL;
+        $expected = 'Not enough information provided to roll back.' . PHP_EOL;
         $this->assertSame($expected, $this->tester->getDisplay());
     }
 
-- 
GitLab


From d2e0d446b1a72be0b473562f732d15c5446eaf10 Mon Sep 17 00:00:00 2001
From: Fabian Schmengler <fs@integer-net.de>
Date: Tue, 26 Sep 2017 16:13:12 +0200
Subject: [PATCH 004/380] Replace expectException(, ) in unit tests

expectException(); expectExceptionMessage()
---
 .../Config/SessionLifetime/BackendModelTest.php      |  3 ++-
 .../Test/Unit/Model/CategoryRepositoryTest.php       |  3 ++-
 .../Model/Indexer/Product/Eav/Action/FullTest.php    |  3 ++-
 .../Unit/Model/Indexer/Stock/Action/FullTest.php     |  3 ++-
 .../System/Config/Form/Field/RegexceptionsTest.php   |  3 ++-
 .../Command/ConfigSet/ProcessorFacadeTest.php        |  3 ++-
 .../Mapper/Helper/RelativePathConverterTest.php      |  6 ++++--
 .../Magento/Config/Test/Unit/Model/ConfigTest.php    |  3 ++-
 .../Test/Unit/Model/OptionRepositoryTest.php         |  3 ++-
 .../Model/Product/Cache/Tag/ConfigurableTest.php     |  6 ++++--
 .../Magento/Customer/Test/Unit/Model/LoggerTest.php  |  3 ++-
 .../Test/Unit/Model/Currency/Import/ConfigTest.php   |  3 ++-
 .../Eav/Test/Unit/Model/Entity/Attribute/SetTest.php |  3 ++-
 .../Email/Test/Unit/Model/Template/ConfigTest.php    |  3 ++-
 .../Integration/Test/Unit/Model/Oauth/TokenTest.php  | 12 ++++++++----
 .../Magento/Paypal/Test/Unit/Model/Api/NvpTest.php   |  3 ++-
 .../Rule/Test/Unit/Model/ConditionFactoryTest.php    |  6 ++++--
 .../Test/Unit/Model/CouponRepositoryTest.php         |  3 ++-
 .../Unit/Model/Calculation/RateRepositoryTest.php    |  3 ++-
 .../Tax/Test/Unit/Model/Calculation/RateTest.php     |  3 ++-
 .../Tax/Test/Unit/Model/TaxRuleRepositoryTest.php    |  3 ++-
 .../CleanThemeRelatedContentObserverTest.php         |  3 ++-
 app/code/Magento/Webapi/Test/Unit/ExceptionTest.php  |  3 ++-
 .../Unit/Model/Attribute/Backend/Weee/TaxTest.php    |  3 ++-
 24 files changed, 60 insertions(+), 30 deletions(-)

diff --git a/app/code/Magento/Backend/Test/Unit/Model/Config/SessionLifetime/BackendModelTest.php b/app/code/Magento/Backend/Test/Unit/Model/Config/SessionLifetime/BackendModelTest.php
index 31a13191750..2f0102ffd41 100755
--- a/app/code/Magento/Backend/Test/Unit/Model/Config/SessionLifetime/BackendModelTest.php
+++ b/app/code/Magento/Backend/Test/Unit/Model/Config/SessionLifetime/BackendModelTest.php
@@ -20,7 +20,8 @@ class BackendModelTest extends \PHPUnit\Framework\TestCase
             \Magento\Backend\Model\Config\SessionLifetime\BackendModel::class
         );
         if ($errorMessage !== null) {
-            $this->expectException(\Magento\Framework\Exception\LocalizedException::class, $errorMessage);
+            $this->expectException(\Magento\Framework\Exception\LocalizedException::class);
+            $this->expectExceptionMessage($errorMessage);
         }
         $model->setValue($value);
         $object = $model->beforeSave();
diff --git a/app/code/Magento/Catalog/Test/Unit/Model/CategoryRepositoryTest.php b/app/code/Magento/Catalog/Test/Unit/Model/CategoryRepositoryTest.php
index 1bc5e450ae1..f77a6fec283 100644
--- a/app/code/Magento/Catalog/Test/Unit/Model/CategoryRepositoryTest.php
+++ b/app/code/Magento/Catalog/Test/Unit/Model/CategoryRepositoryTest.php
@@ -255,7 +255,8 @@ class CategoryRepositoryTest extends \PHPUnit\Framework\TestCase
      */
     public function testSaveWithValidateCategoryException($error, $expectedException, $expectedExceptionMessage)
     {
-        $this->expectException($expectedException, $expectedExceptionMessage);
+        $this->expectException($expectedException);
+        $this->expectExceptionMessage($expectedExceptionMessage);
         $categoryId = 5;
         $categoryMock = $this->createMock(\Magento\Catalog\Model\Category::class);
         $this->extensibleDataObjectConverterMock
diff --git a/app/code/Magento/Catalog/Test/Unit/Model/Indexer/Product/Eav/Action/FullTest.php b/app/code/Magento/Catalog/Test/Unit/Model/Indexer/Product/Eav/Action/FullTest.php
index eb5fdabe533..c254557904d 100644
--- a/app/code/Magento/Catalog/Test/Unit/Model/Indexer/Product/Eav/Action/FullTest.php
+++ b/app/code/Magento/Catalog/Test/Unit/Model/Indexer/Product/Eav/Action/FullTest.php
@@ -48,7 +48,8 @@ class FullTest extends \PHPUnit\Framework\TestCase
             $tableSwitcherMock
         );
 
-        $this->expectException(\Magento\Framework\Exception\LocalizedException::class, $exceptionMessage);
+        $this->expectException(\Magento\Framework\Exception\LocalizedException::class);
+        $this->expectExceptionMessage($exceptionMessage);
 
         $model->execute();
     }
diff --git a/app/code/Magento/CatalogInventory/Test/Unit/Model/Indexer/Stock/Action/FullTest.php b/app/code/Magento/CatalogInventory/Test/Unit/Model/Indexer/Stock/Action/FullTest.php
index e1a19bf10ec..3590c96bd15 100644
--- a/app/code/Magento/CatalogInventory/Test/Unit/Model/Indexer/Stock/Action/FullTest.php
+++ b/app/code/Magento/CatalogInventory/Test/Unit/Model/Indexer/Stock/Action/FullTest.php
@@ -44,7 +44,8 @@ class FullTest extends \PHPUnit\Framework\TestCase
             ]
         );
 
-        $this->expectException(\Magento\Framework\Exception\LocalizedException::class, $exceptionMessage);
+        $this->expectException(\Magento\Framework\Exception\LocalizedException::class);
+        $this->expectExceptionMessage($exceptionMessage);
 
         $model->execute();
     }
diff --git a/app/code/Magento/Config/Test/Unit/Block/System/Config/Form/Field/RegexceptionsTest.php b/app/code/Magento/Config/Test/Unit/Block/System/Config/Form/Field/RegexceptionsTest.php
index 4f53f1072e0..0b4d5f7ef15 100644
--- a/app/code/Magento/Config/Test/Unit/Block/System/Config/Form/Field/RegexceptionsTest.php
+++ b/app/code/Magento/Config/Test/Unit/Block/System/Config/Form/Field/RegexceptionsTest.php
@@ -128,7 +128,8 @@ class RegexceptionsTest extends \PHPUnit\Framework\TestCase
 
         $this->object->addColumn($wrongColumnName, $this->cellParameters);
 
-        $this->expectException('\Exception', 'Wrong column name specified.');
+        $this->expectException('\Exception');
+        $this->expectExceptionMessage('Wrong column name specified.');
 
         $this->object->renderCellTemplate($columnName);
     }
diff --git a/app/code/Magento/Config/Test/Unit/Console/Command/ConfigSet/ProcessorFacadeTest.php b/app/code/Magento/Config/Test/Unit/Console/Command/ConfigSet/ProcessorFacadeTest.php
index 4e65ab3f4cc..0f5852c322b 100644
--- a/app/code/Magento/Config/Test/Unit/Console/Command/ConfigSet/ProcessorFacadeTest.php
+++ b/app/code/Magento/Config/Test/Unit/Console/Command/ConfigSet/ProcessorFacadeTest.php
@@ -132,7 +132,8 @@ class ProcessorFacadeTest extends \PHPUnit\Framework\TestCase
      */
     public function testProcessWithValidatorException(LocalizedException $exception)
     {
-        $this->expectException(ValidatorException::class, 'Some error');
+        $this->expectException(ValidatorException::class);
+        $this->expectExceptionMessage('Some error');
         $this->scopeValidatorMock->expects($this->once())
             ->method('isValid')
             ->willThrowException($exception);
diff --git a/app/code/Magento/Config/Test/Unit/Model/Config/Structure/Mapper/Helper/RelativePathConverterTest.php b/app/code/Magento/Config/Test/Unit/Model/Config/Structure/Mapper/Helper/RelativePathConverterTest.php
index c671a5326c4..058f9a380a2 100644
--- a/app/code/Magento/Config/Test/Unit/Model/Config/Structure/Mapper/Helper/RelativePathConverterTest.php
+++ b/app/code/Magento/Config/Test/Unit/Model/Config/Structure/Mapper/Helper/RelativePathConverterTest.php
@@ -24,7 +24,8 @@ class RelativePathConverterTest extends \PHPUnit\Framework\TestCase
 
         $exceptionMessage = sprintf('Invalid relative path %s in %s node', $relativePath, $nodePath);
 
-        $this->expectException('InvalidArgumentException', $exceptionMessage);
+        $this->expectException('InvalidArgumentException');
+        $this->expectExceptionMessage($exceptionMessage);
         $this->_sut->convert($nodePath, $relativePath);
     }
 
@@ -35,7 +36,8 @@ class RelativePathConverterTest extends \PHPUnit\Framework\TestCase
      */
     public function testConvertWithInvalidArguments($nodePath, $relativePath)
     {
-        $this->expectException('InvalidArgumentException', 'Invalid arguments');
+        $this->expectException('InvalidArgumentException');
+        $this->expectExceptionMessage('Invalid arguments');
         $this->_sut->convert($nodePath, $relativePath);
     }
 
diff --git a/app/code/Magento/Config/Test/Unit/Model/ConfigTest.php b/app/code/Magento/Config/Test/Unit/Model/ConfigTest.php
index 2832e8e54e5..2ddbbd5ffe1 100644
--- a/app/code/Magento/Config/Test/Unit/Model/ConfigTest.php
+++ b/app/code/Magento/Config/Test/Unit/Model/ConfigTest.php
@@ -280,7 +280,8 @@ class ConfigTest extends \PHPUnit\Framework\TestCase
     public function testSetDataByPathWrongDepth($path, $expectedException)
     {
         $expectedException = 'Allowed depth of configuration is 3 (<section>/<group>/<field>). ' . $expectedException;
-        $this->expectException('\UnexpectedValueException', $expectedException);
+        $this->expectException('\UnexpectedValueException');
+        $this->expectExceptionMessage($expectedException);
         $value = 'value';
         $this->_model->setDataByPath($path, $value);
     }
diff --git a/app/code/Magento/ConfigurableProduct/Test/Unit/Model/OptionRepositoryTest.php b/app/code/Magento/ConfigurableProduct/Test/Unit/Model/OptionRepositoryTest.php
index 2d824e52c72..ab3fd33322a 100644
--- a/app/code/Magento/ConfigurableProduct/Test/Unit/Model/OptionRepositoryTest.php
+++ b/app/code/Magento/ConfigurableProduct/Test/Unit/Model/OptionRepositoryTest.php
@@ -356,7 +356,8 @@ class OptionRepositoryTest extends \PHPUnit\Framework\TestCase
      */
     public function testValidateNewOptionData($attributeId, $label, $optionValues, $msg)
     {
-        $this->expectException(\Magento\Framework\Exception\InputException::class, $msg);
+        $this->expectException(\Magento\Framework\Exception\InputException::class);
+        $this->expectExceptionMessage($msg);
         $optionValueMock = $this->getMockBuilder(\Magento\ConfigurableProduct\Api\Data\OptionValueInterface::class)
             ->setMethods(['getValueIndex', 'getPricingValue', 'getIsPercent'])
             ->getMockForAbstractClass();
diff --git a/app/code/Magento/ConfigurableProduct/Test/Unit/Model/Product/Cache/Tag/ConfigurableTest.php b/app/code/Magento/ConfigurableProduct/Test/Unit/Model/Product/Cache/Tag/ConfigurableTest.php
index 519288a50c8..958b75a2285 100644
--- a/app/code/Magento/ConfigurableProduct/Test/Unit/Model/Product/Cache/Tag/ConfigurableTest.php
+++ b/app/code/Magento/ConfigurableProduct/Test/Unit/Model/Product/Cache/Tag/ConfigurableTest.php
@@ -32,13 +32,15 @@ class ConfigurableTest extends \PHPUnit\Framework\TestCase
 
     public function testGetWithScalar()
     {
-        $this->expectException(\InvalidArgumentException::class, 'Provided argument is not an object');
+        $this->expectException(\InvalidArgumentException::class);
+        $this->expectExceptionMessage('Provided argument is not an object');
         $this->model->getTags('scalar');
     }
 
     public function testGetTagsWithObject()
     {
-        $this->expectException(\InvalidArgumentException::class, 'Provided argument must be a product');
+        $this->expectException(\InvalidArgumentException::class);
+        $this->expectExceptionMessage('Provided argument must be a product');
         $this->model->getTags(new \StdClass());
     }
 
diff --git a/app/code/Magento/Customer/Test/Unit/Model/LoggerTest.php b/app/code/Magento/Customer/Test/Unit/Model/LoggerTest.php
index 4cea7ee2283..408389182ae 100644
--- a/app/code/Magento/Customer/Test/Unit/Model/LoggerTest.php
+++ b/app/code/Magento/Customer/Test/Unit/Model/LoggerTest.php
@@ -71,7 +71,8 @@ class LoggerTest extends \PHPUnit\Framework\TestCase
         $data = array_filter($data);
 
         if (!$data) {
-            $this->expectException('\InvalidArgumentException', 'Log data is empty');
+            $this->expectException('\InvalidArgumentException');
+            $this->expectExceptionMessage('Log data is empty');
             $this->logger->log($customerId, $data);
             return;
         }
diff --git a/app/code/Magento/Directory/Test/Unit/Model/Currency/Import/ConfigTest.php b/app/code/Magento/Directory/Test/Unit/Model/Currency/Import/ConfigTest.php
index 54ec26386f3..76b23e4e79e 100644
--- a/app/code/Magento/Directory/Test/Unit/Model/Currency/Import/ConfigTest.php
+++ b/app/code/Magento/Directory/Test/Unit/Model/Currency/Import/ConfigTest.php
@@ -29,7 +29,8 @@ class ConfigTest extends \PHPUnit\Framework\TestCase
      */
     public function testConstructorException(array $configData, $expectedException)
     {
-        $this->expectException('InvalidArgumentException', $expectedException);
+        $this->expectException('InvalidArgumentException');
+        $this->expectExceptionMessage($expectedException);
         new \Magento\Directory\Model\Currency\Import\Config($configData);
     }
 
diff --git a/app/code/Magento/Eav/Test/Unit/Model/Entity/Attribute/SetTest.php b/app/code/Magento/Eav/Test/Unit/Model/Entity/Attribute/SetTest.php
index 78465e57c62..e976d031e96 100644
--- a/app/code/Magento/Eav/Test/Unit/Model/Entity/Attribute/SetTest.php
+++ b/app/code/Magento/Eav/Test/Unit/Model/Entity/Attribute/SetTest.php
@@ -44,7 +44,8 @@ class SetTest extends \PHPUnit\Framework\TestCase
     {
         $this->_model->getResource()->expects($this->any())->method('validate')->will($this->returnValue(false));
 
-        $this->expectException(\Magento\Framework\Exception\LocalizedException::class, $exceptionMessage);
+        $this->expectException(\Magento\Framework\Exception\LocalizedException::class);
+        $this->expectExceptionMessage($exceptionMessage);
         $this->_model->setAttributeSetName($attributeSetName);
         $this->_model->validate();
     }
diff --git a/app/code/Magento/Email/Test/Unit/Model/Template/ConfigTest.php b/app/code/Magento/Email/Test/Unit/Model/Template/ConfigTest.php
index 6ec3905fe46..47c3ac1e7e4 100644
--- a/app/code/Magento/Email/Test/Unit/Model/Template/ConfigTest.php
+++ b/app/code/Magento/Email/Test/Unit/Model/Template/ConfigTest.php
@@ -311,7 +311,8 @@ class ConfigTest extends \PHPUnit\Framework\TestCase
         array $fixtureFields = [],
         $argument = null
     ) {
-        $this->expectException('UnexpectedValueException', $expectedException);
+        $this->expectException('UnexpectedValueException');
+        $this->expectExceptionMessage($expectedException);
         $dataStorage = $this->createPartialMock(\Magento\Email\Model\Template\Config\Data::class, ['get']);
         $dataStorage->expects(
             $this->atLeastOnce()
diff --git a/app/code/Magento/Integration/Test/Unit/Model/Oauth/TokenTest.php b/app/code/Magento/Integration/Test/Unit/Model/Oauth/TokenTest.php
index 36b0d77d1e1..badb69aa19f 100644
--- a/app/code/Magento/Integration/Test/Unit/Model/Oauth/TokenTest.php
+++ b/app/code/Magento/Integration/Test/Unit/Model/Oauth/TokenTest.php
@@ -384,7 +384,8 @@ class TokenTest extends \PHPUnit\Framework\TestCase
         $this->validatorMock->expects($this->once())->method('isValid')->willReturn(false);
         $this->validatorMock->expects($this->once())->method('getMessages')->willReturn([$exceptionMessage]);
 
-        $this->expectException(\Magento\Framework\Oauth\Exception::class, $exceptionMessage);
+        $this->expectException(\Magento\Framework\Oauth\Exception::class);
+        $this->expectExceptionMessage($exceptionMessage);
 
         $this->tokenModel->validate();
     }
@@ -402,7 +403,8 @@ class TokenTest extends \PHPUnit\Framework\TestCase
         $this->validatorKeyLengthMock->expects($this->once())->method('isValid')->willReturn(false);
         $this->validatorKeyLengthMock->expects($this->once())->method('getMessages')->willReturn([$exceptionMessage]);
 
-        $this->expectException(\Magento\Framework\Oauth\Exception::class, $exceptionMessage);
+        $this->expectException(\Magento\Framework\Oauth\Exception::class);
+        $this->expectExceptionMessage($exceptionMessage);
 
         $this->tokenModel->validate();
     }
@@ -429,7 +431,8 @@ class TokenTest extends \PHPUnit\Framework\TestCase
             ]
         );
         $this->validatorKeyLengthMock->expects($this->once())->method('getMessages')->willReturn([$exceptionMessage]);
-        $this->expectException(\Magento\Framework\Oauth\Exception::class, $exceptionMessage);
+        $this->expectException(\Magento\Framework\Oauth\Exception::class);
+        $this->expectExceptionMessage($exceptionMessage);
 
         $this->tokenModel->validate();
     }
@@ -459,7 +462,8 @@ class TokenTest extends \PHPUnit\Framework\TestCase
             ]
         );
         $this->validatorKeyLengthMock->expects($this->once())->method('getMessages')->willReturn([$exceptionMessage]);
-        $this->expectException(\Magento\Framework\Oauth\Exception::class, $exceptionMessage);
+        $this->expectException(\Magento\Framework\Oauth\Exception::class);
+        $this->expectExceptionMessage($exceptionMessage);
 
         $this->tokenModel->validate();
     }
diff --git a/app/code/Magento/Paypal/Test/Unit/Model/Api/NvpTest.php b/app/code/Magento/Paypal/Test/Unit/Model/Api/NvpTest.php
index 8b270fe24ab..c0b2bb4fc1d 100644
--- a/app/code/Magento/Paypal/Test/Unit/Model/Api/NvpTest.php
+++ b/app/code/Magento/Paypal/Test/Unit/Model/Api/NvpTest.php
@@ -126,7 +126,8 @@ class NvpTest extends \PHPUnit\Framework\TestCase
     public function testCall($response, $processableErrors, $exception, $exceptionMessage = '', $exceptionCode = null)
     {
         if (isset($exception)) {
-            $this->expectException($exception, $exceptionMessage, $exceptionCode);
+            $this->expectException($exception);
+            $this->expectExceptionMessage($exceptionMessage, $exceptionCode);
         }
         $this->curl->expects($this->once())
             ->method('read')
diff --git a/app/code/Magento/Rule/Test/Unit/Model/ConditionFactoryTest.php b/app/code/Magento/Rule/Test/Unit/Model/ConditionFactoryTest.php
index d8c0cc470f5..f78ee4f345d 100644
--- a/app/code/Magento/Rule/Test/Unit/Model/ConditionFactoryTest.php
+++ b/app/code/Magento/Rule/Test/Unit/Model/ConditionFactoryTest.php
@@ -78,7 +78,8 @@ class ConditionFactoryTest extends \PHPUnit\Framework\TestCase
             ->expects($this->never())
             ->method('create');
 
-        $this->expectException(\InvalidArgumentException::class, 'Class does not exist');
+        $this->expectException(\InvalidArgumentException::class);
+        $this->expectExceptionMessage('Class does not exist');
 
         $this->conditionFactory->create($type);
     }
@@ -92,7 +93,8 @@ class ConditionFactoryTest extends \PHPUnit\Framework\TestCase
             ->method('create')
             ->with($type)
             ->willReturn(new \stdClass());
-        $this->expectException(\InvalidArgumentException::class, 'Class does not implement condition interface');
+        $this->expectException(\InvalidArgumentException::class);
+        $this->expectExceptionMessage('Class does not implement condition interface');
         $this->conditionFactory->create($type);
     }
 }
diff --git a/app/code/Magento/SalesRule/Test/Unit/Model/CouponRepositoryTest.php b/app/code/Magento/SalesRule/Test/Unit/Model/CouponRepositoryTest.php
index ebdc10830f3..31536e1be3d 100644
--- a/app/code/Magento/SalesRule/Test/Unit/Model/CouponRepositoryTest.php
+++ b/app/code/Magento/SalesRule/Test/Unit/Model/CouponRepositoryTest.php
@@ -150,7 +150,8 @@ class CouponRepositoryTest extends \PHPUnit\Framework\TestCase
             $this->resource->expects($this->once())->method('save')->with($coupon)
                 ->willThrowException($exceptionObject);
         }
-        $this->expectException($exceptionName, $exceptionMessage);
+        $this->expectException($exceptionName);
+        $this->expectExceptionMessage($exceptionMessage);
         $this->model->save($coupon);
     }
 
diff --git a/app/code/Magento/Tax/Test/Unit/Model/Calculation/RateRepositoryTest.php b/app/code/Magento/Tax/Test/Unit/Model/Calculation/RateRepositoryTest.php
index db2053efd41..e6a29177301 100644
--- a/app/code/Magento/Tax/Test/Unit/Model/Calculation/RateRepositoryTest.php
+++ b/app/code/Magento/Tax/Test/Unit/Model/Calculation/RateRepositoryTest.php
@@ -307,7 +307,8 @@ class RateRepositoryTest extends \PHPUnit\Framework\TestCase
             ->with($rateTitles)
             ->willThrowException($expectedException);
         $this->rateRegistryMock->expects($this->never())->method('registerTaxRate')->with($rateMock);
-        $this->expectException($exceptionType, $exceptionMessage);
+        $this->expectException($exceptionType);
+        $this->expectExceptionMessage($exceptionMessage);
         $this->model->save($rateMock);
     }
 
diff --git a/app/code/Magento/Tax/Test/Unit/Model/Calculation/RateTest.php b/app/code/Magento/Tax/Test/Unit/Model/Calculation/RateTest.php
index 5a5abfd828d..c0a04a3fb45 100644
--- a/app/code/Magento/Tax/Test/Unit/Model/Calculation/RateTest.php
+++ b/app/code/Magento/Tax/Test/Unit/Model/Calculation/RateTest.php
@@ -46,7 +46,8 @@ class RateTest extends \PHPUnit\Framework\TestCase
      */
     public function testExceptionOfValidation($exceptionMessage, $data)
     {
-        $this->expectException(\Magento\Framework\Exception\LocalizedException::class, $exceptionMessage);
+        $this->expectException(\Magento\Framework\Exception\LocalizedException::class);
+        $this->expectExceptionMessage($exceptionMessage);
         $rate = $this->objectHelper->getObject(
             \Magento\Tax\Model\Calculation\Rate::class,
             ['resource' => $this->resourceMock]
diff --git a/app/code/Magento/Tax/Test/Unit/Model/TaxRuleRepositoryTest.php b/app/code/Magento/Tax/Test/Unit/Model/TaxRuleRepositoryTest.php
index 182e1b43d78..f4151cd18ba 100644
--- a/app/code/Magento/Tax/Test/Unit/Model/TaxRuleRepositoryTest.php
+++ b/app/code/Magento/Tax/Test/Unit/Model/TaxRuleRepositoryTest.php
@@ -163,7 +163,8 @@ class TaxRuleRepositoryTest extends \PHPUnit\Framework\TestCase
             ->willThrowException($exceptionObject);
         $this->taxRuleRegistry->expects($this->never())->method('registerTaxRule');
 
-        $this->expectException($exceptionName, $exceptionMessage);
+        $this->expectException($exceptionName);
+        $this->expectExceptionMessage($exceptionMessage);
         $this->model->save($rule);
     }
 
diff --git a/app/code/Magento/Theme/Test/Unit/Observer/CleanThemeRelatedContentObserverTest.php b/app/code/Magento/Theme/Test/Unit/Observer/CleanThemeRelatedContentObserverTest.php
index 0eaa5096856..f1f4664c854 100644
--- a/app/code/Magento/Theme/Test/Unit/Observer/CleanThemeRelatedContentObserverTest.php
+++ b/app/code/Magento/Theme/Test/Unit/Observer/CleanThemeRelatedContentObserverTest.php
@@ -105,7 +105,8 @@ class CleanThemeRelatedContentObserverTest extends \PHPUnit\Framework\TestCase
 
         $this->themeConfig->expects($this->any())->method('isThemeAssignedToStore')->with($themeMock)->willReturn(true);
 
-        $this->expectException(\Magento\Framework\Exception\LocalizedException::class, 'Theme isn\'t deletable.');
+        $this->expectException(\Magento\Framework\Exception\LocalizedException::class);
+        $this->expectExceptionMessage('Theme isn\'t deletable.');
         $this->themeObserver->execute($observerMock);
     }
 
diff --git a/app/code/Magento/Webapi/Test/Unit/ExceptionTest.php b/app/code/Magento/Webapi/Test/Unit/ExceptionTest.php
index f4ba3519472..c3761c4e248 100644
--- a/app/code/Magento/Webapi/Test/Unit/ExceptionTest.php
+++ b/app/code/Magento/Webapi/Test/Unit/ExceptionTest.php
@@ -43,7 +43,8 @@ class ExceptionTest extends \PHPUnit\Framework\TestCase
      */
     public function testConstructInvalidHttpCode($httpCode)
     {
-        $this->expectException('InvalidArgumentException', "The specified HTTP code \"{$httpCode}\" is invalid.");
+        $this->expectException('InvalidArgumentException');
+        $this->expectExceptionMessage("The specified HTTP code \"{$httpCode}\" is invalid.");
         /** Create \Magento\Framework\Webapi\Exception object with invalid code. */
         /** Valid codes range is from 400 to 599. */
         new \Magento\Framework\Webapi\Exception(__('Message'), 0, $httpCode);
diff --git a/app/code/Magento/Weee/Test/Unit/Model/Attribute/Backend/Weee/TaxTest.php b/app/code/Magento/Weee/Test/Unit/Model/Attribute/Backend/Weee/TaxTest.php
index 9e220091d6c..8ba8afaa1a8 100644
--- a/app/code/Magento/Weee/Test/Unit/Model/Attribute/Backend/Weee/TaxTest.php
+++ b/app/code/Magento/Weee/Test/Unit/Model/Attribute/Backend/Weee/TaxTest.php
@@ -82,7 +82,8 @@ class TaxTest extends \PHPUnit\Framework\TestCase
             ->will($this->returnValue($taxes));
 
         // Exception caught
-        $this->expectException('Exception', $expected);
+        $this->expectException('Exception');
+        $this->expectExceptionMessage($expected);
         $modelMock->validate($productMock);
     }
 
-- 
GitLab


From 485cd5757d51dceb7beabdec09dfb3be465dcc42 Mon Sep 17 00:00:00 2001
From: Fabian Schmengler <fs@integer-net.de>
Date: Tue, 26 Sep 2017 16:18:36 +0200
Subject: [PATCH 005/380] Replace expectException(, ) in integration tests

expectException(); expectExceptionMessage()
---
 ...AttributeMediaGalleryManagementInterfaceTest.php |  6 ++++--
 .../Api/ProductCustomAttributeWrongTypeTest.php     |  6 ++++--
 .../Api/ProductCustomOptionRepositoryTest.php       | 13 +++++++++----
 .../Catalog/Api/ProductRepositoryInterfaceTest.php  |  3 ++-
 .../Magento/Webapi/Routing/CoreRoutingTest.php      |  3 ++-
 .../Magento/Test/Bootstrap/SettingsTest.php         |  3 ++-
 .../Framework/View/Design/Fallback/RulePoolTest.php |  3 ++-
 .../testsuite/Magento/Framework/View/LayoutTest.php |  3 ++-
 .../Review/Model/ResourceModel/RatingTest.php       |  3 ++-
 9 files changed, 29 insertions(+), 14 deletions(-)

diff --git a/dev/tests/api-functional/testsuite/Magento/Catalog/Api/ProductAttributeMediaGalleryManagementInterfaceTest.php b/dev/tests/api-functional/testsuite/Magento/Catalog/Api/ProductAttributeMediaGalleryManagementInterfaceTest.php
index ca9ad9897bf..17bc1226d99 100644
--- a/dev/tests/api-functional/testsuite/Magento/Catalog/Api/ProductAttributeMediaGalleryManagementInterfaceTest.php
+++ b/dev/tests/api-functional/testsuite/Magento/Catalog/Api/ProductAttributeMediaGalleryManagementInterfaceTest.php
@@ -609,9 +609,11 @@ class ProductAttributeMediaGalleryManagementInterfaceTest extends \Magento\TestF
             'sku' => $productSku,
         ];
         if (TESTS_WEB_API_ADAPTER == self::ADAPTER_SOAP) {
-            $this->expectException('SoapFault', 'Requested product doesn\'t exist');
+            $this->expectException('SoapFault');
+            $this->expectExceptionMessage('Requested product doesn\'t exist');
         } else {
-            $this->expectException('Exception', '', 404);
+            $this->expectException('Exception');
+            $this->expectExceptionCode(404);
         }
         $this->_webApiCall($serviceInfo, $requestData);
     }
diff --git a/dev/tests/api-functional/testsuite/Magento/Catalog/Api/ProductCustomAttributeWrongTypeTest.php b/dev/tests/api-functional/testsuite/Magento/Catalog/Api/ProductCustomAttributeWrongTypeTest.php
index 2dc8d197778..19b07574390 100644
--- a/dev/tests/api-functional/testsuite/Magento/Catalog/Api/ProductCustomAttributeWrongTypeTest.php
+++ b/dev/tests/api-functional/testsuite/Magento/Catalog/Api/ProductCustomAttributeWrongTypeTest.php
@@ -43,9 +43,11 @@ class ProductCustomAttributeWrongTypeTest extends WebapiAbstract
         ];
 
         if (TESTS_WEB_API_ADAPTER == self::ADAPTER_SOAP) {
-            $this->expectException('Exception', 'Attribute "meta_title" has invalid value.');
+            $this->expectException('Exception');
+            $this->expectExceptionMessage('Attribute "meta_title" has invalid value.');
         } else {
-            $this->expectException('Exception', 'Attribute \"meta_title\" has invalid value.');
+            $this->expectException('Exception');
+            $this->expectExceptionMessage('Attribute \"meta_title\" has invalid value.');
         }
 
         $this->_webApiCall($serviceInfo, $this->getRequestData());
diff --git a/dev/tests/api-functional/testsuite/Magento/Catalog/Api/ProductCustomOptionRepositoryTest.php b/dev/tests/api-functional/testsuite/Magento/Catalog/Api/ProductCustomOptionRepositoryTest.php
index a152167a345..b0dd2702f89 100644
--- a/dev/tests/api-functional/testsuite/Magento/Catalog/Api/ProductCustomOptionRepositoryTest.php
+++ b/dev/tests/api-functional/testsuite/Magento/Catalog/Api/ProductCustomOptionRepositoryTest.php
@@ -211,12 +211,15 @@ class ProductCustomOptionRepositoryTest extends WebapiAbstract
 
         if (TESTS_WEB_API_ADAPTER == self::ADAPTER_SOAP) {
             if (isset($optionDataPost['title']) && empty($optionDataPost['title'])) {
-                $this->expectException('SoapFault', 'Missed values for option required fields');
+                $this->expectException('SoapFault');
+                $this->expectExceptionMessage('Missed values for option required fields');
             } else {
-                $this->expectException('SoapFault', 'Invalid option');
+                $this->expectException('SoapFault');
+                $this->expectExceptionMessage('Invalid option');
             }
         } else {
-            $this->expectException('Exception', '', 400);
+            $this->expectException('Exception');
+            $this->expectExceptionMessage('', 400);
         }
         $this->_webApiCall($serviceInfo, ['option' => $optionDataPost]);
     }
@@ -406,7 +409,9 @@ class ProductCustomOptionRepositoryTest extends WebapiAbstract
             ],
         ];
 
-        $this->expectException('Exception', $message, 400);
+        $this->expectException('Exception');
+        $this->expectExceptionMessage($message);
+        $this->expectExceptionCode(400);
         $this->_webApiCall($serviceInfo, ['option' => $optionData]);
     }
 
diff --git a/dev/tests/api-functional/testsuite/Magento/Catalog/Api/ProductRepositoryInterfaceTest.php b/dev/tests/api-functional/testsuite/Magento/Catalog/Api/ProductRepositoryInterfaceTest.php
index cd9aaa1d952..cb33edce3af 100644
--- a/dev/tests/api-functional/testsuite/Magento/Catalog/Api/ProductRepositoryInterfaceTest.php
+++ b/dev/tests/api-functional/testsuite/Magento/Catalog/Api/ProductRepositoryInterfaceTest.php
@@ -313,7 +313,8 @@ class ProductRepositoryInterfaceTest extends WebapiAbstract
     {
         $sku = $fixtureProduct[ProductInterface::SKU];
         $this->saveProduct($fixtureProduct);
-        $this->expectException('Exception', 'Requested product doesn\'t exist');
+        $this->expectException('Exception');
+        $this->expectExceptionMessage('Requested product doesn\'t exist');
 
         // Delete all with 'all' store code
         $this->deleteProduct($sku);
diff --git a/dev/tests/api-functional/testsuite/Magento/Webapi/Routing/CoreRoutingTest.php b/dev/tests/api-functional/testsuite/Magento/Webapi/Routing/CoreRoutingTest.php
index 89533a0a624..23b889c7c12 100644
--- a/dev/tests/api-functional/testsuite/Magento/Webapi/Routing/CoreRoutingTest.php
+++ b/dev/tests/api-functional/testsuite/Magento/Webapi/Routing/CoreRoutingTest.php
@@ -73,7 +73,8 @@ class CoreRoutingTest extends \Magento\Webapi\Routing\BaseService
                 'operation' => 'testModule3ErrorV1ServiceException',
             ],
         ];
-        $this->expectException('SoapFault', 'Generic service exception');
+        $this->expectException('SoapFault');
+        $this->expectExceptionMessage('Generic service exception');
         $this->_webApiCall($serviceInfo);
     }
 
diff --git a/dev/tests/integration/framework/tests/unit/testsuite/Magento/Test/Bootstrap/SettingsTest.php b/dev/tests/integration/framework/tests/unit/testsuite/Magento/Test/Bootstrap/SettingsTest.php
index aefe51f6ab3..26e6b59ede0 100644
--- a/dev/tests/integration/framework/tests/unit/testsuite/Magento/Test/Bootstrap/SettingsTest.php
+++ b/dev/tests/integration/framework/tests/unit/testsuite/Magento/Test/Bootstrap/SettingsTest.php
@@ -199,7 +199,8 @@ class SettingsTest extends \PHPUnit\Framework\TestCase
      */
     public function testGetAsConfigFileException($settingName, $expectedExceptionMsg)
     {
-        $this->expectException(\Magento\Framework\Exception\LocalizedException::class, $expectedExceptionMsg);
+        $this->expectException(\Magento\Framework\Exception\LocalizedException::class);
+        $this->expectExceptionMessage($expectedExceptionMsg);
         $this->_object->getAsConfigFile($settingName);
     }
 
diff --git a/dev/tests/integration/testsuite/Magento/Framework/View/Design/Fallback/RulePoolTest.php b/dev/tests/integration/testsuite/Magento/Framework/View/Design/Fallback/RulePoolTest.php
index 1500c91478a..c586c68b745 100644
--- a/dev/tests/integration/testsuite/Magento/Framework/View/Design/Fallback/RulePoolTest.php
+++ b/dev/tests/integration/testsuite/Magento/Framework/View/Design/Fallback/RulePoolTest.php
@@ -74,7 +74,8 @@ class RulePoolTest extends \PHPUnit\Framework\TestCase
      */
     public function testGetPatternDirsException($type, array $overriddenParams, $expectedErrorMessage)
     {
-        $this->expectException('InvalidArgumentException', $expectedErrorMessage);
+        $this->expectException('InvalidArgumentException');
+        $this->expectExceptionMessage($expectedErrorMessage);
         $params = $overriddenParams + $this->defaultParams;
         $this->model->getRule($type)->getPatternDirs($params);
     }
diff --git a/dev/tests/integration/testsuite/Magento/Framework/View/LayoutTest.php b/dev/tests/integration/testsuite/Magento/Framework/View/LayoutTest.php
index c014b517f64..66e8eb3e453 100644
--- a/dev/tests/integration/testsuite/Magento/Framework/View/LayoutTest.php
+++ b/dev/tests/integration/testsuite/Magento/Framework/View/LayoutTest.php
@@ -275,7 +275,8 @@ class LayoutTest extends \PHPUnit\Framework\TestCase
         $msg = 'Html tag "span" is forbidden for usage in containers. ' .
             'Consider to use one of the allowed: aside, dd, div, dl, fieldset, main, nav, ' .
             'header, footer, ol, p, section, table, tfoot, ul.';
-        $this->expectException(\Magento\Framework\Exception\LocalizedException::class, $msg);
+        $this->expectException(\Magento\Framework\Exception\LocalizedException::class);
+        $this->expectExceptionMessage($msg);
         $this->_layout->addContainer('container', 'Container', ['htmlTag' => 'span']);
     }
 
diff --git a/dev/tests/integration/testsuite/Magento/Review/Model/ResourceModel/RatingTest.php b/dev/tests/integration/testsuite/Magento/Review/Model/ResourceModel/RatingTest.php
index c88bd5ed7cf..7801cb2c78c 100644
--- a/dev/tests/integration/testsuite/Magento/Review/Model/ResourceModel/RatingTest.php
+++ b/dev/tests/integration/testsuite/Magento/Review/Model/ResourceModel/RatingTest.php
@@ -77,7 +77,8 @@ class RatingTest extends \PHPUnit\Framework\TestCase
      */
     public function testRatingSaveWithError()
     {
-        $this->expectException('Exception', 'Rolled back transaction has not been completed correctly');
+        $this->expectException('Exception');
+        $this->expectExceptionMessage('Rolled back transaction has not been completed correctly');
         $rating = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create(
             \Magento\Review\Model\Rating::class
         );
-- 
GitLab


From 3dbfc5e79abff5dbd15c4f712e64737106cf77e4 Mon Sep 17 00:00:00 2001
From: Fabian Schmengler <fs@integer-net.de>
Date: Wed, 27 Sep 2017 20:50:36 +0200
Subject: [PATCH 006/380] Convert phrase to string

---
 .../unit/testsuite/Magento/Test/Bootstrap/SettingsTest.php      | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/dev/tests/integration/framework/tests/unit/testsuite/Magento/Test/Bootstrap/SettingsTest.php b/dev/tests/integration/framework/tests/unit/testsuite/Magento/Test/Bootstrap/SettingsTest.php
index 26e6b59ede0..9964ec7f8c5 100644
--- a/dev/tests/integration/framework/tests/unit/testsuite/Magento/Test/Bootstrap/SettingsTest.php
+++ b/dev/tests/integration/framework/tests/unit/testsuite/Magento/Test/Bootstrap/SettingsTest.php
@@ -200,7 +200,7 @@ class SettingsTest extends \PHPUnit\Framework\TestCase
     public function testGetAsConfigFileException($settingName, $expectedExceptionMsg)
     {
         $this->expectException(\Magento\Framework\Exception\LocalizedException::class);
-        $this->expectExceptionMessage($expectedExceptionMsg);
+        $this->expectExceptionMessage((string)$expectedExceptionMsg);
         $this->_object->getAsConfigFile($settingName);
     }
 
-- 
GitLab


From 0253aecce5261c0543b203c727ba28a574caf70a Mon Sep 17 00:00:00 2001
From: Fabian Schmengler <fs@integer-net.de>
Date: Wed, 27 Sep 2017 20:57:36 +0200
Subject: [PATCH 007/380] Distinguish between non existing SKU and missing SKU
 in API test

---
 .../product_options_update_negative.php       | 37 ++++++++++++-------
 1 file changed, 24 insertions(+), 13 deletions(-)

diff --git a/dev/tests/api-functional/testsuite/Magento/Catalog/Api/_files/product_options_update_negative.php b/dev/tests/api-functional/testsuite/Magento/Catalog/Api/_files/product_options_update_negative.php
index 1e713424f80..08a14c2e7b2 100644
--- a/dev/tests/api-functional/testsuite/Magento/Catalog/Api/_files/product_options_update_negative.php
+++ b/dev/tests/api-functional/testsuite/Magento/Catalog/Api/_files/product_options_update_negative.php
@@ -5,18 +5,29 @@
  */
 
 return [
-    'missed_product_sku' =>
+    'missing_product_sku' => [
         [
-            [
-                'title' => 'title',
-                'type' => 'field',
-                'sort_order' => 1,
-                'is_require' => 1,
-                'price' => 10.0,
-                'price_type' => 'fixed',
-                'sku' => 'sku1',
-                'max_characters' => 10,
-            ],
-            'ProductSku should be specified',
-        ]
+            'title'          => 'title',
+            'type'           => 'field',
+            'sort_order'     => 1,
+            'is_require'     => 1,
+            'price'          => 10.0,
+            'price_type'     => 'fixed',
+            'max_characters' => 10,
+        ],
+        'ProductSku should be specified',
+    ],
+    'invalid_product_sku' => [
+        [
+            'title'          => 'title',
+            'type'           => 'field',
+            'sort_order'     => 1,
+            'is_require'     => 1,
+            'price'          => 10.0,
+            'price_type'     => 'fixed',
+            'sku'            => 'sku1',
+            'max_characters' => 10,
+        ],
+        'Requested product doesn\'t exist',
+    ],
 ];
-- 
GitLab


From 0888e8ce84d9f29c97e7c1997b7ff243990c5201 Mon Sep 17 00:00:00 2001
From: marina <marina.gociu@gmail.com>
Date: Mon, 9 Oct 2017 23:57:23 +0300
Subject: [PATCH 008/380] Stop throwing exception in order to send sitemap
 errors by email

---
 app/code/Magento/Sitemap/Model/Observer.php | 1 -
 1 file changed, 1 deletion(-)

diff --git a/app/code/Magento/Sitemap/Model/Observer.php b/app/code/Magento/Sitemap/Model/Observer.php
index 3ae3061310a..54f91bebea7 100644
--- a/app/code/Magento/Sitemap/Model/Observer.php
+++ b/app/code/Magento/Sitemap/Model/Observer.php
@@ -113,7 +113,6 @@ class Observer
                 $sitemap->generateXml();
             } catch (\Exception $e) {
                 $errors[] = $e->getMessage();
-                throw $e;
             }
         }
 
-- 
GitLab


From 3fc3c1dc76bf643915b752dbe13b064e3cbc858e Mon Sep 17 00:00:00 2001
From: marina <marina.gociu@gmail.com>
Date: Tue, 10 Oct 2017 00:06:27 +0300
Subject: [PATCH 009/380] Remove undefined _translateModel property

The lines were a reminiscence from when the translation logic was in the
core module. The logic was replaced with the correct use of the
inlineTranslation property that is also present at the end of the method.
---
 app/code/Magento/Sitemap/Model/Observer.php | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/app/code/Magento/Sitemap/Model/Observer.php b/app/code/Magento/Sitemap/Model/Observer.php
index 54f91bebea7..840a6a1858f 100644
--- a/app/code/Magento/Sitemap/Model/Observer.php
+++ b/app/code/Magento/Sitemap/Model/Observer.php
@@ -121,8 +121,7 @@ class Observer
             \Magento\Store\Model\ScopeInterface::SCOPE_STORE
         )
         ) {
-            $translate = $this->_translateModel->getTranslateInline();
-            $this->_translateModel->setTranslateInline(false);
+            $this->inlineTranslation->suspend();
 
             $this->_transportBuilder->setTemplateIdentifier(
                 $this->_scopeConfig->getValue(
-- 
GitLab


From 836cb3042c77d7b5899b4ed48373490da678be8b Mon Sep 17 00:00:00 2001
From: Ben Robie <brobie@degdigital.com>
Date: Mon, 9 Oct 2017 22:59:05 -0500
Subject: [PATCH 010/380] Defaulting missing alt-text for a product to use the
 product name.

https://github.com/magento/magento2/issues/9931
---
 app/code/Magento/Catalog/Block/Product/View/Gallery.php | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/app/code/Magento/Catalog/Block/Product/View/Gallery.php b/app/code/Magento/Catalog/Block/Product/View/Gallery.php
index 44dd3b9f97c..661132457b9 100644
--- a/app/code/Magento/Catalog/Block/Product/View/Gallery.php
+++ b/app/code/Magento/Catalog/Block/Product/View/Gallery.php
@@ -116,7 +116,7 @@ class Gallery extends \Magento\Catalog\Block\Product\View\AbstractView
                 'thumb' => $image->getData('small_image_url'),
                 'img' => $image->getData('medium_image_url'),
                 'full' => $image->getData('large_image_url'),
-                'caption' => $image->getLabel(),
+                'caption' => ($image->getLabel() ?: $this->getProduct()->getName()),
                 'position' => $image->getPosition(),
                 'isMain' => $this->isMainImage($image),
                 'type' => str_replace('external-', '', $image->getMediaType()),
-- 
GitLab


From 3381ec061baa7cdc4710ab2d025b046e06eb0f57 Mon Sep 17 00:00:00 2001
From: Ben Robie <brobie@degdigital.com>
Date: Tue, 10 Oct 2017 08:58:16 -0500
Subject: [PATCH 011/380] Adding unit test coverage for
 Catalog/Block/Product/View/Gallery's getGalleryImagesJson() function

https://github.com/magento/magento2/issues/9931
---
 .../Unit/Block/Product/View/GalleryTest.php   | 103 ++++++++++++++++++
 1 file changed, 103 insertions(+)

diff --git a/app/code/Magento/Catalog/Test/Unit/Block/Product/View/GalleryTest.php b/app/code/Magento/Catalog/Test/Unit/Block/Product/View/GalleryTest.php
index ec7779fcbb7..b3fbe7d040e 100644
--- a/app/code/Magento/Catalog/Test/Unit/Block/Product/View/GalleryTest.php
+++ b/app/code/Magento/Catalog/Test/Unit/Block/Product/View/GalleryTest.php
@@ -77,6 +77,83 @@ class GalleryTest extends \PHPUnit\Framework\TestCase
             ->willReturn($this->registry);
     }
 
+    public function testGetGalleryImagesJsonWithLabel(){
+        $this->prepareGetGalleryImagesJsonMocks();
+        $json = $this->model->getGalleryImagesJson();
+        $decodedJson = json_decode($json, true);
+        $this->assertEquals('product_page_image_small_url', $decodedJson[0]['thumb']);
+        $this->assertEquals('product_page_image_medium_url', $decodedJson[0]['img']);
+        $this->assertEquals('product_page_image_large_url', $decodedJson[0]['full']);
+        $this->assertEquals('test_label', $decodedJson[0]['caption']);
+        $this->assertEquals('2', $decodedJson[0]['position']);
+        $this->assertEquals(false, $decodedJson[0]['isMain']);
+        $this->assertEquals('test_media_type', $decodedJson[0]['type']);
+        $this->assertEquals('test_video_url', $decodedJson[0]['videoUrl']);
+    }
+
+    public function testGetGalleryImagesJsonWithoutLabel(){
+        $this->prepareGetGalleryImagesJsonMocks(false);
+        $json = $this->model->getGalleryImagesJson();
+        $decodedJson = json_decode($json, true);
+        $this->assertEquals('test_product_name', $decodedJson[0]['caption']);
+
+    }
+
+    private function prepareGetGalleryImagesJsonMocks($hasLabel = true){
+        $storeMock = $this->getMockBuilder(\Magento\Store\Model\Store::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $productMock = $this->getMockBuilder(\Magento\Catalog\Model\Product::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $productTypeMock = $this->getMockBuilder(\Magento\Catalog\Model\Product\Type\AbstractType::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $productTypeMock->expects($this->any())
+            ->method('getStoreFilter')
+            ->with($productMock)
+            ->willReturn($storeMock);
+
+        $productMock->expects($this->any())
+            ->method('getTypeInstance')
+            ->willReturn($productTypeMock);
+        $productMock->expects($this->any())
+            ->method('getMediaGalleryImages')
+            ->willReturn($this->getImagesCollectionWithPopulatedDataObject($hasLabel));
+        $productMock->expects($this->any())
+            ->method('getName')
+            ->willReturn('test_product_name');
+
+        $this->registry->expects($this->any())
+            ->method('registry')
+            ->with('product')
+            ->willReturn($productMock);
+
+        $this->imageHelper->expects($this->any())
+            ->method('init')
+            ->willReturnMap([
+                [$productMock, 'product_page_image_small', [], $this->imageHelper],
+                [$productMock, 'product_page_image_medium_no_frame', [], $this->imageHelper],
+                [$productMock, 'product_page_image_large_no_frame', [], $this->imageHelper],
+            ])
+            ->willReturnSelf();
+        $this->imageHelper->expects($this->any())
+            ->method('setImageFile')
+            ->with('test_file')
+            ->willReturnSelf();
+        $this->imageHelper->expects($this->at(2))
+            ->method('getUrl')
+            ->willReturn('product_page_image_small_url');
+        $this->imageHelper->expects($this->at(5))
+            ->method('getUrl')
+            ->willReturn('product_page_image_medium_url');
+        $this->imageHelper->expects($this->at(8))
+            ->method('getUrl')
+            ->willReturn('product_page_image_large_url');
+    }
+
     public function testGetGalleryImages()
     {
         $storeMock = $this->getMockBuilder(\Magento\Store\Model\Store::class)
@@ -154,4 +231,30 @@ class GalleryTest extends \PHPUnit\Framework\TestCase
 
         return $collectionMock;
     }
+
+    /**
+     * @return \Magento\Framework\Data\Collection
+     */
+    private function getImagesCollectionWithPopulatedDataObject($hasLabel)
+    {
+        $collectionMock = $this->getMockBuilder(\Magento\Framework\Data\Collection::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $items = [
+            new \Magento\Framework\DataObject([
+                'file' => 'test_file',
+                'label' => ($hasLabel ? 'test_label' : ''),
+                'position' => '2',
+                'media_type' => 'external-test_media_type',
+                "video_url" => 'test_video_url'
+            ]),
+        ];
+
+        $collectionMock->expects($this->any())
+            ->method('getIterator')
+            ->willReturn(new \ArrayIterator($items));
+
+        return $collectionMock;
+    }
 }
-- 
GitLab


From 0f1b58f99d2eec7226b4cb1af8c099f901353b2b Mon Sep 17 00:00:00 2001
From: Ben Robie <brobie@degdigital.com>
Date: Tue, 10 Oct 2017 10:01:21 -0500
Subject: [PATCH 012/380] Correcting code to conform with static code testing.

https://github.com/magento/magento2/issues/9931
---
 .../Catalog/Test/Unit/Block/Product/View/GalleryTest.php | 9 ++++++---
 1 file changed, 6 insertions(+), 3 deletions(-)

diff --git a/app/code/Magento/Catalog/Test/Unit/Block/Product/View/GalleryTest.php b/app/code/Magento/Catalog/Test/Unit/Block/Product/View/GalleryTest.php
index b3fbe7d040e..707cc00d1a9 100644
--- a/app/code/Magento/Catalog/Test/Unit/Block/Product/View/GalleryTest.php
+++ b/app/code/Magento/Catalog/Test/Unit/Block/Product/View/GalleryTest.php
@@ -77,7 +77,8 @@ class GalleryTest extends \PHPUnit\Framework\TestCase
             ->willReturn($this->registry);
     }
 
-    public function testGetGalleryImagesJsonWithLabel(){
+    public function testGetGalleryImagesJsonWithLabel()
+    {
         $this->prepareGetGalleryImagesJsonMocks();
         $json = $this->model->getGalleryImagesJson();
         $decodedJson = json_decode($json, true);
@@ -91,7 +92,8 @@ class GalleryTest extends \PHPUnit\Framework\TestCase
         $this->assertEquals('test_video_url', $decodedJson[0]['videoUrl']);
     }
 
-    public function testGetGalleryImagesJsonWithoutLabel(){
+    public function testGetGalleryImagesJsonWithoutLabel()
+    {
         $this->prepareGetGalleryImagesJsonMocks(false);
         $json = $this->model->getGalleryImagesJson();
         $decodedJson = json_decode($json, true);
@@ -99,7 +101,8 @@ class GalleryTest extends \PHPUnit\Framework\TestCase
 
     }
 
-    private function prepareGetGalleryImagesJsonMocks($hasLabel = true){
+    private function prepareGetGalleryImagesJsonMocks($hasLabel = true)
+    {
         $storeMock = $this->getMockBuilder(\Magento\Store\Model\Store::class)
             ->disableOriginalConstructor()
             ->getMock();
-- 
GitLab


From 7f44e668c0bb6119514f544b63e16db19a072ccb Mon Sep 17 00:00:00 2001
From: Ben Robie <brobie@degdigital.com>
Date: Tue, 10 Oct 2017 21:41:20 -0500
Subject: [PATCH 013/380] Correcting code to conform with static code testing.

https://github.com/magento/magento2/issues/9931
---
 .../Magento/Catalog/Test/Unit/Block/Product/View/GalleryTest.php | 1 -
 1 file changed, 1 deletion(-)

diff --git a/app/code/Magento/Catalog/Test/Unit/Block/Product/View/GalleryTest.php b/app/code/Magento/Catalog/Test/Unit/Block/Product/View/GalleryTest.php
index 707cc00d1a9..e0ba6531c8a 100644
--- a/app/code/Magento/Catalog/Test/Unit/Block/Product/View/GalleryTest.php
+++ b/app/code/Magento/Catalog/Test/Unit/Block/Product/View/GalleryTest.php
@@ -98,7 +98,6 @@ class GalleryTest extends \PHPUnit\Framework\TestCase
         $json = $this->model->getGalleryImagesJson();
         $decodedJson = json_decode($json, true);
         $this->assertEquals('test_product_name', $decodedJson[0]['caption']);
-
     }
 
     private function prepareGetGalleryImagesJsonMocks($hasLabel = true)
-- 
GitLab


From ccb38abcb7b4db5691fadca76da71211b223846b Mon Sep 17 00:00:00 2001
From: Danny Verkade <danny@cream.nl>
Date: Wed, 11 Oct 2017 22:13:05 +0200
Subject: [PATCH 014/380] Fix #11236: - Changed side-menu.phtml to have naming
 in line with the naming in home.phtml. Component was the name in < Magento
 2.2 - Updated the less files to reflect these changes and switched the icons
 in the menu - Updated compiled setup.css file

---
 .../web/app/updater/styles/less/components/_menu.less        | 5 +++--
 setup/pub/styles/setup.css                                   | 2 +-
 setup/view/magento/setup/navigation/side-menu.phtml          | 2 +-
 3 files changed, 5 insertions(+), 4 deletions(-)

diff --git a/app/design/adminhtml/Magento/backend/web/app/updater/styles/less/components/_menu.less b/app/design/adminhtml/Magento/backend/web/app/updater/styles/less/components/_menu.less
index 2c7939e8064..25f411f6f1b 100644
--- a/app/design/adminhtml/Magento/backend/web/app/updater/styles/less/components/_menu.less
+++ b/app/design/adminhtml/Magento/backend/web/app/updater/styles/less/components/_menu.less
@@ -56,7 +56,8 @@
         }
     }
 
-    .item-component {
+    .item-component,
+    .item-extension {
         > a {
             &:before {
                 content: @icon-lego__content;
@@ -64,7 +65,7 @@
         }
     }
 
-    .item-extension {
+    .item-module {
         > a {
             &:before {
                 content: @icon-module__content;
diff --git a/setup/pub/styles/setup.css b/setup/pub/styles/setup.css
index 71a96f8e5bb..13dc7b2a043 100644
--- a/setup/pub/styles/setup.css
+++ b/setup/pub/styles/setup.css
@@ -3,4 +3,4 @@
  * See COPYING.txt for license details.
  */
 
-.abs-action-delete,.abs-icon,.action-close:before,.action-next:before,.action-previous:before,.admin-user .admin__action-dropdown:before,.admin__action-multiselect-dropdown:before,.admin__action-multiselect-search-label:before,.admin__control-checkbox+label:before,.admin__control-collapsible .admin__collapsible-block-wrapper .fieldset-wrapper-title .action-delete:before,.admin__control-table .action-delete:before,.admin__current-filters-list .action-remove:before,.admin__data-grid-action-bookmarks .action-delete:before,.admin__data-grid-action-bookmarks .action-edit:before,.admin__data-grid-action-bookmarks .action-submit:before,.admin__data-grid-action-bookmarks .admin__action-dropdown:before,.admin__data-grid-action-columns .admin__action-dropdown:before,.admin__data-grid-action-export .admin__action-dropdown:before,.admin__field-fallback-reset:before,.admin__menu .level-0>a:before,.admin__page-nav-item-message .admin__page-nav-item-message-icon,.admin__page-nav-title._collapsible:after,.data-grid-filters-action-wrap .action-default:before,.data-grid-row-changed:after,.data-grid-row-parent>td .data-grid-checkbox-cell-inner:before,.data-grid-search-control-wrap .action-submit:before,.extensions-information .list .extension-delete,.icon-failed:before,.icon-success:before,.notifications-action:before,.notifications-close:before,.page-actions .page-actions-buttons>button.action-back:before,.page-actions .page-actions-buttons>button.back:before,.page-actions>button.action-back:before,.page-actions>button.back:before,.page-title-jumbo-success:before,.search-global-label:before,.selectmenu .action-delete:before,.selectmenu .action-edit:before,.selectmenu .action-save:before,.setup-home-item:before,.sticky-header .data-grid-search-control-wrap .data-grid-search-label:before,.store-switcher .dropdown-menu .dropdown-toolbar a:before,.tooltip .help a:before,.tooltip .help span:before{-webkit-font-smoothing:antialiased;font-family:Icons;font-style:normal;font-weight:400;line-height:1;speak:none}.validation-symbol:after{color:#e22626;content:'*';font-weight:400;margin-left:3px}.abs-modal-overlay,.modals-overlay{background:rgba(0,0,0,.35);bottom:0;left:0;position:fixed;right:0;top:0}.abs-action-delete>span,.abs-visually-hidden,.action-multicheck-wrap .action-multicheck-toggle>span,.admin__actions-switch-checkbox,.admin__control-fields .admin__field:nth-child(n+2):not(.admin__field-option):not(.admin__field-group-show-label)>.admin__field-label,.admin__field-tooltip .admin__field-tooltip-action span,.customize-your-store .customize-your-store-default .legend,.extensions-information .list .extension-delete>span,.form-el-checkbox,.form-el-radio,.selectmenu .action-delete>span,.selectmenu .action-edit>span,.selectmenu .action-save>span,.selectmenu-toggle span,.tooltip .help a span,.tooltip .help span span,[class*=admin__control-grouped]>.admin__field:nth-child(n+2):not(.admin__field-option):not(.admin__field-group-show-label):not(.admin__field-date)>.admin__field-label{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.abs-visually-hidden-reset,.admin__field-group-columns>.admin__field:nth-child(n+2):not(.admin__field-option):not(.admin__field-group-show-label):not(.admin__field-date)>.admin__field-label[class]{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.abs-clearfix:after,.abs-clearfix:before,.action-multicheck-wrap:after,.action-multicheck-wrap:before,.actions-split:after,.actions-split:before,.admin__control-table-pagination:after,.admin__control-table-pagination:before,.admin__data-grid-action-columns-menu .admin__action-dropdown-menu-content:after,.admin__data-grid-action-columns-menu .admin__action-dropdown-menu-content:before,.admin__data-grid-filters-footer:after,.admin__data-grid-filters-footer:before,.admin__data-grid-filters:after,.admin__data-grid-filters:before,.admin__data-grid-header-row:after,.admin__data-grid-header-row:before,.admin__field-complex:after,.admin__field-complex:before,.modal-slide .magento-message .insert-title-inner:after,.modal-slide .magento-message .insert-title-inner:before,.modal-slide .main-col .insert-title-inner:after,.modal-slide .main-col .insert-title-inner:before,.page-actions._fixed:after,.page-actions._fixed:before,.page-content:after,.page-content:before,.page-header-actions:after,.page-header-actions:before,.page-main-actions:not(._hidden):after,.page-main-actions:not(._hidden):before{content:'';display:table}.abs-clearfix:after,.action-multicheck-wrap:after,.actions-split:after,.admin__control-table-pagination:after,.admin__data-grid-action-columns-menu .admin__action-dropdown-menu-content:after,.admin__data-grid-filters-footer:after,.admin__data-grid-filters:after,.admin__data-grid-header-row:after,.admin__field-complex:after,.modal-slide .magento-message .insert-title-inner:after,.modal-slide .main-col .insert-title-inner:after,.page-actions._fixed:after,.page-content:after,.page-header-actions:after,.page-main-actions:not(._hidden):after{clear:both}.abs-list-reset-styles{margin:0;padding:0;list-style:none}.abs-draggable-handle,.admin__control-collapsible .admin__collapsible-block-wrapper .fieldset-wrapper-title .draggable-handle,.admin__control-table .draggable-handle,.data-grid .data-grid-draggable-row-cell .draggable-handle{cursor:-webkit-grab;cursor:move;font-size:0;margin-top:-4px;padding:0 1rem 0 0;vertical-align:middle;display:inline-block;text-decoration:none}.abs-draggable-handle:before,.admin__control-collapsible .admin__collapsible-block-wrapper .fieldset-wrapper-title .draggable-handle:before,.admin__control-table .draggable-handle:before,.data-grid .data-grid-draggable-row-cell .draggable-handle:before{-webkit-font-smoothing:antialiased;font-size:1.8rem;line-height:inherit;color:#9e9e9e;content:'\e617';font-family:Icons;vertical-align:middle;display:inline-block;font-weight:400;overflow:hidden;speak:none;text-align:center}.abs-draggable-handle:hover:before,.admin__control-collapsible .admin__collapsible-block-wrapper .fieldset-wrapper-title .draggable-handle:hover:before,.admin__control-table .draggable-handle:hover:before,.data-grid .data-grid-draggable-row-cell .draggable-handle:hover:before{color:#858585}.abs-config-scope-label,.admin__field:not(.admin__field-option)>.admin__field-label span[data-config-scope]:before{bottom:-1.3rem;color:gray;content:attr(data-config-scope);font-size:1.1rem;font-weight:400;min-width:15rem;position:absolute;right:0;text-transform:lowercase}.abs-word-wrap,.admin__field:not(.admin__field-option)>.admin__field-label{overflow-wrap:break-word;word-wrap:break-word;-ms-word-break:break-all;word-break:break-word;-webkit-hyphens:auto;-ms-hyphens:auto;hyphens:auto}html{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;box-sizing:border-box}*,:after,:before{box-sizing:inherit}:focus{box-shadow:none;outline:0}._keyfocus :focus{box-shadow:0 0 0 1px #008bdb}body{margin:0}article,aside,details,figcaption,figure,footer,header,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}mark{background:#ff0;color:#000}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}embed,img,object,video{max-width:100%}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}@font-face{font-family:'Open Sans';src:url(../fonts/opensans/light/opensans-300.eot);src:url(../fonts/opensans/light/opensans-300.eot?#iefix) format('embedded-opentype'),url(../fonts/opensans/light/opensans-300.woff2) format('woff2'),url(../fonts/opensans/light/opensans-300.woff) format('woff'),url(../fonts/opensans/light/opensans-300.ttf) format('truetype'),url('../fonts/opensans/light/opensans-300.svg#Open Sans') format('svg');font-weight:300;font-style:normal}@font-face{font-family:'Open Sans';src:url(../fonts/opensans/regular/opensans-400.eot);src:url(../fonts/opensans/regular/opensans-400.eot?#iefix) format('embedded-opentype'),url(../fonts/opensans/regular/opensans-400.woff2) format('woff2'),url(../fonts/opensans/regular/opensans-400.woff) format('woff'),url(../fonts/opensans/regular/opensans-400.ttf) format('truetype'),url('../fonts/opensans/regular/opensans-400.svg#Open Sans') format('svg');font-weight:400;font-style:normal}@font-face{font-family:'Open Sans';src:url(../fonts/opensans/semibold/opensans-600.eot);src:url(../fonts/opensans/semibold/opensans-600.eot?#iefix) format('embedded-opentype'),url(../fonts/opensans/semibold/opensans-600.woff2) format('woff2'),url(../fonts/opensans/semibold/opensans-600.woff) format('woff'),url(../fonts/opensans/semibold/opensans-600.ttf) format('truetype'),url('../fonts/opensans/semibold/opensans-600.svg#Open Sans') format('svg');font-weight:600;font-style:normal}@font-face{font-family:'Open Sans';src:url(../fonts/opensans/bold/opensans-700.eot);src:url(../fonts/opensans/bold/opensans-700.eot?#iefix) format('embedded-opentype'),url(../fonts/opensans/bold/opensans-700.woff2) format('woff2'),url(../fonts/opensans/bold/opensans-700.woff) format('woff'),url(../fonts/opensans/bold/opensans-700.ttf) format('truetype'),url('../fonts/opensans/bold/opensans-700.svg#Open Sans') format('svg');font-weight:700;font-style:normal}html{font-size:62.5%}body{color:#333;font-family:'Open Sans','Helvetica Neue',Helvetica,Arial,sans-serif;font-style:normal;font-weight:400;line-height:1.36;font-size:1.4rem}h1{margin:0 0 2rem;color:#41362f;font-weight:400;line-height:1.2;font-size:2.8rem}h2{margin:0 0 2rem;color:#41362f;font-weight:400;line-height:1.2;font-size:2rem}h3{margin:0 0 2rem;color:#41362f;font-weight:600;line-height:1.2;font-size:1.7rem}h4,h5,h6{font-weight:600;margin-top:0}p{margin:0 0 1em}small{font-size:1.2rem}a{color:#008bdb;text-decoration:none}a:hover{color:#0fa7ff;text-decoration:underline}dl,ol,ul{padding-left:0}nav ol,nav ul{list-style:none;margin:0;padding:0}html{height:100%}body{background-color:#fff;min-height:100%;min-width:102.4rem}.page-wrapper{background-color:#fff;display:inline-block;margin-left:-4px;vertical-align:top;width:calc(100% - 8.8rem)}.page-content{padding-bottom:3rem;padding-left:3rem;padding-right:3rem}.notices-wrapper{margin:0 3rem}.notices-wrapper .messages{margin-bottom:0}.row{margin-left:0;margin-right:0}.row:after{clear:both;content:'';display:table}.col-l-1,.col-l-10,.col-l-11,.col-l-12,.col-l-2,.col-l-3,.col-l-4,.col-l-5,.col-l-6,.col-l-7,.col-l-8,.col-l-9,.col-m-1,.col-m-10,.col-m-11,.col-m-12,.col-m-2,.col-m-3,.col-m-4,.col-m-5,.col-m-6,.col-m-7,.col-m-8,.col-m-9,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{min-height:1px;padding-left:0;padding-right:0;position:relative}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}.row-gutter{margin-left:-1.5rem;margin-right:-1.5rem}.row-gutter>[class*=col-]{padding-left:1.5rem;padding-right:1.5rem}.abs-clearer:after,.extension-manager-content:after,.extension-manager-title:after,.form-row:after,.header:after,.nav:after,body:after{clear:both;content:'';display:table}.ng-cloak{display:none!important}.hide.hide{display:none}.show.show{display:block}.text-center{text-align:center}.text-right{text-align:right}@font-face{font-family:Icons;src:url(../fonts/icons/icons.eot);src:url(../fonts/icons/icons.eot?#iefix) format('embedded-opentype'),url(../fonts/icons/icons.woff2) format('woff2'),url(../fonts/icons/icons.woff) format('woff'),url(../fonts/icons/icons.ttf) format('truetype'),url(../fonts/icons/icons.svg#Icons) format('svg');font-weight:400;font-style:normal}[class*=icon-]{display:inline-block;line-height:1}.icon-failed:before,.icon-success:before,[class*=icon-]:after{font-family:Icons}.icon-success{color:#79a22e}.icon-success:before{content:'\e62d'}.icon-failed{color:#e22626}.icon-failed:before{content:'\e632'}.icon-success-thick:after{content:'\e62d'}.icon-collapse:after{content:'\e615'}.icon-failed-thick:after{content:'\e632'}.icon-expand:after{content:'\e616'}.icon-warning:after{content:'\e623'}.icon-failed-round,.icon-success-round{border-radius:100%;color:#fff;font-size:2.5rem;height:1em;position:relative;text-align:center;width:1em}.icon-failed-round:after,.icon-success-round:after{bottom:0;font-size:.5em;left:0;position:absolute;right:0;top:.45em}.icon-success-round{background-color:#79a22e}.icon-success-round:after{content:'\e62d'}.icon-failed-round{background-color:#e22626}.icon-failed-round:after{content:'\e632'}dl,ol,ul{margin-top:0}.list{padding-left:0}.list>li{display:block;margin-bottom:.75em;position:relative}.list>li>.icon-failed,.list>li>.icon-success{font-size:1.6em;left:-.1em;position:absolute;top:0}.list>li>.icon-success{color:#79a22e}.list>li>.icon-failed{color:#e22626}.list-item-failed,.list-item-icon,.list-item-success,.list-item-warning{padding-left:3.5rem}.list-item-failed:before,.list-item-success:before,.list-item-warning:before{left:-.1em;position:absolute}.list-item-success:before{color:#79a22e}.list-item-failed:before{color:#e22626}.list-item-warning:before{color:#ef672f}.list-definition{margin:0 0 3rem;padding:0}.list-definition>dt{clear:left;float:left}.list-definition>dd{margin-bottom:1em;margin-left:20rem}.btn-wrap{margin:0 auto}.btn-wrap .btn{width:100%}.btn{background:#e3e3e3;border:none;color:#514943;display:inline-block;font-size:1.6rem;font-weight:600;padding:.45em .9em;text-align:center}.btn:hover{background-color:#dbdbdb;color:#514943;text-decoration:none}.btn:active{background-color:#d6d6d6}.btn.disabled,.btn[disabled]{cursor:default;opacity:.5;pointer-events:none}.ie9 .btn.disabled,.ie9 .btn[disabled]{background-color:#f0f0f0;opacity:1;text-shadow:none}.btn-large{padding:.75em 1.25em}.btn-medium{font-size:1.4rem;padding:.5em 1.5em .6em}.btn-link{background-color:transparent;border:none;color:#008bdb;font-family:1.6rem;font-size:1.5rem}.btn-link:active,.btn-link:focus,.btn-link:hover{background-color:transparent;color:#0fa7ff}.btn-prime{background-color:#eb5202;color:#fff;text-shadow:1px 1px 0 rgba(0,0,0,.25)}.btn-prime:focus,.btn-prime:hover{background-color:#f65405;background-repeat:repeat-x;background-image:linear-gradient(to right,#e04f00 0,#f65405 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#e04f00', endColorstr='#f65405', GradientType=1);color:#fff}.btn-prime:active{background-color:#e04f00;background-repeat:repeat-x;background-image:linear-gradient(to right,#f65405 0,#e04f00 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f65405', endColorstr='#e04f00', GradientType=1);color:#fff}.ie9 .btn-prime.disabled,.ie9 .btn-prime[disabled]{background-color:#fd6e23}.ie9 .btn-prime.disabled:active,.ie9 .btn-prime.disabled:hover,.ie9 .btn-prime[disabled]:active,.ie9 .btn-prime[disabled]:hover{background-color:#fd6e23;-webkit-filter:none;filter:none}.btn-secondary{background-color:#514943;color:#fff}.btn-secondary:hover{background-color:#5f564f;color:#fff}.btn-secondary:active,.btn-secondary:focus{background-color:#574e48;color:#fff}.ie9 .btn-secondary.disabled,.ie9 .btn-secondary[disabled]{background-color:#514943}.ie9 .btn-secondary.disabled:active,.ie9 .btn-secondary[disabled]:active{background-color:#514943;-webkit-filter:none;filter:none}[class*=btn-wrap-triangle]{overflow:hidden;position:relative}[class*=btn-wrap-triangle] .btn:after{border-style:solid;content:'';height:0;position:absolute;top:0;width:0}.btn-wrap-triangle-right{display:inline-block;padding-right:1.74rem;position:relative}.btn-wrap-triangle-right .btn{text-indent:.92rem}.btn-wrap-triangle-right .btn:after{border-color:transparent transparent transparent #e3e3e3;border-width:1.84rem 0 1.84rem 1.84rem;left:100%;margin-left:-1.74rem}.btn-wrap-triangle-right .btn:focus:after,.btn-wrap-triangle-right .btn:hover:after{border-left-color:#dbdbdb}.btn-wrap-triangle-right .btn:active:after{border-left-color:#d6d6d6}.btn-wrap-triangle-right .btn:not(.disabled):active,.btn-wrap-triangle-right .btn:not([disabled]):active{left:1px}.ie9 .btn-wrap-triangle-right .btn.disabled:after,.ie9 .btn-wrap-triangle-right .btn[disabled]:after{border-color:transparent transparent transparent #f0f0f0}.ie9 .btn-wrap-triangle-right .btn.disabled:active:after,.ie9 .btn-wrap-triangle-right .btn.disabled:focus:after,.ie9 .btn-wrap-triangle-right .btn.disabled:hover:after,.ie9 .btn-wrap-triangle-right .btn[disabled]:active:after,.ie9 .btn-wrap-triangle-right .btn[disabled]:focus:after,.ie9 .btn-wrap-triangle-right .btn[disabled]:hover:after{border-left-color:#f0f0f0}.btn-wrap-triangle-right .btn-prime:after{border-color:transparent transparent transparent #eb5202}.btn-wrap-triangle-right .btn-prime:focus:after,.btn-wrap-triangle-right .btn-prime:hover:after{border-left-color:#f65405}.btn-wrap-triangle-right .btn-prime:active:after{border-left-color:#e04f00}.btn-wrap-triangle-right .btn-prime:not(.disabled):active,.btn-wrap-triangle-right .btn-prime:not([disabled]):active{left:1px}.ie9 .btn-wrap-triangle-right .btn-prime.disabled:after,.ie9 .btn-wrap-triangle-right .btn-prime[disabled]:after{border-color:transparent transparent transparent #fd6e23}.ie9 .btn-wrap-triangle-right .btn-prime.disabled:active:after,.ie9 .btn-wrap-triangle-right .btn-prime.disabled:hover:after,.ie9 .btn-wrap-triangle-right .btn-prime[disabled]:active:after,.ie9 .btn-wrap-triangle-right .btn-prime[disabled]:hover:after{border-left-color:#fd6e23}.btn-wrap-triangle-left{display:inline-block;padding-left:1.74rem}.btn-wrap-triangle-left .btn{text-indent:-.92rem}.btn-wrap-triangle-left .btn:after{border-color:transparent #e3e3e3 transparent transparent;border-width:1.84rem 1.84rem 1.84rem 0;margin-right:-1.74rem;right:100%}.btn-wrap-triangle-left .btn:focus:after,.btn-wrap-triangle-left .btn:hover:after{border-right-color:#dbdbdb}.btn-wrap-triangle-left .btn:active:after{border-right-color:#d6d6d6}.btn-wrap-triangle-left .btn:not(.disabled):active,.btn-wrap-triangle-left .btn:not([disabled]):active{right:1px}.ie9 .btn-wrap-triangle-left .btn.disabled:after,.ie9 .btn-wrap-triangle-left .btn[disabled]:after{border-color:transparent #f0f0f0 transparent transparent}.ie9 .btn-wrap-triangle-left .btn.disabled:active:after,.ie9 .btn-wrap-triangle-left .btn.disabled:hover:after,.ie9 .btn-wrap-triangle-left .btn[disabled]:active:after,.ie9 .btn-wrap-triangle-left .btn[disabled]:hover:after{border-right-color:#f0f0f0}.btn-wrap-triangle-left .btn-prime:after{border-color:transparent #eb5202 transparent transparent}.btn-wrap-triangle-left .btn-prime:focus:after,.btn-wrap-triangle-left .btn-prime:hover:after{border-right-color:#e04f00}.btn-wrap-triangle-left .btn-prime:active:after{border-right-color:#f65405}.btn-wrap-triangle-left .btn-prime:not(.disabled):active,.btn-wrap-triangle-left .btn-prime:not([disabled]):active{right:1px}.ie9 .btn-wrap-triangle-left .btn-prime.disabled:after,.ie9 .btn-wrap-triangle-left .btn-prime[disabled]:after{border-color:transparent #fd6e23 transparent transparent}.ie9 .btn-wrap-triangle-left .btn-prime.disabled:active:after,.ie9 .btn-wrap-triangle-left .btn-prime.disabled:hover:after,.ie9 .btn-wrap-triangle-left .btn-prime[disabled]:active:after,.ie9 .btn-wrap-triangle-left .btn-prime[disabled]:hover:after{border-right-color:#fd6e23}.btn-expand{background-color:transparent;border:none;color:#303030;font-family:'Open Sans','Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.4rem;font-weight:700;padding:0;position:relative}.btn-expand.expanded:after{border-color:transparent transparent #303030;border-width:0 .285em .36em}.btn-expand.expanded:hover:after{border-color:transparent transparent #3d3d3d}.btn-expand:hover{background-color:transparent;border:none;color:#3d3d3d}.btn-expand:hover:after{border-color:#3d3d3d transparent transparent}.btn-expand:after{border-color:#303030 transparent transparent;border-style:solid;border-width:.36em .285em 0;content:'';height:0;left:100%;margin-left:.5em;margin-top:-.18em;position:absolute;top:50%;width:0}[class*=col-] .form-el-input,[class*=col-] .form-el-select{width:100%}.form-fieldset{border:none;margin:0 0 1em;padding:0}.form-row{margin-bottom:2.2rem}.form-row .form-row{margin-bottom:.4rem}.form-row .form-label{display:block;font-weight:600;padding:.6rem 2.1em 0 0;text-align:right}.form-row .form-label.required{position:relative}.form-row .form-label.required:after{color:#eb5202;content:'*';font-size:1.15em;position:absolute;right:.7em;top:.5em}.form-row .form-el-checkbox+.form-label:before,.form-row .form-el-radio+.form-label:before{top:.7rem}.form-row .form-el-checkbox+.form-label:after,.form-row .form-el-radio+.form-label:after{top:1.1rem}.form-row.form-row-text{padding-top:.6rem}.form-row.form-row-text .action-sign-out{font-size:1.2rem;margin-left:1rem}.form-note{font-size:1.2rem;font-weight:600;margin-top:1rem}.form-el-dummy{display:none}.fieldset{border:0;margin:0;min-width:0;padding:0}input:not([disabled]):focus,textarea:not([disabled]):focus{box-shadow:none}.form-el-input{border:1px solid #adadad;color:#303030;padding:.35em .55em .5em}.form-el-input:hover{border-color:#949494}.form-el-input:focus{border-color:#008bdb}.form-el-input:required{box-shadow:none}.form-label{margin-bottom:.5em}[class*=form-label][for]{cursor:pointer}.form-el-insider-wrap{display:table;width:100%}.form-el-insider-input{display:table-cell;width:100%}.form-el-insider{border-radius:2px;display:table-cell;padding:.43em .55em .5em 0;vertical-align:top}.form-legend,.form-legend-expand,.form-legend-light{display:block;margin:0}.form-legend,.form-legend-expand{font-size:1.25em;font-weight:600;margin-bottom:2.5em;padding-top:1.5em}.form-legend{border-top:1px solid #ccc;width:100%}.form-legend-light{font-size:1em;margin-bottom:1.5em}.form-legend-expand{cursor:pointer;transition:opacity .2s linear}.form-legend-expand:hover{opacity:.85}.form-legend-expand.expanded:after{content:'\e615'}.form-legend-expand:after{content:'\e616';font-family:Icons;font-size:1.15em;font-weight:400;margin-left:.5em;vertical-align:sub}.form-el-checkbox.disabled+.form-label,.form-el-checkbox.disabled+.form-label:before,.form-el-checkbox[disabled]+.form-label,.form-el-checkbox[disabled]+.form-label:before,.form-el-radio.disabled+.form-label,.form-el-radio.disabled+.form-label:before,.form-el-radio[disabled]+.form-label,.form-el-radio[disabled]+.form-label:before{cursor:default;opacity:.5;pointer-events:none}.form-el-checkbox:not(.disabled)+.form-label:hover:before,.form-el-checkbox:not([disabled])+.form-label:hover:before,.form-el-radio:not(.disabled)+.form-label:hover:before,.form-el-radio:not([disabled])+.form-label:hover:before{border-color:#514943}.form-el-checkbox+.form-label,.form-el-radio+.form-label{font-weight:400;padding-left:2em;padding-right:0;position:relative;text-align:left;transition:border-color .1s linear}.form-el-checkbox+.form-label:before,.form-el-radio+.form-label:before{border:1px solid;content:'';left:0;position:absolute;top:.1rem;transition:border-color .1s linear}.form-el-checkbox+.form-label:before{background-color:#fff;border-color:#adadad;border-radius:2px;font-size:1.2rem;height:1.6rem;line-height:1.2;width:1.6rem}.form-el-checkbox:checked+.form-label::before{content:'\e62d';font-family:Icons}.form-el-radio+.form-label:before{background-color:#fff;border:1px solid #adadad;border-radius:100%;height:1.8rem;width:1.8rem}.form-el-radio+.form-label:after{background:0 0;border:.5rem solid transparent;border-radius:100%;content:'';height:0;left:.4rem;position:absolute;top:.5rem;transition:background .3s linear;width:0}.form-el-radio:checked+.form-label{cursor:default}.form-el-radio:checked+.form-label:after{border-color:#514943}.form-select-label{border:1px solid #adadad;color:#303030;cursor:pointer;display:block;overflow:hidden;position:relative;z-index:0}.form-select-label:hover,.form-select-label:hover:after{border-color:#949494}.form-select-label:active,.form-select-label:active:after,.form-select-label:focus,.form-select-label:focus:after{border-color:#008bdb}.form-select-label:after{background:#e3e3e3;border-left:1px solid #adadad;bottom:0;content:'';position:absolute;right:0;top:0;width:2.36em;z-index:-2}.ie9 .form-select-label:after{display:none}.form-select-label:before{border-color:#303030 transparent transparent;border-style:solid;border-width:5px 4px 0;content:'';height:0;margin-right:-4px;margin-top:-2.5px;position:absolute;right:1.18em;top:50%;width:0;z-index:-1}.ie9 .form-select-label:before{display:none}.form-select-label .form-el-select{background:0 0;border:none;border-radius:0;content:'';display:block;margin:0;padding:.35em calc(2.36em + 10%) .5em .55em;width:110%}.ie9 .form-select-label .form-el-select{padding-right:.55em;width:100%}.form-select-label .form-el-select::-ms-expand{display:none}.form-el-select{background:#fff;border:1px solid #adadad;border-radius:2px;color:#303030;display:block;padding:.35em .55em}.multiselect-custom{border:1px solid #adadad;height:45.2rem;margin:0 0 1.5rem;overflow:auto;position:relative}.multiselect-custom ul{margin:0;padding:0;list-style:none;min-width:29rem}.multiselect-custom .item{padding:1rem 1.4rem}.multiselect-custom .selected{background-color:#e0f6fe}.multiselect-custom .form-label{margin-bottom:0}[class*=form-el-].invalid{border-color:#e22626}[class*=form-el-].invalid+.error-container{display:block}.error-container{background-color:#fffbbb;border:1px solid #ee7d7d;color:#514943;display:none;font-size:1.19rem;margin-top:.2rem;padding:.8rem 1rem .9rem}.check-result-message{margin-left:.5em;min-height:3.68rem;-ms-align-items:center;-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.check-result-text{margin-left:.5em}body:not([class]){min-width:0}.container{display:block;margin:0 auto 4rem;max-width:100rem;padding:0}.abs-action-delete,.action-close:before,.action-next:before,.action-previous:before,.admin-user .admin__action-dropdown:before,.admin__action-multiselect-dropdown:before,.admin__action-multiselect-search-label:before,.admin__control-checkbox+label:before,.admin__control-collapsible .admin__collapsible-block-wrapper .fieldset-wrapper-title .action-delete:before,.admin__control-table .action-delete:before,.admin__current-filters-list .action-remove:before,.admin__data-grid-action-bookmarks .action-delete:before,.admin__data-grid-action-bookmarks .action-edit:before,.admin__data-grid-action-bookmarks .action-submit:before,.admin__data-grid-action-bookmarks .admin__action-dropdown:before,.admin__data-grid-action-columns .admin__action-dropdown:before,.admin__data-grid-action-export .admin__action-dropdown:before,.admin__field-fallback-reset:before,.admin__menu .level-0>a:before,.admin__page-nav-item-message .admin__page-nav-item-message-icon,.admin__page-nav-title._collapsible:after,.data-grid-filters-action-wrap .action-default:before,.data-grid-row-changed:after,.data-grid-row-parent>td .data-grid-checkbox-cell-inner:before,.data-grid-search-control-wrap .action-submit:before,.extensions-information .list .extension-delete,.icon-failed:before,.icon-success:before,.notifications-action:before,.notifications-close:before,.page-actions .page-actions-buttons>button.action-back:before,.page-actions .page-actions-buttons>button.back:before,.page-actions>button.action-back:before,.page-actions>button.back:before,.page-title-jumbo-success:before,.search-global-label:before,.selectmenu .action-delete:before,.selectmenu .action-edit:before,.selectmenu .action-save:before,.setup-home-item:before,.sticky-header .data-grid-search-control-wrap .data-grid-search-label:before,.store-switcher .dropdown-menu .dropdown-toolbar a:before,.tooltip .help a:before,.tooltip .help span:before{-webkit-font-smoothing:antialiased;font-family:Icons;font-style:normal;font-weight:400;line-height:1;speak:none}.text-stretch{margin-bottom:1.5em}.page-title-jumbo{font-size:4rem;font-weight:300;letter-spacing:-.05em;margin-bottom:2.9rem}.page-title-jumbo-success:before{color:#79a22e;content:'\e62d';font-size:3.9rem;margin-left:-.3rem;margin-right:2.4rem}.list{margin-bottom:3rem}.list-dot .list-item{display:list-item;list-style-position:inside;margin-bottom:1.2rem}.list-title{color:#333;font-size:1.4rem;font-weight:700;letter-spacing:.025em;margin-bottom:1.2rem}.list-item-failed:before,.list-item-success:before,.list-item-warning:before{font-family:Icons;font-size:1.6rem;top:0}.list-item-success:before{content:'\e62d';font-size:1.6rem}.list-item-failed:before{content:'\e632';font-size:1.4rem;left:.1rem;top:.2rem}.list-item-warning:before{content:'\e623';font-size:1.3rem;left:.2rem}.form-wrap{margin-bottom:3.6rem;padding-top:2.1rem}.form-el-label-horizontal{display:inline-block;font-size:1.3rem;font-weight:600;letter-spacing:.025em;margin-bottom:.4rem;margin-left:.4rem}.app-updater{min-width:768px}body._has-modal{height:100%;overflow:hidden;width:100%}.modals-overlay{z-index:899}.modal-popup,.modal-slide{bottom:0;min-width:0;position:fixed;right:0;top:0;visibility:hidden}.modal-popup._show,.modal-slide._show{visibility:visible}.modal-popup._show .modal-inner-wrap,.modal-slide._show .modal-inner-wrap{-ms-transform:translate(0,0);transform:translate(0,0)}.modal-popup .modal-inner-wrap,.modal-slide .modal-inner-wrap{background-color:#fff;box-shadow:0 0 12px 2px rgba(0,0,0,.35);opacity:1;pointer-events:auto}.modal-slide{left:14.8rem;z-index:900}.modal-slide._show .modal-inner-wrap{-ms-transform:translateX(0);transform:translateX(0)}.modal-slide .modal-inner-wrap{height:100%;overflow-y:auto;position:static;-ms-transform:translateX(100%);transform:translateX(100%);transition-duration:.3s;transition-property:transform,visibility;transition-timing-function:ease-in-out;width:auto}.modal-slide._inner-scroll .modal-inner-wrap{overflow-y:visible;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.modal-slide._inner-scroll .modal-footer,.modal-slide._inner-scroll .modal-header{-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0}.modal-slide._inner-scroll .modal-content{overflow-y:auto}.modal-slide._inner-scroll .modal-footer{margin-top:auto}.modal-slide .modal-content,.modal-slide .modal-footer,.modal-slide .modal-header{padding:0 2.6rem 2.6rem}.modal-slide .modal-header{padding-bottom:2.1rem;padding-top:2.1rem}.modal-popup{z-index:900;left:0;overflow-y:auto}.modal-popup._show .modal-inner-wrap{-ms-transform:translateY(0);transform:translateY(0)}.modal-popup .modal-inner-wrap{margin:5rem auto;width:75%;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;box-sizing:border-box;height:auto;left:0;position:absolute;right:0;-ms-transform:translateY(-200%);transform:translateY(-200%);transition-duration:.2s;transition-property:transform,visibility;transition-timing-function:ease}.modal-popup._inner-scroll{overflow-y:visible}.ie10 .modal-popup._inner-scroll,.ie9 .modal-popup._inner-scroll{overflow-y:auto}.modal-popup._inner-scroll .modal-inner-wrap{max-height:90%}.ie10 .modal-popup._inner-scroll .modal-inner-wrap,.ie9 .modal-popup._inner-scroll .modal-inner-wrap{max-height:none}.modal-popup._inner-scroll .modal-content{overflow-y:auto}.modal-popup .modal-content,.modal-popup .modal-footer,.modal-popup .modal-header{padding-left:3rem;padding-right:3rem}.modal-popup .modal-footer,.modal-popup .modal-header{-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0}.modal-popup .modal-header{padding-bottom:1.2rem;padding-top:3rem}.modal-popup .modal-footer{margin-top:auto;padding-bottom:3rem}.modal-popup .modal-footer-actions{text-align:right}.admin__action-dropdown-wrap{display:inline-block;position:relative}.admin__action-dropdown-wrap .admin__action-dropdown-text:after{left:-6px;right:0}.admin__action-dropdown-wrap .admin__action-dropdown-menu{left:auto;right:0}.admin__action-dropdown-wrap._active .admin__action-dropdown,.admin__action-dropdown-wrap.active .admin__action-dropdown{border-color:#007bdb;box-shadow:1px 1px 5px rgba(0,0,0,.5)}.admin__action-dropdown-wrap._active .admin__action-dropdown-text:after,.admin__action-dropdown-wrap.active .admin__action-dropdown-text:after{background-color:#fff;content:'';height:6px;position:absolute;top:100%}.admin__action-dropdown-wrap._active .admin__action-dropdown-menu,.admin__action-dropdown-wrap.active .admin__action-dropdown-menu{display:block}.admin__action-dropdown-wrap._disabled .admin__action-dropdown{cursor:default}.admin__action-dropdown-wrap._disabled:hover .admin__action-dropdown{color:#333}.admin__action-dropdown{background-color:#fff;border:1px solid transparent;border-bottom:none;border-radius:0;box-shadow:none;color:#333;display:inline-block;font-size:1.3rem;font-weight:400;letter-spacing:-.025em;padding:.7rem 3.3rem .8rem 1.5rem;position:relative;vertical-align:baseline;z-index:2}.admin__action-dropdown._active:after,.admin__action-dropdown.active:after{-ms-transform:rotate(180deg);transform:rotate(180deg)}.admin__action-dropdown:after{border-color:#000 transparent transparent;border-style:solid;border-width:.5rem .4rem 0;content:'';height:0;margin-top:-.2rem;position:absolute;top:50%;transition:all .2s linear;width:0}._active .admin__action-dropdown:after,.active .admin__action-dropdown:after{-ms-transform:rotate(180deg);transform:rotate(180deg)}.admin__action-dropdown:hover:after{border-color:#000 transparent transparent}.admin__action-dropdown:focus,.admin__action-dropdown:hover{background-color:#fff;color:#000;text-decoration:none}.admin__action-dropdown:after{right:1.5rem}.admin__action-dropdown:before{margin-right:1rem}.admin__action-dropdown-menu{background-color:#fff;border:1px solid #007bdb;box-shadow:1px 1px 5px rgba(0,0,0,.5);display:none;line-height:1.36;margin-top:-1px;min-width:120%;padding:.5rem 1rem;position:absolute;top:100%;transition:all .15s ease;z-index:1}.admin__action-dropdown-menu>li{display:block}.admin__action-dropdown-menu>li>a{color:#333;display:block;text-decoration:none;padding:.6rem .5rem}.selectmenu{display:inline-block;position:relative;text-align:left;z-index:1}.selectmenu._active{border-color:#007bdb;z-index:500}.selectmenu .action-delete,.selectmenu .action-edit,.selectmenu .action-save{background-color:transparent;border-color:transparent;box-shadow:none;padding:0 1rem}.selectmenu .action-delete:hover,.selectmenu .action-edit:hover,.selectmenu .action-save:hover{background-color:transparent;border-color:transparent;box-shadow:none}.selectmenu .action-delete:before,.selectmenu .action-edit:before,.selectmenu .action-save:before{content:'\e630'}.selectmenu .action-delete,.selectmenu .action-edit{border:0 solid #fff;border-left-width:1px;bottom:0;position:absolute;right:0;top:0;z-index:1}.selectmenu .action-delete:hover,.selectmenu .action-edit:hover{border:0 solid #fff;border-left-width:1px}.selectmenu .action-save:before{content:'\e625'}.selectmenu .action-edit:before{content:'\e631'}.selectmenu-value{display:inline-block}.selectmenu-value input[type=text]{-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;appearance:none;border:0;display:inline;margin:0;width:6rem}body._keyfocus .selectmenu-value input[type=text]:focus{box-shadow:none}.selectmenu-toggle{padding-right:3rem;background:0 0;border-width:0;bottom:0;float:right;position:absolute;right:0;top:0;width:0}.selectmenu-toggle._active:after,.selectmenu-toggle.active:after{-ms-transform:rotate(180deg);transform:rotate(180deg)}.selectmenu-toggle:after{border-color:#000 transparent transparent;border-style:solid;border-width:.5rem .4rem 0;content:'';height:0;margin-top:-.2rem;position:absolute;right:1.1rem;top:50%;transition:all .2s linear;width:0}._active .selectmenu-toggle:after,.active .selectmenu-toggle:after{-ms-transform:rotate(180deg);transform:rotate(180deg)}.selectmenu-toggle:hover:after{border-color:#000 transparent transparent}.selectmenu-toggle:active,.selectmenu-toggle:focus,.selectmenu-toggle:hover{background:0 0}.selectmenu._active .selectmenu-toggle:before{border-color:#007bdb}body._keyfocus .selectmenu-toggle:focus{box-shadow:none}.selectmenu-toggle:before{background:#e3e3e3;border-left:1px solid #adadad;bottom:0;content:'';display:block;position:absolute;right:0;top:0;width:3.2rem}.selectmenu-items{background:#fff;border:1px solid #007bdb;box-shadow:1px 1px 5px rgba(0,0,0,.5);display:none;float:left;left:-1px;margin-top:3px;max-width:20rem;min-width:calc(100% + 2px);position:absolute;top:100%}.selectmenu-items._active{display:block}.selectmenu-items ul{float:left;list-style-type:none;margin:0;min-width:100%;padding:0}.selectmenu-items li{-webkit-flex-direction:row;display:flex;-ms-flex-direction:row;flex-direction:row;transition:background .2s linear}.selectmenu-items li:hover{background:#e3e3e3}.selectmenu-items li:last-child .selectmenu-item-action,.selectmenu-items li:last-child .selectmenu-item-action:visited{color:#008bdb;text-decoration:none}.selectmenu-items li:last-child .selectmenu-item-action:hover{color:#0fa7ff;text-decoration:underline}.selectmenu-items li:last-child .selectmenu-item-action:active{color:#ff5501;text-decoration:underline}.selectmenu-item{position:relative;width:100%;z-index:1}li._edit>.selectmenu-item{display:none}.selectmenu-item-edit{display:none;padding:.3rem 4rem .3rem .4rem;position:relative;white-space:nowrap;z-index:1}li:last-child .selectmenu-item-edit{padding-right:.4rem}.selectmenu-item-edit .admin__control-text{margin:0;width:5.4rem}li._edit .selectmenu-item-edit{display:block}.selectmenu-item-action{-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;appearance:none;background:0 0;border:0;color:#333;display:block;font-size:1.4rem;font-weight:400;min-width:100%;padding:1rem 6rem 1rem 1.5rem;text-align:left;transition:background .2s linear;width:5rem}.selectmenu-item-action:focus,.selectmenu-item-action:hover{background:#e3e3e3}.abs-actions-split-xl .action-default,.page-actions .actions-split .action-default{margin-right:4rem}.abs-actions-split-xl .action-toggle,.page-actions .actions-split .action-toggle{padding-right:4rem}.abs-actions-split-xl .action-toggle:after,.page-actions .actions-split .action-toggle:after{border-width:.9rem .6rem 0;margin-top:-.3rem;right:1.4rem}.actions-split{position:relative;z-index:400}.actions-split._active,.actions-split.active,.actions-split:hover{box-shadow:0 0 0 1px #007bdb}.actions-split._active .action-toggle.action-primary,.actions-split._active .action-toggle.primary,.actions-split.active .action-toggle.action-primary,.actions-split.active .action-toggle.primary{background-color:#ba4000;border-color:#ba4000}.actions-split._active .dropdown-menu,.actions-split.active .dropdown-menu{opacity:1;visibility:visible;display:block}.actions-split .action-default,.actions-split .action-toggle{float:left;margin:0}.actions-split .action-default._active,.actions-split .action-default.active,.actions-split .action-default:hover,.actions-split .action-toggle._active,.actions-split .action-toggle.active,.actions-split .action-toggle:hover{box-shadow:none}.actions-split .action-default{margin-right:3.2rem;min-width:9.3rem}.actions-split .action-toggle{padding-right:3.2rem;border-left-color:rgba(0,0,0,.2);bottom:0;padding-left:0;position:absolute;right:0;top:0}.actions-split .action-toggle._active:after,.actions-split .action-toggle.active:after{-ms-transform:rotate(180deg);transform:rotate(180deg)}.actions-split .action-toggle:after{border-color:#000 transparent transparent;border-style:solid;border-width:.5rem .4rem 0;content:'';height:0;margin-top:-.2rem;position:absolute;right:1.2rem;top:50%;transition:all .2s linear;width:0}._active .actions-split .action-toggle:after,.active .actions-split .action-toggle:after{-ms-transform:rotate(180deg);transform:rotate(180deg)}.actions-split .action-toggle:hover:after{border-color:#000 transparent transparent}.actions-split .action-toggle.action-primary:after,.actions-split .action-toggle.action-secondary:after,.actions-split .action-toggle.primary:after,.actions-split .action-toggle.secondary:after{border-color:#fff transparent transparent}.actions-split .action-toggle>span{clip:rect(0,0,0,0);overflow:hidden;position:absolute}.action-select-wrap{display:inline-block;position:relative}.action-select-wrap .action-select{padding-right:3.2rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;background-color:#fff;font-weight:400;text-align:left}.action-select-wrap .action-select._active:after,.action-select-wrap .action-select.active:after{-ms-transform:rotate(180deg);transform:rotate(180deg)}.action-select-wrap .action-select:after{border-color:#000 transparent transparent;border-style:solid;border-width:.5rem .4rem 0;content:'';height:0;margin-top:-.2rem;position:absolute;right:1.2rem;top:50%;transition:all .2s linear;width:0}._active .action-select-wrap .action-select:after,.active .action-select-wrap .action-select:after{-ms-transform:rotate(180deg);transform:rotate(180deg)}.action-select-wrap .action-select:hover:after{border-color:#000 transparent transparent}.action-select-wrap .action-select:hover,.action-select-wrap .action-select:hover:before{border-color:#878787}.action-select-wrap .action-select:before{background-color:#e3e3e3;border:1px solid #adadad;bottom:0;content:'';position:absolute;right:0;top:0;width:3.2rem}.action-select-wrap .action-select._active{border-color:#007bdb}.action-select-wrap .action-select._active:before{border-color:#007bdb #007bdb #007bdb #adadad}.action-select-wrap .action-select[disabled]{color:#333}.action-select-wrap .action-select[disabled]:after{border-color:#333 transparent transparent}.action-select-wrap._active{z-index:500}.action-select-wrap._active .action-select,.action-select-wrap._active .action-select:before{border-color:#007bdb}.action-select-wrap._active .action-select:after{-ms-transform:rotate(180deg);transform:rotate(180deg)}.action-select-wrap .abs-action-menu .action-submenu,.action-select-wrap .abs-action-menu .action-submenu .action-submenu,.action-select-wrap .action-menu,.action-select-wrap .action-menu .action-submenu,.action-select-wrap .actions-split .action-menu .action-submenu,.action-select-wrap .actions-split .action-menu .action-submenu .action-submenu,.action-select-wrap .actions-split .dropdown-menu .action-submenu,.action-select-wrap .actions-split .dropdown-menu .action-submenu .action-submenu{max-height:45rem;overflow-y:auto}.action-select-wrap .abs-action-menu .action-submenu ._disabled:hover,.action-select-wrap .abs-action-menu .action-submenu .action-submenu ._disabled:hover,.action-select-wrap .action-menu ._disabled:hover,.action-select-wrap .action-menu .action-submenu ._disabled:hover,.action-select-wrap .actions-split .action-menu .action-submenu ._disabled:hover,.action-select-wrap .actions-split .action-menu .action-submenu .action-submenu ._disabled:hover,.action-select-wrap .actions-split .dropdown-menu .action-submenu ._disabled:hover,.action-select-wrap .actions-split .dropdown-menu .action-submenu .action-submenu ._disabled:hover{background:#fff}.action-select-wrap .abs-action-menu .action-submenu ._disabled .action-menu-item,.action-select-wrap .abs-action-menu .action-submenu .action-submenu ._disabled .action-menu-item,.action-select-wrap .action-menu ._disabled .action-menu-item,.action-select-wrap .action-menu .action-submenu ._disabled .action-menu-item,.action-select-wrap .actions-split .action-menu .action-submenu ._disabled .action-menu-item,.action-select-wrap .actions-split .action-menu .action-submenu .action-submenu ._disabled .action-menu-item,.action-select-wrap .actions-split .dropdown-menu .action-submenu ._disabled .action-menu-item,.action-select-wrap .actions-split .dropdown-menu .action-submenu .action-submenu ._disabled .action-menu-item{cursor:default;opacity:.5}.action-select-wrap .action-menu-items{left:0;position:absolute;right:0;top:100%}.action-select-wrap .action-menu-items>.abs-action-menu .action-submenu,.action-select-wrap .action-menu-items>.abs-action-menu .action-submenu .action-submenu,.action-select-wrap .action-menu-items>.action-menu,.action-select-wrap .action-menu-items>.action-menu .action-submenu,.action-select-wrap .action-menu-items>.actions-split .action-menu .action-submenu,.action-select-wrap .action-menu-items>.actions-split .action-menu .action-submenu .action-submenu,.action-select-wrap .action-menu-items>.actions-split .dropdown-menu .action-submenu,.action-select-wrap .action-menu-items>.actions-split .dropdown-menu .action-submenu .action-submenu{min-width:100%;position:static}.action-select-wrap .action-menu-items>.abs-action-menu .action-submenu .action-submenu,.action-select-wrap .action-menu-items>.abs-action-menu .action-submenu .action-submenu .action-submenu,.action-select-wrap .action-menu-items>.action-menu .action-submenu,.action-select-wrap .action-menu-items>.action-menu .action-submenu .action-submenu,.action-select-wrap .action-menu-items>.actions-split .action-menu .action-submenu .action-submenu,.action-select-wrap .action-menu-items>.actions-split .action-menu .action-submenu .action-submenu .action-submenu,.action-select-wrap .action-menu-items>.actions-split .dropdown-menu .action-submenu .action-submenu,.action-select-wrap .action-menu-items>.actions-split .dropdown-menu .action-submenu .action-submenu .action-submenu{position:absolute}.action-multicheck-wrap{display:inline-block;height:1.6rem;padding-top:1px;position:relative;width:3.1rem;z-index:200}.action-multicheck-wrap:hover .action-multicheck-toggle,.action-multicheck-wrap:hover .admin__control-checkbox+label:before{border-color:#878787}.action-multicheck-wrap._active .action-multicheck-toggle,.action-multicheck-wrap._active .admin__control-checkbox+label:before{border-color:#007bdb}.action-multicheck-wrap._active .abs-action-menu .action-submenu,.action-multicheck-wrap._active .abs-action-menu .action-submenu .action-submenu,.action-multicheck-wrap._active .action-menu,.action-multicheck-wrap._active .action-menu .action-submenu,.action-multicheck-wrap._active .actions-split .action-menu .action-submenu,.action-multicheck-wrap._active .actions-split .action-menu .action-submenu .action-submenu,.action-multicheck-wrap._active .actions-split .dropdown-menu .action-submenu,.action-multicheck-wrap._active .actions-split .dropdown-menu .action-submenu .action-submenu{opacity:1;visibility:visible;display:block}.action-multicheck-wrap._disabled .admin__control-checkbox+label:before{background-color:#fff}.action-multicheck-wrap._disabled .action-multicheck-toggle,.action-multicheck-wrap._disabled .admin__control-checkbox+label:before{border-color:#adadad;opacity:1}.action-multicheck-wrap .action-multicheck-toggle,.action-multicheck-wrap .admin__control-checkbox,.action-multicheck-wrap .admin__control-checkbox+label{float:left}.action-multicheck-wrap .action-multicheck-toggle{border-radius:0 1px 1px 0;height:1.6rem;margin-left:-1px;padding:0;position:relative;transition:border-color .1s linear;width:1.6rem}.action-multicheck-wrap .action-multicheck-toggle._active:after,.action-multicheck-wrap .action-multicheck-toggle.active:after{-ms-transform:rotate(180deg);transform:rotate(180deg)}.action-multicheck-wrap .action-multicheck-toggle:after{border-color:#000 transparent transparent;border-style:solid;border-width:.5rem .4rem 0;content:'';height:0;margin-top:-.2rem;position:absolute;top:50%;transition:all .2s linear;width:0}._active .action-multicheck-wrap .action-multicheck-toggle:after,.active .action-multicheck-wrap .action-multicheck-toggle:after{-ms-transform:rotate(180deg);transform:rotate(180deg)}.action-multicheck-wrap .action-multicheck-toggle:hover:after{border-color:#000 transparent transparent}.action-multicheck-wrap .action-multicheck-toggle:focus{border-color:#007bdb}.action-multicheck-wrap .action-multicheck-toggle:after{right:.3rem}.action-multicheck-wrap .abs-action-menu .action-submenu,.action-multicheck-wrap .abs-action-menu .action-submenu .action-submenu,.action-multicheck-wrap .action-menu,.action-multicheck-wrap .action-menu .action-submenu,.action-multicheck-wrap .actions-split .action-menu .action-submenu,.action-multicheck-wrap .actions-split .action-menu .action-submenu .action-submenu,.action-multicheck-wrap .actions-split .dropdown-menu .action-submenu,.action-multicheck-wrap .actions-split .dropdown-menu .action-submenu .action-submenu{left:-1.1rem;margin-top:1px;right:auto;text-align:left}.action-multicheck-wrap .action-menu-item{white-space:nowrap}.admin__action-multiselect-wrap{display:block;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.admin__action-multiselect-wrap.action-select-wrap:focus{box-shadow:none}.admin__action-multiselect-wrap.action-select-wrap .abs-action-menu .action-submenu,.admin__action-multiselect-wrap.action-select-wrap .abs-action-menu .action-submenu .action-submenu,.admin__action-multiselect-wrap.action-select-wrap .action-menu,.admin__action-multiselect-wrap.action-select-wrap .action-menu .action-submenu,.admin__action-multiselect-wrap.action-select-wrap .actions-split .action-menu .action-submenu,.admin__action-multiselect-wrap.action-select-wrap .actions-split .action-menu .action-submenu .action-submenu,.admin__action-multiselect-wrap.action-select-wrap .actions-split .dropdown-menu .action-submenu,.admin__action-multiselect-wrap.action-select-wrap .actions-split .dropdown-menu .action-submenu .action-submenu{max-height:none;overflow-y:inherit}.admin__action-multiselect-wrap .action-menu-item{transition:background-color .1s linear}.admin__action-multiselect-wrap .action-menu-item._selected{background-color:#e0f6fe}.admin__action-multiselect-wrap .action-menu-item._hover{background-color:#e3e3e3}.admin__action-multiselect-wrap .action-menu-item._unclickable{cursor:default}.admin__action-multiselect-wrap .admin__action-multiselect{border:1px solid #adadad;cursor:pointer;display:block;min-height:3.2rem;padding-right:3.6rem;white-space:normal}.admin__action-multiselect-wrap .admin__action-multiselect:after{bottom:1.25rem;top:auto}.admin__action-multiselect-wrap .admin__action-multiselect:before{height:3.3rem;top:auto}.admin__control-table-wrapper .admin__action-multiselect-wrap{position:static}.admin__control-table-wrapper .admin__action-multiselect-wrap .admin__action-multiselect{position:relative}.admin__control-table-wrapper .admin__action-multiselect-wrap .admin__action-multiselect:before{right:-1px;top:-1px}.admin__control-table-wrapper .admin__action-multiselect-wrap .abs-action-menu .action-submenu,.admin__control-table-wrapper .admin__action-multiselect-wrap .abs-action-menu .action-submenu .action-submenu,.admin__control-table-wrapper .admin__action-multiselect-wrap .action-menu,.admin__control-table-wrapper .admin__action-multiselect-wrap .action-menu .action-submenu,.admin__control-table-wrapper .admin__action-multiselect-wrap .actions-split .action-menu .action-submenu,.admin__control-table-wrapper .admin__action-multiselect-wrap .actions-split .action-menu .action-submenu .action-submenu,.admin__control-table-wrapper .admin__action-multiselect-wrap .actions-split .dropdown-menu .action-submenu,.admin__control-table-wrapper .admin__action-multiselect-wrap .actions-split .dropdown-menu .action-submenu .action-submenu{left:auto;min-width:34rem;right:auto;top:auto;z-index:1}.admin__action-multiselect-wrap .admin__action-multiselect-item-path{color:#a79d95;font-size:1.2rem;font-weight:400;padding-left:1rem}.admin__action-multiselect-actions-wrap{border-top:1px solid #e3e3e3;margin:0 1rem;padding:1rem 0;text-align:center}.admin__action-multiselect-actions-wrap .action-default{font-size:1.3rem;min-width:13rem}.admin__action-multiselect-text{padding:.6rem 1rem}.abs-action-menu .action-submenu,.abs-action-menu .action-submenu .action-submenu,.action-menu,.action-menu .action-submenu,.actions-split .action-menu .action-submenu,.actions-split .action-menu .action-submenu .action-submenu,.actions-split .dropdown-menu .action-submenu,.actions-split .dropdown-menu .action-submenu .action-submenu{text-align:left}.admin__action-multiselect-label{cursor:pointer;position:relative;z-index:1}.admin__action-multiselect-label:before{margin-right:.5rem}._unclickable .admin__action-multiselect-label{cursor:default;font-weight:700}.admin__action-multiselect-search-wrap{border-bottom:1px solid #e3e3e3;margin:0 1rem;padding:1rem 0;position:relative}.admin__action-multiselect-search{padding-right:3rem;width:100%}.admin__action-multiselect-search-label{display:block;font-size:1.5rem;height:1em;overflow:hidden;position:absolute;right:2.2rem;top:1.7rem;width:1em}.admin__action-multiselect-search-label:before{content:'\e60c'}.admin__action-multiselect-search-count{color:#a79d95;margin-top:1rem}.admin__action-multiselect-menu-inner{margin-bottom:0;max-height:46rem;overflow-y:auto}.admin__action-multiselect-menu-inner .admin__action-multiselect-menu-inner{list-style:none;max-height:none;overflow:hidden;padding-left:2.2rem}.admin__action-multiselect-menu-inner ._hidden{display:none}.admin__action-multiselect-crumb{background-color:#f5f5f5;border:1px solid #a79d95;border-radius:1px;display:inline-block;font-size:1.2rem;margin:.3rem -4px .3rem .3rem;padding:.3rem 2.4rem .4rem 1rem;position:relative;transition:border-color .1s linear}.admin__action-multiselect-crumb:hover{border-color:#908379}.admin__action-multiselect-crumb .action-close{bottom:0;font-size:.5em;position:absolute;right:0;top:0;width:2rem}.admin__action-multiselect-crumb .action-close:hover{color:#000}.admin__action-multiselect-crumb .action-close:active,.admin__action-multiselect-crumb .action-close:focus{background-color:transparent}.admin__action-multiselect-crumb .action-close:active{-ms-transform:scale(0.9);transform:scale(0.9)}.admin__action-multiselect-tree .abs-action-menu .action-submenu,.admin__action-multiselect-tree .abs-action-menu .action-submenu .action-submenu,.admin__action-multiselect-tree .action-menu,.admin__action-multiselect-tree .action-menu .action-submenu,.admin__action-multiselect-tree .actions-split .action-menu .action-submenu,.admin__action-multiselect-tree .actions-split .action-menu .action-submenu .action-submenu,.admin__action-multiselect-tree .actions-split .dropdown-menu .action-submenu,.admin__action-multiselect-tree .actions-split .dropdown-menu .action-submenu .action-submenu{min-width:34.7rem}.admin__action-multiselect-tree .abs-action-menu .action-submenu .action-menu-item,.admin__action-multiselect-tree .abs-action-menu .action-submenu .action-submenu .action-menu-item,.admin__action-multiselect-tree .action-menu .action-menu-item,.admin__action-multiselect-tree .action-menu .action-submenu .action-menu-item,.admin__action-multiselect-tree .actions-split .action-menu .action-submenu .action-menu-item,.admin__action-multiselect-tree .actions-split .action-menu .action-submenu .action-submenu .action-menu-item,.admin__action-multiselect-tree .actions-split .dropdown-menu .action-submenu .action-menu-item,.admin__action-multiselect-tree .actions-split .dropdown-menu .action-submenu .action-submenu .action-menu-item{margin-top:.1rem}.admin__action-multiselect-tree .action-menu-item{margin-left:4.2rem;position:relative}.admin__action-multiselect-tree .action-menu-item._expended:before{border-left:1px dashed #a79d95;bottom:0;content:'';left:-1rem;position:absolute;top:1rem;width:1px}.admin__action-multiselect-tree .action-menu-item._expended .admin__action-multiselect-dropdown:before{content:'\e615'}.admin__action-multiselect-tree .action-menu-item._with-checkbox .admin__action-multiselect-label{padding-left:2.6rem}.admin__action-multiselect-tree .admin__action-multiselect-menu-inner{position:relative}.admin__action-multiselect-tree .admin__action-multiselect-menu-inner .admin__action-multiselect-menu-inner{padding-left:3.2rem}.admin__action-multiselect-tree .admin__action-multiselect-menu-inner .admin__action-multiselect-menu-inner:before{left:4.3rem}.admin__action-multiselect-tree .admin__action-multiselect-menu-inner-item{position:relative}.admin__action-multiselect-tree .admin__action-multiselect-menu-inner-item:last-child:before{height:2.1rem}.admin__action-multiselect-tree .admin__action-multiselect-menu-inner-item:after,.admin__action-multiselect-tree .admin__action-multiselect-menu-inner-item:before{content:'';left:0;position:absolute}.admin__action-multiselect-tree .admin__action-multiselect-menu-inner-item:after{border-top:1px dashed #a79d95;height:1px;top:2.1rem;width:5.2rem}.admin__action-multiselect-tree .admin__action-multiselect-menu-inner-item:before{border-left:1px dashed #a79d95;height:100%;top:0;width:1px}.admin__action-multiselect-tree .admin__action-multiselect-menu-inner-item._parent:after{width:4.2rem}.admin__action-multiselect-tree .admin__action-multiselect-menu-inner-item._root{margin-left:-1rem}.admin__action-multiselect-tree .admin__action-multiselect-menu-inner-item._root:after{left:3.2rem;width:2.2rem}.admin__action-multiselect-tree .admin__action-multiselect-menu-inner-item._root:before{left:3.2rem;top:1rem}.admin__action-multiselect-tree .admin__action-multiselect-menu-inner-item._root._parent:after{display:none}.admin__action-multiselect-tree .admin__action-multiselect-menu-inner-item._root:first-child:before{top:2.1rem}.admin__action-multiselect-tree .admin__action-multiselect-menu-inner-item._root:last-child:before{height:1rem}.admin__action-multiselect-tree .admin__action-multiselect-label{line-height:2.2rem;vertical-align:middle;word-break:break-all}.admin__action-multiselect-tree .admin__action-multiselect-label:before{left:0;position:absolute;top:.4rem}.admin__action-multiselect-dropdown{border-radius:50%;height:2.2rem;left:-2.2rem;position:absolute;top:1rem;width:2.2rem;z-index:1}.admin__action-multiselect-dropdown:before{background:#fff;color:#a79d95;content:'\e616';font-size:2.2rem}.admin__actions-switch{display:inline-block;position:relative;vertical-align:middle}.admin__field-control .admin__actions-switch{line-height:3.2rem}.admin__actions-switch+.admin__field-service{min-width:34rem}._disabled .admin__actions-switch-checkbox+.admin__actions-switch-label,.admin__actions-switch-checkbox.disabled+.admin__actions-switch-label{cursor:not-allowed;opacity:.5;pointer-events:none}.admin__actions-switch-checkbox:checked+.admin__actions-switch-label:before{left:15px}.admin__actions-switch-checkbox:checked+.admin__actions-switch-label:after{background:#79a22e}.admin__actions-switch-checkbox:checked+.admin__actions-switch-label .admin__actions-switch-text:before{content:attr(data-text-on)}.admin__actions-switch-checkbox:focus+.admin__actions-switch-label:after,.admin__actions-switch-checkbox:focus+.admin__actions-switch-label:before{border-color:#007bdb}._error .admin__actions-switch-checkbox+.admin__actions-switch-label:after,._error .admin__actions-switch-checkbox+.admin__actions-switch-label:before{border-color:#e22626}.admin__actions-switch-label{cursor:pointer;display:inline-block;height:22px;line-height:22px;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;vertical-align:middle}.admin__actions-switch-label:after,.admin__actions-switch-label:before{left:0;position:absolute;right:auto;top:0}.admin__actions-switch-label:before{background:#fff;border:1px solid #aaa6a0;border-radius:100%;content:'';display:block;height:22px;transition:left .2s ease-in 0s;width:22px;z-index:1}.admin__actions-switch-label:after{background:#e3e3e3;border:1px solid #aaa6a0;border-radius:12px;content:'';display:block;height:22px;transition:background .2s ease-in 0s;vertical-align:middle;width:37px;z-index:0}.admin__actions-switch-text:before{content:attr(data-text-off);padding-left:47px;white-space:nowrap}.abs-action-delete,.abs-action-reset,.action-close,.admin__field-fallback-reset,.extensions-information .list .extension-delete,.notifications-close,.search-global-field._active .search-global-action{background-color:transparent;border:none;border-radius:0;box-shadow:none;margin:0;padding:0}.abs-action-delete:hover,.abs-action-reset:hover,.action-close:hover,.admin__field-fallback-reset:hover,.extensions-information .list .extension-delete:hover,.notifications-close:hover,.search-global-field._active .search-global-action:hover{background-color:transparent;border:none;box-shadow:none}.abs-action-default,.abs-action-pattern,.abs-action-primary,.abs-action-quaternary,.abs-action-secondary,.abs-action-tertiary,.action-default,.action-primary,.action-quaternary,.action-secondary,.action-tertiary,.modal-popup .modal-footer .action-primary,.modal-popup .modal-footer .action-secondary,.page-actions .page-actions-buttons>button,.page-actions .page-actions-buttons>button.action-primary,.page-actions .page-actions-buttons>button.action-secondary,.page-actions .page-actions-buttons>button.primary,.page-actions>button,.page-actions>button.action-primary,.page-actions>button.action-secondary,.page-actions>button.primary,button,button.primary,button.secondary,button.tertiary{border:1px solid;border-radius:0;display:inline-block;font-family:'Open Sans','Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.4rem;font-weight:600;line-height:1.36;padding:.6rem 1em;text-align:center;vertical-align:baseline}.abs-action-default.disabled,.abs-action-default[disabled],.abs-action-pattern.disabled,.abs-action-pattern[disabled],.abs-action-primary.disabled,.abs-action-primary[disabled],.abs-action-quaternary.disabled,.abs-action-quaternary[disabled],.abs-action-secondary.disabled,.abs-action-secondary[disabled],.abs-action-tertiary.disabled,.abs-action-tertiary[disabled],.action-default.disabled,.action-default[disabled],.action-primary.disabled,.action-primary[disabled],.action-quaternary.disabled,.action-quaternary[disabled],.action-secondary.disabled,.action-secondary[disabled],.action-tertiary.disabled,.action-tertiary[disabled],.modal-popup .modal-footer .action-primary.disabled,.modal-popup .modal-footer .action-primary[disabled],.modal-popup .modal-footer .action-secondary.disabled,.modal-popup .modal-footer .action-secondary[disabled],.page-actions .page-actions-buttons>button.action-primary.disabled,.page-actions .page-actions-buttons>button.action-primary[disabled],.page-actions .page-actions-buttons>button.action-secondary.disabled,.page-actions .page-actions-buttons>button.action-secondary[disabled],.page-actions .page-actions-buttons>button.disabled,.page-actions .page-actions-buttons>button.primary.disabled,.page-actions .page-actions-buttons>button.primary[disabled],.page-actions .page-actions-buttons>button[disabled],.page-actions>button.action-primary.disabled,.page-actions>button.action-primary[disabled],.page-actions>button.action-secondary.disabled,.page-actions>button.action-secondary[disabled],.page-actions>button.disabled,.page-actions>button.primary.disabled,.page-actions>button.primary[disabled],.page-actions>button[disabled],button.disabled,button.primary.disabled,button.primary[disabled],button.secondary.disabled,button.secondary[disabled],button.tertiary.disabled,button.tertiary[disabled],button[disabled]{cursor:default;opacity:.5;pointer-events:none}.abs-action-l,.modal-popup .modal-footer .action-primary,.modal-popup .modal-footer .action-secondary,.page-actions .page-actions-buttons>button,.page-actions .page-actions-buttons>button.action-primary,.page-actions .page-actions-buttons>button.action-secondary,.page-actions .page-actions-buttons>button.primary,.page-actions button,.page-actions>button.action-primary,.page-actions>button.action-secondary,.page-actions>button.primary{font-size:1.6rem;letter-spacing:.025em;padding-bottom:.6875em;padding-top:.6875em}.abs-action-delete,.extensions-information .list .extension-delete{display:inline-block;font-size:1.6rem;margin-left:1.2rem;padding-top:.7rem;text-decoration:none;vertical-align:middle}.abs-action-delete:after,.extensions-information .list .extension-delete:after{color:#666;content:'\e630'}.abs-action-delete:hover:after,.extensions-information .list .extension-delete:hover:after{color:#35302c}.abs-action-button-as-link,.action-advanced,.data-grid .action-delete{line-height:1.36;padding:0;color:#008bdb;text-decoration:none;background:0 0;border:0;display:inline;font-weight:400;border-radius:0}.abs-action-button-as-link:visited,.action-advanced:visited,.data-grid .action-delete:visited{color:#008bdb;text-decoration:none}.abs-action-button-as-link:hover,.action-advanced:hover,.data-grid .action-delete:hover{text-decoration:underline}.abs-action-button-as-link:active,.action-advanced:active,.data-grid .action-delete:active{color:#ff5501;text-decoration:underline}.abs-action-button-as-link:hover,.action-advanced:hover,.data-grid .action-delete:hover{color:#0fa7ff}.abs-action-button-as-link:active,.abs-action-button-as-link:focus,.abs-action-button-as-link:hover,.action-advanced:active,.action-advanced:focus,.action-advanced:hover,.data-grid .action-delete:active,.data-grid .action-delete:focus,.data-grid .action-delete:hover{background:0 0;border:0}.abs-action-button-as-link.disabled,.abs-action-button-as-link[disabled],.action-advanced.disabled,.action-advanced[disabled],.data-grid .action-delete.disabled,.data-grid .action-delete[disabled],fieldset[disabled] .abs-action-button-as-link,fieldset[disabled] .action-advanced,fieldset[disabled] .data-grid .action-delete{color:#008bdb;opacity:.5;cursor:default;pointer-events:none;text-decoration:underline}.abs-action-button-as-link:active,.abs-action-button-as-link:not(:focus),.action-advanced:active,.action-advanced:not(:focus),.data-grid .action-delete:active,.data-grid .action-delete:not(:focus){box-shadow:none}.abs-action-button-as-link:focus,.action-advanced:focus,.data-grid .action-delete:focus{color:#0fa7ff}.abs-action-default,button{background:#e3e3e3;border-color:#adadad;color:#514943}.abs-action-default:active,.abs-action-default:focus,.abs-action-default:hover,button:active,button:focus,button:hover{background-color:#dbdbdb;color:#514943;text-decoration:none}.abs-action-primary,.page-actions .page-actions-buttons>button.action-primary,.page-actions .page-actions-buttons>button.primary,.page-actions>button.action-primary,.page-actions>button.primary,button.primary{background-color:#eb5202;border-color:#eb5202;color:#fff;text-shadow:1px 1px 0 rgba(0,0,0,.25)}.abs-action-primary:active,.abs-action-primary:focus,.abs-action-primary:hover,.page-actions .page-actions-buttons>button.action-primary:active,.page-actions .page-actions-buttons>button.action-primary:focus,.page-actions .page-actions-buttons>button.action-primary:hover,.page-actions .page-actions-buttons>button.primary:active,.page-actions .page-actions-buttons>button.primary:focus,.page-actions .page-actions-buttons>button.primary:hover,.page-actions>button.action-primary:active,.page-actions>button.action-primary:focus,.page-actions>button.action-primary:hover,.page-actions>button.primary:active,.page-actions>button.primary:focus,.page-actions>button.primary:hover,button.primary:active,button.primary:focus,button.primary:hover{background-color:#ba4000;border-color:#b84002;box-shadow:0 0 0 1px #007bdb;color:#fff;text-decoration:none}.abs-action-primary.disabled,.abs-action-primary[disabled],.page-actions .page-actions-buttons>button.action-primary.disabled,.page-actions .page-actions-buttons>button.action-primary[disabled],.page-actions .page-actions-buttons>button.primary.disabled,.page-actions .page-actions-buttons>button.primary[disabled],.page-actions>button.action-primary.disabled,.page-actions>button.action-primary[disabled],.page-actions>button.primary.disabled,.page-actions>button.primary[disabled],button.primary.disabled,button.primary[disabled]{cursor:default;opacity:.5;pointer-events:none}.abs-action-secondary,.modal-popup .modal-footer .action-primary,.page-actions .page-actions-buttons>button.action-secondary,.page-actions>button.action-secondary,button.secondary{background-color:#514943;border-color:#514943;color:#fff;text-shadow:1px 1px 1px rgba(0,0,0,.3)}.abs-action-secondary:active,.abs-action-secondary:focus,.abs-action-secondary:hover,.modal-popup .modal-footer .action-primary:active,.modal-popup .modal-footer .action-primary:focus,.modal-popup .modal-footer .action-primary:hover,.page-actions .page-actions-buttons>button.action-secondary:active,.page-actions .page-actions-buttons>button.action-secondary:focus,.page-actions .page-actions-buttons>button.action-secondary:hover,.page-actions>button.action-secondary:active,.page-actions>button.action-secondary:focus,.page-actions>button.action-secondary:hover,button.secondary:active,button.secondary:focus,button.secondary:hover{background-color:#35302c;border-color:#35302c;box-shadow:0 0 0 1px #007bdb;color:#fff;text-decoration:none}.abs-action-secondary:active,.modal-popup .modal-footer .action-primary:active,.page-actions .page-actions-buttons>button.action-secondary:active,.page-actions>button.action-secondary:active,button.secondary:active{background-color:#35302c}.abs-action-tertiary,.modal-popup .modal-footer .action-secondary,button.tertiary{background-color:transparent;border-color:transparent;text-shadow:none;color:#008bdb}.abs-action-tertiary:active,.abs-action-tertiary:focus,.abs-action-tertiary:hover,.modal-popup .modal-footer .action-secondary:active,.modal-popup .modal-footer .action-secondary:focus,.modal-popup .modal-footer .action-secondary:hover,button.tertiary:active,button.tertiary:focus,button.tertiary:hover{background-color:transparent;border-color:transparent;box-shadow:none;color:#0fa7ff;text-decoration:underline}.abs-action-quaternary,.page-actions .page-actions-buttons>button,.page-actions>button{background-color:transparent;border-color:transparent;text-shadow:none;color:#333}.abs-action-quaternary:active,.abs-action-quaternary:focus,.abs-action-quaternary:hover,.page-actions .page-actions-buttons>button:active,.page-actions .page-actions-buttons>button:focus,.page-actions .page-actions-buttons>button:hover,.page-actions>button:active,.page-actions>button:focus,.page-actions>button:hover{background-color:transparent;border-color:transparent;box-shadow:none;color:#1a1a1a}.abs-action-menu,.actions-split .abs-action-menu .action-submenu,.actions-split .abs-action-menu .action-submenu .action-submenu,.actions-split .action-menu,.actions-split .action-menu .action-submenu,.actions-split .actions-split .dropdown-menu .action-submenu,.actions-split .actions-split .dropdown-menu .action-submenu .action-submenu,.actions-split .dropdown-menu{text-align:left;background-color:#fff;border:1px solid #007bdb;border-radius:1px;box-shadow:1px 1px 5px rgba(0,0,0,.5);color:#333;display:none;font-weight:400;left:0;list-style:none;margin:2px 0 0;min-width:0;padding:0;position:absolute;right:0;top:100%}.abs-action-menu._active,.actions-split .abs-action-menu .action-submenu .action-submenu._active,.actions-split .abs-action-menu .action-submenu._active,.actions-split .action-menu .action-submenu._active,.actions-split .action-menu._active,.actions-split .actions-split .dropdown-menu .action-submenu .action-submenu._active,.actions-split .actions-split .dropdown-menu .action-submenu._active,.actions-split .dropdown-menu._active{display:block}.abs-action-menu>li,.actions-split .abs-action-menu .action-submenu .action-submenu>li,.actions-split .abs-action-menu .action-submenu>li,.actions-split .action-menu .action-submenu>li,.actions-split .action-menu>li,.actions-split .actions-split .dropdown-menu .action-submenu .action-submenu>li,.actions-split .actions-split .dropdown-menu .action-submenu>li,.actions-split .dropdown-menu>li{border:none;display:block;padding:0;transition:background-color .1s linear}.abs-action-menu>li>a:hover,.actions-split .abs-action-menu .action-submenu .action-submenu>li>a:hover,.actions-split .abs-action-menu .action-submenu>li>a:hover,.actions-split .action-menu .action-submenu>li>a:hover,.actions-split .action-menu>li>a:hover,.actions-split .actions-split .dropdown-menu .action-submenu .action-submenu>li>a:hover,.actions-split .actions-split .dropdown-menu .action-submenu>li>a:hover,.actions-split .dropdown-menu>li>a:hover{text-decoration:none}.abs-action-menu>li._visible,.abs-action-menu>li:hover,.actions-split .abs-action-menu .action-submenu .action-submenu>li._visible,.actions-split .abs-action-menu .action-submenu .action-submenu>li:hover,.actions-split .abs-action-menu .action-submenu>li._visible,.actions-split .abs-action-menu .action-submenu>li:hover,.actions-split .action-menu .action-submenu>li._visible,.actions-split .action-menu .action-submenu>li:hover,.actions-split .action-menu>li._visible,.actions-split .action-menu>li:hover,.actions-split .actions-split .dropdown-menu .action-submenu .action-submenu>li._visible,.actions-split .actions-split .dropdown-menu .action-submenu .action-submenu>li:hover,.actions-split .actions-split .dropdown-menu .action-submenu>li._visible,.actions-split .actions-split .dropdown-menu .action-submenu>li:hover,.actions-split .dropdown-menu>li._visible,.actions-split .dropdown-menu>li:hover{background-color:#e3e3e3}.abs-action-menu>li:active,.actions-split .abs-action-menu .action-submenu .action-submenu>li:active,.actions-split .abs-action-menu .action-submenu>li:active,.actions-split .action-menu .action-submenu>li:active,.actions-split .action-menu>li:active,.actions-split .actions-split .dropdown-menu .action-submenu .action-submenu>li:active,.actions-split .actions-split .dropdown-menu .action-submenu>li:active,.actions-split .dropdown-menu>li:active{background-color:#cacaca}.abs-action-menu>li._parent,.actions-split .abs-action-menu .action-submenu .action-submenu>li._parent,.actions-split .abs-action-menu .action-submenu>li._parent,.actions-split .action-menu .action-submenu>li._parent,.actions-split .action-menu>li._parent,.actions-split .actions-split .dropdown-menu .action-submenu .action-submenu>li._parent,.actions-split .actions-split .dropdown-menu .action-submenu>li._parent,.actions-split .dropdown-menu>li._parent{-webkit-flex-direction:row;display:flex;-ms-flex-direction:row;flex-direction:row}.abs-action-menu>li._parent>.action-menu-item,.actions-split .abs-action-menu .action-submenu .action-submenu>li._parent>.action-menu-item,.actions-split .abs-action-menu .action-submenu>li._parent>.action-menu-item,.actions-split .action-menu .action-submenu>li._parent>.action-menu-item,.actions-split .action-menu>li._parent>.action-menu-item,.actions-split .actions-split .dropdown-menu .action-submenu .action-submenu>li._parent>.action-menu-item,.actions-split .actions-split .dropdown-menu .action-submenu>li._parent>.action-menu-item,.actions-split .dropdown-menu>li._parent>.action-menu-item{min-width:100%}.abs-action-menu .action-menu-item,.abs-action-menu .item,.actions-split .abs-action-menu .action-submenu .action-menu-item,.actions-split .abs-action-menu .action-submenu .action-submenu .action-menu-item,.actions-split .abs-action-menu .action-submenu .action-submenu .item,.actions-split .abs-action-menu .action-submenu .item,.actions-split .action-menu .action-menu-item,.actions-split .action-menu .action-submenu .action-menu-item,.actions-split .action-menu .action-submenu .item,.actions-split .action-menu .item,.actions-split .actions-split .dropdown-menu .action-submenu .action-menu-item,.actions-split .actions-split .dropdown-menu .action-submenu .action-submenu .action-menu-item,.actions-split .actions-split .dropdown-menu .action-submenu .action-submenu .item,.actions-split .actions-split .dropdown-menu .action-submenu .item,.actions-split .dropdown-menu .action-menu-item,.actions-split .dropdown-menu .item{cursor:pointer;display:block;padding:.6875em 1em}.abs-action-menu .action-submenu,.actions-split .action-menu .action-submenu,.actions-split .action-menu .action-submenu .action-submenu,.actions-split .dropdown-menu .action-submenu{bottom:auto;left:auto;margin-left:0;margin-top:-1px;position:absolute;right:auto;top:auto}.ie9 .abs-action-menu .action-submenu,.ie9 .actions-split .abs-action-menu .action-submenu .action-submenu,.ie9 .actions-split .abs-action-menu .action-submenu .action-submenu .action-submenu,.ie9 .actions-split .action-menu .action-submenu,.ie9 .actions-split .action-menu .action-submenu .action-submenu,.ie9 .actions-split .actions-split .dropdown-menu .action-submenu .action-submenu,.ie9 .actions-split .actions-split .dropdown-menu .action-submenu .action-submenu .action-submenu,.ie9 .actions-split .dropdown-menu .action-submenu{margin-left:99%;margin-top:-3.5rem}.abs-action-menu a.action-menu-item,.actions-split .abs-action-menu .action-submenu .action-submenu a.action-menu-item,.actions-split .abs-action-menu .action-submenu a.action-menu-item,.actions-split .action-menu .action-submenu a.action-menu-item,.actions-split .action-menu a.action-menu-item,.actions-split .actions-split .dropdown-menu .action-submenu .action-submenu a.action-menu-item,.actions-split .actions-split .dropdown-menu .action-submenu a.action-menu-item,.actions-split .dropdown-menu a.action-menu-item{color:#333}.abs-action-menu a.action-menu-item:focus,.actions-split .abs-action-menu .action-submenu .action-submenu a.action-menu-item:focus,.actions-split .abs-action-menu .action-submenu a.action-menu-item:focus,.actions-split .action-menu .action-submenu a.action-menu-item:focus,.actions-split .action-menu a.action-menu-item:focus,.actions-split .actions-split .dropdown-menu .action-submenu .action-submenu a.action-menu-item:focus,.actions-split .actions-split .dropdown-menu .action-submenu a.action-menu-item:focus,.actions-split .dropdown-menu a.action-menu-item:focus{background-color:#e3e3e3;box-shadow:none}.abs-action-wrap-triangle{position:relative}.abs-action-wrap-triangle .action-default{width:100%}.abs-action-wrap-triangle .action-default:after,.abs-action-wrap-triangle .action-default:before{border-style:solid;content:'';height:0;position:absolute;top:0;width:0}.abs-action-wrap-triangle .action-default:active,.abs-action-wrap-triangle .action-default:focus,.abs-action-wrap-triangle .action-default:hover{box-shadow:none}._keyfocus .abs-action-wrap-triangle .action-default:focus{box-shadow:0 0 0 1px #007bdb}.ie10 .abs-action-wrap-triangle .action-default.disabled,.ie10 .abs-action-wrap-triangle .action-default[disabled],.ie9 .abs-action-wrap-triangle .action-default.disabled,.ie9 .abs-action-wrap-triangle .action-default[disabled]{background-color:#fcfcfc;opacity:1;text-shadow:none}.abs-action-wrap-triangle-right{display:inline-block;padding-right:1.6rem;position:relative}.abs-action-wrap-triangle-right .action-default:after,.abs-action-wrap-triangle-right .action-default:before{border-color:transparent transparent transparent #e3e3e3;border-width:1.7rem 0 1.6rem 1.7rem;left:100%;margin-left:-1.7rem}.abs-action-wrap-triangle-right .action-default:before{border-left-color:#949494;right:-1px}.abs-action-wrap-triangle-right .action-default:active:after,.abs-action-wrap-triangle-right .action-default:focus:after,.abs-action-wrap-triangle-right .action-default:hover:after{border-left-color:#dbdbdb}.ie10 .abs-action-wrap-triangle-right .action-default.disabled:after,.ie10 .abs-action-wrap-triangle-right .action-default[disabled]:after,.ie9 .abs-action-wrap-triangle-right .action-default.disabled:after,.ie9 .abs-action-wrap-triangle-right .action-default[disabled]:after{border-color:transparent transparent transparent #fcfcfc}.abs-action-wrap-triangle-right .action-primary:after{border-color:transparent transparent transparent #eb5202}.abs-action-wrap-triangle-right .action-primary:active:after,.abs-action-wrap-triangle-right .action-primary:focus:after,.abs-action-wrap-triangle-right .action-primary:hover:after{border-left-color:#ba4000}.abs-action-wrap-triangle-left{display:inline-block;padding-left:1.6rem}.abs-action-wrap-triangle-left .action-default{text-indent:-.85rem}.abs-action-wrap-triangle-left .action-default:after,.abs-action-wrap-triangle-left .action-default:before{border-color:transparent #e3e3e3 transparent transparent;border-width:1.7rem 1.7rem 1.6rem 0;margin-right:-1.7rem;right:100%}.abs-action-wrap-triangle-left .action-default:before{border-right-color:#949494;left:-1px}.abs-action-wrap-triangle-left .action-default:active:after,.abs-action-wrap-triangle-left .action-default:focus:after,.abs-action-wrap-triangle-left .action-default:hover:after{border-right-color:#dbdbdb}.ie10 .abs-action-wrap-triangle-left .action-default.disabled:after,.ie10 .abs-action-wrap-triangle-left .action-default[disabled]:after,.ie9 .abs-action-wrap-triangle-left .action-default.disabled:after,.ie9 .abs-action-wrap-triangle-left .action-default[disabled]:after{border-color:transparent #fcfcfc transparent transparent}.abs-action-wrap-triangle-left .action-primary:after{border-color:transparent #eb5202 transparent transparent}.abs-action-wrap-triangle-left .action-primary:active:after,.abs-action-wrap-triangle-left .action-primary:focus:after,.abs-action-wrap-triangle-left .action-primary:hover:after{border-right-color:#ba4000}.action-default,button{background:#e3e3e3;border-color:#adadad;color:#514943}.action-default:active,.action-default:focus,.action-default:hover,button:active,button:focus,button:hover{background-color:#dbdbdb;color:#514943;text-decoration:none}.action-primary{background-color:#eb5202;border-color:#eb5202;color:#fff;text-shadow:1px 1px 0 rgba(0,0,0,.25)}.action-primary:active,.action-primary:focus,.action-primary:hover{background-color:#ba4000;border-color:#b84002;box-shadow:0 0 0 1px #007bdb;color:#fff;text-decoration:none}.action-primary.disabled,.action-primary[disabled]{cursor:default;opacity:.5;pointer-events:none}.action-secondary{background-color:#514943;border-color:#514943;color:#fff;text-shadow:1px 1px 1px rgba(0,0,0,.3)}.action-secondary:active,.action-secondary:focus,.action-secondary:hover{background-color:#35302c;border-color:#35302c;box-shadow:0 0 0 1px #007bdb;color:#fff;text-decoration:none}.action-secondary:active{background-color:#35302c}.action-quaternary,.action-tertiary{background-color:transparent;border-color:transparent;text-shadow:none}.action-quaternary:active,.action-quaternary:focus,.action-quaternary:hover,.action-tertiary:active,.action-tertiary:focus,.action-tertiary:hover{background-color:transparent;border-color:transparent;box-shadow:none}.action-tertiary{color:#008bdb}.action-tertiary:active,.action-tertiary:focus,.action-tertiary:hover{color:#0fa7ff;text-decoration:underline}.action-quaternary{color:#333}.action-quaternary:active,.action-quaternary:focus,.action-quaternary:hover{color:#1a1a1a}.action-close>span{clip:rect(0,0,0,0);overflow:hidden;position:absolute}.action-close:active{-ms-transform:scale(0.9);transform:scale(0.9)}.action-close:before{content:'\e62f';transition:color .1s linear}.action-close:hover{cursor:pointer;text-decoration:none}.abs-action-menu .action-submenu,.abs-action-menu .action-submenu .action-submenu,.action-menu,.action-menu .action-submenu,.actions-split .action-menu .action-submenu,.actions-split .action-menu .action-submenu .action-submenu,.actions-split .dropdown-menu .action-submenu,.actions-split .dropdown-menu .action-submenu .action-submenu{background-color:#fff;border:1px solid #007bdb;border-radius:1px;box-shadow:1px 1px 5px rgba(0,0,0,.5);color:#333;display:none;font-weight:400;left:0;list-style:none;margin:2px 0 0;min-width:0;padding:0;position:absolute;right:0;top:100%}.abs-action-menu .action-submenu .action-submenu._active,.abs-action-menu .action-submenu._active,.action-menu .action-submenu._active,.action-menu._active,.actions-split .action-menu .action-submenu .action-submenu._active,.actions-split .action-menu .action-submenu._active,.actions-split .dropdown-menu .action-submenu .action-submenu._active,.actions-split .dropdown-menu .action-submenu._active{display:block}.abs-action-menu .action-submenu .action-submenu>li,.abs-action-menu .action-submenu>li,.action-menu .action-submenu>li,.action-menu>li,.actions-split .action-menu .action-submenu .action-submenu>li,.actions-split .action-menu .action-submenu>li,.actions-split .dropdown-menu .action-submenu .action-submenu>li,.actions-split .dropdown-menu .action-submenu>li{border:none;display:block;padding:0;transition:background-color .1s linear}.abs-action-menu .action-submenu .action-submenu>li>a:hover,.abs-action-menu .action-submenu>li>a:hover,.action-menu .action-submenu>li>a:hover,.action-menu>li>a:hover,.actions-split .action-menu .action-submenu .action-submenu>li>a:hover,.actions-split .action-menu .action-submenu>li>a:hover,.actions-split .dropdown-menu .action-submenu .action-submenu>li>a:hover,.actions-split .dropdown-menu .action-submenu>li>a:hover{text-decoration:none}.abs-action-menu .action-submenu .action-submenu>li._visible,.abs-action-menu .action-submenu .action-submenu>li:hover,.abs-action-menu .action-submenu>li._visible,.abs-action-menu .action-submenu>li:hover,.action-menu .action-submenu>li._visible,.action-menu .action-submenu>li:hover,.action-menu>li._visible,.action-menu>li:hover,.actions-split .action-menu .action-submenu .action-submenu>li._visible,.actions-split .action-menu .action-submenu .action-submenu>li:hover,.actions-split .action-menu .action-submenu>li._visible,.actions-split .action-menu .action-submenu>li:hover,.actions-split .dropdown-menu .action-submenu .action-submenu>li._visible,.actions-split .dropdown-menu .action-submenu .action-submenu>li:hover,.actions-split .dropdown-menu .action-submenu>li._visible,.actions-split .dropdown-menu .action-submenu>li:hover{background-color:#e3e3e3}.abs-action-menu .action-submenu .action-submenu>li:active,.abs-action-menu .action-submenu>li:active,.action-menu .action-submenu>li:active,.action-menu>li:active,.actions-split .action-menu .action-submenu .action-submenu>li:active,.actions-split .action-menu .action-submenu>li:active,.actions-split .dropdown-menu .action-submenu .action-submenu>li:active,.actions-split .dropdown-menu .action-submenu>li:active{background-color:#cacaca}.abs-action-menu .action-submenu .action-submenu>li._parent,.abs-action-menu .action-submenu>li._parent,.action-menu .action-submenu>li._parent,.action-menu>li._parent,.actions-split .action-menu .action-submenu .action-submenu>li._parent,.actions-split .action-menu .action-submenu>li._parent,.actions-split .dropdown-menu .action-submenu .action-submenu>li._parent,.actions-split .dropdown-menu .action-submenu>li._parent{-webkit-flex-direction:row;display:flex;-ms-flex-direction:row;flex-direction:row}.abs-action-menu .action-submenu .action-submenu>li._parent>.action-menu-item,.abs-action-menu .action-submenu>li._parent>.action-menu-item,.action-menu .action-submenu>li._parent>.action-menu-item,.action-menu>li._parent>.action-menu-item,.actions-split .action-menu .action-submenu .action-submenu>li._parent>.action-menu-item,.actions-split .action-menu .action-submenu>li._parent>.action-menu-item,.actions-split .dropdown-menu .action-submenu .action-submenu>li._parent>.action-menu-item,.actions-split .dropdown-menu .action-submenu>li._parent>.action-menu-item{min-width:100%}.abs-action-menu .action-submenu .action-menu-item,.abs-action-menu .action-submenu .action-submenu .action-menu-item,.abs-action-menu .action-submenu .action-submenu .item,.abs-action-menu .action-submenu .item,.action-menu .action-menu-item,.action-menu .action-submenu .action-menu-item,.action-menu .action-submenu .item,.action-menu .item,.actions-split .action-menu .action-submenu .action-menu-item,.actions-split .action-menu .action-submenu .action-submenu .action-menu-item,.actions-split .action-menu .action-submenu .action-submenu .item,.actions-split .action-menu .action-submenu .item,.actions-split .dropdown-menu .action-submenu .action-menu-item,.actions-split .dropdown-menu .action-submenu .action-submenu .action-menu-item,.actions-split .dropdown-menu .action-submenu .action-submenu .item,.actions-split .dropdown-menu .action-submenu .item{cursor:pointer;display:block;padding:.6875em 1em}.abs-action-menu .action-submenu .action-submenu,.action-menu .action-submenu,.actions-split .action-menu .action-submenu .action-submenu,.actions-split .dropdown-menu .action-submenu .action-submenu{bottom:auto;left:auto;margin-left:0;margin-top:-1px;position:absolute;right:auto;top:auto}.ie9 .abs-action-menu .action-submenu .action-submenu,.ie9 .abs-action-menu .action-submenu .action-submenu .action-submenu,.ie9 .action-menu .action-submenu,.ie9 .action-menu .action-submenu .action-submenu,.ie9 .actions-split .action-menu .action-submenu .action-submenu,.ie9 .actions-split .action-menu .action-submenu .action-submenu .action-submenu,.ie9 .actions-split .dropdown-menu .action-submenu .action-submenu,.ie9 .actions-split .dropdown-menu .action-submenu .action-submenu .action-submenu{margin-left:99%;margin-top:-3.5rem}.abs-action-menu .action-submenu .action-submenu a.action-menu-item,.abs-action-menu .action-submenu a.action-menu-item,.action-menu .action-submenu a.action-menu-item,.action-menu a.action-menu-item,.actions-split .action-menu .action-submenu .action-submenu a.action-menu-item,.actions-split .action-menu .action-submenu a.action-menu-item,.actions-split .dropdown-menu .action-submenu .action-submenu a.action-menu-item,.actions-split .dropdown-menu .action-submenu a.action-menu-item{color:#333}.abs-action-menu .action-submenu .action-submenu a.action-menu-item:focus,.abs-action-menu .action-submenu a.action-menu-item:focus,.action-menu .action-submenu a.action-menu-item:focus,.action-menu a.action-menu-item:focus,.actions-split .action-menu .action-submenu .action-submenu a.action-menu-item:focus,.actions-split .action-menu .action-submenu a.action-menu-item:focus,.actions-split .dropdown-menu .action-submenu .action-submenu a.action-menu-item:focus,.actions-split .dropdown-menu .action-submenu a.action-menu-item:focus{background-color:#e3e3e3;box-shadow:none}.messages .message:last-child{margin:0 0 2rem}.message{background:#fffbbb;border:none;border-radius:0;color:#333;font-size:1.4rem;margin:0 0 1px;padding:1.8rem 4rem 1.8rem 5.5rem;position:relative;text-shadow:none}.message:before{background:0 0;border:0;color:#007bdb;content:'\e61a';font-family:Icons;font-size:1.9rem;font-style:normal;font-weight:400;height:auto;left:1.9rem;line-height:inherit;margin-top:-1.3rem;position:absolute;speak:none;text-shadow:none;top:50%;width:auto}.message-notice:before{color:#007bdb;content:'\e61a'}.message-warning:before{color:#eb5202;content:'\e623'}.message-error{background:#fcc}.message-error:before{color:#e22626;content:'\e632';font-size:1.5rem;left:2.2rem;margin-top:-1rem}.message-success:before{color:#79a22e;content:'\e62d'}.message-spinner:before{display:none}.message-spinner .spinner{font-size:2.5rem;left:1.5rem;position:absolute;top:1.5rem}.message-in-rating-edit{margin-left:1.8rem;margin-right:1.8rem}.modal-popup .action-close,.modal-slide .action-close{color:#736963;position:absolute;right:0;top:0;z-index:1}.modal-popup .action-close:active,.modal-slide .action-close:active{-ms-transform:none;transform:none}.modal-popup .action-close:active:before,.modal-slide .action-close:active:before{font-size:1.8rem}.modal-popup .action-close:hover:before,.modal-slide .action-close:hover:before{color:#58504b}.modal-popup .action-close:before,.modal-slide .action-close:before{font-size:2rem}.modal-popup .action-close:focus,.modal-slide .action-close:focus{background-color:transparent}.modal-popup.prompt .prompt-message{padding:2rem 0}.modal-popup.prompt .prompt-message input{width:100%}.modal-popup.confirm .modal-inner-wrap .message,.modal-popup.prompt .modal-inner-wrap .message{background:#fff}.modal-popup.modal-system-messages .modal-inner-wrap{background:#fffbbb}.modal-popup._image-box .modal-inner-wrap{margin:5rem auto;max-width:78rem;position:static}.modal-popup._image-box .thumbnail-preview{padding-bottom:3rem;text-align:center}.modal-popup._image-box .thumbnail-preview .thumbnail-preview-image-block{border:1px solid #ccc;margin:0 auto 2rem;max-width:58rem;padding:2rem}.modal-popup._image-box .thumbnail-preview .thumbnail-preview-image{max-height:54rem}.modal-popup .modal-title{font-size:2.4rem;margin-right:6.4rem}.modal-popup .modal-footer{padding-top:2.6rem;text-align:right}.modal-popup .action-close{padding:3rem}.modal-popup .action-close:active,.modal-popup .action-close:focus{background:0 0;padding-right:3.1rem;padding-top:3.1rem}.modal-slide .modal-content-new-attribute{-webkit-overflow-scrolling:touch;overflow:auto;padding-bottom:0}.modal-slide .modal-content-new-attribute iframe{margin-bottom:-2.5rem}.modal-slide .modal-title{font-size:2.1rem;margin-right:5.7rem}.modal-slide .action-close{padding:2.1rem 2.6rem}.modal-slide .action-close:active{padding-right:2.7rem;padding-top:2.2rem}.modal-slide .page-main-actions{margin-bottom:.6rem;margin-top:2.1rem}.modal-slide .magento-message{padding:0 3rem 3rem;position:relative}.modal-slide .magento-message .insert-title-inner,.modal-slide .main-col .insert-title-inner{border-bottom:1px solid #adadad;margin:0 0 2rem;padding-bottom:.5rem}.modal-slide .magento-message .insert-actions,.modal-slide .main-col .insert-actions{float:right}.modal-slide .magento-message .title,.modal-slide .main-col .title{font-size:1.6rem;padding-top:.5rem}.modal-slide .main-col,.modal-slide .side-col{float:left;padding-bottom:0}.modal-slide .main-col:after,.modal-slide .side-col:after{display:none}.modal-slide .side-col{width:20%}.modal-slide .main-col{padding-right:0;width:80%}.modal-slide .content-footer .form-buttons{float:right}.modal-title{font-weight:400;margin-bottom:0;min-height:1em}.modal-title span{font-size:1.4rem;font-style:italic;margin-left:1rem}.spinner{display:inline-block;font-size:4rem;height:1em;margin-right:1.5rem;position:relative;width:1em}.spinner>span:nth-child(1){animation-delay:.27s;-ms-transform:rotate(-315deg);transform:rotate(-315deg)}.spinner>span:nth-child(2){animation-delay:.36s;-ms-transform:rotate(-270deg);transform:rotate(-270deg)}.spinner>span:nth-child(3){animation-delay:.45s;-ms-transform:rotate(-225deg);transform:rotate(-225deg)}.spinner>span:nth-child(4){animation-delay:.54s;-ms-transform:rotate(-180deg);transform:rotate(-180deg)}.spinner>span:nth-child(5){animation-delay:.63s;-ms-transform:rotate(-135deg);transform:rotate(-135deg)}.spinner>span:nth-child(6){animation-delay:.72s;-ms-transform:rotate(-90deg);transform:rotate(-90deg)}.spinner>span:nth-child(7){animation-delay:.81s;-ms-transform:rotate(-45deg);transform:rotate(-45deg)}.spinner>span:nth-child(8){animation-delay:.9;-ms-transform:rotate(0deg);transform:rotate(0deg)}@keyframes fade{0%{background-color:#514943}100%{background-color:#fff}}.spinner>span{-ms-transform:scale(0.4);transform:scale(0.4);animation-name:fade;animation-duration:.72s;animation-iteration-count:infinite;animation-direction:linear;background-color:#fff;border-radius:6px;clip:rect(0 .28571429em .1em 0);height:.1em;margin-top:.5em;position:absolute;width:1em}.ie9 .spinner{background:url(../images/ajax-loader.gif) center no-repeat}.ie9 .spinner>span{display:none}.popup-loading{background:rgba(255,255,255,.8);border-color:#ef672f;color:#ef672f;font-size:14px;font-weight:700;left:50%;margin-left:-100px;padding:100px 0 10px;position:fixed;text-align:center;top:40%;width:200px;z-index:1003}.popup-loading:after{background-image:url(../images/loader-1.gif);content:'';height:64px;left:50%;margin:-32px 0 0 -32px;position:absolute;top:40%;width:64px;z-index:2}.loading-mask,.loading-old{background:rgba(255,255,255,.4);bottom:0;left:0;position:fixed;right:0;top:0;z-index:2003}.loading-mask img,.loading-old img{display:none}.loading-mask p,.loading-old p{margin-top:118px}.loading-mask .loader,.loading-old .loader{background:url(../images/loader-1.gif) 50% 30% no-repeat #f7f3eb;border-radius:5px;bottom:0;color:#575757;font-size:14px;font-weight:700;height:160px;left:0;margin:auto;opacity:.95;position:absolute;right:0;text-align:center;top:0;width:160px}.admin-user{float:right;line-height:1.36;margin-left:.3rem;z-index:490}.admin-user._active .admin__action-dropdown,.admin-user.active .admin__action-dropdown{border-color:#007bdb;box-shadow:1px 1px 5px rgba(0,0,0,.5)}.admin-user .admin__action-dropdown{height:3.3rem;padding:.7rem 2.8rem .4rem 4rem}.admin-user .admin__action-dropdown._active:after,.admin-user .admin__action-dropdown.active:after{-ms-transform:rotate(180deg);transform:rotate(180deg)}.admin-user .admin__action-dropdown:after{border-color:#777 transparent transparent;border-style:solid;border-width:.5rem .4rem 0;content:'';height:0;margin-top:-.2rem;position:absolute;right:1.3rem;top:50%;transition:all .2s linear;width:0}._active .admin-user .admin__action-dropdown:after,.active .admin-user .admin__action-dropdown:after{-ms-transform:rotate(180deg);transform:rotate(180deg)}.admin-user .admin__action-dropdown:hover:after{border-color:#000 transparent transparent}.admin-user .admin__action-dropdown:before{color:#777;content:'\e600';font-size:2rem;left:1.1rem;margin-top:-1.1rem;position:absolute;top:50%}.admin-user .admin__action-dropdown:hover:before{color:#333}.admin-user .admin__action-dropdown-menu{min-width:20rem;padding-left:1rem;padding-right:1rem}.admin-user .admin__action-dropdown-menu>li>a{padding-left:.5em;padding-right:1.8rem;transition:background-color .1s linear;white-space:nowrap}.admin-user .admin__action-dropdown-menu>li>a:hover{background-color:#e0f6fe;color:#333}.admin-user .admin__action-dropdown-menu>li>a:active{background-color:#c7effd;bottom:-1px;position:relative}.admin-user .admin__action-dropdown-menu .admin-user-name{text-overflow:ellipsis;white-space:nowrap;display:inline-block;max-width:20rem;overflow:hidden;vertical-align:top}.admin-user-account-text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:inline-block;max-width:11.2rem}.search-global{float:right;margin-right:-.3rem;position:relative;z-index:480}.search-global-field{min-width:5rem}.search-global-field._active .search-global-input{background-color:#fff;border-color:#007bdb;box-shadow:1px 1px 5px rgba(0,0,0,.5);padding-right:4rem;width:25rem}.search-global-field._active .search-global-action{display:block;height:3.3rem;position:absolute;right:0;text-indent:-100%;top:0;width:5rem;z-index:3}.search-global-field .autocomplete-results{height:3.3rem;position:absolute;right:0;top:0;width:25rem}.search-global-field .search-global-menu{border:1px solid #007bdb;border-top-color:transparent;box-shadow:1px 1px 5px rgba(0,0,0,.5);left:0;margin-top:-2px;padding:0;position:absolute;right:0;top:100%;z-index:2}.search-global-field .search-global-menu:after{background-color:#fff;content:'';height:5px;left:0;position:absolute;right:0;top:-5px}.search-global-field .search-global-menu>li{background-color:#fff;border-top:1px solid #ddd;display:block;font-size:1.2rem;padding:.75rem 1.4rem .55rem}.search-global-field .search-global-menu>li._active{background-color:#e0f6fe}.search-global-field .search-global-menu .title{display:block;font-size:1.4rem}.search-global-field .search-global-menu .type{color:#1a1a1a;display:block}.search-global-label{cursor:pointer;height:3.3rem;padding:.75rem 1.4rem .55rem;position:absolute;right:0;top:0;z-index:2}.search-global-label:active{-ms-transform:scale(0.9);transform:scale(0.9)}.search-global-label:hover:before{color:#000}.search-global-label:before{color:#777;content:'\e60c';font-size:2rem}.search-global-input{background-color:transparent;border:1px solid transparent;font-size:1.4rem;height:3.3rem;padding:.75rem 1.4rem .55rem;position:absolute;right:0;top:0;transition:all .1s linear,width .3s linear;width:5rem;z-index:1}.search-global-action{display:none}.notifications-wrapper{float:right;line-height:1;position:relative}.notifications-wrapper.active{z-index:500}.notifications-wrapper.active .notifications-action{border-color:#007bdb;box-shadow:1px 1px 5px rgba(0,0,0,.5)}.notifications-wrapper.active .notifications-action:after{background-color:#fff;border:none;content:'';display:block;height:6px;left:-6px;margin-top:0;position:absolute;right:0;top:100%;width:auto}.notifications-wrapper .admin__action-dropdown-menu{padding:1rem 0 0;width:32rem}.notifications-action{color:#777;height:3.3rem;padding:.75rem 2rem .65rem}.notifications-action:after{display:none}.notifications-action:before{content:'\e607';font-size:1.9rem;margin-right:0}.notifications-action:active:before{position:relative;top:1px}.notifications-action .notifications-counter{background-color:#e22626;border-radius:1em;color:#fff;display:inline-block;font-size:1.1rem;font-weight:700;left:50%;margin-left:.3em;margin-top:-1.1em;padding:.3em .5em;position:absolute;top:50%}.notifications-entry{line-height:1.36;padding:.6rem 2rem .8rem;position:relative;transition:background-color .1s linear}.notifications-entry:hover{background-color:#e0f6fe}.notifications-entry.notifications-entry-last{margin:0 2rem;padding:.3rem 0 1.3rem;text-align:center}.notifications-entry.notifications-entry-last:hover{background-color:transparent}.notifications-entry+.notifications-entry-last{border-top:1px solid #ddd;padding-bottom:.6rem}.notifications-entry ._cutted{cursor:pointer}.notifications-entry ._cutted .notifications-entry-description-start:after{content:'...'}.notifications-entry-title{color:#ef672f;display:block;font-size:1.1rem;font-weight:700;margin-bottom:.7rem;margin-right:1em}.notifications-entry-description{color:#333;font-size:1.1rem;margin-bottom:.8rem}.notifications-entry-description-end{display:none}.notifications-entry-description-end._show{display:inline}.notifications-entry-time{color:#777;font-size:1.1rem}.notifications-close{line-height:1;padding:1rem;position:absolute;right:0;top:.6rem}.notifications-close:before{color:#ccc;content:'\e620';transition:color .1s linear}.notifications-close:hover:before{color:#b3b3b3}.notifications-close:active{-ms-transform:scale(0.95);transform:scale(0.95)}.page-header-actions{padding-top:1.1rem}.page-header-hgroup{padding-right:1.5rem}.page-title{color:#333;font-size:2.8rem}.page-header{padding:1.5rem 3rem}.menu-wrapper{display:inline-block;position:relative;width:8.8rem;z-index:700}.menu-wrapper:before{background-color:#373330;bottom:0;content:'';left:0;position:fixed;top:0;width:8.8rem;z-index:699}.menu-wrapper._fixed{left:0;position:fixed;top:0}.menu-wrapper._fixed~.page-wrapper{margin-left:8.8rem}.menu-wrapper .logo{display:block;height:8.8rem;padding:2.4rem 0 2.2rem;position:relative;text-align:center;z-index:700}._keyfocus .menu-wrapper .logo:focus{background-color:#4a4542;box-shadow:none}._keyfocus .menu-wrapper .logo:focus+.admin__menu .level-0:first-child>a{background-color:#373330}._keyfocus .menu-wrapper .logo:focus+.admin__menu .level-0:first-child>a:after{display:none}.menu-wrapper .logo:hover .logo-img{-webkit-filter:brightness(1.1);filter:brightness(1.1)}.menu-wrapper .logo:active .logo-img{-ms-transform:scale(0.95);transform:scale(0.95)}.menu-wrapper .logo .logo-img{height:4.2rem;transition:-webkit-filter .2s linear,filter .2s linear,transform .1s linear;width:3.5rem}.abs-menu-separator,.admin__menu .item-partners>a:after,.admin__menu .level-0:first-child>a:after{background-color:#736963;content:'';display:block;height:1px;left:0;margin-left:16%;position:absolute;top:0;width:68%}.admin__menu li{display:block}.admin__menu .level-0:first-child>a{position:relative}.admin__menu .level-0._active>a,.admin__menu .level-0:hover>a{color:#f7f3eb}.admin__menu .level-0._active>a{background-color:#524d49}.admin__menu .level-0:hover>a{background-color:#4a4542}.admin__menu .level-0>a{color:#aaa6a0;display:block;font-size:1rem;letter-spacing:.025em;min-height:6.2rem;padding:1.2rem .5rem .5rem;position:relative;text-align:center;text-decoration:none;text-transform:uppercase;transition:background-color .1s linear;word-wrap:break-word;z-index:700}.admin__menu .level-0>a:focus{box-shadow:none}.admin__menu .level-0>a:before{content:'\e63a';display:block;font-size:2.2rem;height:2.2rem}.admin__menu .level-0>.submenu{background-color:#4a4542;box-shadow:0 0 3px #000;left:100%;min-height:calc(8.8rem + 2rem + 100%);padding:2rem 0 0;position:absolute;top:0;-ms-transform:translateX(-100%);transform:translateX(-100%);transition-duration:.3s;transition-property:transform,visibility;transition-timing-function:ease-in-out;visibility:hidden;z-index:697}.ie10 .admin__menu .level-0>.submenu,.ie11 .admin__menu .level-0>.submenu{height:100%}.admin__menu .level-0._show>.submenu{-ms-transform:translateX(0);transform:translateX(0);visibility:visible;z-index:698}.admin__menu .level-1{margin-left:1.5rem;margin-right:1.5rem}.admin__menu [class*=level-]:not(.level-0) a{display:block;padding:1.25rem 1.5rem}.admin__menu [class*=level-]:not(.level-0) a:hover{background-color:#403934}.admin__menu [class*=level-]:not(.level-0) a:active{background-color:#322c29;padding-bottom:1.15rem;padding-top:1.35rem}.admin__menu .submenu li{min-width:23.8rem}.admin__menu .submenu a{color:#fcfcfc;transition:background-color .1s linear}.admin__menu .submenu a:focus,.admin__menu .submenu a:hover{box-shadow:none;text-decoration:none}._keyfocus .admin__menu .submenu a:focus{background-color:#403934}._keyfocus .admin__menu .submenu a:active{background-color:#322c29}.admin__menu .submenu .parent{margin-bottom:4.5rem}.admin__menu .submenu .parent .submenu-group-title{color:#a79d95;display:block;font-size:1.6rem;font-weight:600;margin-bottom:.7rem;padding:1.25rem 1.5rem;pointer-events:none}.admin__menu .submenu .column{display:table-cell}.admin__menu .submenu-title{color:#fff;display:block;font-size:2.2rem;font-weight:600;margin-bottom:4.2rem;margin-left:3rem;margin-right:5.8rem}.admin__menu .submenu-sub-title{color:#fff;display:block;font-size:1.2rem;margin:-3.8rem 5.8rem 3.8rem 3rem}.admin__menu .action-close{padding:2.4rem 2.8rem;position:absolute;right:0;top:0}.admin__menu .action-close:before{color:#a79d95;font-size:1.7rem}.admin__menu .action-close:hover:before{color:#fff}.admin__menu .item-dashboard>a:before{content:'\e604';font-size:1.8rem;padding-top:.4rem}.admin__menu .item-sales>a:before{content:'\e60b'}.admin__menu .item-catalog>a:before{content:'\e608'}.admin__menu .item-customer>a:before{content:'\e603';font-size:2.6rem;position:relative;top:-.4rem}.admin__menu .item-marketing>a:before{content:'\e609';font-size:2rem;padding-top:.2rem}.admin__menu .item-content>a:before{content:'\e602';font-size:2.4rem;position:relative;top:-.2rem}.admin__menu .item-report>a:before{content:'\e60a'}.admin__menu .item-stores>a:before{content:'\e60d';font-size:1.9rem;padding-top:.3rem}.admin__menu .item-system>a:before{content:'\e610'}.admin__menu .item-partners._active>a:after,.admin__menu .item-system._current+.item-partners>a:after{display:none}.admin__menu .item-partners>a{padding-bottom:1rem}.admin__menu .item-partners>a:before{content:'\e612'}.admin__menu .level-0>.submenu>ul>.level-1:only-of-type>.submenu-group-title,.admin__menu .submenu .column:only-of-type .submenu-group-title{display:none}.admin__menu-overlay{bottom:0;left:0;position:fixed;right:0;top:0;z-index:697}.store-switcher{color:#333;float:left;font-size:1.3rem;margin-top:.7rem}.store-switcher .admin__action-dropdown{background-color:#f8f8f8;margin-left:.5em}.store-switcher .dropdown{display:inline-block;position:relative}.store-switcher .dropdown:after,.store-switcher .dropdown:before{content:'';display:table}.store-switcher .dropdown:after{clear:both}.store-switcher .dropdown .action.toggle{cursor:pointer;display:inline-block;text-decoration:none}.store-switcher .dropdown .action.toggle:after{-webkit-font-smoothing:antialiased;font-size:22px;line-height:2;color:#333;content:'\e607';font-family:icons-blank-theme;margin:0;vertical-align:top;display:inline-block;font-weight:400;overflow:hidden;speak:none;text-align:center}.store-switcher .dropdown .action.toggle:active:after,.store-switcher .dropdown .action.toggle:hover:after{color:#333}.store-switcher .dropdown .action.toggle.active{display:inline-block;text-decoration:none}.store-switcher .dropdown .action.toggle.active:after{-webkit-font-smoothing:antialiased;font-size:22px;line-height:2;color:#333;content:'\e618';font-family:icons-blank-theme;margin:0;vertical-align:top;display:inline-block;font-weight:400;overflow:hidden;speak:none;text-align:center}.store-switcher .dropdown .action.toggle.active:active:after,.store-switcher .dropdown .action.toggle.active:hover:after{color:#333}.store-switcher .dropdown .dropdown-menu{margin:4px 0 0;padding:0;list-style:none;background:#fff;border:1px solid #aaa6a0;min-width:19.5rem;z-index:100;box-sizing:border-box;display:none;position:absolute;top:100%;box-shadow:1px 1px 5px rgba(0,0,0,.5)}.store-switcher .dropdown .dropdown-menu li{margin:0;padding:0}.store-switcher .dropdown .dropdown-menu li:hover{background:0 0;cursor:pointer}.store-switcher .dropdown.active{overflow:visible}.store-switcher .dropdown.active .dropdown-menu{display:block}.store-switcher .dropdown-menu{left:0;margin-top:.5em;max-height:250px;overflow-y:auto;padding-top:.25em}.store-switcher .dropdown-menu li{border:0;cursor:default}.store-switcher .dropdown-menu li:hover{cursor:default}.store-switcher .dropdown-menu li a,.store-switcher .dropdown-menu li span{color:#333;display:block;padding:.5rem 1.3rem}.store-switcher .dropdown-menu li a{text-decoration:none}.store-switcher .dropdown-menu li a:hover{background:#e9e9e9}.store-switcher .dropdown-menu li span{color:#adadad;cursor:default}.store-switcher .dropdown-menu li.current span{background:#eee;color:#333}.store-switcher .dropdown-menu .store-switcher-store a,.store-switcher .dropdown-menu .store-switcher-store span{padding-left:2.6rem}.store-switcher .dropdown-menu .store-switcher-store-view a,.store-switcher .dropdown-menu .store-switcher-store-view span{padding-left:3.9rem}.store-switcher .dropdown-menu .dropdown-toolbar{border-top:1px solid #ebebeb;margin-top:1rem}.store-switcher .dropdown-menu .dropdown-toolbar a:before{content:'\e610';margin-right:.25em;position:relative;top:1px}.store-switcher-label{font-weight:700}.store-switcher-alt{display:inline-block;position:relative}.store-switcher-alt.active .dropdown-menu{display:block}.store-switcher-alt .dropdown-menu{margin-top:2px;white-space:nowrap}.store-switcher-alt .dropdown-menu ul{list-style:none;margin:0;padding:0}.store-switcher-alt strong{color:#a79d95;display:block;font-size:14px;font-weight:500;line-height:1.333;padding:5px 10px}.store-switcher-alt .store-selected{color:#676056;cursor:pointer;font-size:12px;font-weight:400;line-height:1.333}.store-switcher-alt .store-selected:after{-webkit-font-smoothing:antialiased;color:#afadac;content:'\e02c';font-style:normal;font-weight:400;margin:0 0 0 3px;speak:none;vertical-align:text-top}.store-switcher-alt .store-switcher-store,.store-switcher-alt .store-switcher-website{padding:0}.store-switcher-alt .store-switcher-store:hover,.store-switcher-alt .store-switcher-website:hover{background:0 0}.store-switcher-alt .manage-stores,.store-switcher-alt .store-switcher-all,.store-switcher-alt .store-switcher-store-view{padding:0}.store-switcher-alt .manage-stores>a,.store-switcher-alt .store-switcher-all>a{color:#676056;display:block;font-size:12px;padding:8px 15px;text-decoration:none}.store-switcher-website{margin:5px 0 0}.store-switcher-website>strong{padding-left:13px}.store-switcher-store{margin:1px 0 0}.store-switcher-store>strong{padding-left:20px}.store-switcher-store>ul{margin-top:1px}.store-switcher-store-view:first-child{border-top:1px solid #e5e5e5}.store-switcher-store-view>a{color:#333;display:block;font-size:13px;padding:5px 15px 5px 24px;text-decoration:none}.store-view:not(.store-switcher){float:left}.store-view .store-switcher-label{display:inline-block;margin-top:1rem}.tooltip{margin-left:.5em}.tooltip .help a,.tooltip .help span{cursor:pointer;display:inline-block;height:22px;position:relative;vertical-align:middle;width:22px;z-index:2}.tooltip .help a:before,.tooltip .help span:before{color:#333;content:'\e633';font-size:1.7rem}.tooltip .help a:hover{text-decoration:none}.tooltip .tooltip-content{background:#000;border-radius:3px;color:#fff;display:none;margin-left:-19px;margin-top:10px;max-width:200px;padding:4px 8px;position:absolute;text-shadow:none;z-index:20}.tooltip .tooltip-content:before{border-bottom:5px solid #000;border-left:5px solid transparent;border-right:5px solid transparent;content:'';height:0;left:20px;opacity:.8;position:absolute;top:-5px;width:0}.tooltip .tooltip-content.loading{position:absolute}.tooltip .tooltip-content.loading:before{border-bottom-color:rgba(0,0,0,.3)}.tooltip:hover>.tooltip-content{display:block}.page-actions._fixed,.page-main-actions:not(._hidden){background:#f8f8f8;border-bottom:1px solid #e3e3e3;border-top:1px solid #e3e3e3;padding:1.5rem}.page-main-actions{margin:0 0 3rem}.page-main-actions._hidden .store-switcher{display:none}.page-main-actions._hidden .page-actions-placeholder{min-height:50px}.page-actions{float:right}.page-main-actions .page-actions._fixed{left:8.8rem;position:fixed;right:0;top:0;z-index:501}.page-main-actions .page-actions._fixed .page-actions-inner:before{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#333;content:attr(data-title);float:left;font-size:2.8rem;margin-top:.3rem;max-width:50%}.page-actions .page-actions-buttons>button,.page-actions>button{float:right;margin-left:1.3rem}.page-actions .page-actions-buttons>button.action-back,.page-actions .page-actions-buttons>button.back,.page-actions>button.action-back,.page-actions>button.back{float:left;-ms-flex-order:-1;order:-1}.page-actions .page-actions-buttons>button.action-back:before,.page-actions .page-actions-buttons>button.back:before,.page-actions>button.action-back:before,.page-actions>button.back:before{content:'\e626';margin-right:.5em;position:relative;top:1px}.page-actions .page-actions-buttons>button.action-primary,.page-actions .page-actions-buttons>button.primary,.page-actions>button.action-primary,.page-actions>button.primary{-ms-flex-order:2;order:2}.page-actions .page-actions-buttons>button.save:not(.primary),.page-actions>button.save:not(.primary){-ms-flex-order:1;order:1}.page-actions .page-actions-buttons>button.delete,.page-actions>button.delete{-ms-flex-order:-1;order:-1}.page-actions .actions-split{float:right;margin-left:1.3rem;-ms-flex-order:2;order:2}.page-actions .actions-split .dropdown-menu .item{display:block}.page-actions-buttons{float:right;-ms-flex-pack:end;justify-content:flex-end;display:-ms-flexbox;display:flex}.customer-index-edit .page-actions-buttons{background-color:transparent}.admin__page-nav{background:#f1f1f1;border:1px solid #e3e3e3}.admin__page-nav._collapsed:first-child{border-bottom:none}.admin__page-nav._collapsed._show{border-bottom:1px solid #e3e3e3}.admin__page-nav._collapsed._show ._collapsible{background:#f1f1f1}.admin__page-nav._collapsed._show ._collapsible:after{content:'\e62b'}.admin__page-nav._collapsed._show ._collapsible+.admin__page-nav-items{display:block}.admin__page-nav._collapsed._hide .admin__page-nav-title-messages,.admin__page-nav._collapsed._hide .admin__page-nav-title-messages ._active{display:inline-block}.admin__page-nav+._collapsed{border-bottom:none;border-top:none}.admin__page-nav-title{border-bottom:1px solid #e3e3e3;color:#303030;display:block;font-size:1.4rem;line-height:1.2;margin:0 0 -1px;padding:1.8rem 1.5rem;position:relative;text-transform:uppercase}.admin__page-nav-title._collapsible{background:#fff;cursor:pointer;margin:0;padding-right:3.5rem;transition:border-color .1s ease-out,background-color .1s ease-out}.admin__page-nav-title._collapsible+.admin__page-nav-items{display:none;margin-top:-1px}.admin__page-nav-title._collapsible:after{content:'\e628';font-size:1.3rem;font-weight:700;position:absolute;right:1.8rem;top:2rem}.admin__page-nav-title._collapsible:hover{background:#f1f1f1}.admin__page-nav-title._collapsible:last-child{margin:0 0 -1px}.admin__page-nav-title strong{font-weight:700}.admin__page-nav-title .admin__page-nav-title-messages{display:none}.admin__page-nav-items{list-style-type:none;margin:0;padding:1rem 0 1.3rem}.admin__page-nav-item{border-left:3px solid transparent;margin-left:.7rem;padding:0;position:relative;transition:border-color .1s ease-out,background-color .1s ease-out}.admin__page-nav-item:hover{border-color:#e4e4e4}.admin__page-nav-item:hover .admin__page-nav-link{background:#e4e4e4;color:#303030;text-decoration:none}.admin__page-nav-item._active,.admin__page-nav-item.ui-state-active{border-color:#eb5202}.admin__page-nav-item._active .admin__page-nav-link,.admin__page-nav-item.ui-state-active .admin__page-nav-link{background:#fff;border-color:#e3e3e3;border-right:1px solid #fff;color:#303030;margin-right:-1px;font-weight:600}.admin__page-nav-item._loading:before,.admin__page-nav-item.ui-tabs-loading:before{display:none}.admin__page-nav-item._loading .admin__page-nav-item-message-loader,.admin__page-nav-item.ui-tabs-loading .admin__page-nav-item-message-loader{display:inline-block}.admin__page-nav-link{border:1px solid transparent;border-width:1px 0;color:#303030;display:block;font-weight:500;line-height:1.2;margin:0 0 -1px;padding:2rem 4rem 2rem 1rem;transition:border-color .1s ease-out,background-color .1s ease-out;word-wrap:break-word}.admin__page-nav-item-messages{display:inline-block}.admin__page-nav-item-messages .admin__page-nav-item-message-tooltip{background:#f1f1f1;border:1px solid #f1f1f1;border-radius:1px;bottom:3.7rem;box-shadow:0 3px 9px 0 rgba(0,0,0,.3);display:none;font-size:1.4rem;font-weight:400;left:-1rem;line-height:1.36;padding:1.5rem;position:absolute;text-transform:none;width:27rem;word-break:normal;z-index:2}.admin__page-nav-item-messages .admin__page-nav-item-message-tooltip:after,.admin__page-nav-item-messages .admin__page-nav-item-message-tooltip:before{border:15px solid transparent;height:0;width:0;border-top-color:#f1f1f1;content:'';display:block;left:2rem;position:absolute;top:100%;z-index:3}.admin__page-nav-item-messages .admin__page-nav-item-message-tooltip:after{border-top-color:#f1f1f1;margin-top:-1px;z-index:4}.admin__page-nav-item-messages .admin__page-nav-item-message-tooltip:before{border-top-color:#bfbfbf;margin-top:1px}.admin__page-nav-item-message-loader{display:none;margin-top:-1rem;position:absolute;right:0;top:50%}.admin__page-nav-item-message-loader .spinner{font-size:2rem;margin-right:1.5rem}._loading>.admin__page-nav-item-messages .admin__page-nav-item-message-loader{display:inline-block}.admin__page-nav-item-message{position:relative}.admin__page-nav-item-message:hover{z-index:500}.admin__page-nav-item-message:hover .admin__page-nav-item-message-tooltip{display:block}.admin__page-nav-item-message._changed,.admin__page-nav-item-message._error{display:none}.admin__page-nav-item-message .admin__page-nav-item-message-icon{display:inline-block;font-size:1.4rem;padding-left:.8em;vertical-align:baseline}.admin__page-nav-item-message .admin__page-nav-item-message-icon:after{color:#666;content:'\e631'}._changed:not(._error)>.admin__page-nav-item-messages ._changed{display:inline-block}._error .admin__page-nav-item-message-icon:after{color:#eb5202;content:'\e623'}._error>.admin__page-nav-item-messages ._error{display:inline-block}._error>.admin__page-nav-item-messages ._error .spinner{font-size:2rem;margin-right:1.5rem}._error .admin__page-nav-item-message-tooltip{background:#f1f1f1;border:1px solid #f1f1f1;border-radius:1px;bottom:3.7rem;box-shadow:0 3px 9px 0 rgba(0,0,0,.3);display:none;font-weight:400;left:-1rem;line-height:1.36;padding:2rem;position:absolute;text-transform:none;width:27rem;word-break:normal;z-index:2}._error .admin__page-nav-item-message-tooltip:after,._error .admin__page-nav-item-message-tooltip:before{border:15px solid transparent;height:0;width:0;border-top-color:#f1f1f1;content:'';display:block;left:2rem;position:absolute;top:100%;z-index:3}._error .admin__page-nav-item-message-tooltip:after{border-top-color:#f1f1f1;margin-top:-1px;z-index:4}._error .admin__page-nav-item-message-tooltip:before{border-top-color:#bfbfbf}.admin__data-grid-wrap-static .data-grid{box-sizing:border-box}.admin__data-grid-wrap-static .data-grid thead{color:#333}.admin__data-grid-wrap-static .data-grid tr:nth-child(even) td{background-color:#f5f5f5}.admin__data-grid-wrap-static .data-grid tr:nth-child(even) td._dragging{background-color:rgba(245,245,245,.95)}.admin__data-grid-wrap-static .data-grid ul{margin-left:1rem;padding-left:1rem}.admin__data-grid-wrap-static .admin__data-grid-loading-mask{background:rgba(255,255,255,.5);bottom:0;left:0;position:absolute;right:0;top:0;z-index:399}.admin__data-grid-wrap-static .admin__data-grid-loading-mask .grid-loader{background:url(../images/loader-2.gif) 50% 50% no-repeat;bottom:0;height:149px;left:0;margin:auto;position:absolute;right:0;top:0;width:218px}.data-grid-filters-actions-wrap{float:right}.data-grid-search-control-wrap{float:left;max-width:45.5rem;position:relative;width:35%}.data-grid-search-control-wrap :-ms-input-placeholder{font-style:italic}.data-grid-search-control-wrap ::-webkit-input-placeholder{font-style:italic}.data-grid-search-control-wrap ::-moz-placeholder{font-style:italic}.data-grid-search-control-wrap .action-submit{background-color:transparent;border:none;border-radius:0;box-shadow:none;margin:0;padding:.6rem 2rem .2rem;position:absolute;right:0;top:1px}.data-grid-search-control-wrap .action-submit:hover{background-color:transparent;border:none;box-shadow:none}.data-grid-search-control-wrap .action-submit:active{-ms-transform:scale(0.9);transform:scale(0.9)}.data-grid-search-control-wrap .action-submit:hover:before{color:#1a1a1a}._keyfocus .data-grid-search-control-wrap .action-submit:focus{box-shadow:0 0 0 1px #008bdb}.data-grid-search-control-wrap .action-submit:before{content:'\e60c';font-size:2rem;transition:color .1s linear}.data-grid-search-control-wrap .action-submit>span{clip:rect(0,0,0,0);overflow:hidden;position:absolute}.data-grid-search-control-wrap .abs-action-menu .action-submenu,.data-grid-search-control-wrap .abs-action-menu .action-submenu .action-submenu,.data-grid-search-control-wrap .action-menu,.data-grid-search-control-wrap .action-menu .action-submenu,.data-grid-search-control-wrap .actions-split .action-menu .action-submenu,.data-grid-search-control-wrap .actions-split .action-menu .action-submenu .action-submenu,.data-grid-search-control-wrap .actions-split .dropdown-menu .action-submenu,.data-grid-search-control-wrap .actions-split .dropdown-menu .action-submenu .action-submenu{max-height:19.25rem;overflow-y:auto;z-index:398}.data-grid-search-control-wrap .action-menu-item._selected{background-color:#e0f6fe}.data-grid-search-control-wrap .data-grid-search-label{display:none}.data-grid-search-control{padding-right:6rem;width:100%}.data-grid-filters-action-wrap{float:left;padding-left:2rem}.data-grid-filters-action-wrap .action-default{font-size:1.3rem;margin-bottom:1rem;padding-left:1.7rem;padding-right:2.1rem;padding-top:.7rem}.data-grid-filters-action-wrap .action-default._active{background-color:#fff;border-bottom-color:#fff;border-right-color:#ccc;font-weight:600;margin:-.1rem 0 0;padding-bottom:1.6rem;padding-top:.8rem;position:relative;z-index:281}.data-grid-filters-action-wrap .action-default._active:after{background-color:#eb5202;bottom:100%;content:'';height:3px;left:-1px;position:absolute;right:-1px}.data-grid-filters-action-wrap .action-default:before{color:#333;content:'\e605';font-size:1.8rem;margin-right:.4rem;position:relative;top:-1px;vertical-align:top}.data-grid-filters-action-wrap .filters-active{display:none}.admin__action-grid-select .admin__control-select{margin:-.5rem .5rem 0 0;padding-bottom:.6rem;padding-top:.6rem}.admin__data-grid-filters-wrap{opacity:0;visibility:hidden;clear:both;font-size:1.3rem;transition:opacity .3s ease}.admin__data-grid-filters-wrap._show{opacity:1;visibility:visible;border-bottom:1px solid #ccc;border-top:1px solid #ccc;margin-bottom:.7rem;padding:3.6rem 0 3rem;position:relative;top:-1px;z-index:280}.admin__data-grid-filters-wrap._show .admin__data-grid-filters,.admin__data-grid-filters-wrap._show .admin__data-grid-filters-footer{display:block}.admin__data-grid-filters-wrap .admin__form-field-label,.admin__data-grid-filters-wrap .admin__form-field-legend{display:block;font-weight:700;margin:0 0 .3rem;text-align:left}.admin__data-grid-filters-wrap .admin__form-field{display:inline-block;margin-bottom:2em;margin-left:0;padding-left:2rem;padding-right:2rem;vertical-align:top;width:calc(100% / 4 - 4px)}.admin__data-grid-filters-wrap .admin__form-field .admin__form-field{display:block;float:none;margin-bottom:1.5rem;padding-left:0;padding-right:0;width:auto}.admin__data-grid-filters-wrap .admin__form-field .admin__form-field:last-child{margin-bottom:0}.admin__data-grid-filters-wrap .admin__form-field .admin__form-field .admin__form-field-label{border:1px solid transparent;float:left;font-weight:400;line-height:1.36;margin-bottom:0;padding-bottom:.6rem;padding-right:1em;padding-top:.6rem;width:25%}.admin__data-grid-filters-wrap .admin__form-field .admin__form-field .admin__form-field-control{margin-left:25%}.admin__data-grid-filters-wrap .admin__action-multiselect,.admin__data-grid-filters-wrap .admin__control-select,.admin__data-grid-filters-wrap .admin__control-text,.admin__data-grid-filters-wrap .admin__form-field-label{font-size:1.3rem}.admin__data-grid-filters-wrap .admin__control-select{height:3.2rem;padding-top:.5rem}.admin__data-grid-filters-wrap .admin__action-multiselect:before{height:3.2rem;width:3.2rem}.admin__data-grid-filters-wrap .admin__control-select,.admin__data-grid-filters-wrap .admin__control-text._has-datepicker{width:100%}.admin__data-grid-filters{display:none;margin-left:-2rem;margin-right:-2rem}.admin__filters-legend{clip:rect(0,0,0,0);overflow:hidden;position:absolute}.admin__data-grid-filters-footer{display:none;font-size:1.4rem}.admin__data-grid-filters-footer .admin__footer-main-actions{margin-left:25%;text-align:right}.admin__data-grid-filters-footer .admin__footer-secondary-actions{float:left;width:50%}.admin__data-grid-filters-current{border-bottom:.1rem solid #ccc;border-top:.1rem solid #ccc;display:none;font-size:1.3rem;margin-bottom:.9rem;padding-bottom:.8rem;padding-top:1.1rem;width:100%}.admin__data-grid-filters-current._show{display:table;position:relative;top:-1px;z-index:3}.admin__data-grid-filters-current._show+.admin__data-grid-filters-wrap._show{margin-top:-1rem}.admin__current-filters-actions-wrap,.admin__current-filters-list-wrap,.admin__current-filters-title-wrap{display:table-cell;vertical-align:top}.admin__current-filters-title{margin-right:1em;white-space:nowrap}.admin__current-filters-list-wrap{width:100%}.admin__current-filters-list{margin-bottom:0}.admin__current-filters-list>li{display:inline-block;font-weight:600;margin:0 1rem .5rem;padding-right:2.6rem;position:relative}.admin__current-filters-list .action-remove{background-color:transparent;border:none;border-radius:0;box-shadow:none;margin:0;padding:0;line-height:1;position:absolute;right:0;top:1px}.admin__current-filters-list .action-remove:hover{background-color:transparent;border:none;box-shadow:none}.admin__current-filters-list .action-remove:hover:before{color:#949494}.admin__current-filters-list .action-remove:active{-ms-transform:scale(0.9);transform:scale(0.9)}.admin__current-filters-list .action-remove:before{color:#adadad;content:'\e620';font-size:1.6rem;transition:color .1s linear}.admin__current-filters-list .action-remove>span{clip:rect(0,0,0,0);overflow:hidden;position:absolute}.admin__current-filters-actions-wrap .action-clear{border:none;padding-bottom:0;padding-top:0;white-space:nowrap}.admin__data-grid-pager-wrap{float:right;text-align:right}.admin__data-grid-pager{display:inline-block;margin-left:3rem}.admin__data-grid-pager .admin__control-text::-webkit-inner-spin-button,.admin__data-grid-pager .admin__control-text::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.admin__data-grid-pager .admin__control-text{-moz-appearance:textfield;text-align:center;width:4.4rem}.action-next,.action-previous{width:4.4rem}.action-next:before,.action-previous:before{font-weight:700}.action-next>span,.action-previous>span{clip:rect(0,0,0,0);overflow:hidden;position:absolute}.action-previous{margin-right:2.5rem;text-indent:-.25em}.action-previous:before{content:'\e629'}.action-next{margin-left:1.5rem;text-indent:.1em}.action-next:before{content:'\e62a'}.admin__data-grid-action-bookmarks{opacity:.98}.admin__data-grid-action-bookmarks .admin__action-dropdown-text:after{left:0;right:-6px}.admin__data-grid-action-bookmarks._active{z-index:290}.admin__data-grid-action-bookmarks .admin__action-dropdown .admin__action-dropdown-text{display:inline-block;max-width:15rem;min-width:4.9rem;vertical-align:top;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.admin__data-grid-action-bookmarks .admin__action-dropdown:before{content:'\e60f'}.admin__data-grid-action-bookmarks .admin__action-dropdown-menu{font-size:1.3rem;left:0;padding:1rem 0;right:auto}.admin__data-grid-action-bookmarks .admin__action-dropdown-menu>li{padding:0 5rem 0 0;position:relative;white-space:nowrap}.admin__data-grid-action-bookmarks .admin__action-dropdown-menu>li:not(.action-dropdown-menu-action){transition:background-color .1s linear}.admin__data-grid-action-bookmarks .admin__action-dropdown-menu>li:not(.action-dropdown-menu-action):hover{background-color:#e3e3e3}.admin__data-grid-action-bookmarks .admin__action-dropdown-menu .action-dropdown-menu-item{max-width:23rem;min-width:18rem;white-space:normal;word-break:break-all}.admin__data-grid-action-bookmarks .admin__action-dropdown-menu .action-dropdown-menu-item-edit{display:none;padding-bottom:1rem;padding-left:1rem;padding-top:1rem}.admin__data-grid-action-bookmarks .admin__action-dropdown-menu .action-dropdown-menu-item-edit .action-dropdown-menu-item-actions{padding-bottom:1rem;padding-top:1rem}.admin__data-grid-action-bookmarks .admin__action-dropdown-menu .action-dropdown-menu-action{padding-left:1rem;padding-top:1rem}.admin__data-grid-action-bookmarks .admin__action-dropdown-menu .action-dropdown-menu-action+.action-dropdown-menu-item-last{padding-top:.5rem}.admin__data-grid-action-bookmarks .admin__action-dropdown-menu .action-dropdown-menu-action>a{color:#008bdb;text-decoration:none;display:inline-block;padding-left:1.1rem}.admin__data-grid-action-bookmarks .admin__action-dropdown-menu .action-dropdown-menu-action>a:hover{color:#0fa7ff;text-decoration:underline}.admin__data-grid-action-bookmarks .admin__action-dropdown-menu .action-dropdown-menu-item-last{padding-bottom:0}.admin__data-grid-action-bookmarks .admin__action-dropdown-menu ._edit .action-dropdown-menu-item{display:none}.admin__data-grid-action-bookmarks .admin__action-dropdown-menu ._edit .action-dropdown-menu-item-edit{display:block}.admin__data-grid-action-bookmarks .admin__action-dropdown-menu ._active .action-dropdown-menu-link{font-weight:600}.admin__data-grid-action-bookmarks .admin__action-dropdown-menu .admin__control-text{font-size:1.3rem;min-width:15rem;width:calc(100% - 4rem)}.ie9 .admin__data-grid-action-bookmarks .admin__action-dropdown-menu .admin__control-text{width:15rem}.admin__data-grid-action-bookmarks .admin__action-dropdown-menu .action-dropdown-menu-item-actions{border-left:1px solid #fff;bottom:0;position:absolute;right:0;top:0;width:5rem}.admin__data-grid-action-bookmarks .admin__action-dropdown-menu .action-dropdown-menu-link{color:#333;display:block;text-decoration:none;padding:1rem 1rem 1rem 2.1rem}.admin__data-grid-action-bookmarks .action-delete,.admin__data-grid-action-bookmarks .action-edit,.admin__data-grid-action-bookmarks .action-submit{background-color:transparent;border:none;border-radius:0;box-shadow:none;margin:0;vertical-align:top}.admin__data-grid-action-bookmarks .action-delete:hover,.admin__data-grid-action-bookmarks .action-edit:hover,.admin__data-grid-action-bookmarks .action-submit:hover{background-color:transparent;border:none;box-shadow:none}.admin__data-grid-action-bookmarks .action-delete:before,.admin__data-grid-action-bookmarks .action-edit:before,.admin__data-grid-action-bookmarks .action-submit:before{font-size:1.7rem}.admin__data-grid-action-bookmarks .action-delete>span,.admin__data-grid-action-bookmarks .action-edit>span,.admin__data-grid-action-bookmarks .action-submit>span{clip:rect(0,0,0,0);overflow:hidden;position:absolute}.admin__data-grid-action-bookmarks .action-delete,.admin__data-grid-action-bookmarks .action-edit{padding:.6rem 1.4rem}.admin__data-grid-action-bookmarks .action-delete:active,.admin__data-grid-action-bookmarks .action-edit:active{-ms-transform:scale(0.9);transform:scale(0.9)}.admin__data-grid-action-bookmarks .action-submit{padding:.6rem 1rem .6rem .8rem}.admin__data-grid-action-bookmarks .action-submit:active{position:relative;right:-1px}.admin__data-grid-action-bookmarks .action-submit:before{content:'\e625'}.admin__data-grid-action-bookmarks .action-delete:before{content:'\e630'}.admin__data-grid-action-bookmarks .action-edit{padding-top:.8rem}.admin__data-grid-action-bookmarks .action-edit:before{content:'\e631'}.admin__data-grid-action-columns._active{opacity:.98;z-index:290}.admin__data-grid-action-columns .admin__action-dropdown:before{content:'\e610';font-size:1.8rem;margin-right:.7rem;vertical-align:top}.admin__data-grid-action-columns-menu{color:#303030;font-size:1.3rem;overflow:hidden;padding:2.2rem 3.5rem 1rem;z-index:1}.admin__data-grid-action-columns-menu._overflow .admin__action-dropdown-menu-header{border-bottom:1px solid #d1d1d1}.admin__data-grid-action-columns-menu._overflow .admin__action-dropdown-menu-content{width:49.2rem}.admin__data-grid-action-columns-menu._overflow .admin__action-dropdown-menu-footer{border-top:1px solid #d1d1d1;padding-top:2.5rem}.admin__data-grid-action-columns-menu .admin__action-dropdown-menu-content{max-height:22.85rem;overflow-y:auto;padding-top:1.5rem;position:relative;width:47.4rem}.admin__data-grid-action-columns-menu .admin__field-option{float:left;height:1.9rem;margin-bottom:1.5rem;padding:0 1rem 0 0;width:15.8rem}.admin__data-grid-action-columns-menu .admin__field-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:block}.admin__data-grid-action-columns-menu .admin__action-dropdown-menu-header{padding-bottom:1.5rem}.admin__data-grid-action-columns-menu .admin__action-dropdown-menu-footer{padding:1rem 0 2rem}.admin__data-grid-action-columns-menu .admin__action-dropdown-footer-main-actions{margin-left:25%;text-align:right}.admin__data-grid-action-columns-menu .admin__action-dropdown-footer-secondary-actions{float:left;margin-left:-1em}.admin__data-grid-action-export._active{opacity:.98;z-index:290}.admin__data-grid-action-export .admin__action-dropdown:before{content:'\e635';font-size:1.7rem;left:.3rem;margin-right:.7rem;vertical-align:top}.admin__data-grid-action-export-menu{padding-left:2rem;padding-right:2rem;padding-top:1rem}.admin__data-grid-action-export-menu .admin__action-dropdown-footer-main-actions{padding-bottom:2rem;padding-top:2.5rem;white-space:nowrap}.sticky-header{background-color:#f8f8f8;border-bottom:1px solid #e3e3e3;box-shadow:0 5px 5px 0 rgba(0,0,0,.25);left:8.8rem;margin-top:-1px;padding:.5rem 3rem 0;position:fixed;right:0;top:77px;z-index:398}.sticky-header .admin__data-grid-wrap{margin-bottom:0;overflow-x:visible;padding-bottom:0}.sticky-header .admin__data-grid-header-row{position:relative;text-align:right}.sticky-header .admin__data-grid-header-row:last-child{margin:0}.sticky-header .admin__data-grid-actions-wrap,.sticky-header .admin__data-grid-filters-wrap,.sticky-header .admin__data-grid-pager-wrap,.sticky-header .data-grid-filters-actions-wrap,.sticky-header .data-grid-search-control-wrap{display:inline-block;float:none;vertical-align:top}.sticky-header .action-select-wrap{float:left;margin-right:1.5rem;width:16.66666667%}.sticky-header .admin__control-support-text{float:left}.sticky-header .data-grid-search-control-wrap{margin:-.5rem 0 0 1.1rem;width:auto}.sticky-header .data-grid-search-control-wrap .data-grid-search-label{box-sizing:border-box;cursor:pointer;display:block;min-width:3.8rem;padding:1.2rem .6rem 1.7rem;position:relative;text-align:center}.sticky-header .data-grid-search-control-wrap .data-grid-search-label:before{color:#333;content:'\e60c';font-size:2rem;transition:color .1s linear}.sticky-header .data-grid-search-control-wrap .data-grid-search-label:hover:before{color:#000}.sticky-header .data-grid-search-control-wrap .data-grid-search-label span{display:none}.sticky-header .data-grid-filters-actions-wrap{margin:-.5rem 0 0 1.1rem;padding-left:0;position:relative}.sticky-header .data-grid-filters-actions-wrap .action-default{background-color:transparent;border:1px solid transparent;box-sizing:border-box;min-width:3.8rem;padding:1.2rem .6rem 1.7rem;text-align:center;transition:all .15s ease}.sticky-header .data-grid-filters-actions-wrap .action-default span{display:none}.sticky-header .data-grid-filters-actions-wrap .action-default:before{margin:0}.sticky-header .data-grid-filters-actions-wrap .action-default._active{background-color:#fff;border-color:#adadad #adadad #fff;box-shadow:1px 1px 5px rgba(0,0,0,.5);z-index:210}.sticky-header .data-grid-filters-actions-wrap .action-default._active:after{background-color:#fff;content:'';height:6px;left:-2px;position:absolute;right:-6px;top:100%}.sticky-header .data-grid-filters-action-wrap{padding:0}.sticky-header .admin__data-grid-filters-wrap{background-color:#fff;border:1px solid #adadad;box-shadow:0 5px 5px 0 rgba(0,0,0,.25);left:0;padding-left:3.5rem;padding-right:3.5rem;position:absolute;top:100%;width:100%;z-index:209}.sticky-header .admin__data-grid-filters-current+.admin__data-grid-filters-wrap._show{margin-top:-6px}.sticky-header .filters-active{background-color:#e04f00;border-radius:10px;color:#fff;display:block;font-size:1.4rem;font-weight:700;padding:.1rem .7rem;position:absolute;right:-7px;top:0;z-index:211}.sticky-header .filters-active:empty{padding-bottom:0;padding-top:0}.sticky-header .admin__data-grid-actions-wrap{margin:-.5rem 0 0 1.1rem;padding-right:.3rem}.sticky-header .admin__data-grid-actions-wrap .admin__action-dropdown{background-color:transparent;box-sizing:border-box;min-width:3.8rem;padding-left:.6rem;padding-right:.6rem;text-align:center}.sticky-header .admin__data-grid-actions-wrap .admin__action-dropdown .admin__action-dropdown-text{display:inline-block;max-width:0;min-width:0;overflow:hidden}.sticky-header .admin__data-grid-actions-wrap .admin__action-dropdown:before{margin:0}.sticky-header .admin__data-grid-actions-wrap .admin__action-dropdown-wrap{margin-right:1.1rem}.sticky-header .admin__data-grid-actions-wrap .admin__action-dropdown-wrap:after,.sticky-header .admin__data-grid-actions-wrap .admin__action-dropdown:after{display:none}.sticky-header .admin__data-grid-actions-wrap ._active .admin__action-dropdown{background-color:#fff}.sticky-header .admin__data-grid-action-bookmarks .admin__action-dropdown:before{position:relative;top:-3px}.sticky-header .admin__data-grid-filters-current{border-bottom:0;border-top:0;margin-bottom:0;padding-bottom:0;padding-top:0}.sticky-header .admin__data-grid-pager .admin__control-text,.sticky-header .admin__data-grid-pager-wrap .admin__control-support-text,.sticky-header .data-grid-search-control-wrap .action-submit,.sticky-header .data-grid-search-control-wrap .data-grid-search-control{display:none}.sticky-header .action-next{margin:0}.sticky-header .data-grid{margin-bottom:-1px}.data-grid-cap-left,.data-grid-cap-right{background-color:#f8f8f8;bottom:-2px;position:absolute;top:6rem;width:3rem;z-index:201}.data-grid-cap-left{left:0}.admin__data-grid-header{font-size:1.4rem}.admin__data-grid-header-row+.admin__data-grid-header-row{margin-top:1.1rem}.admin__data-grid-header-row:last-child{margin-bottom:0}.admin__data-grid-header-row .action-select-wrap{display:block}.admin__data-grid-header-row .action-select{width:100%}.admin__data-grid-actions-wrap{float:right;margin-left:1.1rem;margin-top:-.5rem;text-align:right}.admin__data-grid-actions-wrap .admin__action-dropdown-wrap{position:relative;text-align:left;vertical-align:middle}.admin__data-grid-actions-wrap .admin__action-dropdown-wrap._active+.admin__action-dropdown-wrap:after,.admin__data-grid-actions-wrap .admin__action-dropdown-wrap._active:after,.admin__data-grid-actions-wrap .admin__action-dropdown-wrap._hide+.admin__action-dropdown-wrap:after,.admin__data-grid-actions-wrap .admin__action-dropdown-wrap:first-child:after{display:none}.admin__data-grid-actions-wrap .admin__action-dropdown-wrap._active .admin__action-dropdown,.admin__data-grid-actions-wrap .admin__action-dropdown-wrap._active .admin__action-dropdown-menu{border-color:#adadad}.admin__data-grid-actions-wrap .admin__action-dropdown-wrap:after{border-left:1px solid #ccc;content:'';height:3.2rem;left:0;position:absolute;top:.5rem;z-index:3}.admin__data-grid-actions-wrap .admin__action-dropdown{padding-bottom:1.7rem;padding-top:1.2rem}.admin__data-grid-actions-wrap .admin__action-dropdown:after{margin-top:-.4rem}.admin__data-grid-outer-wrap{min-height:8rem;position:relative}.admin__data-grid-wrap{margin-bottom:2rem;max-width:100%;overflow-x:auto;padding-bottom:1rem;padding-top:2rem}.admin__data-grid-loading-mask{background:rgba(255,255,255,.5);bottom:0;left:0;position:absolute;right:0;top:0;z-index:399}.admin__data-grid-loading-mask .spinner{font-size:4rem;left:50%;margin-left:-2rem;margin-top:-2rem;position:absolute;top:50%}.ie9 .admin__data-grid-loading-mask .spinner{background:url(../images/loader-2.gif) 50% 50% no-repeat;bottom:0;height:149px;left:0;margin:auto;position:absolute;right:0;top:0;width:218px}.data-grid-cell-content{display:inline-block;overflow:hidden;width:100%}body._in-resize{cursor:col-resize;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}body._in-resize *,body._in-resize .data-grid-th,body._in-resize .data-grid-th._draggable,body._in-resize .data-grid-th._sortable{cursor:col-resize!important}._layout-fixed{table-layout:fixed}.data-grid{border:none;font-size:1.3rem;margin-bottom:0;width:100%}.data-grid:not(._dragging-copy) ._odd-row td._dragging{background-color:#d0d0d0}.data-grid:not(._dragging-copy) ._dragging{background-color:#d9d9d9;color:rgba(48,48,48,.95)}.data-grid:not(._dragging-copy) ._dragging a{color:rgba(0,139,219,.95)}.data-grid:not(._dragging-copy) ._dragging a:hover{color:rgba(15,167,255,.95)}.data-grid._dragged{outline:#007bdb solid 1px}.data-grid thead{background-color:transparent}.data-grid tfoot th{padding:1rem}.data-grid tr._odd-row td{background-color:#f5f5f5}.data-grid tr._odd-row td._update-status-active{background:#89e1ff}.data-grid tr._odd-row td._update-status-upcoming{background:#b7ee63}.data-grid tr:hover td._update-status-active,.data-grid tr:hover td._update-status-upcoming{background-color:#e5f7fe}.data-grid tr.data-grid-tr-no-data td{font-size:1.6rem;padding:3rem;text-align:center}.data-grid tr.data-grid-tr-no-data:hover td{background-color:#fff;cursor:default}.data-grid tr:active td{background-color:#e0f6fe}.data-grid tr:hover td{background-color:#e5f7fe}.data-grid tr._dragged td{background:#d0d0d0}.data-grid tr._dragover-top td{box-shadow:inset 0 3px 0 0 #008bdb}.data-grid tr._dragover-bottom td{box-shadow:inset 0 -3px 0 0 #008bdb}.data-grid tr:not(.data-grid-editable-row):last-child td{border-bottom:.1rem solid #d6d6d6}.data-grid tr ._clickable,.data-grid tr._clickable{cursor:pointer}.data-grid tr._disabled{pointer-events:none}.data-grid td,.data-grid th{font-size:1.3rem;line-height:1.36;transition:background-color .1s linear;vertical-align:top}.data-grid td._resizing,.data-grid th._resizing{border-left:1px solid #007bdb;border-right:1px solid #007bdb}.data-grid td._hidden,.data-grid th._hidden{display:none}.data-grid td._fit,.data-grid th._fit{width:1%}.data-grid td{background-color:#fff;border-left:.1rem dashed #d6d6d6;border-right:.1rem dashed #d6d6d6;color:#303030;padding:1rem}.data-grid td:first-child{border-left-style:solid}.data-grid td:last-child{border-right-style:solid}.data-grid td .action-select-wrap{position:static}.data-grid td .action-select{color:#008bdb;text-decoration:none;background-color:transparent;border:none;font-size:1.3rem;padding:0 3rem 0 0;position:relative}.data-grid td .action-select:hover{color:#0fa7ff;text-decoration:underline}.data-grid td .action-select:hover:after{border-color:#0fa7ff transparent transparent}.data-grid td .action-select:after{border-color:#008bdb transparent transparent;margin:.6rem 0 0 .7rem;right:auto;top:auto}.data-grid td .action-select:before{display:none}.data-grid td .abs-action-menu .action-submenu,.data-grid td .abs-action-menu .action-submenu .action-submenu,.data-grid td .action-menu,.data-grid td .action-menu .action-submenu,.data-grid td .actions-split .action-menu .action-submenu,.data-grid td .actions-split .action-menu .action-submenu .action-submenu,.data-grid td .actions-split .dropdown-menu .action-submenu,.data-grid td .actions-split .dropdown-menu .action-submenu .action-submenu{left:auto;min-width:10rem;right:0;text-align:left;top:auto;z-index:1}.data-grid td._update-status-active{background:#bceeff}.data-grid td._update-status-upcoming{background:#ccf391}.data-grid th{background-color:#514943;border:.1rem solid #8a837f;border-left-color:transparent;color:#fff;font-weight:600;padding:0;text-align:left}.data-grid th:first-child{border-left-color:#8a837f}.data-grid th._dragover-left{box-shadow:inset 3px 0 0 0 #fff;z-index:2}.data-grid th._dragover-right{box-shadow:inset -3px 0 0 0 #fff}.data-grid .shadow-div{cursor:col-resize;height:100%;margin-right:-5px;position:absolute;right:0;top:0;width:10px}.data-grid .data-grid-th{background-clip:padding-box;color:#fff;padding:1rem;position:relative;vertical-align:middle}.data-grid .data-grid-th._resize-visible .shadow-div{cursor:auto;display:none}.data-grid .data-grid-th._draggable{cursor:grab}.data-grid .data-grid-th._sortable{cursor:pointer;transition:background-color .1s linear;z-index:1}.data-grid .data-grid-th._sortable:focus,.data-grid .data-grid-th._sortable:hover{background-color:#5f564f}.data-grid .data-grid-th._sortable:active{padding-bottom:.9rem;padding-top:1.1rem}.data-grid .data-grid-th.required>span:after{color:#f38a5e;content:'*';margin-left:.3rem}.data-grid .data-grid-checkbox-cell{overflow:hidden;padding:0;vertical-align:top;width:5.2rem}.data-grid .data-grid-checkbox-cell:hover{cursor:default}.data-grid .data-grid-thumbnail-cell{text-align:center;width:7rem}.data-grid .data-grid-thumbnail-cell img{border:1px solid #d6d6d6;width:5rem}.data-grid .data-grid-multicheck-cell{padding:1rem 1rem .9rem;text-align:center;vertical-align:middle}.data-grid .data-grid-onoff-cell{text-align:center;width:12rem}.data-grid .data-grid-actions-cell{padding-left:2rem;padding-right:2rem;text-align:center;width:1%}.data-grid._hidden{display:none}.data-grid._dragging-copy{box-shadow:1px 1px 5px rgba(0,0,0,.5);left:0;opacity:.95;position:fixed;top:0;z-index:1000}.data-grid._dragging-copy .data-grid-th{border:1px solid #007bdb;border-bottom:none}.data-grid._dragging-copy .data-grid-th,.data-grid._dragging-copy .data-grid-th._sortable{cursor:grabbing}.data-grid._dragging-copy tr:last-child td{border-bottom:1px solid #007bdb}.data-grid._dragging-copy td{border-left:1px solid #007bdb;border-right:1px solid #007bdb}.data-grid._dragging-copy._in-edit .data-grid-editable-row.data-grid-bulk-edit-panel td,.data-grid._dragging-copy._in-edit .data-grid-editable-row.data-grid-bulk-edit-panel td:before,.data-grid._dragging-copy._in-edit .data-grid-editable-row.data-grid-bulk-edit-panel:hover td{background-color:rgba(255,251,230,.95)}.data-grid._dragging-copy._in-edit .data-grid-editable-row td,.data-grid._dragging-copy._in-edit .data-grid-editable-row:hover td{background-color:rgba(255,255,255,.95)}.data-grid._dragging-copy._in-edit .data-grid-editable-row td:after,.data-grid._dragging-copy._in-edit .data-grid-editable-row td:before{left:0;right:0}.data-grid._dragging-copy._in-edit .data-grid-editable-row td:before{background-color:rgba(255,255,255,.95)}.data-grid._dragging-copy._in-edit .data-grid-editable-row td:only-child{border-left:1px solid #007bdb;border-right:1px solid #007bdb;left:0}.data-grid._dragging-copy._in-edit .data-grid-editable-row .admin__control-select,.data-grid._dragging-copy._in-edit .data-grid-editable-row .admin__control-text{opacity:.5}.data-grid .data-grid-controls-row td{padding-top:1.6rem}.data-grid .data-grid-controls-row td.data-grid-checkbox-cell{padding-top:.6rem}.data-grid .data-grid-controls-row td [class*=admin__control-],.data-grid .data-grid-controls-row td button{margin-top:-1.7rem}.data-grid._in-edit tr:hover td{background-color:#e6e6e6}.data-grid._in-edit ._odd-row.data-grid-editable-row td,.data-grid._in-edit ._odd-row.data-grid-editable-row:hover td{background-color:#fff}.data-grid._in-edit ._odd-row td,.data-grid._in-edit ._odd-row:hover td{background-color:#dcdcdc}.data-grid._in-edit .data-grid-editable-row-actions td,.data-grid._in-edit .data-grid-editable-row-actions:hover td{background-color:#fff}.data-grid._in-edit td{background-color:#e6e6e6;pointer-events:none}.data-grid._in-edit .data-grid-checkbox-cell{pointer-events:auto}.data-grid._in-edit .data-grid-editable-row{border:.1rem solid #adadad;border-bottom-color:#c2c2c2}.data-grid._in-edit .data-grid-editable-row:hover td{background-color:#fff}.data-grid._in-edit .data-grid-editable-row td{background-color:#fff;border-bottom-color:#fff;border-left-style:hidden;border-right-style:hidden;border-top-color:#fff;pointer-events:auto;vertical-align:middle}.data-grid._in-edit .data-grid-editable-row td:first-child{border-left-color:#adadad;border-left-style:solid}.data-grid._in-edit .data-grid-editable-row td:first-child:after,.data-grid._in-edit .data-grid-editable-row td:first-child:before{left:0}.data-grid._in-edit .data-grid-editable-row td:last-child{border-right-color:#adadad;border-right-style:solid;left:-.1rem}.data-grid._in-edit .data-grid-editable-row td:last-child:after,.data-grid._in-edit .data-grid-editable-row td:last-child:before{right:0}.data-grid._in-edit .data-grid-editable-row .admin__control-select,.data-grid._in-edit .data-grid-editable-row .admin__control-text{width:100%}.data-grid._in-edit .data-grid-bulk-edit-panel td{vertical-align:bottom}.data-grid .data-grid-editable-row td{border-left-color:#fff;border-left-style:solid;position:relative;z-index:1}.data-grid .data-grid-editable-row td:after{bottom:0;box-shadow:0 5px 5px rgba(0,0,0,.25);content:'';height:.9rem;left:0;margin-top:-1rem;position:absolute;right:0}.data-grid .data-grid-editable-row td:before{background-color:#fff;bottom:0;content:'';height:1rem;left:-10px;position:absolute;right:-10px;z-index:1}.data-grid .data-grid-editable-row.data-grid-editable-row-actions td,.data-grid .data-grid-editable-row.data-grid-editable-row-actions:hover td{background-color:#fff}.data-grid .data-grid-editable-row.data-grid-editable-row-actions td:first-child{border-left-color:#fff;border-right-color:#fff}.data-grid .data-grid-editable-row.data-grid-editable-row-actions td:last-child{left:0}.data-grid .data-grid-editable-row.data-grid-bulk-edit-panel td,.data-grid .data-grid-editable-row.data-grid-bulk-edit-panel td:before,.data-grid .data-grid-editable-row.data-grid-bulk-edit-panel:hover td{background-color:#fffbe6}.data-grid .data-grid-editable-row-actions{left:50%;margin-left:-12.5rem;margin-top:-2px;position:absolute;text-align:center}.data-grid .data-grid-editable-row-actions td{width:25rem}.data-grid .data-grid-editable-row-actions [class*=action-]{min-width:9rem}.data-grid .data-grid-draggable-row-cell{width:1%}.data-grid .data-grid-draggable-row-cell .draggable-handle{padding:0}.data-grid-th._sortable._ascend,.data-grid-th._sortable._descend{padding-right:2.7rem}.data-grid-th._sortable._ascend:before,.data-grid-th._sortable._descend:before{margin-top:-1em;position:absolute;right:1rem;top:50%}.data-grid-th._sortable._ascend:before{content:'\2193'}.data-grid-th._sortable._descend:before{content:'\2191'}.data-grid-checkbox-cell-inner{display:block;padding:1.1rem 1.8rem .9rem;text-align:right}.data-grid-checkbox-cell-inner:hover{cursor:pointer}.data-grid-state-cell-inner{display:block;padding:1.1rem 1.8rem .9rem;text-align:center}.data-grid-state-cell-inner>span{display:inline-block;font-style:italic;padding:.6rem 0}.data-grid-row-parent._active>td .data-grid-checkbox-cell-inner:before{content:'\e62b'}.data-grid-row-parent>td .data-grid-checkbox-cell-inner{padding-left:3.7rem;position:relative}.data-grid-row-parent>td .data-grid-checkbox-cell-inner:before{content:'\e628';font-size:1rem;font-weight:700;left:1.35rem;position:absolute;top:1.6rem}.data-grid-th._col-xs{width:1%}.data-grid-info-panel{box-shadow:0 0 5px rgba(0,0,0,.5);margin:2rem .1rem -2rem}.data-grid-info-panel .messages{overflow:hidden}.data-grid-info-panel .messages .message{margin:1rem}.data-grid-info-panel .messages .message:last-child{margin-bottom:1rem}.data-grid-info-panel-actions{padding:1rem;text-align:right}.data-grid-editable-row .admin__field-control{position:relative}.data-grid-editable-row .admin__field-control._error:after{border-color:transparent #ee7d7d transparent transparent;border-style:solid;border-width:0 12px 12px 0;content:'';position:absolute;right:0;top:0}.data-grid-editable-row .admin__field-control._error .admin__control-text{border-color:#ee7d7d}.data-grid-editable-row .admin__field-control._focus:after{display:none}.data-grid-editable-row .admin__field-error{bottom:100%;box-shadow:1px 1px 5px rgba(0,0,0,.5);left:0;margin:0 auto 1.5rem;max-width:32rem;position:absolute;right:0}.data-grid-editable-row .admin__field-error:after,.data-grid-editable-row .admin__field-error:before{border-style:solid;content:'';left:50%;position:absolute;top:100%}.data-grid-editable-row .admin__field-error:after{border-color:#fffbbb transparent transparent;border-width:10px 10px 0;margin-left:-10px;z-index:1}.data-grid-editable-row .admin__field-error:before{border-color:#ee7d7d transparent transparent;border-width:11px 12px 0;margin-left:-12px}.data-grid-bulk-edit-panel .admin__field-label-vertical{display:block;font-size:1.2rem;margin-bottom:.5rem;text-align:left}.data-grid-row-changed{cursor:default;display:block;opacity:.5;position:relative;width:100%;z-index:1}.data-grid-row-changed:after{content:'\e631';display:inline-block}.data-grid-row-changed .data-grid-row-changed-tooltip{background:#f1f1f1;border:1px solid #f1f1f1;border-radius:1px;bottom:100%;box-shadow:0 3px 9px 0 rgba(0,0,0,.3);display:none;font-weight:400;line-height:1.36;margin-bottom:1.5rem;padding:1rem;position:absolute;right:-1rem;text-transform:none;width:27rem;word-break:normal;z-index:2}.data-grid-row-changed._changed{opacity:1;z-index:3}.data-grid-row-changed._changed:hover .data-grid-row-changed-tooltip{display:block}.data-grid-row-changed._changed:hover:before{background:#f1f1f1;border:1px solid #f1f1f1;bottom:100%;box-shadow:4px 4px 3px -1px rgba(0,0,0,.15);content:'';display:block;height:1.6rem;left:50%;margin:0 0 .7rem -.8rem;position:absolute;-ms-transform:rotate(45deg);transform:rotate(45deg);width:1.6rem;z-index:3}.ie9 .data-grid-row-changed._changed:hover:before{display:none}.admin__data-grid-outer-wrap .data-grid-checkbox-cell{overflow:hidden}.admin__data-grid-outer-wrap .data-grid-checkbox-cell-inner{position:relative}.admin__data-grid-outer-wrap .data-grid-checkbox-cell-inner:before{bottom:0;content:'';height:500%;left:0;position:absolute;right:0;top:0}.admin__data-grid-wrap-static .data-grid-checkbox-cell:hover{cursor:pointer}.admin__data-grid-wrap-static .data-grid-checkbox-cell-inner{margin:1.1rem 1.8rem .9rem;padding:0}.adminhtml-cms-hierarchy-index .admin__data-grid-wrap-static .data-grid-actions-cell:first-child{padding:0}.adminhtml-export-index .admin__data-grid-wrap-static .data-grid-checkbox-cell-inner{margin:0;padding:1.1rem 1.8rem 1.9rem}.admin__control-addon [class*=admin__control-][class]~[class*=admin__addon-]:last-child:before,.admin__control-file-label:before,.admin__control-multiselect,.admin__control-select,.admin__control-text,.admin__control-textarea,.selectmenu{-webkit-appearance:none;background-color:#fff;border:1px solid #adadad;border-radius:1px;box-shadow:none;color:#303030;font-size:1.4rem;font-weight:400;height:auto;line-height:1.36;padding:.6rem 1rem;transition:border-color .1s linear;vertical-align:baseline;width:auto}.admin__control-addon [class*=admin__control-][class]:hover~[class*=admin__addon-]:last-child:before,.admin__control-multiselect:hover,.admin__control-select:hover,.admin__control-text:hover,.admin__control-textarea:hover,.selectmenu:hover,.selectmenu:hover .selectmenu-toggle:before{border-color:#878787}.admin__control-addon [class*=admin__control-][class]:focus~[class*=admin__addon-]:last-child:before,.admin__control-file:active+.admin__control-file-label:before,.admin__control-file:focus+.admin__control-file-label:before,.admin__control-multiselect:focus,.admin__control-select:focus,.admin__control-text:focus,.admin__control-textarea:focus,.selectmenu._focus,.selectmenu._focus .selectmenu-toggle:before{border-color:#007bdb;box-shadow:none;outline:0}.admin__control-addon [class*=admin__control-][class][disabled]~[class*=admin__addon-]:last-child:before,.admin__control-file[disabled]+.admin__control-file-label:before,.admin__control-multiselect[disabled],.admin__control-select[disabled],.admin__control-text[disabled],.admin__control-textarea[disabled]{background-color:#e9e9e9;border-color:#adadad;color:#303030;cursor:not-allowed;opacity:.5}.admin__field-row[class]>.admin__field-control,.admin__fieldset>.admin__field.admin__field-wide[class]>.admin__field-control{clear:left;float:none;text-align:left;width:auto}.admin__field-row[class]:not(.admin__field-option)>.admin__field-label,.admin__fieldset>.admin__field.admin__field-wide[class]:not(.admin__field-option)>.admin__field-label{display:block;line-height:1.4rem;margin-bottom:.86rem;margin-top:-.14rem;text-align:left;width:auto}.admin__field-row[class]:not(.admin__field-option)>.admin__field-label:before,.admin__fieldset>.admin__field.admin__field-wide[class]:not(.admin__field-option)>.admin__field-label:before{display:none}.admin__field-row[class]:not(.admin__field-option)._required>.admin__field-label span,.admin__field-row[class]:not(.admin__field-option).required>.admin__field-label span,.admin__fieldset>.admin__field.admin__field-wide[class]:not(.admin__field-option)._required>.admin__field-label span,.admin__fieldset>.admin__field.admin__field-wide[class]:not(.admin__field-option).required>.admin__field-label span{padding-left:1.5rem}.admin__field-row[class]:not(.admin__field-option)._required>.admin__field-label span:after,.admin__field-row[class]:not(.admin__field-option).required>.admin__field-label span:after,.admin__fieldset>.admin__field.admin__field-wide[class]:not(.admin__field-option)._required>.admin__field-label span:after,.admin__fieldset>.admin__field.admin__field-wide[class]:not(.admin__field-option).required>.admin__field-label span:after{left:0;margin-left:30px}.admin__legend{font-size:1.8rem;font-weight:600;margin-bottom:3rem}.admin__control-checkbox,.admin__control-radio{cursor:pointer;opacity:.01;overflow:hidden;position:absolute;vertical-align:top}.admin__control-checkbox:after,.admin__control-radio:after{display:none}.admin__control-checkbox+label,.admin__control-radio+label{cursor:pointer;display:inline-block}.admin__control-checkbox+label:before,.admin__control-radio+label:before{background-color:#fff;border:1px solid #adadad;color:transparent;float:left;height:1.6rem;text-align:center;vertical-align:top;width:1.6rem}.admin__control-checkbox+.admin__field-label,.admin__control-radio+.admin__field-label{padding-left:2.6rem}.admin__control-checkbox+.admin__field-label:before,.admin__control-radio+.admin__field-label:before{margin:1px 1rem 0 -2.6rem}.admin__control-checkbox:checked+label:before,.admin__control-radio:checked+label:before{color:#514943}.admin__control-checkbox.disabled+label,.admin__control-checkbox[disabled]+label,.admin__control-radio.disabled+label,.admin__control-radio[disabled]+label{color:#303030;cursor:default;opacity:.5}.admin__control-checkbox.disabled+label:before,.admin__control-checkbox[disabled]+label:before,.admin__control-radio.disabled+label:before,.admin__control-radio[disabled]+label:before{background-color:#e9e9e9;border-color:#adadad;cursor:default}._keyfocus .admin__control-checkbox:not(.disabled):focus+label:before,._keyfocus .admin__control-checkbox:not([disabled]):focus+label:before,._keyfocus .admin__control-radio:not(.disabled):focus+label:before,._keyfocus .admin__control-radio:not([disabled]):focus+label:before{border-color:#007bdb}.admin__control-checkbox:not(.disabled):hover+label:before,.admin__control-checkbox:not([disabled]):hover+label:before,.admin__control-radio:not(.disabled):hover+label:before,.admin__control-radio:not([disabled]):hover+label:before{border-color:#878787}.admin__control-radio+label:before{border-radius:1.6rem;content:'';transition:border-color .1s linear,color .1s ease-in}.admin__control-radio.admin__control-radio+label:before{line-height:140%}.admin__control-radio:checked+label{position:relative}.admin__control-radio:checked+label:after{background-color:#514943;border-radius:50%;content:'';height:10px;left:3px;position:absolute;top:4px;width:10px}.admin__control-radio:checked:not(.disabled):hover,.admin__control-radio:checked:not(.disabled):hover+label,.admin__control-radio:checked:not([disabled]):hover,.admin__control-radio:checked:not([disabled]):hover+label{cursor:default}.admin__control-radio:checked:not(.disabled):hover+label:before,.admin__control-radio:checked:not([disabled]):hover+label:before{border-color:#adadad}.admin__control-checkbox+label:before{border-radius:1px;content:'';font-size:0;transition:font-size .1s ease-out,color .1s ease-out,border-color .1s linear}.admin__control-checkbox:checked+label:before{content:'\e62d';font-size:1.1rem;line-height:125%}.admin__control-checkbox:not(:checked)._indeterminate+label:before,.admin__control-checkbox:not(:checked):indeterminate+label:before{color:#514943;content:'-';font-family:'Open Sans','Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.4rem;font-weight:700}input[type=checkbox].admin__control-checkbox,input[type=radio].admin__control-checkbox{margin:0;position:absolute}.admin__control-text{min-width:4rem}.admin__control-select{-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;appearance:none;background-image:url(../images/arrows-bg.svg),linear-gradient(#e3e3e3,#e3e3e3),linear-gradient(#adadad,#adadad);background-position:calc(100% - 12px) -34px,100%,calc(100% - 3.2rem) 0;background-size:auto,3.2rem 100%,1px 100%;background-repeat:no-repeat;max-width:100%;min-width:8.5rem;padding-bottom:.5rem;padding-right:4.4rem;padding-top:.5rem;transition:border-color .1s linear}.admin__control-select:hover{border-color:#878787;cursor:pointer}.admin__control-select:focus{background-image:url(../images/arrows-bg.svg),linear-gradient(#e3e3e3,#e3e3e3),linear-gradient(#007bdb,#007bdb);background-position:calc(100% - 12px) 13px,100%,calc(100% - 3.2rem) 0;border-color:#007bdb}.admin__control-select::-ms-expand{display:none}.ie9 .admin__control-select{background-image:none;padding-right:1rem}option:empty{display:none}.admin__control-multiselect{height:auto;max-width:100%;min-width:15rem;overflow:auto;padding:0;resize:both}.admin__control-multiselect optgroup,.admin__control-multiselect option{padding:.5rem 1rem}.admin__control-file-wrapper{display:inline-block;padding:.5rem 1rem;position:relative;z-index:1}.admin__control-file-label:before{content:'';left:0;position:absolute;top:0;width:100%;z-index:0}.admin__control-file{background:0 0;border:0;padding-top:.7rem;position:relative;width:auto;z-index:1}.admin__control-support-text{border:1px solid transparent;display:inline-block;font-size:1.4rem;line-height:1.36;padding-bottom:.6rem;padding-top:.6rem}.admin__control-support-text+[class*=admin__control-],[class*=admin__control-]+.admin__control-support-text{margin-left:.7rem}.admin__control-service{float:left;margin:.8rem 0 0 3rem}.admin__control-textarea{height:8.48rem;line-height:1.18;padding-top:.8rem;resize:vertical}.admin__control-addon{-ms-flex-direction:row;flex-direction:row;display:inline-flex;-ms-flex-flow:row nowrap;flex-flow:row nowrap;position:relative;width:100%;z-index:1}.admin__control-addon>[class*=admin__addon-],.admin__control-addon>[class*=admin__control-]{-ms-flex-preferred-size:auto;flex-basis:auto;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;position:relative;z-index:1}.admin__control-addon .admin__control-select{width:auto}.admin__control-addon .admin__control-text{margin:.1rem;padding:.5rem .9rem;width:100%}.admin__control-addon [class*=admin__control-][class]{appearence:none;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;-ms-flex-order:1;order:1;-ms-flex-negative:1;flex-shrink:1;background-color:transparent;border-color:transparent;box-shadow:none;vertical-align:top}.admin__control-addon [class*=admin__control-][class]+[class*=admin__control-]{border-left-color:#adadad}.admin__control-addon [class*=admin__control-][class] :focus{box-shadow:0}.admin__control-addon [class*=admin__control-][class]~[class*=admin__addon-]:last-child{padding-left:1rem;position:static!important;z-index:0}.admin__control-addon [class*=admin__control-][class]~[class*=admin__addon-]:last-child>*{position:relative;vertical-align:top;z-index:1}.admin__control-addon [class*=admin__control-][class]~[class*=admin__addon-]:last-child:empty{padding:0}.admin__control-addon [class*=admin__control-][class]~[class*=admin__addon-]:last-child:before{bottom:0;box-sizing:border-box;content:'';left:0;position:absolute;top:0;width:100%;z-index:-1}.admin__addon-prefix,.admin__addon-suffix{border:0;box-sizing:border-box;color:#858585;display:inline-block;font-size:1.4rem;font-weight:400;height:3.2rem;line-height:3.2rem;padding:0}.admin__addon-suffix{-ms-flex-order:3;order:3}.admin__addon-suffix:last-child{padding-right:1rem}.admin__addon-prefix{-ms-flex-order:0;order:0}.ie9 .admin__control-addon:after{clear:both;content:'';display:block;height:0;overflow:hidden}.ie9 .admin__addon{min-width:0;overflow:hidden;text-align:right;white-space:nowrap;width:auto}.ie9 .admin__addon [class*=admin__control-]{display:inline}.ie9 .admin__addon-prefix{float:left}.ie9 .admin__addon-suffix{float:right}.admin__control-collapsible{width:100%}.admin__control-collapsible ._dragged .admin__collapsible-block-wrapper .admin__collapsible-title{background:#d0d0d0}.admin__control-collapsible ._dragover-bottom .admin__collapsible-block-wrapper:before,.admin__control-collapsible ._dragover-top .admin__collapsible-block-wrapper:before{background:#008bdb;content:'';display:block;height:3px;left:0;position:absolute;right:0}.admin__control-collapsible ._dragover-top .admin__collapsible-block-wrapper:before{top:-3px}.admin__control-collapsible ._dragover-bottom .admin__collapsible-block-wrapper:before{bottom:-3px}.admin__control-collapsible .admin__collapsible-block-wrapper.fieldset-wrapper{border:0;margin:0;position:relative}.admin__control-collapsible .admin__collapsible-block-wrapper.fieldset-wrapper .fieldset-wrapper-title{background:#f8f8f8;border:2px solid #ccc}.admin__control-collapsible .admin__collapsible-block-wrapper .fieldset-wrapper-title .admin__collapsible-title{font-size:1.4rem;font-weight:400;line-height:1;padding:1.6rem 4rem 1.6rem 3.8rem}.admin__control-collapsible .admin__collapsible-block-wrapper .fieldset-wrapper-title .admin__collapsible-title:before{left:1rem;right:auto;top:1.4rem}.admin__control-collapsible .admin__collapsible-block-wrapper .fieldset-wrapper-title .action-delete{background-color:transparent;border-color:transparent;box-shadow:none;padding:0;position:absolute;right:1rem;top:1.4rem}.admin__control-collapsible .admin__collapsible-block-wrapper .fieldset-wrapper-title .action-delete:hover{background-color:transparent;border-color:transparent;box-shadow:none}.admin__control-collapsible .admin__collapsible-block-wrapper .fieldset-wrapper-title .action-delete:before{content:'\e630';font-size:2rem}.admin__control-collapsible .admin__collapsible-block-wrapper .fieldset-wrapper-title .action-delete>span{display:none}.admin__control-collapsible .admin__collapsible-content{background-color:#fff;margin-bottom:1rem}.admin__control-collapsible .admin__collapsible-content>.fieldset-wrapper{border:1px solid #ccc;margin-top:-1px;padding:1rem}.admin__control-collapsible .admin__collapsible-content .admin__fieldset{padding:0}.admin__control-collapsible .admin__collapsible-content .admin__field:last-child{margin-bottom:0}.admin__control-table-wrapper{max-width:100%;overflow-x:auto;overflow-y:hidden}.admin__control-table{width:100%}.admin__control-table thead{background-color:transparent}.admin__control-table tbody td{vertical-align:top}.admin__control-table tfoot th{padding-bottom:1.3rem}.admin__control-table tfoot th.validation{padding-bottom:0;padding-top:0}.admin__control-table tfoot td{border-top:1px solid #fff}.admin__control-table tfoot .admin__control-table-pagination{float:right;padding-bottom:0}.admin__control-table tfoot .action-previous{margin-right:.5rem}.admin__control-table tfoot .action-next{margin-left:.9rem}.admin__control-table tr:last-child td{border-bottom:none}.admin__control-table tr._dragover-top td{box-shadow:inset 0 3px 0 0 #008bdb}.admin__control-table tr._dragover-bottom td{box-shadow:inset 0 -3px 0 0 #008bdb}.admin__control-table tr._dragged td,.admin__control-table tr._dragged th{background:#d0d0d0}.admin__control-table td,.admin__control-table th{background-color:#efefef;border:0;border-bottom:1px solid #fff;padding:1.3rem 1rem 1.3rem 0;text-align:left;vertical-align:top}.admin__control-table td:first-child,.admin__control-table th:first-child{padding-left:1rem}.admin__control-table td>.admin__control-select,.admin__control-table td>.admin__control-text,.admin__control-table th>.admin__control-select,.admin__control-table th>.admin__control-text{width:100%}.admin__control-table td._hidden,.admin__control-table th._hidden{display:none}.admin__control-table td._fit,.admin__control-table th._fit{width:1px}.admin__control-table th{color:#303030;font-size:1.4rem;font-weight:600;vertical-align:bottom}.admin__control-table th._required span:after{color:#eb5202;content:'*'}.admin__control-table .control-table-actions-th{white-space:nowrap}.admin__control-table .control-table-actions-cell{padding-top:1.8rem;text-align:center;width:1%}.admin__control-table .control-table-options-th{text-align:center;width:10rem}.admin__control-table .control-table-options-cell{text-align:center}.admin__control-table .control-table-text{line-height:3.2rem}.admin__control-table .col-draggable{padding-top:2.2rem;width:1%}.admin__control-table .action-delete{background-color:transparent;border-color:transparent;box-shadow:none;padding-left:0;padding-right:0}.admin__control-table .action-delete:hover{background-color:transparent;border-color:transparent;box-shadow:none}.admin__control-table .action-delete:before{content:'\e630';font-size:2rem}.admin__control-table .action-delete>span{display:none}.admin__control-table .draggable-handle{padding:0}.admin__control-table._dragged{outline:#007bdb solid 1px}.admin__control-table-action{background-color:#efefef;border-top:1px solid #fff;padding:1.3rem 1rem}.admin__dynamic-rows._dragged{opacity:.95;position:absolute;z-index:999}.admin__dynamic-rows.admin__control-table .admin__control-fields>.admin__field{border:0;padding:0}.admin__dynamic-rows td>.admin__field{border:0;margin:0;padding:0}.admin__control-table-pagination{padding-bottom:1rem}.admin__control-table-pagination .admin__data-grid-pager{float:right}.admin__field-tooltip{display:inline-block;margin-top:.5rem;max-width:45px;overflow:visible;vertical-align:top;width:0}.admin__field-tooltip:hover{position:relative;z-index:500}.admin__field-option .admin__field-tooltip{margin-top:.5rem}.admin__field-tooltip .admin__field-tooltip-action{margin-left:2rem;position:relative;z-index:2;display:inline-block;text-decoration:none}.admin__field-tooltip .admin__field-tooltip-action:before{-webkit-font-smoothing:antialiased;font-size:2.2rem;line-height:1;color:#514943;content:'\e633';font-family:Icons;vertical-align:middle;display:inline-block;font-weight:400;overflow:hidden;speak:none;text-align:center}.admin__field-tooltip .admin__control-text:focus+.admin__field-tooltip-content,.admin__field-tooltip:hover .admin__field-tooltip-content{display:block}.admin__field-tooltip .admin__field-tooltip-content{bottom:3.8rem;display:none;right:-2.3rem}.admin__field-tooltip .admin__field-tooltip-content:after,.admin__field-tooltip .admin__field-tooltip-content:before{border:1.6rem solid transparent;height:0;width:0;border-top-color:#afadac;content:'';display:block;position:absolute;right:2rem;top:100%;z-index:3}.admin__field-tooltip .admin__field-tooltip-content:after{border-top-color:#fffbbb;margin-top:-1px;z-index:4}.abs-admin__field-tooltip-content,.admin__field-tooltip .admin__field-tooltip-content{box-shadow:0 2px 8px 0 rgba(0,0,0,.3);background:#fffbbb;border:1px solid #afadac;border-radius:1px;padding:1.5rem 2.5rem;position:absolute;width:32rem;z-index:1}.admin__field-fallback-reset{font-size:1.25rem;white-space:nowrap;width:30px}.admin__field-fallback-reset>span{margin-left:.5rem;position:relative}.admin__field-fallback-reset:active{-ms-transform:scale(0.98);transform:scale(0.98)}.admin__field-fallback-reset:before{transition:color .1s linear;content:'\e642';font-size:1.3rem;margin-left:.5rem}.admin__field-fallback-reset:hover{cursor:pointer;text-decoration:none}.admin__field-fallback-reset:focus{background:0 0}.abs-field-size-x-small,.abs-field-sizes.admin__field-x-small>.admin__field-control,.admin__field.admin__field-x-small>.admin__field-control,.admin__fieldset>.admin__field.admin__field-x-small>.admin__field-control,[class*=admin__control-grouped]>.admin__field.admin__field-x-small>.admin__field-control{width:8rem}.abs-field-size-small,.abs-field-sizes.admin__field-small>.admin__field-control,.admin__control-grouped-date>.admin__field-date.admin__field>.admin__field-control,.admin__field.admin__field-small>.admin__field-control,.admin__fieldset>.admin__field.admin__field-small>.admin__field-control,[class*=admin__control-grouped]>.admin__field.admin__field-small>.admin__field-control{width:15rem}.abs-field-size-medium,.abs-field-sizes.admin__field-medium>.admin__field-control,.admin__field.admin__field-medium>.admin__field-control,.admin__fieldset>.admin__field.admin__field-medium>.admin__field-control,[class*=admin__control-grouped]>.admin__field.admin__field-medium>.admin__field-control{width:34rem}.abs-field-size-large,.abs-field-sizes.admin__field-large>.admin__field-control,.admin__field.admin__field-large>.admin__field-control,.admin__fieldset>.admin__field.admin__field-large>.admin__field-control,[class*=admin__control-grouped]>.admin__field.admin__field-large>.admin__field-control{width:64rem}.abs-field-no-label,.admin__field-group-additional,.admin__field-no-label,.admin__fieldset>.admin__field.admin__field-no-label>.admin__field-control{margin-left:calc((100%) * .25 + 30px)}.admin__fieldset{border:0;margin:0;min-width:0;padding:0}.admin__fieldset .fieldset-wrapper.admin__fieldset-section>.fieldset-wrapper-title{padding-left:1rem}.admin__fieldset .fieldset-wrapper.admin__fieldset-section>.fieldset-wrapper-title strong{font-size:1.7rem;font-weight:600}.admin__fieldset .fieldset-wrapper.admin__fieldset-section .admin__fieldset-wrapper-content>.admin__fieldset{padding-top:1rem}.admin__fieldset .fieldset-wrapper.admin__fieldset-section:last-child .admin__fieldset-wrapper-content>.admin__fieldset{padding-bottom:0}.admin__fieldset>.admin__field{border:0;margin:0 0 0 -30px;padding:0}.admin__fieldset>.admin__field:after{clear:both;content:'';display:table}.admin__fieldset>.admin__field>.admin__field-control{width:calc((100%) * .5 - 30px);float:left;margin-left:30px}.admin__fieldset>.admin__field>.admin__field-label{width:calc((100%) * .25 - 30px);float:left;margin-left:30px}.admin__fieldset>.admin__field.admin__field-no-label>.admin__field-label{display:none}.admin__fieldset>.admin__field+.admin__field._empty._no-header{margin-top:-3rem}.admin__fieldset-product-websites{position:relative;z-index:300}.admin__fieldset-note{margin-bottom:2rem}.admin__form-field{border:0;margin:0;padding:0}.admin__field-control .admin__control-text,.admin__field-control .admin__control-textarea,.admin__form-field-control .admin__control-text,.admin__form-field-control .admin__control-textarea{width:100%}.admin__field-label{color:#303030;cursor:pointer;margin:0;text-align:right}.admin__field-label+br{display:none}.admin__field:not(.admin__field-option)>.admin__field-label{font-family:'Open Sans','Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.4rem;font-weight:600;line-height:3.2rem;padding:0;white-space:nowrap}.admin__field:not(.admin__field-option)>.admin__field-label:before{opacity:0;visibility:hidden;content:'.';margin-left:-7px;overflow:hidden}.admin__field:not(.admin__field-option)>.admin__field-label span{display:inline-block;line-height:1.2;vertical-align:middle;white-space:normal}.admin__field:not(.admin__field-option)>.admin__field-label span[data-config-scope]{position:relative}._required>.admin__field-label>span:after,.required>.admin__field-label>span:after{color:#eb5202;content:'*';display:inline-block;font-size:1.6rem;font-weight:500;line-height:1;margin-left:10px;margin-top:.2rem;position:absolute;z-index:1}._disabled>.admin__field-label{color:#999;cursor:default}.admin__field{margin-bottom:0}.admin__field+.admin__field{margin-top:1.5rem}.admin__field:not(.admin__field-option)~.admin__field-option{margin-top:.5rem}.admin__field.admin__field-option~.admin__field-option{margin-top:.9rem}.admin__field~.admin__field-option:last-child{margin-bottom:.8rem}.admin__fieldset>.admin__field{margin-bottom:3rem;position:relative}.admin__field legend.admin__field-label{opacity:0}.admin__field[data-config-scope]:before{color:gray;content:attr(data-config-scope);display:inline-block;font-size:1.2rem;left:calc((100%) * .75 - 30px);line-height:3.2rem;margin-left:60px;position:absolute;width:calc((100%) * .25 - 30px)}.admin__field-control .admin__field[data-config-scope]:nth-child(n+2):before{content:''}.admin__field._error .admin__field-control [class*=admin__addon-]:before,.admin__field._error .admin__field-control [class*=admin__control-] [class*=admin__addon-]:before,.admin__field._error .admin__field-control>[class*=admin__control-]{border-color:#e22626}.admin__field._disabled,.admin__field._disabled:hover{box-shadow:inherit;cursor:inherit;opacity:1;outline:inherit}.admin__field._hidden{display:none}.admin__field-control+.admin__field-control{margin-top:1.5rem}.admin__field-control._with-tooltip>.admin__control-addon,.admin__field-control._with-tooltip>.admin__control-select,.admin__field-control._with-tooltip>.admin__control-text,.admin__field-control._with-tooltip>.admin__control-textarea,.admin__field-control._with-tooltip>.admin__field-option{max-width:calc(100% - 45px - 4px)}.admin__field-control._with-tooltip .admin__field-tooltip{width:auto}.admin__field-control._with-tooltip .admin__field-option{display:inline-block}.admin__field-control._with-reset>.admin__control-addon,.admin__field-control._with-reset>.admin__control-text,.admin__field-control._with-reset>.admin__control-textarea{width:calc(100% - 30px - .5rem - 4px)}.admin__field-control._with-reset .admin__field-fallback-reset{margin-left:.5rem;margin-top:1rem;vertical-align:top}.admin__field-control._with-reset._with-tooltip>.admin__control-addon,.admin__field-control._with-reset._with-tooltip>.admin__control-text,.admin__field-control._with-reset._with-tooltip>.admin__control-textarea{width:calc(100% - 30px - .5rem - 45px - 8px)}.admin__fieldset>.admin__field-collapsible{margin-bottom:0}.admin__fieldset>.admin__field-collapsible .admin__field-control{border-top:1px solid #ccc;display:block;font-size:1.7rem;font-weight:700;padding:1.7rem 0;width:calc(97%)}.admin__fieldset>.admin__field-collapsible .admin__field-option{padding-top:0}.admin__field-collapsible+div{margin-top:2.5rem}.admin__field-collapsible .admin__control-radio+label:before{height:1.8rem;width:1.8rem}.admin__field-collapsible .admin__control-radio:checked+label:after{left:4px;top:5px}.admin__field-error{background:#fffbbb;border:1px solid #ee7d7d;box-sizing:border-box;color:#555;display:block;font-size:1.2rem;font-weight:400;line-height:1.2;margin:.2rem 0 0;padding:.8rem 1rem .9rem}.admin__field-note{color:#303030;font-size:1.2rem;margin:10px 0 0;padding:0}.admin__additional-info{padding-top:1rem}.admin__field-option{padding-top:.7rem}.admin__field-option .admin__field-label{text-align:left}.admin__field-control>.admin__field-option:nth-child(1):nth-last-child(2),.admin__field-control>.admin__field-option:nth-child(2):nth-last-child(1){display:inline-block}.admin__field-control>.admin__field-option:nth-child(1):nth-last-child(2)+.admin__field-option,.admin__field-control>.admin__field-option:nth-child(2):nth-last-child(1)+.admin__field-option{display:inline-block;margin-left:41px;margin-top:0}.admin__field-control>.admin__field-option:nth-child(1):nth-last-child(2)+.admin__field-option:before,.admin__field-control>.admin__field-option:nth-child(2):nth-last-child(1)+.admin__field-option:before{background:#cacaca;content:'';display:inline-block;height:20px;margin-left:-20px;position:absolute;width:1px}.admin__field-value{display:inline-block;padding-top:.7rem}.admin__field-service{padding-top:1rem}.admin__control-fields>.admin__field:first-child,[class*=admin__control-grouped]>.admin__field:first-child{position:static}.admin__control-fields>.admin__field:first-child>.admin__field-label,[class*=admin__control-grouped]>.admin__field:first-child>.admin__field-label{width:calc((100%) * .25 - 30px);float:left;margin-left:30px;background:#fff;cursor:pointer;left:0;position:absolute;top:0}.admin__control-fields>.admin__field:first-child>.admin__field-label span:before,[class*=admin__control-grouped]>.admin__field:first-child>.admin__field-label span:before{display:block}.admin__control-fields>.admin__field._disabled>.admin__field-label,[class*=admin__control-grouped]>.admin__field._disabled>.admin__field-label{cursor:default}.admin__control-fields>.admin__field>.admin__field-label span:before,[class*=admin__control-grouped]>.admin__field>.admin__field-label span:before{display:none}.admin__control-fields .admin__field-label~.admin__field-control{width:100%}.admin__control-fields .admin__field-option{padding-top:0}[class*=admin__control-grouped]{box-sizing:border-box;display:table;width:100%}[class*=admin__control-grouped]>.admin__field{display:table-cell;vertical-align:top}[class*=admin__control-grouped]>.admin__field>.admin__field-control{float:none;width:100%}[class*=admin__control-grouped]>.admin__field.admin__field-default,[class*=admin__control-grouped]>.admin__field.admin__field-large,[class*=admin__control-grouped]>.admin__field.admin__field-medium,[class*=admin__control-grouped]>.admin__field.admin__field-small,[class*=admin__control-grouped]>.admin__field.admin__field-x-small{width:1px}[class*=admin__control-grouped]>.admin__field.admin__field-default+.admin__field:last-child,[class*=admin__control-grouped]>.admin__field.admin__field-large+.admin__field:last-child,[class*=admin__control-grouped]>.admin__field.admin__field-medium+.admin__field:last-child,[class*=admin__control-grouped]>.admin__field.admin__field-small+.admin__field:last-child,[class*=admin__control-grouped]>.admin__field.admin__field-x-small+.admin__field:last-child{width:auto}[class*=admin__control-grouped]>.admin__field:nth-child(n+2){padding-left:20px}.admin__control-group-equal{table-layout:fixed}.admin__control-group-equal>.admin__field{width:50%}.admin__field-control-group{margin-top:.8rem}.admin__field-control-group>.admin__field{padding:0}.admin__control-grouped-date>.admin__field-date{white-space:nowrap;width:1px}.admin__control-grouped-date>.admin__field-date.admin__field>.admin__field-control{float:left;position:relative}.admin__control-grouped-date>.admin__field-date+.admin__field:last-child{width:auto}.admin__control-grouped-date>.admin__field-date+.admin__field-date>.admin__field-label{float:left;padding-right:20px}.admin__control-grouped-date .ui-datepicker-trigger{left:100%;top:0}.admin__field-group-columns.admin__field-control.admin__control-grouped{width:calc((100%) * 1 - 30px);float:left;margin-left:30px}.admin__field-group-columns>.admin__field:first-child>.admin__field-label{float:none;margin:0;opacity:1;position:static;text-align:left}.admin__field-group-columns .admin__control-select{width:100%}.admin__field-group-additional{clear:both}.admin__field-group-additional .action-advanced{margin-top:1rem}.admin__field-group-additional .action-secondary{width:100%}.admin__field-group-show-label{white-space:nowrap}.admin__field-group-show-label>.admin__field-control,.admin__field-group-show-label>.admin__field-label{display:inline-block;vertical-align:top}.admin__field-group-show-label>.admin__field-label{margin-right:20px}.admin__field-complex{margin:1rem 0 3rem;padding-left:1rem}.admin__field:not(._hidden)+.admin__field-complex{margin-top:3rem}.admin__field-complex .admin__field-complex-title{clear:both;color:#303030;font-size:1.7rem;font-weight:600;letter-spacing:.025em;margin-bottom:1rem}.admin__field-complex .admin__field-complex-elements{float:right;max-width:40%}.admin__field-complex .admin__field-complex-elements button{margin-left:1rem}.admin__field-complex .admin__field-complex-content{max-width:60%;overflow:hidden}.admin__field-complex .admin__field-complex-text{margin-left:-1rem}.admin__field-complex+.admin__field._empty._no-header{margin-top:-3rem}.admin__legend{float:left;position:static;width:100%}.admin__legend+br{clear:left;display:block;height:0;overflow:hidden}.message{margin-bottom:3rem}.message-icon-top:before{margin-top:0;top:1.8rem}.nav{background-color:#f8f8f8;border-bottom:1px solid #e3e3e3;border-top:1px solid #e3e3e3;display:none;margin-bottom:3rem;padding:2.2rem 1.5rem 0 0}.nav .btn-group,.nav-bar-outer-actions{float:right;margin-bottom:1.7rem}.nav .btn-group .btn-wrap,.nav-bar-outer-actions .btn-wrap{float:right;margin-left:.5rem;margin-right:.5rem}.nav .btn-group .btn-wrap .btn,.nav-bar-outer-actions .btn-wrap .btn{padding-left:.5rem;padding-right:.5rem}.nav-bar-outer-actions{margin-top:-10.6rem;padding-right:1.5rem}.btn-wrap-try-again{width:9.5rem}.btn-wrap-next,.btn-wrap-prev{width:8.5rem}.nav-bar{counter-reset:i;float:left;margin:0 1rem 1.7rem 0;padding:0;position:relative;white-space:nowrap}.nav-bar:before{background-color:#d4d4d4;background-repeat:repeat-x;background-image:linear-gradient(to bottom,#d1d1d1 0,#d4d4d4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#d1d1d1', endColorstr='#d4d4d4', GradientType=0);border-bottom:1px solid #d9d9d9;border-top:1px solid #bfbfbf;content:'';height:1rem;left:5.15rem;position:absolute;right:5.15rem;top:.7rem}.nav-bar>li{display:inline-block;font-size:0;position:relative;vertical-align:top;width:10.3rem}.nav-bar>li:first-child:after{display:none}.nav-bar>li:after{background-color:#514943;content:'';height:.5rem;left:calc(-50% + .25rem);position:absolute;right:calc(50% + .7rem);top:.9rem}.nav-bar>li.disabled:before,.nav-bar>li.ui-state-disabled:before{bottom:0;content:'';left:0;position:absolute;right:0;top:0;z-index:1}.nav-bar>li.active~li:after,.nav-bar>li.ui-state-active~li:after{display:none}.nav-bar>li.active~li a:after,.nav-bar>li.ui-state-active~li a:after{background-color:transparent;border-color:transparent;color:#a6a6a6}.nav-bar>li.active a,.nav-bar>li.ui-state-active a{color:#000}.nav-bar>li.active a:hover,.nav-bar>li.ui-state-active a:hover{cursor:default}.nav-bar>li.active a:after,.nav-bar>li.ui-state-active a:after{background-color:#fff;content:''}.nav-bar a{color:#514943;display:block;font-size:1.2rem;font-weight:600;line-height:1.2;overflow:hidden;padding:3rem .5em 0;position:relative;text-align:center;text-overflow:ellipsis}.nav-bar a:hover{text-decoration:none}.nav-bar a:after{background-color:#514943;border:.4rem solid #514943;border-radius:100%;color:#fff;content:counter(i);counter-increment:i;height:1.5rem;left:50%;line-height:.6;margin-left:-.8rem;position:absolute;right:auto;text-align:center;top:.4rem;width:1.5rem}.nav-bar a:before{background-color:#d6d6d6;border:1px solid transparent;border-bottom-color:#d9d9d9;border-radius:100%;border-top-color:#bfbfbf;content:'';height:2.3rem;left:50%;line-height:1;margin-left:-1.2rem;position:absolute;top:0;width:2.3rem}.tooltip{display:block;font-family:'Open Sans','Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.19rem;font-weight:400;line-height:1.4;opacity:0;position:absolute;visibility:visible;z-index:10}.tooltip.in{opacity:.9}.tooltip.top{margin-top:-4px;padding:8px 0}.tooltip.right{margin-left:4px;padding:0 8px}.tooltip.bottom{margin-top:4px;padding:8px 0}.tooltip.left{margin-left:-4px;padding:0 8px}.tooltip p:last-child{margin-bottom:0}.tooltip-inner{background-color:#fff;border:1px solid #adadad;border-radius:0;box-shadow:1px 1px 1px #ccc;color:#41362f;max-width:31rem;padding:.5em 1em;text-decoration:none}.tooltip-arrow,.tooltip-arrow:after{border:solid transparent;height:0;position:absolute;width:0}.tooltip-arrow:after{content:'';position:absolute}.tooltip.top .tooltip-arrow,.tooltip.top .tooltip-arrow:after{border-top-color:#949494;border-width:8px 8px 0;bottom:0;left:50%;margin-left:-8px}.tooltip.top-left .tooltip-arrow,.tooltip.top-left .tooltip-arrow:after{border-top-color:#949494;border-width:8px 8px 0;bottom:0;margin-bottom:-8px;right:8px}.tooltip.top-right .tooltip-arrow,.tooltip.top-right .tooltip-arrow:after{border-top-color:#949494;border-width:8px 8px 0;bottom:0;left:8px;margin-bottom:-8px}.tooltip.right .tooltip-arrow,.tooltip.right .tooltip-arrow:after{border-right-color:#949494;border-width:8px 8px 8px 0;left:1px;margin-top:-8px;top:50%}.tooltip.right .tooltip-arrow:after{border-right-color:#fff;border-width:6px 7px 6px 0;margin-left:0;margin-top:-6px}.tooltip.left .tooltip-arrow,.tooltip.left .tooltip-arrow:after{border-left-color:#949494;border-width:8px 0 8px 8px;margin-top:-8px;right:0;top:50%}.tooltip.bottom .tooltip-arrow,.tooltip.bottom .tooltip-arrow:after{border-bottom-color:#949494;border-width:0 8px 8px;left:50%;margin-left:-8px;top:0}.tooltip.bottom-left .tooltip-arrow,.tooltip.bottom-left .tooltip-arrow:after{border-bottom-color:#949494;border-width:0 8px 8px;margin-top:-8px;right:8px;top:0}.tooltip.bottom-right .tooltip-arrow,.tooltip.bottom-right .tooltip-arrow:after{border-bottom-color:#949494;border-width:0 8px 8px;left:8px;margin-top:-8px;top:0}.password-strength{display:block;margin:0 -.3rem 1em;white-space:nowrap}.password-strength.password-strength-too-short .password-strength-item:first-child,.password-strength.password-strength-weak .password-strength-item:first-child,.password-strength.password-strength-weak .password-strength-item:first-child+.password-strength-item{background-color:#e22626}.password-strength.password-strength-fair .password-strength-item:first-child,.password-strength.password-strength-fair .password-strength-item:first-child+.password-strength-item,.password-strength.password-strength-fair .password-strength-item:first-child+.password-strength-item+.password-strength-item{background-color:#ef672f}.password-strength.password-strength-good .password-strength-item:first-child,.password-strength.password-strength-good .password-strength-item:first-child+.password-strength-item,.password-strength.password-strength-good .password-strength-item:first-child+.password-strength-item+.password-strength-item,.password-strength.password-strength-good .password-strength-item:first-child+.password-strength-item+.password-strength-item+.password-strength-item,.password-strength.password-strength-strong .password-strength-item{background-color:#79a22e}.password-strength .password-strength-item{background-color:#ccc;display:inline-block;font-size:0;height:1.4rem;margin-right:.3rem;width:calc(20% - .6rem)}@keyframes progress-bar-stripes{from{background-position:4rem 0}to{background-position:0 0}}.progress{background-color:#fafafa;border:1px solid #ccc;clear:left;height:3rem;margin-bottom:3rem;overflow:hidden}.progress-bar{background-color:#79a22e;color:#fff;float:left;font-size:1.19rem;height:100%;line-height:3rem;text-align:center;transition:width .6s ease;width:0}.progress-bar.active{animation:progress-bar-stripes 2s linear infinite}.progress-bar-text-description{margin-bottom:1.6rem}.progress-bar-text-progress{text-align:right}.page-columns .page-inner-sidebar{margin:0 0 3rem}.page-header{margin-bottom:2.7rem;padding-bottom:2rem;position:relative}.page-header:before{border-bottom:1px solid #e3e3e3;bottom:0;content:'';display:block;height:1px;left:3rem;position:absolute;right:3rem}.container .page-header:before{content:normal}.page-header .message{margin-bottom:1.8rem}.page-header .message+.message{margin-top:-1.5rem}.page-header .admin__action-dropdown,.page-header .search-global-input{transition:none}.container .page-header{margin-bottom:0}.page-title-wrapper{margin-top:1.1rem}.container .page-title-wrapper{background:url(../../pub/images/logo.svg) no-repeat;min-height:41px;padding:4px 0 0 45px}.admin__menu .level-0:first-child>a{margin-top:1.6rem}.admin__menu .level-0:first-child>a:after{top:-1.6rem}.admin__menu .level-0:first-child._active>a:after{display:block}.admin__menu .level-0>a{padding-bottom:1.3rem;padding-top:1.3rem}.admin__menu .level-0>a:before{margin-bottom:.7rem}.admin__menu .item-home>a:before{content:'\e611';font-size:2.3rem;padding-top:-.1rem}.admin__menu .item-component>a:before{content:'\e612'}.admin__menu .item-extension>a:before{content:'\e647'}.admin__menu .item-upgrade>a:before{content:'\e614'}.admin__menu .item-system-config>a:before{content:'\e610'}.admin__menu .item-tools>a:before{content:'\e613'}.modal-sub-title{font-size:1.7rem;font-weight:600}.modal-connect-signin .modal-inner-wrap{max-width:80rem}@keyframes ngdialog-fadeout{0%{opacity:1}100%{opacity:0}}@keyframes ngdialog-fadein{0%{opacity:0}100%{opacity:1}}.ngdialog{-webkit-overflow-scrolling:touch;bottom:0;box-sizing:border-box;left:0;overflow:auto;position:fixed;right:0;top:0;z-index:999}.ngdialog *,.ngdialog:after,.ngdialog:before{box-sizing:inherit}.ngdialog.ngdialog-disabled-animation *{animation:none!important}.ngdialog.ngdialog-closing .ngdialog-content,.ngdialog.ngdialog-closing .ngdialog-overlay{-webkit-animation:ngdialog-fadeout .5s;-webkit-backface-visibility:hidden;animation:ngdialog-fadeout .5s}.ngdialog-overlay{-webkit-animation:ngdialog-fadein .5s;-webkit-backface-visibility:hidden;animation:ngdialog-fadein .5s;background:rgba(0,0,0,.4);bottom:0;left:0;position:fixed;right:0;top:0}.ngdialog-content{-webkit-animation:ngdialog-fadein .5s;-webkit-backface-visibility:hidden;animation:ngdialog-fadein .5s}body.ngdialog-open{overflow:hidden}.component-indicator{border-radius:50%;cursor:help;display:inline-block;height:16px;text-align:center;vertical-align:middle;width:16px}.component-indicator::after,.component-indicator::before{background:#fff;display:block;opacity:0;position:absolute;transition:opacity .2s linear .1s;visibility:hidden}.component-indicator::before{border:1px solid #adadad;border-radius:1px;box-shadow:0 0 2px rgba(0,0,0,.4);content:attr(data-label);font-size:1.2rem;margin:30px 0 0 -10px;min-width:50px;padding:4px 5px}.component-indicator::after{border-color:#999;border-style:solid;border-width:1px 0 0 1px;box-shadow:-1px -1px 1px rgba(0,0,0,.1);content:'';height:10px;margin:9px 0 0 5px;-ms-transform:rotate(45deg);transform:rotate(45deg);width:10px}.component-indicator:hover::after,.component-indicator:hover::before{opacity:1;transition:opacity .2s linear;visibility:visible}.component-indicator span{display:block;height:16px;overflow:hidden;width:16px}.component-indicator span:before{content:'';display:block;font-family:Icons;font-size:16px;height:100%;line-height:16px;width:100%}.component-indicator._on{background:#79a22e}.component-indicator._off{background:#e22626}.component-indicator._off span:before{background:#fff;height:4px;margin:8px auto 20px;width:12px}.component-indicator._info{background:0 0}.component-indicator._info span{width:21px}.component-indicator._info span:before{color:#008bdb;content:'\e648';font-family:Icons;font-size:16px}.component-indicator._tooltip{background:0 0;margin:0 0 8px 5px}.component-indicator._tooltip a{width:21px}.component-indicator._tooltip a:hover{text-decoration:none}.component-indicator._tooltip a:before{color:#514943;content:'\e633';font-family:Icons;font-size:16px}.col-manager-item-name .data-grid-data{padding-left:5px}.col-manager-item-name .ng-hide+.data-grid-data{padding-left:24px}.col-manager-item-name ._hide-dependencies,.col-manager-item-name ._show-dependencies{cursor:pointer;padding-left:24px;position:relative}.col-manager-item-name ._hide-dependencies:before,.col-manager-item-name ._show-dependencies:before{display:block;font-family:Icons;font-size:12px;left:0;position:absolute;top:1px}.col-manager-item-name ._show-dependencies:before{content:'\e62b'}.col-manager-item-name ._hide-dependencies:before{content:'\e628'}.col-manager-item-name ._no-dependencies{padding-left:24px}.product-modules-block{font-size:1.2rem;padding:15px 0 0}.col-manager-item-name .product-modules-block{padding-left:1rem}.product-modules-descriprion,.product-modules-title{font-weight:700;margin:0 0 7px}.product-modules-list{font-size:1.1rem;list-style:none;margin:0}.col-manager-item-name .product-modules-list{margin-left:15px}.col-manager-item-name .product-modules-list li{padding:0 0 0 15px;position:relative}.product-modules-list li{margin:0 0 .5rem}.product-modules-list .component-indicator{height:10px;left:0;position:absolute;top:3px;width:10px}.module-summary{white-space:nowrap}.module-summary-title{font-size:2.1rem;margin-right:1rem}.app-updater .nav{display:block;margin-bottom:3.1rem;margin-top:-2.8rem}.app-updater .nav-bar-outer-actions{margin-top:1rem;padding-right:0}.app-updater .nav-bar-outer-actions .btn-wrap-cancel{margin-right:2.6rem}.main{padding-bottom:2rem;padding-top:3rem}.menu-wrapper .logo-static{pointer-events:none}.header{display:none}.header .logo{float:left;height:4.1rem;width:3.5rem}.header-title{font-size:2.8rem;letter-spacing:.02em;line-height:1.4;margin:2.5rem 0 3.5rem 5rem}.page-title{margin-bottom:1rem}.page-sub-title{font-size:2rem}.accent-box{margin-bottom:2rem}.accent-box .btn-prime{margin-top:1.5rem}.spinner.side{float:left;font-size:2.4rem;margin-left:2rem;margin-top:-5px}.page-landing{margin:7.6% auto 0;max-width:44rem;text-align:center}.page-landing .logo{height:5.6rem;margin-bottom:2rem;width:19.2rem}.page-landing .text-version{margin-bottom:3rem}.page-landing .text-welcome{margin-bottom:6.5rem}.page-landing .text-terms{margin-bottom:2.5rem;text-align:center}.page-landing .btn-submit,.page-license .license-text{margin-bottom:2rem}.page-license .page-license-footer{text-align:right}.readiness-check-item{margin-bottom:4rem;min-height:2.5rem}.readiness-check-item .spinner{float:left;font-size:2.5rem;margin:-.4rem 0 0 1.7rem}.readiness-check-title{font-size:1.4rem;font-weight:700;margin-bottom:.1rem;margin-left:5.7rem}.readiness-check-content{margin-left:5.7rem;margin-right:22rem;position:relative}.readiness-check-content .readiness-check-title{margin-left:0}.readiness-check-content .list{margin-top:-.3rem}.readiness-check-side{left:100%;padding-left:2.4rem;position:absolute;top:0;width:22rem}.readiness-check-side .side-title{margin-bottom:0}.readiness-check-icon{float:left;margin-left:1.7rem;margin-top:.3rem}.extensions-information{margin-bottom:5rem}.extensions-information h3{font-size:1.4rem;margin-bottom:1.3rem}.extensions-information .message{margin-bottom:2.5rem}.extensions-information .message:before{margin-top:0;top:1.8rem}.extensions-information .extensions-container{padding:0 2rem}.extensions-information .list{margin-bottom:1rem}.extensions-information .list select{cursor:pointer}.extensions-information .list select:disabled{background:#ccc;cursor:default}.extensions-information .list .extension-delete{font-size:1.7rem;padding-top:0}.delete-modal-wrap{padding:0 4% 4rem}.delete-modal-wrap h3{font-size:3.4rem;display:inline-block;font-weight:300;margin:0 0 2rem;padding:.9rem 0 0;vertical-align:top}.delete-modal-wrap .actions{padding:3rem 0 0}.page-web-configuration .form-el-insider-wrap{width:auto}.page-web-configuration .form-el-insider{width:15.4rem}.page-web-configuration .form-el-insider-input .form-el-input{width:16.5rem}.customize-your-store .advanced-modules-count,.customize-your-store .advanced-modules-select{padding-left:1.5rem}.customize-your-store .customize-your-store-advanced{min-width:0}.customize-your-store .message-error:before{margin-top:0;top:1.8rem}.customize-your-store .message-error a{color:#333;text-decoration:underline}.customize-your-store .message-error .form-label:before{background:#fff}.customize-your-store .customize-database-clean p{margin-top:2.5rem}.content-install{margin-bottom:2rem}.console{border:1px solid #ccc;font-family:'Courier New',Courier,monospace;font-weight:300;height:20rem;margin:1rem 0 2rem;overflow-y:auto;padding:1.5rem 2rem 2rem;resize:vertical}.console .text-danger{color:#e22626}.console .text-success{color:#090}.console .hidden{display:none}.content-success .btn-prime{margin-top:1.5rem}.jumbo-title{font-size:3.6rem}.jumbo-title .jumbo-icon{font-size:3.8rem;margin-right:.25em;position:relative;top:.15em}.install-database-clean{margin-top:4rem}.install-database-clean .btn{margin-right:1rem}.page-sub-title{margin-bottom:2.1rem;margin-top:3rem}.multiselect-custom{max-width:71.1rem}.content-install{margin-top:3.7rem}.home-page-inner-wrap{margin:0 auto;max-width:91rem}.setup-home-title{margin-bottom:3.9rem;padding-top:1.8rem;text-align:center}.setup-home-item{background-color:#fafafa;border:1px solid #ccc;color:#333;display:block;margin-bottom:2rem;margin-left:1.3rem;margin-right:1.3rem;min-height:30rem;padding:2rem;text-align:center}.setup-home-item:hover{border-color:#8c8c8c;color:#333;text-decoration:none;transition:border-color .1s linear}.setup-home-item:active{-ms-transform:scale(0.99);transform:scale(0.99)}.setup-home-item:before{display:block;font-size:7rem;margin-bottom:3.3rem;margin-top:4rem}.setup-home-item-component:before,.setup-home-item-extension:before{content:'\e612'}.setup-home-item-module:before{content:'\e647'}.setup-home-item-upgrade:before{content:'\e614'}.setup-home-item-configuration:before{content:'\e610'}.setup-home-item-title{display:block;font-size:1.8rem;letter-spacing:.025em;margin-bottom:1rem}.setup-home-item-description{display:block}.extension-manager-wrap{border:1px solid #bbb;margin:0 0 4rem}.extension-manager-account{font-size:2.1rem;display:inline-block;font-weight:400}.extension-manager-title{font-size:3.2rem;background-color:#f8f8f8;border-bottom:1px solid #e3e3e3;color:#41362f;font-weight:600;line-height:1.2;padding:2rem}.extension-manager-content{padding:2.5rem 2rem 2rem}.extension-manager-items{list-style:none;margin:0;text-align:center}.extension-manager-items .btn{border:1px solid #adadad;display:block;margin:1rem auto 0}.extension-manager-items .item-title{font-size:2.1rem;display:inline-block;text-align:left}.extension-manager-items .item-number{font-size:4.1rem;display:inline-block;line-height:.8;margin:0 5px 1.5rem 0;vertical-align:top}.extension-manager-items .item-date{font-size:2.6rem;margin-top:1px}.extension-manager-items .item-date-title{font-size:1.5rem}.extension-manager-items .item-install{margin:0 0 2rem}.sync-login-wrap{padding:0 10% 4rem}.sync-login-wrap .legend{font-size:2.6rem;color:#eb5202;float:left;font-weight:300;line-height:1.2;margin:-1rem 0 2.5rem;position:static;width:100%}.sync-login-wrap .legend._hidden{display:none}.sync-login-wrap .login-header{font-size:3.4rem;font-weight:300;margin:0 0 2rem}.sync-login-wrap .login-header span{display:inline-block;padding:.9rem 0 0;vertical-align:top}.sync-login-wrap h4{font-size:1.4rem;margin:0 0 2rem}.sync-login-wrap .sync-login-steps{margin:0 0 2rem 1.5rem}.sync-login-wrap .sync-login-steps li{padding:0 0 0 1rem}.sync-login-wrap .form-row .form-label{display:inline-block}.sync-login-wrap .form-row .form-label.required{padding-left:1.5rem}.sync-login-wrap .form-row .form-label.required:after{left:0;position:absolute;right:auto}.sync-login-wrap .form-row{max-width:28rem}.sync-login-wrap .form-actions{display:table;margin-top:-1.3rem}.sync-login-wrap .form-actions .links{display:table-header-group}.sync-login-wrap .form-actions .actions{padding:3rem 0 0}@media all and (max-width:1047px){.admin__menu .submenu li{min-width:19.8rem}.nav{padding-bottom:5.38rem;padding-left:1.5rem;text-align:center}.nav-bar{display:inline-block;float:none;margin-right:0;vertical-align:top}.nav .btn-group,.nav-bar-outer-actions{display:inline-block;float:none;margin-top:-8.48rem;text-align:center;vertical-align:top;width:100%}.nav-bar-outer-actions{padding-right:0}.nav-bar-outer-actions .outer-actions-inner-wrap{display:inline-block}.app-updater .nav{padding-bottom:1.7rem}.app-updater .nav-bar-outer-actions{margin-top:2rem}}@media all and (min-width:768px){.page-layout-admin-2columns-left .page-columns{margin-left:-30px}.page-layout-admin-2columns-left .page-columns:after{clear:both;content:'';display:table}.page-layout-admin-2columns-left .page-columns .main-col{width:calc((100%) * .75 - 30px);float:right}.page-layout-admin-2columns-left .page-columns .side-col{width:calc((100%) * .25 - 30px);float:left;margin-left:30px}.col-m-1,.col-m-10,.col-m-11,.col-m-12,.col-m-2,.col-m-3,.col-m-4,.col-m-5,.col-m-6,.col-m-7,.col-m-8,.col-m-9{float:left}.col-m-12{width:100%}.col-m-11{width:91.66666667%}.col-m-10{width:83.33333333%}.col-m-9{width:75%}.col-m-8{width:66.66666667%}.col-m-7{width:58.33333333%}.col-m-6{width:50%}.col-m-5{width:41.66666667%}.col-m-4{width:33.33333333%}.col-m-3{width:25%}.col-m-2{width:16.66666667%}.col-m-1{width:8.33333333%}.col-m-pull-12{right:100%}.col-m-pull-11{right:91.66666667%}.col-m-pull-10{right:83.33333333%}.col-m-pull-9{right:75%}.col-m-pull-8{right:66.66666667%}.col-m-pull-7{right:58.33333333%}.col-m-pull-6{right:50%}.col-m-pull-5{right:41.66666667%}.col-m-pull-4{right:33.33333333%}.col-m-pull-3{right:25%}.col-m-pull-2{right:16.66666667%}.col-m-pull-1{right:8.33333333%}.col-m-pull-0{right:auto}.col-m-push-12{left:100%}.col-m-push-11{left:91.66666667%}.col-m-push-10{left:83.33333333%}.col-m-push-9{left:75%}.col-m-push-8{left:66.66666667%}.col-m-push-7{left:58.33333333%}.col-m-push-6{left:50%}.col-m-push-5{left:41.66666667%}.col-m-push-4{left:33.33333333%}.col-m-push-3{left:25%}.col-m-push-2{left:16.66666667%}.col-m-push-1{left:8.33333333%}.col-m-push-0{left:auto}.col-m-offset-12{margin-left:100%}.col-m-offset-11{margin-left:91.66666667%}.col-m-offset-10{margin-left:83.33333333%}.col-m-offset-9{margin-left:75%}.col-m-offset-8{margin-left:66.66666667%}.col-m-offset-7{margin-left:58.33333333%}.col-m-offset-6{margin-left:50%}.col-m-offset-5{margin-left:41.66666667%}.col-m-offset-4{margin-left:33.33333333%}.col-m-offset-3{margin-left:25%}.col-m-offset-2{margin-left:16.66666667%}.col-m-offset-1{margin-left:8.33333333%}.col-m-offset-0{margin-left:0}.page-columns{margin-left:-30px}.page-columns:after{clear:both;content:'';display:table}.page-columns .page-inner-content{width:calc((100%) * .75 - 30px);float:right}.page-columns .page-inner-sidebar{width:calc((100%) * .25 - 30px);float:left;margin-left:30px}}@media all and (min-width:1048px){.col-l-1,.col-l-10,.col-l-11,.col-l-12,.col-l-2,.col-l-3,.col-l-4,.col-l-5,.col-l-6,.col-l-7,.col-l-8,.col-l-9{float:left}.col-l-12{width:100%}.col-l-11{width:91.66666667%}.col-l-10{width:83.33333333%}.col-l-9{width:75%}.col-l-8{width:66.66666667%}.col-l-7{width:58.33333333%}.col-l-6{width:50%}.col-l-5{width:41.66666667%}.col-l-4{width:33.33333333%}.col-l-3{width:25%}.col-l-2{width:16.66666667%}.col-l-1{width:8.33333333%}.col-l-pull-12{right:100%}.col-l-pull-11{right:91.66666667%}.col-l-pull-10{right:83.33333333%}.col-l-pull-9{right:75%}.col-l-pull-8{right:66.66666667%}.col-l-pull-7{right:58.33333333%}.col-l-pull-6{right:50%}.col-l-pull-5{right:41.66666667%}.col-l-pull-4{right:33.33333333%}.col-l-pull-3{right:25%}.col-l-pull-2{right:16.66666667%}.col-l-pull-1{right:8.33333333%}.col-l-pull-0{right:auto}.col-l-push-12{left:100%}.col-l-push-11{left:91.66666667%}.col-l-push-10{left:83.33333333%}.col-l-push-9{left:75%}.col-l-push-8{left:66.66666667%}.col-l-push-7{left:58.33333333%}.col-l-push-6{left:50%}.col-l-push-5{left:41.66666667%}.col-l-push-4{left:33.33333333%}.col-l-push-3{left:25%}.col-l-push-2{left:16.66666667%}.col-l-push-1{left:8.33333333%}.col-l-push-0{left:auto}.col-l-offset-12{margin-left:100%}.col-l-offset-11{margin-left:91.66666667%}.col-l-offset-10{margin-left:83.33333333%}.col-l-offset-9{margin-left:75%}.col-l-offset-8{margin-left:66.66666667%}.col-l-offset-7{margin-left:58.33333333%}.col-l-offset-6{margin-left:50%}.col-l-offset-5{margin-left:41.66666667%}.col-l-offset-4{margin-left:33.33333333%}.col-l-offset-3{margin-left:25%}.col-l-offset-2{margin-left:16.66666667%}.col-l-offset-1{margin-left:8.33333333%}.col-l-offset-0{margin-left:0}}@media all and (min-width:1440px){.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9{float:left}.col-xl-12{width:100%}.col-xl-11{width:91.66666667%}.col-xl-10{width:83.33333333%}.col-xl-9{width:75%}.col-xl-8{width:66.66666667%}.col-xl-7{width:58.33333333%}.col-xl-6{width:50%}.col-xl-5{width:41.66666667%}.col-xl-4{width:33.33333333%}.col-xl-3{width:25%}.col-xl-2{width:16.66666667%}.col-xl-1{width:8.33333333%}.col-xl-pull-12{right:100%}.col-xl-pull-11{right:91.66666667%}.col-xl-pull-10{right:83.33333333%}.col-xl-pull-9{right:75%}.col-xl-pull-8{right:66.66666667%}.col-xl-pull-7{right:58.33333333%}.col-xl-pull-6{right:50%}.col-xl-pull-5{right:41.66666667%}.col-xl-pull-4{right:33.33333333%}.col-xl-pull-3{right:25%}.col-xl-pull-2{right:16.66666667%}.col-xl-pull-1{right:8.33333333%}.col-xl-pull-0{right:auto}.col-xl-push-12{left:100%}.col-xl-push-11{left:91.66666667%}.col-xl-push-10{left:83.33333333%}.col-xl-push-9{left:75%}.col-xl-push-8{left:66.66666667%}.col-xl-push-7{left:58.33333333%}.col-xl-push-6{left:50%}.col-xl-push-5{left:41.66666667%}.col-xl-push-4{left:33.33333333%}.col-xl-push-3{left:25%}.col-xl-push-2{left:16.66666667%}.col-xl-push-1{left:8.33333333%}.col-xl-push-0{left:auto}.col-xl-offset-12{margin-left:100%}.col-xl-offset-11{margin-left:91.66666667%}.col-xl-offset-10{margin-left:83.33333333%}.col-xl-offset-9{margin-left:75%}.col-xl-offset-8{margin-left:66.66666667%}.col-xl-offset-7{margin-left:58.33333333%}.col-xl-offset-6{margin-left:50%}.col-xl-offset-5{margin-left:41.66666667%}.col-xl-offset-4{margin-left:33.33333333%}.col-xl-offset-3{margin-left:25%}.col-xl-offset-2{margin-left:16.66666667%}.col-xl-offset-1{margin-left:8.33333333%}.col-xl-offset-0{margin-left:0}}@media all and (max-width:767px){.abs-clearer-mobile:after,.nav-bar:after{clear:both;content:'';display:table}.list-definition>dt{float:none}.list-definition>dd{margin-left:0}.form-row .form-label{text-align:left}.form-row .form-label.required:after{position:static}.nav{padding-bottom:0;padding-left:0;padding-right:0}.nav-bar-outer-actions{margin-top:0}.nav-bar{display:block;margin-bottom:0;margin-left:auto;margin-right:auto;width:30.9rem}.nav-bar:before{display:none}.nav-bar>li{float:left;min-height:9rem}.nav-bar>li:after{display:none}.nav-bar>li:nth-child(4n){clear:both}.nav-bar a{line-height:1.4}.tooltip{display:none!important}.readiness-check-content{margin-right:2rem}.readiness-check-side{padding:2rem 0;position:static}.form-el-insider,.form-el-insider-wrap,.page-web-configuration .form-el-insider-input,.page-web-configuration .form-el-insider-input .form-el-input{display:block;width:100%}}@media all and (max-width:479px){.nav-bar{width:23.175rem}.nav-bar>li{width:7.725rem}.nav .btn-group .btn-wrap-try-again,.nav-bar-outer-actions .btn-wrap-try-again{clear:both;display:block;float:none;margin-left:auto;margin-right:auto;margin-top:1rem;padding-top:1rem}}
+.abs-action-delete,.abs-icon,.action-close:before,.action-next:before,.action-previous:before,.admin-user .admin__action-dropdown:before,.admin__action-multiselect-dropdown:before,.admin__action-multiselect-search-label:before,.admin__control-checkbox+label:before,.admin__control-collapsible .admin__collapsible-block-wrapper .fieldset-wrapper-title .action-delete:before,.admin__control-table .action-delete:before,.admin__current-filters-list .action-remove:before,.admin__data-grid-action-bookmarks .action-delete:before,.admin__data-grid-action-bookmarks .action-edit:before,.admin__data-grid-action-bookmarks .action-submit:before,.admin__data-grid-action-bookmarks .admin__action-dropdown:before,.admin__data-grid-action-columns .admin__action-dropdown:before,.admin__data-grid-action-export .admin__action-dropdown:before,.admin__field-fallback-reset:before,.admin__menu .level-0>a:before,.admin__page-nav-item-message .admin__page-nav-item-message-icon,.admin__page-nav-title._collapsible:after,.data-grid-filters-action-wrap .action-default:before,.data-grid-row-changed:after,.data-grid-row-parent>td .data-grid-checkbox-cell-inner:before,.data-grid-search-control-wrap .action-submit:before,.extensions-information .list .extension-delete,.icon-failed:before,.icon-success:before,.notifications-action:before,.notifications-close:before,.page-actions .page-actions-buttons>button.action-back:before,.page-actions .page-actions-buttons>button.back:before,.page-actions>button.action-back:before,.page-actions>button.back:before,.page-title-jumbo-success:before,.search-global-label:before,.selectmenu .action-delete:before,.selectmenu .action-edit:before,.selectmenu .action-save:before,.setup-home-item:before,.sticky-header .data-grid-search-control-wrap .data-grid-search-label:before,.store-switcher .dropdown-menu .dropdown-toolbar a:before,.tooltip .help a:before,.tooltip .help span:before{-webkit-font-smoothing:antialiased;font-family:Icons;font-style:normal;font-weight:400;line-height:1;speak:none}.validation-symbol:after{color:#e22626;content:'*';font-weight:400;margin-left:3px}.abs-modal-overlay,.modals-overlay{background:rgba(0,0,0,.35);bottom:0;left:0;position:fixed;right:0;top:0}.abs-action-delete>span,.abs-visually-hidden,.action-multicheck-wrap .action-multicheck-toggle>span,.admin__actions-switch-checkbox,.admin__control-fields .admin__field:nth-child(n+2):not(.admin__field-option):not(.admin__field-group-show-label)>.admin__field-label,.admin__field-tooltip .admin__field-tooltip-action span,.customize-your-store .customize-your-store-default .legend,.extensions-information .list .extension-delete>span,.form-el-checkbox,.form-el-radio,.selectmenu .action-delete>span,.selectmenu .action-edit>span,.selectmenu .action-save>span,.selectmenu-toggle span,.tooltip .help a span,.tooltip .help span span,[class*=admin__control-grouped]>.admin__field:nth-child(n+2):not(.admin__field-option):not(.admin__field-group-show-label):not(.admin__field-date)>.admin__field-label{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.abs-visually-hidden-reset,.admin__field-group-columns>.admin__field:nth-child(n+2):not(.admin__field-option):not(.admin__field-group-show-label):not(.admin__field-date)>.admin__field-label[class]{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.abs-clearfix:after,.abs-clearfix:before,.action-multicheck-wrap:after,.action-multicheck-wrap:before,.actions-split:after,.actions-split:before,.admin__control-table-pagination:after,.admin__control-table-pagination:before,.admin__data-grid-action-columns-menu .admin__action-dropdown-menu-content:after,.admin__data-grid-action-columns-menu .admin__action-dropdown-menu-content:before,.admin__data-grid-filters-footer:after,.admin__data-grid-filters-footer:before,.admin__data-grid-filters:after,.admin__data-grid-filters:before,.admin__data-grid-header-row:after,.admin__data-grid-header-row:before,.admin__field-complex:after,.admin__field-complex:before,.modal-slide .magento-message .insert-title-inner:after,.modal-slide .magento-message .insert-title-inner:before,.modal-slide .main-col .insert-title-inner:after,.modal-slide .main-col .insert-title-inner:before,.page-actions._fixed:after,.page-actions._fixed:before,.page-content:after,.page-content:before,.page-header-actions:after,.page-header-actions:before,.page-main-actions:not(._hidden):after,.page-main-actions:not(._hidden):before{content:'';display:table}.abs-clearfix:after,.action-multicheck-wrap:after,.actions-split:after,.admin__control-table-pagination:after,.admin__data-grid-action-columns-menu .admin__action-dropdown-menu-content:after,.admin__data-grid-filters-footer:after,.admin__data-grid-filters:after,.admin__data-grid-header-row:after,.admin__field-complex:after,.modal-slide .magento-message .insert-title-inner:after,.modal-slide .main-col .insert-title-inner:after,.page-actions._fixed:after,.page-content:after,.page-header-actions:after,.page-main-actions:not(._hidden):after{clear:both}.abs-list-reset-styles{margin:0;padding:0;list-style:none}.abs-draggable-handle,.admin__control-collapsible .admin__collapsible-block-wrapper .fieldset-wrapper-title .draggable-handle,.admin__control-table .draggable-handle,.data-grid .data-grid-draggable-row-cell .draggable-handle{cursor:-webkit-grab;cursor:move;font-size:0;margin-top:-4px;padding:0 1rem 0 0;vertical-align:middle;display:inline-block;text-decoration:none}.abs-draggable-handle:before,.admin__control-collapsible .admin__collapsible-block-wrapper .fieldset-wrapper-title .draggable-handle:before,.admin__control-table .draggable-handle:before,.data-grid .data-grid-draggable-row-cell .draggable-handle:before{-webkit-font-smoothing:antialiased;font-size:1.8rem;line-height:inherit;color:#9e9e9e;content:'\e617';font-family:Icons;vertical-align:middle;display:inline-block;font-weight:400;overflow:hidden;speak:none;text-align:center}.abs-draggable-handle:hover:before,.admin__control-collapsible .admin__collapsible-block-wrapper .fieldset-wrapper-title .draggable-handle:hover:before,.admin__control-table .draggable-handle:hover:before,.data-grid .data-grid-draggable-row-cell .draggable-handle:hover:before{color:#858585}.abs-config-scope-label,.admin__field:not(.admin__field-option)>.admin__field-label span[data-config-scope]:before{bottom:-1.3rem;color:gray;content:attr(data-config-scope);font-size:1.1rem;font-weight:400;min-width:15rem;position:absolute;right:0;text-transform:lowercase}.abs-word-wrap,.admin__field:not(.admin__field-option)>.admin__field-label{overflow-wrap:break-word;word-wrap:break-word;-ms-word-break:break-all;word-break:break-word;-webkit-hyphens:auto;-ms-hyphens:auto;hyphens:auto}html{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;box-sizing:border-box}*,:after,:before{box-sizing:inherit}:focus{box-shadow:none;outline:0}._keyfocus :focus{box-shadow:0 0 0 1px #008bdb}body{margin:0}article,aside,details,figcaption,figure,footer,header,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}mark{background:#ff0;color:#000}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}embed,img,object,video{max-width:100%}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}@font-face{font-family:'Open Sans';src:url(../fonts/opensans/light/opensans-300.eot);src:url(../fonts/opensans/light/opensans-300.eot?#iefix) format('embedded-opentype'),url(../fonts/opensans/light/opensans-300.woff2) format('woff2'),url(../fonts/opensans/light/opensans-300.woff) format('woff'),url(../fonts/opensans/light/opensans-300.ttf) format('truetype'),url('../fonts/opensans/light/opensans-300.svg#Open Sans') format('svg');font-weight:300;font-style:normal}@font-face{font-family:'Open Sans';src:url(../fonts/opensans/regular/opensans-400.eot);src:url(../fonts/opensans/regular/opensans-400.eot?#iefix) format('embedded-opentype'),url(../fonts/opensans/regular/opensans-400.woff2) format('woff2'),url(../fonts/opensans/regular/opensans-400.woff) format('woff'),url(../fonts/opensans/regular/opensans-400.ttf) format('truetype'),url('../fonts/opensans/regular/opensans-400.svg#Open Sans') format('svg');font-weight:400;font-style:normal}@font-face{font-family:'Open Sans';src:url(../fonts/opensans/semibold/opensans-600.eot);src:url(../fonts/opensans/semibold/opensans-600.eot?#iefix) format('embedded-opentype'),url(../fonts/opensans/semibold/opensans-600.woff2) format('woff2'),url(../fonts/opensans/semibold/opensans-600.woff) format('woff'),url(../fonts/opensans/semibold/opensans-600.ttf) format('truetype'),url('../fonts/opensans/semibold/opensans-600.svg#Open Sans') format('svg');font-weight:600;font-style:normal}@font-face{font-family:'Open Sans';src:url(../fonts/opensans/bold/opensans-700.eot);src:url(../fonts/opensans/bold/opensans-700.eot?#iefix) format('embedded-opentype'),url(../fonts/opensans/bold/opensans-700.woff2) format('woff2'),url(../fonts/opensans/bold/opensans-700.woff) format('woff'),url(../fonts/opensans/bold/opensans-700.ttf) format('truetype'),url('../fonts/opensans/bold/opensans-700.svg#Open Sans') format('svg');font-weight:700;font-style:normal}html{font-size:62.5%}body{color:#333;font-family:'Open Sans','Helvetica Neue',Helvetica,Arial,sans-serif;font-style:normal;font-weight:400;line-height:1.36;font-size:1.4rem}h1{margin:0 0 2rem;color:#41362f;font-weight:400;line-height:1.2;font-size:2.8rem}h2{margin:0 0 2rem;color:#41362f;font-weight:400;line-height:1.2;font-size:2rem}h3{margin:0 0 2rem;color:#41362f;font-weight:600;line-height:1.2;font-size:1.7rem}h4,h5,h6{font-weight:600;margin-top:0}p{margin:0 0 1em}small{font-size:1.2rem}a{color:#008bdb;text-decoration:none}a:hover{color:#0fa7ff;text-decoration:underline}dl,ol,ul{padding-left:0}nav ol,nav ul{list-style:none;margin:0;padding:0}html{height:100%}body{background-color:#fff;min-height:100%;min-width:102.4rem}.page-wrapper{background-color:#fff;display:inline-block;margin-left:-4px;vertical-align:top;width:calc(100% - 8.8rem)}.page-content{padding-bottom:3rem;padding-left:3rem;padding-right:3rem}.notices-wrapper{margin:0 3rem}.notices-wrapper .messages{margin-bottom:0}.row{margin-left:0;margin-right:0}.row:after{clear:both;content:'';display:table}.col-l-1,.col-l-10,.col-l-11,.col-l-12,.col-l-2,.col-l-3,.col-l-4,.col-l-5,.col-l-6,.col-l-7,.col-l-8,.col-l-9,.col-m-1,.col-m-10,.col-m-11,.col-m-12,.col-m-2,.col-m-3,.col-m-4,.col-m-5,.col-m-6,.col-m-7,.col-m-8,.col-m-9,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{min-height:1px;padding-left:0;padding-right:0;position:relative}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}.row-gutter{margin-left:-1.5rem;margin-right:-1.5rem}.row-gutter>[class*=col-]{padding-left:1.5rem;padding-right:1.5rem}.abs-clearer:after,.extension-manager-content:after,.extension-manager-title:after,.form-row:after,.header:after,.nav:after,body:after{clear:both;content:'';display:table}.ng-cloak{display:none!important}.hide.hide{display:none}.show.show{display:block}.text-center{text-align:center}.text-right{text-align:right}@font-face{font-family:Icons;src:url(../fonts/icons/icons.eot);src:url(../fonts/icons/icons.eot?#iefix) format('embedded-opentype'),url(../fonts/icons/icons.woff2) format('woff2'),url(../fonts/icons/icons.woff) format('woff'),url(../fonts/icons/icons.ttf) format('truetype'),url(../fonts/icons/icons.svg#Icons) format('svg');font-weight:400;font-style:normal}[class*=icon-]{display:inline-block;line-height:1}.icon-failed:before,.icon-success:before,[class*=icon-]:after{font-family:Icons}.icon-success{color:#79a22e}.icon-success:before{content:'\e62d'}.icon-failed{color:#e22626}.icon-failed:before{content:'\e632'}.icon-success-thick:after{content:'\e62d'}.icon-collapse:after{content:'\e615'}.icon-failed-thick:after{content:'\e632'}.icon-expand:after{content:'\e616'}.icon-warning:after{content:'\e623'}.icon-failed-round,.icon-success-round{border-radius:100%;color:#fff;font-size:2.5rem;height:1em;position:relative;text-align:center;width:1em}.icon-failed-round:after,.icon-success-round:after{bottom:0;font-size:.5em;left:0;position:absolute;right:0;top:.45em}.icon-success-round{background-color:#79a22e}.icon-success-round:after{content:'\e62d'}.icon-failed-round{background-color:#e22626}.icon-failed-round:after{content:'\e632'}dl,ol,ul{margin-top:0}.list{padding-left:0}.list>li{display:block;margin-bottom:.75em;position:relative}.list>li>.icon-failed,.list>li>.icon-success{font-size:1.6em;left:-.1em;position:absolute;top:0}.list>li>.icon-success{color:#79a22e}.list>li>.icon-failed{color:#e22626}.list-item-failed,.list-item-icon,.list-item-success,.list-item-warning{padding-left:3.5rem}.list-item-failed:before,.list-item-success:before,.list-item-warning:before{left:-.1em;position:absolute}.list-item-success:before{color:#79a22e}.list-item-failed:before{color:#e22626}.list-item-warning:before{color:#ef672f}.list-definition{margin:0 0 3rem;padding:0}.list-definition>dt{clear:left;float:left}.list-definition>dd{margin-bottom:1em;margin-left:20rem}.btn-wrap{margin:0 auto}.btn-wrap .btn{width:100%}.btn{background:#e3e3e3;border:none;color:#514943;display:inline-block;font-size:1.6rem;font-weight:600;padding:.45em .9em;text-align:center}.btn:hover{background-color:#dbdbdb;color:#514943;text-decoration:none}.btn:active{background-color:#d6d6d6}.btn.disabled,.btn[disabled]{cursor:default;opacity:.5;pointer-events:none}.ie9 .btn.disabled,.ie9 .btn[disabled]{background-color:#f0f0f0;opacity:1;text-shadow:none}.btn-large{padding:.75em 1.25em}.btn-medium{font-size:1.4rem;padding:.5em 1.5em .6em}.btn-link{background-color:transparent;border:none;color:#008bdb;font-family:1.6rem;font-size:1.5rem}.btn-link:active,.btn-link:focus,.btn-link:hover{background-color:transparent;color:#0fa7ff}.btn-prime{background-color:#eb5202;color:#fff;text-shadow:1px 1px 0 rgba(0,0,0,.25)}.btn-prime:focus,.btn-prime:hover{background-color:#f65405;background-repeat:repeat-x;background-image:linear-gradient(to right,#e04f00 0,#f65405 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#e04f00', endColorstr='#f65405', GradientType=1);color:#fff}.btn-prime:active{background-color:#e04f00;background-repeat:repeat-x;background-image:linear-gradient(to right,#f65405 0,#e04f00 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f65405', endColorstr='#e04f00', GradientType=1);color:#fff}.ie9 .btn-prime.disabled,.ie9 .btn-prime[disabled]{background-color:#fd6e23}.ie9 .btn-prime.disabled:active,.ie9 .btn-prime.disabled:hover,.ie9 .btn-prime[disabled]:active,.ie9 .btn-prime[disabled]:hover{background-color:#fd6e23;-webkit-filter:none;filter:none}.btn-secondary{background-color:#514943;color:#fff}.btn-secondary:hover{background-color:#5f564f;color:#fff}.btn-secondary:active,.btn-secondary:focus{background-color:#574e48;color:#fff}.ie9 .btn-secondary.disabled,.ie9 .btn-secondary[disabled]{background-color:#514943}.ie9 .btn-secondary.disabled:active,.ie9 .btn-secondary[disabled]:active{background-color:#514943;-webkit-filter:none;filter:none}[class*=btn-wrap-triangle]{overflow:hidden;position:relative}[class*=btn-wrap-triangle] .btn:after{border-style:solid;content:'';height:0;position:absolute;top:0;width:0}.btn-wrap-triangle-right{display:inline-block;padding-right:1.74rem;position:relative}.btn-wrap-triangle-right .btn{text-indent:.92rem}.btn-wrap-triangle-right .btn:after{border-color:transparent transparent transparent #e3e3e3;border-width:1.84rem 0 1.84rem 1.84rem;left:100%;margin-left:-1.74rem}.btn-wrap-triangle-right .btn:focus:after,.btn-wrap-triangle-right .btn:hover:after{border-left-color:#dbdbdb}.btn-wrap-triangle-right .btn:active:after{border-left-color:#d6d6d6}.btn-wrap-triangle-right .btn:not(.disabled):active,.btn-wrap-triangle-right .btn:not([disabled]):active{left:1px}.ie9 .btn-wrap-triangle-right .btn.disabled:after,.ie9 .btn-wrap-triangle-right .btn[disabled]:after{border-color:transparent transparent transparent #f0f0f0}.ie9 .btn-wrap-triangle-right .btn.disabled:active:after,.ie9 .btn-wrap-triangle-right .btn.disabled:focus:after,.ie9 .btn-wrap-triangle-right .btn.disabled:hover:after,.ie9 .btn-wrap-triangle-right .btn[disabled]:active:after,.ie9 .btn-wrap-triangle-right .btn[disabled]:focus:after,.ie9 .btn-wrap-triangle-right .btn[disabled]:hover:after{border-left-color:#f0f0f0}.btn-wrap-triangle-right .btn-prime:after{border-color:transparent transparent transparent #eb5202}.btn-wrap-triangle-right .btn-prime:focus:after,.btn-wrap-triangle-right .btn-prime:hover:after{border-left-color:#f65405}.btn-wrap-triangle-right .btn-prime:active:after{border-left-color:#e04f00}.btn-wrap-triangle-right .btn-prime:not(.disabled):active,.btn-wrap-triangle-right .btn-prime:not([disabled]):active{left:1px}.ie9 .btn-wrap-triangle-right .btn-prime.disabled:after,.ie9 .btn-wrap-triangle-right .btn-prime[disabled]:after{border-color:transparent transparent transparent #fd6e23}.ie9 .btn-wrap-triangle-right .btn-prime.disabled:active:after,.ie9 .btn-wrap-triangle-right .btn-prime.disabled:hover:after,.ie9 .btn-wrap-triangle-right .btn-prime[disabled]:active:after,.ie9 .btn-wrap-triangle-right .btn-prime[disabled]:hover:after{border-left-color:#fd6e23}.btn-wrap-triangle-left{display:inline-block;padding-left:1.74rem}.btn-wrap-triangle-left .btn{text-indent:-.92rem}.btn-wrap-triangle-left .btn:after{border-color:transparent #e3e3e3 transparent transparent;border-width:1.84rem 1.84rem 1.84rem 0;margin-right:-1.74rem;right:100%}.btn-wrap-triangle-left .btn:focus:after,.btn-wrap-triangle-left .btn:hover:after{border-right-color:#dbdbdb}.btn-wrap-triangle-left .btn:active:after{border-right-color:#d6d6d6}.btn-wrap-triangle-left .btn:not(.disabled):active,.btn-wrap-triangle-left .btn:not([disabled]):active{right:1px}.ie9 .btn-wrap-triangle-left .btn.disabled:after,.ie9 .btn-wrap-triangle-left .btn[disabled]:after{border-color:transparent #f0f0f0 transparent transparent}.ie9 .btn-wrap-triangle-left .btn.disabled:active:after,.ie9 .btn-wrap-triangle-left .btn.disabled:hover:after,.ie9 .btn-wrap-triangle-left .btn[disabled]:active:after,.ie9 .btn-wrap-triangle-left .btn[disabled]:hover:after{border-right-color:#f0f0f0}.btn-wrap-triangle-left .btn-prime:after{border-color:transparent #eb5202 transparent transparent}.btn-wrap-triangle-left .btn-prime:focus:after,.btn-wrap-triangle-left .btn-prime:hover:after{border-right-color:#e04f00}.btn-wrap-triangle-left .btn-prime:active:after{border-right-color:#f65405}.btn-wrap-triangle-left .btn-prime:not(.disabled):active,.btn-wrap-triangle-left .btn-prime:not([disabled]):active{right:1px}.ie9 .btn-wrap-triangle-left .btn-prime.disabled:after,.ie9 .btn-wrap-triangle-left .btn-prime[disabled]:after{border-color:transparent #fd6e23 transparent transparent}.ie9 .btn-wrap-triangle-left .btn-prime.disabled:active:after,.ie9 .btn-wrap-triangle-left .btn-prime.disabled:hover:after,.ie9 .btn-wrap-triangle-left .btn-prime[disabled]:active:after,.ie9 .btn-wrap-triangle-left .btn-prime[disabled]:hover:after{border-right-color:#fd6e23}.btn-expand{background-color:transparent;border:none;color:#303030;font-family:'Open Sans','Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.4rem;font-weight:700;padding:0;position:relative}.btn-expand.expanded:after{border-color:transparent transparent #303030;border-width:0 .285em .36em}.btn-expand.expanded:hover:after{border-color:transparent transparent #3d3d3d}.btn-expand:hover{background-color:transparent;border:none;color:#3d3d3d}.btn-expand:hover:after{border-color:#3d3d3d transparent transparent}.btn-expand:after{border-color:#303030 transparent transparent;border-style:solid;border-width:.36em .285em 0;content:'';height:0;left:100%;margin-left:.5em;margin-top:-.18em;position:absolute;top:50%;width:0}[class*=col-] .form-el-input,[class*=col-] .form-el-select{width:100%}.form-fieldset{border:none;margin:0 0 1em;padding:0}.form-row{margin-bottom:2.2rem}.form-row .form-row{margin-bottom:.4rem}.form-row .form-label{display:block;font-weight:600;padding:.6rem 2.1em 0 0;text-align:right}.form-row .form-label.required{position:relative}.form-row .form-label.required:after{color:#eb5202;content:'*';font-size:1.15em;position:absolute;right:.7em;top:.5em}.form-row .form-el-checkbox+.form-label:before,.form-row .form-el-radio+.form-label:before{top:.7rem}.form-row .form-el-checkbox+.form-label:after,.form-row .form-el-radio+.form-label:after{top:1.1rem}.form-row.form-row-text{padding-top:.6rem}.form-row.form-row-text .action-sign-out{font-size:1.2rem;margin-left:1rem}.form-note{font-size:1.2rem;font-weight:600;margin-top:1rem}.form-el-dummy{display:none}.fieldset{border:0;margin:0;min-width:0;padding:0}input:not([disabled]):focus,textarea:not([disabled]):focus{box-shadow:none}.form-el-input{border:1px solid #adadad;color:#303030;padding:.35em .55em .5em}.form-el-input:hover{border-color:#949494}.form-el-input:focus{border-color:#008bdb}.form-el-input:required{box-shadow:none}.form-label{margin-bottom:.5em}[class*=form-label][for]{cursor:pointer}.form-el-insider-wrap{display:table;width:100%}.form-el-insider-input{display:table-cell;width:100%}.form-el-insider{border-radius:2px;display:table-cell;padding:.43em .55em .5em 0;vertical-align:top}.form-legend,.form-legend-expand,.form-legend-light{display:block;margin:0}.form-legend,.form-legend-expand{font-size:1.25em;font-weight:600;margin-bottom:2.5em;padding-top:1.5em}.form-legend{border-top:1px solid #ccc;width:100%}.form-legend-light{font-size:1em;margin-bottom:1.5em}.form-legend-expand{cursor:pointer;transition:opacity .2s linear}.form-legend-expand:hover{opacity:.85}.form-legend-expand.expanded:after{content:'\e615'}.form-legend-expand:after{content:'\e616';font-family:Icons;font-size:1.15em;font-weight:400;margin-left:.5em;vertical-align:sub}.form-el-checkbox.disabled+.form-label,.form-el-checkbox.disabled+.form-label:before,.form-el-checkbox[disabled]+.form-label,.form-el-checkbox[disabled]+.form-label:before,.form-el-radio.disabled+.form-label,.form-el-radio.disabled+.form-label:before,.form-el-radio[disabled]+.form-label,.form-el-radio[disabled]+.form-label:before{cursor:default;opacity:.5;pointer-events:none}.form-el-checkbox:not(.disabled)+.form-label:hover:before,.form-el-checkbox:not([disabled])+.form-label:hover:before,.form-el-radio:not(.disabled)+.form-label:hover:before,.form-el-radio:not([disabled])+.form-label:hover:before{border-color:#514943}.form-el-checkbox+.form-label,.form-el-radio+.form-label{font-weight:400;padding-left:2em;padding-right:0;position:relative;text-align:left;transition:border-color .1s linear}.form-el-checkbox+.form-label:before,.form-el-radio+.form-label:before{border:1px solid;content:'';left:0;position:absolute;top:.1rem;transition:border-color .1s linear}.form-el-checkbox+.form-label:before{background-color:#fff;border-color:#adadad;border-radius:2px;font-size:1.2rem;height:1.6rem;line-height:1.2;width:1.6rem}.form-el-checkbox:checked+.form-label::before{content:'\e62d';font-family:Icons}.form-el-radio+.form-label:before{background-color:#fff;border:1px solid #adadad;border-radius:100%;height:1.8rem;width:1.8rem}.form-el-radio+.form-label:after{background:0 0;border:.5rem solid transparent;border-radius:100%;content:'';height:0;left:.4rem;position:absolute;top:.5rem;transition:background .3s linear;width:0}.form-el-radio:checked+.form-label{cursor:default}.form-el-radio:checked+.form-label:after{border-color:#514943}.form-select-label{border:1px solid #adadad;color:#303030;cursor:pointer;display:block;overflow:hidden;position:relative;z-index:0}.form-select-label:hover,.form-select-label:hover:after{border-color:#949494}.form-select-label:active,.form-select-label:active:after,.form-select-label:focus,.form-select-label:focus:after{border-color:#008bdb}.form-select-label:after{background:#e3e3e3;border-left:1px solid #adadad;bottom:0;content:'';position:absolute;right:0;top:0;width:2.36em;z-index:-2}.ie9 .form-select-label:after{display:none}.form-select-label:before{border-color:#303030 transparent transparent;border-style:solid;border-width:5px 4px 0;content:'';height:0;margin-right:-4px;margin-top:-2.5px;position:absolute;right:1.18em;top:50%;width:0;z-index:-1}.ie9 .form-select-label:before{display:none}.form-select-label .form-el-select{background:0 0;border:none;border-radius:0;content:'';display:block;margin:0;padding:.35em calc(2.36em + 10%) .5em .55em;width:110%}.ie9 .form-select-label .form-el-select{padding-right:.55em;width:100%}.form-select-label .form-el-select::-ms-expand{display:none}.form-el-select{background:#fff;border:1px solid #adadad;border-radius:2px;color:#303030;display:block;padding:.35em .55em}.multiselect-custom{border:1px solid #adadad;height:45.2rem;margin:0 0 1.5rem;overflow:auto;position:relative}.multiselect-custom ul{margin:0;padding:0;list-style:none;min-width:29rem}.multiselect-custom .item{padding:1rem 1.4rem}.multiselect-custom .selected{background-color:#e0f6fe}.multiselect-custom .form-label{margin-bottom:0}[class*=form-el-].invalid{border-color:#e22626}[class*=form-el-].invalid+.error-container{display:block}.error-container{background-color:#fffbbb;border:1px solid #ee7d7d;color:#514943;display:none;font-size:1.19rem;margin-top:.2rem;padding:.8rem 1rem .9rem}.check-result-message{margin-left:.5em;min-height:3.68rem;-ms-align-items:center;-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.check-result-text{margin-left:.5em}body:not([class]){min-width:0}.container{display:block;margin:0 auto 4rem;max-width:100rem;padding:0}.abs-action-delete,.action-close:before,.action-next:before,.action-previous:before,.admin-user .admin__action-dropdown:before,.admin__action-multiselect-dropdown:before,.admin__action-multiselect-search-label:before,.admin__control-checkbox+label:before,.admin__control-collapsible .admin__collapsible-block-wrapper .fieldset-wrapper-title .action-delete:before,.admin__control-table .action-delete:before,.admin__current-filters-list .action-remove:before,.admin__data-grid-action-bookmarks .action-delete:before,.admin__data-grid-action-bookmarks .action-edit:before,.admin__data-grid-action-bookmarks .action-submit:before,.admin__data-grid-action-bookmarks .admin__action-dropdown:before,.admin__data-grid-action-columns .admin__action-dropdown:before,.admin__data-grid-action-export .admin__action-dropdown:before,.admin__field-fallback-reset:before,.admin__menu .level-0>a:before,.admin__page-nav-item-message .admin__page-nav-item-message-icon,.admin__page-nav-title._collapsible:after,.data-grid-filters-action-wrap .action-default:before,.data-grid-row-changed:after,.data-grid-row-parent>td .data-grid-checkbox-cell-inner:before,.data-grid-search-control-wrap .action-submit:before,.extensions-information .list .extension-delete,.icon-failed:before,.icon-success:before,.notifications-action:before,.notifications-close:before,.page-actions .page-actions-buttons>button.action-back:before,.page-actions .page-actions-buttons>button.back:before,.page-actions>button.action-back:before,.page-actions>button.back:before,.page-title-jumbo-success:before,.search-global-label:before,.selectmenu .action-delete:before,.selectmenu .action-edit:before,.selectmenu .action-save:before,.setup-home-item:before,.sticky-header .data-grid-search-control-wrap .data-grid-search-label:before,.store-switcher .dropdown-menu .dropdown-toolbar a:before,.tooltip .help a:before,.tooltip .help span:before{-webkit-font-smoothing:antialiased;font-family:Icons;font-style:normal;font-weight:400;line-height:1;speak:none}.text-stretch{margin-bottom:1.5em}.page-title-jumbo{font-size:4rem;font-weight:300;letter-spacing:-.05em;margin-bottom:2.9rem}.page-title-jumbo-success:before{color:#79a22e;content:'\e62d';font-size:3.9rem;margin-left:-.3rem;margin-right:2.4rem}.list{margin-bottom:3rem}.list-dot .list-item{display:list-item;list-style-position:inside;margin-bottom:1.2rem}.list-title{color:#333;font-size:1.4rem;font-weight:700;letter-spacing:.025em;margin-bottom:1.2rem}.list-item-failed:before,.list-item-success:before,.list-item-warning:before{font-family:Icons;font-size:1.6rem;top:0}.list-item-success:before{content:'\e62d';font-size:1.6rem}.list-item-failed:before{content:'\e632';font-size:1.4rem;left:.1rem;top:.2rem}.list-item-warning:before{content:'\e623';font-size:1.3rem;left:.2rem}.form-wrap{margin-bottom:3.6rem;padding-top:2.1rem}.form-el-label-horizontal{display:inline-block;font-size:1.3rem;font-weight:600;letter-spacing:.025em;margin-bottom:.4rem;margin-left:.4rem}.app-updater{min-width:768px}body._has-modal{height:100%;overflow:hidden;width:100%}.modals-overlay{z-index:899}.modal-popup,.modal-slide{bottom:0;min-width:0;position:fixed;right:0;top:0;visibility:hidden}.modal-popup._show,.modal-slide._show{visibility:visible}.modal-popup._show .modal-inner-wrap,.modal-slide._show .modal-inner-wrap{-ms-transform:translate(0,0);transform:translate(0,0)}.modal-popup .modal-inner-wrap,.modal-slide .modal-inner-wrap{background-color:#fff;box-shadow:0 0 12px 2px rgba(0,0,0,.35);opacity:1;pointer-events:auto}.modal-slide{left:14.8rem;z-index:900}.modal-slide._show .modal-inner-wrap{-ms-transform:translateX(0);transform:translateX(0)}.modal-slide .modal-inner-wrap{height:100%;overflow-y:auto;position:static;-ms-transform:translateX(100%);transform:translateX(100%);transition-duration:.3s;transition-property:transform,visibility;transition-timing-function:ease-in-out;width:auto}.modal-slide._inner-scroll .modal-inner-wrap{overflow-y:visible;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.modal-slide._inner-scroll .modal-footer,.modal-slide._inner-scroll .modal-header{-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0}.modal-slide._inner-scroll .modal-content{overflow-y:auto}.modal-slide._inner-scroll .modal-footer{margin-top:auto}.modal-slide .modal-content,.modal-slide .modal-footer,.modal-slide .modal-header{padding:0 2.6rem 2.6rem}.modal-slide .modal-header{padding-bottom:2.1rem;padding-top:2.1rem}.modal-popup{z-index:900;left:0;overflow-y:auto}.modal-popup._show .modal-inner-wrap{-ms-transform:translateY(0);transform:translateY(0)}.modal-popup .modal-inner-wrap{margin:5rem auto;width:75%;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;box-sizing:border-box;height:auto;left:0;position:absolute;right:0;-ms-transform:translateY(-200%);transform:translateY(-200%);transition-duration:.2s;transition-property:transform,visibility;transition-timing-function:ease}.modal-popup._inner-scroll{overflow-y:visible}.ie10 .modal-popup._inner-scroll,.ie9 .modal-popup._inner-scroll{overflow-y:auto}.modal-popup._inner-scroll .modal-inner-wrap{max-height:90%}.ie10 .modal-popup._inner-scroll .modal-inner-wrap,.ie9 .modal-popup._inner-scroll .modal-inner-wrap{max-height:none}.modal-popup._inner-scroll .modal-content{overflow-y:auto}.modal-popup .modal-content,.modal-popup .modal-footer,.modal-popup .modal-header{padding-left:3rem;padding-right:3rem}.modal-popup .modal-footer,.modal-popup .modal-header{-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0}.modal-popup .modal-header{padding-bottom:1.2rem;padding-top:3rem}.modal-popup .modal-footer{margin-top:auto;padding-bottom:3rem}.modal-popup .modal-footer-actions{text-align:right}.admin__action-dropdown-wrap{display:inline-block;position:relative}.admin__action-dropdown-wrap .admin__action-dropdown-text:after{left:-6px;right:0}.admin__action-dropdown-wrap .admin__action-dropdown-menu{left:auto;right:0}.admin__action-dropdown-wrap._active .admin__action-dropdown,.admin__action-dropdown-wrap.active .admin__action-dropdown{border-color:#007bdb;box-shadow:1px 1px 5px rgba(0,0,0,.5)}.admin__action-dropdown-wrap._active .admin__action-dropdown-text:after,.admin__action-dropdown-wrap.active .admin__action-dropdown-text:after{background-color:#fff;content:'';height:6px;position:absolute;top:100%}.admin__action-dropdown-wrap._active .admin__action-dropdown-menu,.admin__action-dropdown-wrap.active .admin__action-dropdown-menu{display:block}.admin__action-dropdown-wrap._disabled .admin__action-dropdown{cursor:default}.admin__action-dropdown-wrap._disabled:hover .admin__action-dropdown{color:#333}.admin__action-dropdown{background-color:#fff;border:1px solid transparent;border-bottom:none;border-radius:0;box-shadow:none;color:#333;display:inline-block;font-size:1.3rem;font-weight:400;letter-spacing:-.025em;padding:.7rem 3.3rem .8rem 1.5rem;position:relative;vertical-align:baseline;z-index:2}.admin__action-dropdown._active:after,.admin__action-dropdown.active:after{-ms-transform:rotate(180deg);transform:rotate(180deg)}.admin__action-dropdown:after{border-color:#000 transparent transparent;border-style:solid;border-width:.5rem .4rem 0;content:'';height:0;margin-top:-.2rem;position:absolute;top:50%;transition:all .2s linear;width:0}._active .admin__action-dropdown:after,.active .admin__action-dropdown:after{-ms-transform:rotate(180deg);transform:rotate(180deg)}.admin__action-dropdown:hover:after{border-color:#000 transparent transparent}.admin__action-dropdown:focus,.admin__action-dropdown:hover{background-color:#fff;color:#000;text-decoration:none}.admin__action-dropdown:after{right:1.5rem}.admin__action-dropdown:before{margin-right:1rem}.admin__action-dropdown-menu{background-color:#fff;border:1px solid #007bdb;box-shadow:1px 1px 5px rgba(0,0,0,.5);display:none;line-height:1.36;margin-top:-1px;min-width:120%;padding:.5rem 1rem;position:absolute;top:100%;transition:all .15s ease;z-index:1}.admin__action-dropdown-menu>li{display:block}.admin__action-dropdown-menu>li>a{color:#333;display:block;text-decoration:none;padding:.6rem .5rem}.selectmenu{display:inline-block;position:relative;text-align:left;z-index:1}.selectmenu._active{border-color:#007bdb;z-index:500}.selectmenu .action-delete,.selectmenu .action-edit,.selectmenu .action-save{background-color:transparent;border-color:transparent;box-shadow:none;padding:0 1rem}.selectmenu .action-delete:hover,.selectmenu .action-edit:hover,.selectmenu .action-save:hover{background-color:transparent;border-color:transparent;box-shadow:none}.selectmenu .action-delete:before,.selectmenu .action-edit:before,.selectmenu .action-save:before{content:'\e630'}.selectmenu .action-delete,.selectmenu .action-edit{border:0 solid #fff;border-left-width:1px;bottom:0;position:absolute;right:0;top:0;z-index:1}.selectmenu .action-delete:hover,.selectmenu .action-edit:hover{border:0 solid #fff;border-left-width:1px}.selectmenu .action-save:before{content:'\e625'}.selectmenu .action-edit:before{content:'\e631'}.selectmenu-value{display:inline-block}.selectmenu-value input[type=text]{-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;appearance:none;border:0;display:inline;margin:0;width:6rem}body._keyfocus .selectmenu-value input[type=text]:focus{box-shadow:none}.selectmenu-toggle{padding-right:3rem;background:0 0;border-width:0;bottom:0;float:right;position:absolute;right:0;top:0;width:0}.selectmenu-toggle._active:after,.selectmenu-toggle.active:after{-ms-transform:rotate(180deg);transform:rotate(180deg)}.selectmenu-toggle:after{border-color:#000 transparent transparent;border-style:solid;border-width:.5rem .4rem 0;content:'';height:0;margin-top:-.2rem;position:absolute;right:1.1rem;top:50%;transition:all .2s linear;width:0}._active .selectmenu-toggle:after,.active .selectmenu-toggle:after{-ms-transform:rotate(180deg);transform:rotate(180deg)}.selectmenu-toggle:hover:after{border-color:#000 transparent transparent}.selectmenu-toggle:active,.selectmenu-toggle:focus,.selectmenu-toggle:hover{background:0 0}.selectmenu._active .selectmenu-toggle:before{border-color:#007bdb}body._keyfocus .selectmenu-toggle:focus{box-shadow:none}.selectmenu-toggle:before{background:#e3e3e3;border-left:1px solid #adadad;bottom:0;content:'';display:block;position:absolute;right:0;top:0;width:3.2rem}.selectmenu-items{background:#fff;border:1px solid #007bdb;box-shadow:1px 1px 5px rgba(0,0,0,.5);display:none;float:left;left:-1px;margin-top:3px;max-width:20rem;min-width:calc(100% + 2px);position:absolute;top:100%}.selectmenu-items._active{display:block}.selectmenu-items ul{float:left;list-style-type:none;margin:0;min-width:100%;padding:0}.selectmenu-items li{-webkit-flex-direction:row;display:flex;-ms-flex-direction:row;flex-direction:row;transition:background .2s linear}.selectmenu-items li:hover{background:#e3e3e3}.selectmenu-items li:last-child .selectmenu-item-action,.selectmenu-items li:last-child .selectmenu-item-action:visited{color:#008bdb;text-decoration:none}.selectmenu-items li:last-child .selectmenu-item-action:hover{color:#0fa7ff;text-decoration:underline}.selectmenu-items li:last-child .selectmenu-item-action:active{color:#ff5501;text-decoration:underline}.selectmenu-item{position:relative;width:100%;z-index:1}li._edit>.selectmenu-item{display:none}.selectmenu-item-edit{display:none;padding:.3rem 4rem .3rem .4rem;position:relative;white-space:nowrap;z-index:1}li:last-child .selectmenu-item-edit{padding-right:.4rem}.selectmenu-item-edit .admin__control-text{margin:0;width:5.4rem}li._edit .selectmenu-item-edit{display:block}.selectmenu-item-action{-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;appearance:none;background:0 0;border:0;color:#333;display:block;font-size:1.4rem;font-weight:400;min-width:100%;padding:1rem 6rem 1rem 1.5rem;text-align:left;transition:background .2s linear;width:5rem}.selectmenu-item-action:focus,.selectmenu-item-action:hover{background:#e3e3e3}.abs-actions-split-xl .action-default,.page-actions .actions-split .action-default{margin-right:4rem}.abs-actions-split-xl .action-toggle,.page-actions .actions-split .action-toggle{padding-right:4rem}.abs-actions-split-xl .action-toggle:after,.page-actions .actions-split .action-toggle:after{border-width:.9rem .6rem 0;margin-top:-.3rem;right:1.4rem}.actions-split{position:relative;z-index:400}.actions-split._active,.actions-split.active,.actions-split:hover{box-shadow:0 0 0 1px #007bdb}.actions-split._active .action-toggle.action-primary,.actions-split._active .action-toggle.primary,.actions-split.active .action-toggle.action-primary,.actions-split.active .action-toggle.primary{background-color:#ba4000;border-color:#ba4000}.actions-split._active .dropdown-menu,.actions-split.active .dropdown-menu{opacity:1;visibility:visible;display:block}.actions-split .action-default,.actions-split .action-toggle{float:left;margin:0}.actions-split .action-default._active,.actions-split .action-default.active,.actions-split .action-default:hover,.actions-split .action-toggle._active,.actions-split .action-toggle.active,.actions-split .action-toggle:hover{box-shadow:none}.actions-split .action-default{margin-right:3.2rem;min-width:9.3rem}.actions-split .action-toggle{padding-right:3.2rem;border-left-color:rgba(0,0,0,.2);bottom:0;padding-left:0;position:absolute;right:0;top:0}.actions-split .action-toggle._active:after,.actions-split .action-toggle.active:after{-ms-transform:rotate(180deg);transform:rotate(180deg)}.actions-split .action-toggle:after{border-color:#000 transparent transparent;border-style:solid;border-width:.5rem .4rem 0;content:'';height:0;margin-top:-.2rem;position:absolute;right:1.2rem;top:50%;transition:all .2s linear;width:0}._active .actions-split .action-toggle:after,.active .actions-split .action-toggle:after{-ms-transform:rotate(180deg);transform:rotate(180deg)}.actions-split .action-toggle:hover:after{border-color:#000 transparent transparent}.actions-split .action-toggle.action-primary:after,.actions-split .action-toggle.action-secondary:after,.actions-split .action-toggle.primary:after,.actions-split .action-toggle.secondary:after{border-color:#fff transparent transparent}.actions-split .action-toggle>span{clip:rect(0,0,0,0);overflow:hidden;position:absolute}.action-select-wrap{display:inline-block;position:relative}.action-select-wrap .action-select{padding-right:3.2rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;background-color:#fff;font-weight:400;text-align:left}.action-select-wrap .action-select._active:after,.action-select-wrap .action-select.active:after{-ms-transform:rotate(180deg);transform:rotate(180deg)}.action-select-wrap .action-select:after{border-color:#000 transparent transparent;border-style:solid;border-width:.5rem .4rem 0;content:'';height:0;margin-top:-.2rem;position:absolute;right:1.2rem;top:50%;transition:all .2s linear;width:0}._active .action-select-wrap .action-select:after,.active .action-select-wrap .action-select:after{-ms-transform:rotate(180deg);transform:rotate(180deg)}.action-select-wrap .action-select:hover:after{border-color:#000 transparent transparent}.action-select-wrap .action-select:hover,.action-select-wrap .action-select:hover:before{border-color:#878787}.action-select-wrap .action-select:before{background-color:#e3e3e3;border:1px solid #adadad;bottom:0;content:'';position:absolute;right:0;top:0;width:3.2rem}.action-select-wrap .action-select._active{border-color:#007bdb}.action-select-wrap .action-select._active:before{border-color:#007bdb #007bdb #007bdb #adadad}.action-select-wrap .action-select[disabled]{color:#333}.action-select-wrap .action-select[disabled]:after{border-color:#333 transparent transparent}.action-select-wrap._active{z-index:500}.action-select-wrap._active .action-select,.action-select-wrap._active .action-select:before{border-color:#007bdb}.action-select-wrap._active .action-select:after{-ms-transform:rotate(180deg);transform:rotate(180deg)}.action-select-wrap .abs-action-menu .action-submenu,.action-select-wrap .abs-action-menu .action-submenu .action-submenu,.action-select-wrap .action-menu,.action-select-wrap .action-menu .action-submenu,.action-select-wrap .actions-split .action-menu .action-submenu,.action-select-wrap .actions-split .action-menu .action-submenu .action-submenu,.action-select-wrap .actions-split .dropdown-menu .action-submenu,.action-select-wrap .actions-split .dropdown-menu .action-submenu .action-submenu{max-height:45rem;overflow-y:auto}.action-select-wrap .abs-action-menu .action-submenu ._disabled:hover,.action-select-wrap .abs-action-menu .action-submenu .action-submenu ._disabled:hover,.action-select-wrap .action-menu ._disabled:hover,.action-select-wrap .action-menu .action-submenu ._disabled:hover,.action-select-wrap .actions-split .action-menu .action-submenu ._disabled:hover,.action-select-wrap .actions-split .action-menu .action-submenu .action-submenu ._disabled:hover,.action-select-wrap .actions-split .dropdown-menu .action-submenu ._disabled:hover,.action-select-wrap .actions-split .dropdown-menu .action-submenu .action-submenu ._disabled:hover{background:#fff}.action-select-wrap .abs-action-menu .action-submenu ._disabled .action-menu-item,.action-select-wrap .abs-action-menu .action-submenu .action-submenu ._disabled .action-menu-item,.action-select-wrap .action-menu ._disabled .action-menu-item,.action-select-wrap .action-menu .action-submenu ._disabled .action-menu-item,.action-select-wrap .actions-split .action-menu .action-submenu ._disabled .action-menu-item,.action-select-wrap .actions-split .action-menu .action-submenu .action-submenu ._disabled .action-menu-item,.action-select-wrap .actions-split .dropdown-menu .action-submenu ._disabled .action-menu-item,.action-select-wrap .actions-split .dropdown-menu .action-submenu .action-submenu ._disabled .action-menu-item{cursor:default;opacity:.5}.action-select-wrap .action-menu-items{left:0;position:absolute;right:0;top:100%}.action-select-wrap .action-menu-items>.abs-action-menu .action-submenu,.action-select-wrap .action-menu-items>.abs-action-menu .action-submenu .action-submenu,.action-select-wrap .action-menu-items>.action-menu,.action-select-wrap .action-menu-items>.action-menu .action-submenu,.action-select-wrap .action-menu-items>.actions-split .action-menu .action-submenu,.action-select-wrap .action-menu-items>.actions-split .action-menu .action-submenu .action-submenu,.action-select-wrap .action-menu-items>.actions-split .dropdown-menu .action-submenu,.action-select-wrap .action-menu-items>.actions-split .dropdown-menu .action-submenu .action-submenu{min-width:100%;position:static}.action-select-wrap .action-menu-items>.abs-action-menu .action-submenu .action-submenu,.action-select-wrap .action-menu-items>.abs-action-menu .action-submenu .action-submenu .action-submenu,.action-select-wrap .action-menu-items>.action-menu .action-submenu,.action-select-wrap .action-menu-items>.action-menu .action-submenu .action-submenu,.action-select-wrap .action-menu-items>.actions-split .action-menu .action-submenu .action-submenu,.action-select-wrap .action-menu-items>.actions-split .action-menu .action-submenu .action-submenu .action-submenu,.action-select-wrap .action-menu-items>.actions-split .dropdown-menu .action-submenu .action-submenu,.action-select-wrap .action-menu-items>.actions-split .dropdown-menu .action-submenu .action-submenu .action-submenu{position:absolute}.action-multicheck-wrap{display:inline-block;height:1.6rem;padding-top:1px;position:relative;width:3.1rem;z-index:200}.action-multicheck-wrap:hover .action-multicheck-toggle,.action-multicheck-wrap:hover .admin__control-checkbox+label:before{border-color:#878787}.action-multicheck-wrap._active .action-multicheck-toggle,.action-multicheck-wrap._active .admin__control-checkbox+label:before{border-color:#007bdb}.action-multicheck-wrap._active .abs-action-menu .action-submenu,.action-multicheck-wrap._active .abs-action-menu .action-submenu .action-submenu,.action-multicheck-wrap._active .action-menu,.action-multicheck-wrap._active .action-menu .action-submenu,.action-multicheck-wrap._active .actions-split .action-menu .action-submenu,.action-multicheck-wrap._active .actions-split .action-menu .action-submenu .action-submenu,.action-multicheck-wrap._active .actions-split .dropdown-menu .action-submenu,.action-multicheck-wrap._active .actions-split .dropdown-menu .action-submenu .action-submenu{opacity:1;visibility:visible;display:block}.action-multicheck-wrap._disabled .admin__control-checkbox+label:before{background-color:#fff}.action-multicheck-wrap._disabled .action-multicheck-toggle,.action-multicheck-wrap._disabled .admin__control-checkbox+label:before{border-color:#adadad;opacity:1}.action-multicheck-wrap .action-multicheck-toggle,.action-multicheck-wrap .admin__control-checkbox,.action-multicheck-wrap .admin__control-checkbox+label{float:left}.action-multicheck-wrap .action-multicheck-toggle{border-radius:0 1px 1px 0;height:1.6rem;margin-left:-1px;padding:0;position:relative;transition:border-color .1s linear;width:1.6rem}.action-multicheck-wrap .action-multicheck-toggle._active:after,.action-multicheck-wrap .action-multicheck-toggle.active:after{-ms-transform:rotate(180deg);transform:rotate(180deg)}.action-multicheck-wrap .action-multicheck-toggle:after{border-color:#000 transparent transparent;border-style:solid;border-width:.5rem .4rem 0;content:'';height:0;margin-top:-.2rem;position:absolute;top:50%;transition:all .2s linear;width:0}._active .action-multicheck-wrap .action-multicheck-toggle:after,.active .action-multicheck-wrap .action-multicheck-toggle:after{-ms-transform:rotate(180deg);transform:rotate(180deg)}.action-multicheck-wrap .action-multicheck-toggle:hover:after{border-color:#000 transparent transparent}.action-multicheck-wrap .action-multicheck-toggle:focus{border-color:#007bdb}.action-multicheck-wrap .action-multicheck-toggle:after{right:.3rem}.action-multicheck-wrap .abs-action-menu .action-submenu,.action-multicheck-wrap .abs-action-menu .action-submenu .action-submenu,.action-multicheck-wrap .action-menu,.action-multicheck-wrap .action-menu .action-submenu,.action-multicheck-wrap .actions-split .action-menu .action-submenu,.action-multicheck-wrap .actions-split .action-menu .action-submenu .action-submenu,.action-multicheck-wrap .actions-split .dropdown-menu .action-submenu,.action-multicheck-wrap .actions-split .dropdown-menu .action-submenu .action-submenu{left:-1.1rem;margin-top:1px;right:auto;text-align:left}.action-multicheck-wrap .action-menu-item{white-space:nowrap}.admin__action-multiselect-wrap{display:block;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.admin__action-multiselect-wrap.action-select-wrap:focus{box-shadow:none}.admin__action-multiselect-wrap.action-select-wrap .abs-action-menu .action-submenu,.admin__action-multiselect-wrap.action-select-wrap .abs-action-menu .action-submenu .action-submenu,.admin__action-multiselect-wrap.action-select-wrap .action-menu,.admin__action-multiselect-wrap.action-select-wrap .action-menu .action-submenu,.admin__action-multiselect-wrap.action-select-wrap .actions-split .action-menu .action-submenu,.admin__action-multiselect-wrap.action-select-wrap .actions-split .action-menu .action-submenu .action-submenu,.admin__action-multiselect-wrap.action-select-wrap .actions-split .dropdown-menu .action-submenu,.admin__action-multiselect-wrap.action-select-wrap .actions-split .dropdown-menu .action-submenu .action-submenu{max-height:none;overflow-y:inherit}.admin__action-multiselect-wrap .action-menu-item{transition:background-color .1s linear}.admin__action-multiselect-wrap .action-menu-item._selected{background-color:#e0f6fe}.admin__action-multiselect-wrap .action-menu-item._hover{background-color:#e3e3e3}.admin__action-multiselect-wrap .action-menu-item._unclickable{cursor:default}.admin__action-multiselect-wrap .admin__action-multiselect{border:1px solid #adadad;cursor:pointer;display:block;min-height:3.2rem;padding-right:3.6rem;white-space:normal}.admin__action-multiselect-wrap .admin__action-multiselect:after{bottom:1.25rem;top:auto}.admin__action-multiselect-wrap .admin__action-multiselect:before{height:3.3rem;top:auto}.admin__control-table-wrapper .admin__action-multiselect-wrap{position:static}.admin__control-table-wrapper .admin__action-multiselect-wrap .admin__action-multiselect{position:relative}.admin__control-table-wrapper .admin__action-multiselect-wrap .admin__action-multiselect:before{right:-1px;top:-1px}.admin__control-table-wrapper .admin__action-multiselect-wrap .abs-action-menu .action-submenu,.admin__control-table-wrapper .admin__action-multiselect-wrap .abs-action-menu .action-submenu .action-submenu,.admin__control-table-wrapper .admin__action-multiselect-wrap .action-menu,.admin__control-table-wrapper .admin__action-multiselect-wrap .action-menu .action-submenu,.admin__control-table-wrapper .admin__action-multiselect-wrap .actions-split .action-menu .action-submenu,.admin__control-table-wrapper .admin__action-multiselect-wrap .actions-split .action-menu .action-submenu .action-submenu,.admin__control-table-wrapper .admin__action-multiselect-wrap .actions-split .dropdown-menu .action-submenu,.admin__control-table-wrapper .admin__action-multiselect-wrap .actions-split .dropdown-menu .action-submenu .action-submenu{left:auto;min-width:34rem;right:auto;top:auto;z-index:1}.admin__action-multiselect-wrap .admin__action-multiselect-item-path{color:#a79d95;font-size:1.2rem;font-weight:400;padding-left:1rem}.admin__action-multiselect-actions-wrap{border-top:1px solid #e3e3e3;margin:0 1rem;padding:1rem 0;text-align:center}.admin__action-multiselect-actions-wrap .action-default{font-size:1.3rem;min-width:13rem}.admin__action-multiselect-text{padding:.6rem 1rem}.abs-action-menu .action-submenu,.abs-action-menu .action-submenu .action-submenu,.action-menu,.action-menu .action-submenu,.actions-split .action-menu .action-submenu,.actions-split .action-menu .action-submenu .action-submenu,.actions-split .dropdown-menu .action-submenu,.actions-split .dropdown-menu .action-submenu .action-submenu{text-align:left}.admin__action-multiselect-label{cursor:pointer;position:relative;z-index:1}.admin__action-multiselect-label:before{margin-right:.5rem}._unclickable .admin__action-multiselect-label{cursor:default;font-weight:700}.admin__action-multiselect-search-wrap{border-bottom:1px solid #e3e3e3;margin:0 1rem;padding:1rem 0;position:relative}.admin__action-multiselect-search{padding-right:3rem;width:100%}.admin__action-multiselect-search-label{display:block;font-size:1.5rem;height:1em;overflow:hidden;position:absolute;right:2.2rem;top:1.7rem;width:1em}.admin__action-multiselect-search-label:before{content:'\e60c'}.admin__action-multiselect-search-count{color:#a79d95;margin-top:1rem}.admin__action-multiselect-menu-inner{margin-bottom:0;max-height:46rem;overflow-y:auto}.admin__action-multiselect-menu-inner .admin__action-multiselect-menu-inner{list-style:none;max-height:none;overflow:hidden;padding-left:2.2rem}.admin__action-multiselect-menu-inner ._hidden{display:none}.admin__action-multiselect-crumb{background-color:#f5f5f5;border:1px solid #a79d95;border-radius:1px;display:inline-block;font-size:1.2rem;margin:.3rem -4px .3rem .3rem;padding:.3rem 2.4rem .4rem 1rem;position:relative;transition:border-color .1s linear}.admin__action-multiselect-crumb:hover{border-color:#908379}.admin__action-multiselect-crumb .action-close{bottom:0;font-size:.5em;position:absolute;right:0;top:0;width:2rem}.admin__action-multiselect-crumb .action-close:hover{color:#000}.admin__action-multiselect-crumb .action-close:active,.admin__action-multiselect-crumb .action-close:focus{background-color:transparent}.admin__action-multiselect-crumb .action-close:active{-ms-transform:scale(0.9);transform:scale(0.9)}.admin__action-multiselect-tree .abs-action-menu .action-submenu,.admin__action-multiselect-tree .abs-action-menu .action-submenu .action-submenu,.admin__action-multiselect-tree .action-menu,.admin__action-multiselect-tree .action-menu .action-submenu,.admin__action-multiselect-tree .actions-split .action-menu .action-submenu,.admin__action-multiselect-tree .actions-split .action-menu .action-submenu .action-submenu,.admin__action-multiselect-tree .actions-split .dropdown-menu .action-submenu,.admin__action-multiselect-tree .actions-split .dropdown-menu .action-submenu .action-submenu{min-width:34.7rem}.admin__action-multiselect-tree .abs-action-menu .action-submenu .action-menu-item,.admin__action-multiselect-tree .abs-action-menu .action-submenu .action-submenu .action-menu-item,.admin__action-multiselect-tree .action-menu .action-menu-item,.admin__action-multiselect-tree .action-menu .action-submenu .action-menu-item,.admin__action-multiselect-tree .actions-split .action-menu .action-submenu .action-menu-item,.admin__action-multiselect-tree .actions-split .action-menu .action-submenu .action-submenu .action-menu-item,.admin__action-multiselect-tree .actions-split .dropdown-menu .action-submenu .action-menu-item,.admin__action-multiselect-tree .actions-split .dropdown-menu .action-submenu .action-submenu .action-menu-item{margin-top:.1rem}.admin__action-multiselect-tree .action-menu-item{margin-left:4.2rem;position:relative}.admin__action-multiselect-tree .action-menu-item._expended:before{border-left:1px dashed #a79d95;bottom:0;content:'';left:-1rem;position:absolute;top:1rem;width:1px}.admin__action-multiselect-tree .action-menu-item._expended .admin__action-multiselect-dropdown:before{content:'\e615'}.admin__action-multiselect-tree .action-menu-item._with-checkbox .admin__action-multiselect-label{padding-left:2.6rem}.admin__action-multiselect-tree .admin__action-multiselect-menu-inner{position:relative}.admin__action-multiselect-tree .admin__action-multiselect-menu-inner .admin__action-multiselect-menu-inner{padding-left:3.2rem}.admin__action-multiselect-tree .admin__action-multiselect-menu-inner .admin__action-multiselect-menu-inner:before{left:4.3rem}.admin__action-multiselect-tree .admin__action-multiselect-menu-inner-item{position:relative}.admin__action-multiselect-tree .admin__action-multiselect-menu-inner-item:last-child:before{height:2.1rem}.admin__action-multiselect-tree .admin__action-multiselect-menu-inner-item:after,.admin__action-multiselect-tree .admin__action-multiselect-menu-inner-item:before{content:'';left:0;position:absolute}.admin__action-multiselect-tree .admin__action-multiselect-menu-inner-item:after{border-top:1px dashed #a79d95;height:1px;top:2.1rem;width:5.2rem}.admin__action-multiselect-tree .admin__action-multiselect-menu-inner-item:before{border-left:1px dashed #a79d95;height:100%;top:0;width:1px}.admin__action-multiselect-tree .admin__action-multiselect-menu-inner-item._parent:after{width:4.2rem}.admin__action-multiselect-tree .admin__action-multiselect-menu-inner-item._root{margin-left:-1rem}.admin__action-multiselect-tree .admin__action-multiselect-menu-inner-item._root:after{left:3.2rem;width:2.2rem}.admin__action-multiselect-tree .admin__action-multiselect-menu-inner-item._root:before{left:3.2rem;top:1rem}.admin__action-multiselect-tree .admin__action-multiselect-menu-inner-item._root._parent:after{display:none}.admin__action-multiselect-tree .admin__action-multiselect-menu-inner-item._root:first-child:before{top:2.1rem}.admin__action-multiselect-tree .admin__action-multiselect-menu-inner-item._root:last-child:before{height:1rem}.admin__action-multiselect-tree .admin__action-multiselect-label{line-height:2.2rem;vertical-align:middle;word-break:break-all}.admin__action-multiselect-tree .admin__action-multiselect-label:before{left:0;position:absolute;top:.4rem}.admin__action-multiselect-dropdown{border-radius:50%;height:2.2rem;left:-2.2rem;position:absolute;top:1rem;width:2.2rem;z-index:1}.admin__action-multiselect-dropdown:before{background:#fff;color:#a79d95;content:'\e616';font-size:2.2rem}.admin__actions-switch{display:inline-block;position:relative;vertical-align:middle}.admin__field-control .admin__actions-switch{line-height:3.2rem}.admin__actions-switch+.admin__field-service{min-width:34rem}._disabled .admin__actions-switch-checkbox+.admin__actions-switch-label,.admin__actions-switch-checkbox.disabled+.admin__actions-switch-label{cursor:not-allowed;opacity:.5;pointer-events:none}.admin__actions-switch-checkbox:checked+.admin__actions-switch-label:before{left:15px}.admin__actions-switch-checkbox:checked+.admin__actions-switch-label:after{background:#79a22e}.admin__actions-switch-checkbox:checked+.admin__actions-switch-label .admin__actions-switch-text:before{content:attr(data-text-on)}.admin__actions-switch-checkbox:focus+.admin__actions-switch-label:after,.admin__actions-switch-checkbox:focus+.admin__actions-switch-label:before{border-color:#007bdb}._error .admin__actions-switch-checkbox+.admin__actions-switch-label:after,._error .admin__actions-switch-checkbox+.admin__actions-switch-label:before{border-color:#e22626}.admin__actions-switch-label{cursor:pointer;display:inline-block;height:22px;line-height:22px;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;vertical-align:middle}.admin__actions-switch-label:after,.admin__actions-switch-label:before{left:0;position:absolute;right:auto;top:0}.admin__actions-switch-label:before{background:#fff;border:1px solid #aaa6a0;border-radius:100%;content:'';display:block;height:22px;transition:left .2s ease-in 0s;width:22px;z-index:1}.admin__actions-switch-label:after{background:#e3e3e3;border:1px solid #aaa6a0;border-radius:12px;content:'';display:block;height:22px;transition:background .2s ease-in 0s;vertical-align:middle;width:37px;z-index:0}.admin__actions-switch-text:before{content:attr(data-text-off);padding-left:47px;white-space:nowrap}.abs-action-delete,.abs-action-reset,.action-close,.admin__field-fallback-reset,.extensions-information .list .extension-delete,.notifications-close,.search-global-field._active .search-global-action{background-color:transparent;border:none;border-radius:0;box-shadow:none;margin:0;padding:0}.abs-action-delete:hover,.abs-action-reset:hover,.action-close:hover,.admin__field-fallback-reset:hover,.extensions-information .list .extension-delete:hover,.notifications-close:hover,.search-global-field._active .search-global-action:hover{background-color:transparent;border:none;box-shadow:none}.abs-action-default,.abs-action-pattern,.abs-action-primary,.abs-action-quaternary,.abs-action-secondary,.abs-action-tertiary,.action-default,.action-primary,.action-quaternary,.action-secondary,.action-tertiary,.modal-popup .modal-footer .action-primary,.modal-popup .modal-footer .action-secondary,.page-actions .page-actions-buttons>button,.page-actions .page-actions-buttons>button.action-primary,.page-actions .page-actions-buttons>button.action-secondary,.page-actions .page-actions-buttons>button.primary,.page-actions>button,.page-actions>button.action-primary,.page-actions>button.action-secondary,.page-actions>button.primary,button,button.primary,button.secondary,button.tertiary{border:1px solid;border-radius:0;display:inline-block;font-family:'Open Sans','Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.4rem;font-weight:600;line-height:1.36;padding:.6rem 1em;text-align:center;vertical-align:baseline}.abs-action-default.disabled,.abs-action-default[disabled],.abs-action-pattern.disabled,.abs-action-pattern[disabled],.abs-action-primary.disabled,.abs-action-primary[disabled],.abs-action-quaternary.disabled,.abs-action-quaternary[disabled],.abs-action-secondary.disabled,.abs-action-secondary[disabled],.abs-action-tertiary.disabled,.abs-action-tertiary[disabled],.action-default.disabled,.action-default[disabled],.action-primary.disabled,.action-primary[disabled],.action-quaternary.disabled,.action-quaternary[disabled],.action-secondary.disabled,.action-secondary[disabled],.action-tertiary.disabled,.action-tertiary[disabled],.modal-popup .modal-footer .action-primary.disabled,.modal-popup .modal-footer .action-primary[disabled],.modal-popup .modal-footer .action-secondary.disabled,.modal-popup .modal-footer .action-secondary[disabled],.page-actions .page-actions-buttons>button.action-primary.disabled,.page-actions .page-actions-buttons>button.action-primary[disabled],.page-actions .page-actions-buttons>button.action-secondary.disabled,.page-actions .page-actions-buttons>button.action-secondary[disabled],.page-actions .page-actions-buttons>button.disabled,.page-actions .page-actions-buttons>button.primary.disabled,.page-actions .page-actions-buttons>button.primary[disabled],.page-actions .page-actions-buttons>button[disabled],.page-actions>button.action-primary.disabled,.page-actions>button.action-primary[disabled],.page-actions>button.action-secondary.disabled,.page-actions>button.action-secondary[disabled],.page-actions>button.disabled,.page-actions>button.primary.disabled,.page-actions>button.primary[disabled],.page-actions>button[disabled],button.disabled,button.primary.disabled,button.primary[disabled],button.secondary.disabled,button.secondary[disabled],button.tertiary.disabled,button.tertiary[disabled],button[disabled]{cursor:default;opacity:.5;pointer-events:none}.abs-action-l,.modal-popup .modal-footer .action-primary,.modal-popup .modal-footer .action-secondary,.page-actions .page-actions-buttons>button,.page-actions .page-actions-buttons>button.action-primary,.page-actions .page-actions-buttons>button.action-secondary,.page-actions .page-actions-buttons>button.primary,.page-actions button,.page-actions>button.action-primary,.page-actions>button.action-secondary,.page-actions>button.primary{font-size:1.6rem;letter-spacing:.025em;padding-bottom:.6875em;padding-top:.6875em}.abs-action-delete,.extensions-information .list .extension-delete{display:inline-block;font-size:1.6rem;margin-left:1.2rem;padding-top:.7rem;text-decoration:none;vertical-align:middle}.abs-action-delete:after,.extensions-information .list .extension-delete:after{color:#666;content:'\e630'}.abs-action-delete:hover:after,.extensions-information .list .extension-delete:hover:after{color:#35302c}.abs-action-button-as-link,.action-advanced,.data-grid .action-delete{line-height:1.36;padding:0;color:#008bdb;text-decoration:none;background:0 0;border:0;display:inline;font-weight:400;border-radius:0}.abs-action-button-as-link:visited,.action-advanced:visited,.data-grid .action-delete:visited{color:#008bdb;text-decoration:none}.abs-action-button-as-link:hover,.action-advanced:hover,.data-grid .action-delete:hover{text-decoration:underline}.abs-action-button-as-link:active,.action-advanced:active,.data-grid .action-delete:active{color:#ff5501;text-decoration:underline}.abs-action-button-as-link:hover,.action-advanced:hover,.data-grid .action-delete:hover{color:#0fa7ff}.abs-action-button-as-link:active,.abs-action-button-as-link:focus,.abs-action-button-as-link:hover,.action-advanced:active,.action-advanced:focus,.action-advanced:hover,.data-grid .action-delete:active,.data-grid .action-delete:focus,.data-grid .action-delete:hover{background:0 0;border:0}.abs-action-button-as-link.disabled,.abs-action-button-as-link[disabled],.action-advanced.disabled,.action-advanced[disabled],.data-grid .action-delete.disabled,.data-grid .action-delete[disabled],fieldset[disabled] .abs-action-button-as-link,fieldset[disabled] .action-advanced,fieldset[disabled] .data-grid .action-delete{color:#008bdb;opacity:.5;cursor:default;pointer-events:none;text-decoration:underline}.abs-action-button-as-link:active,.abs-action-button-as-link:not(:focus),.action-advanced:active,.action-advanced:not(:focus),.data-grid .action-delete:active,.data-grid .action-delete:not(:focus){box-shadow:none}.abs-action-button-as-link:focus,.action-advanced:focus,.data-grid .action-delete:focus{color:#0fa7ff}.abs-action-default,button{background:#e3e3e3;border-color:#adadad;color:#514943}.abs-action-default:active,.abs-action-default:focus,.abs-action-default:hover,button:active,button:focus,button:hover{background-color:#dbdbdb;color:#514943;text-decoration:none}.abs-action-primary,.page-actions .page-actions-buttons>button.action-primary,.page-actions .page-actions-buttons>button.primary,.page-actions>button.action-primary,.page-actions>button.primary,button.primary{background-color:#eb5202;border-color:#eb5202;color:#fff;text-shadow:1px 1px 0 rgba(0,0,0,.25)}.abs-action-primary:active,.abs-action-primary:focus,.abs-action-primary:hover,.page-actions .page-actions-buttons>button.action-primary:active,.page-actions .page-actions-buttons>button.action-primary:focus,.page-actions .page-actions-buttons>button.action-primary:hover,.page-actions .page-actions-buttons>button.primary:active,.page-actions .page-actions-buttons>button.primary:focus,.page-actions .page-actions-buttons>button.primary:hover,.page-actions>button.action-primary:active,.page-actions>button.action-primary:focus,.page-actions>button.action-primary:hover,.page-actions>button.primary:active,.page-actions>button.primary:focus,.page-actions>button.primary:hover,button.primary:active,button.primary:focus,button.primary:hover{background-color:#ba4000;border-color:#b84002;box-shadow:0 0 0 1px #007bdb;color:#fff;text-decoration:none}.abs-action-primary.disabled,.abs-action-primary[disabled],.page-actions .page-actions-buttons>button.action-primary.disabled,.page-actions .page-actions-buttons>button.action-primary[disabled],.page-actions .page-actions-buttons>button.primary.disabled,.page-actions .page-actions-buttons>button.primary[disabled],.page-actions>button.action-primary.disabled,.page-actions>button.action-primary[disabled],.page-actions>button.primary.disabled,.page-actions>button.primary[disabled],button.primary.disabled,button.primary[disabled]{cursor:default;opacity:.5;pointer-events:none}.abs-action-secondary,.modal-popup .modal-footer .action-primary,.page-actions .page-actions-buttons>button.action-secondary,.page-actions>button.action-secondary,button.secondary{background-color:#514943;border-color:#514943;color:#fff;text-shadow:1px 1px 1px rgba(0,0,0,.3)}.abs-action-secondary:active,.abs-action-secondary:focus,.abs-action-secondary:hover,.modal-popup .modal-footer .action-primary:active,.modal-popup .modal-footer .action-primary:focus,.modal-popup .modal-footer .action-primary:hover,.page-actions .page-actions-buttons>button.action-secondary:active,.page-actions .page-actions-buttons>button.action-secondary:focus,.page-actions .page-actions-buttons>button.action-secondary:hover,.page-actions>button.action-secondary:active,.page-actions>button.action-secondary:focus,.page-actions>button.action-secondary:hover,button.secondary:active,button.secondary:focus,button.secondary:hover{background-color:#35302c;border-color:#35302c;box-shadow:0 0 0 1px #007bdb;color:#fff;text-decoration:none}.abs-action-secondary:active,.modal-popup .modal-footer .action-primary:active,.page-actions .page-actions-buttons>button.action-secondary:active,.page-actions>button.action-secondary:active,button.secondary:active{background-color:#35302c}.abs-action-tertiary,.modal-popup .modal-footer .action-secondary,button.tertiary{background-color:transparent;border-color:transparent;text-shadow:none;color:#008bdb}.abs-action-tertiary:active,.abs-action-tertiary:focus,.abs-action-tertiary:hover,.modal-popup .modal-footer .action-secondary:active,.modal-popup .modal-footer .action-secondary:focus,.modal-popup .modal-footer .action-secondary:hover,button.tertiary:active,button.tertiary:focus,button.tertiary:hover{background-color:transparent;border-color:transparent;box-shadow:none;color:#0fa7ff;text-decoration:underline}.abs-action-quaternary,.page-actions .page-actions-buttons>button,.page-actions>button{background-color:transparent;border-color:transparent;text-shadow:none;color:#333}.abs-action-quaternary:active,.abs-action-quaternary:focus,.abs-action-quaternary:hover,.page-actions .page-actions-buttons>button:active,.page-actions .page-actions-buttons>button:focus,.page-actions .page-actions-buttons>button:hover,.page-actions>button:active,.page-actions>button:focus,.page-actions>button:hover{background-color:transparent;border-color:transparent;box-shadow:none;color:#1a1a1a}.abs-action-menu,.actions-split .abs-action-menu .action-submenu,.actions-split .abs-action-menu .action-submenu .action-submenu,.actions-split .action-menu,.actions-split .action-menu .action-submenu,.actions-split .actions-split .dropdown-menu .action-submenu,.actions-split .actions-split .dropdown-menu .action-submenu .action-submenu,.actions-split .dropdown-menu{text-align:left;background-color:#fff;border:1px solid #007bdb;border-radius:1px;box-shadow:1px 1px 5px rgba(0,0,0,.5);color:#333;display:none;font-weight:400;left:0;list-style:none;margin:2px 0 0;min-width:0;padding:0;position:absolute;right:0;top:100%}.abs-action-menu._active,.actions-split .abs-action-menu .action-submenu .action-submenu._active,.actions-split .abs-action-menu .action-submenu._active,.actions-split .action-menu .action-submenu._active,.actions-split .action-menu._active,.actions-split .actions-split .dropdown-menu .action-submenu .action-submenu._active,.actions-split .actions-split .dropdown-menu .action-submenu._active,.actions-split .dropdown-menu._active{display:block}.abs-action-menu>li,.actions-split .abs-action-menu .action-submenu .action-submenu>li,.actions-split .abs-action-menu .action-submenu>li,.actions-split .action-menu .action-submenu>li,.actions-split .action-menu>li,.actions-split .actions-split .dropdown-menu .action-submenu .action-submenu>li,.actions-split .actions-split .dropdown-menu .action-submenu>li,.actions-split .dropdown-menu>li{border:none;display:block;padding:0;transition:background-color .1s linear}.abs-action-menu>li>a:hover,.actions-split .abs-action-menu .action-submenu .action-submenu>li>a:hover,.actions-split .abs-action-menu .action-submenu>li>a:hover,.actions-split .action-menu .action-submenu>li>a:hover,.actions-split .action-menu>li>a:hover,.actions-split .actions-split .dropdown-menu .action-submenu .action-submenu>li>a:hover,.actions-split .actions-split .dropdown-menu .action-submenu>li>a:hover,.actions-split .dropdown-menu>li>a:hover{text-decoration:none}.abs-action-menu>li._visible,.abs-action-menu>li:hover,.actions-split .abs-action-menu .action-submenu .action-submenu>li._visible,.actions-split .abs-action-menu .action-submenu .action-submenu>li:hover,.actions-split .abs-action-menu .action-submenu>li._visible,.actions-split .abs-action-menu .action-submenu>li:hover,.actions-split .action-menu .action-submenu>li._visible,.actions-split .action-menu .action-submenu>li:hover,.actions-split .action-menu>li._visible,.actions-split .action-menu>li:hover,.actions-split .actions-split .dropdown-menu .action-submenu .action-submenu>li._visible,.actions-split .actions-split .dropdown-menu .action-submenu .action-submenu>li:hover,.actions-split .actions-split .dropdown-menu .action-submenu>li._visible,.actions-split .actions-split .dropdown-menu .action-submenu>li:hover,.actions-split .dropdown-menu>li._visible,.actions-split .dropdown-menu>li:hover{background-color:#e3e3e3}.abs-action-menu>li:active,.actions-split .abs-action-menu .action-submenu .action-submenu>li:active,.actions-split .abs-action-menu .action-submenu>li:active,.actions-split .action-menu .action-submenu>li:active,.actions-split .action-menu>li:active,.actions-split .actions-split .dropdown-menu .action-submenu .action-submenu>li:active,.actions-split .actions-split .dropdown-menu .action-submenu>li:active,.actions-split .dropdown-menu>li:active{background-color:#cacaca}.abs-action-menu>li._parent,.actions-split .abs-action-menu .action-submenu .action-submenu>li._parent,.actions-split .abs-action-menu .action-submenu>li._parent,.actions-split .action-menu .action-submenu>li._parent,.actions-split .action-menu>li._parent,.actions-split .actions-split .dropdown-menu .action-submenu .action-submenu>li._parent,.actions-split .actions-split .dropdown-menu .action-submenu>li._parent,.actions-split .dropdown-menu>li._parent{-webkit-flex-direction:row;display:flex;-ms-flex-direction:row;flex-direction:row}.abs-action-menu>li._parent>.action-menu-item,.actions-split .abs-action-menu .action-submenu .action-submenu>li._parent>.action-menu-item,.actions-split .abs-action-menu .action-submenu>li._parent>.action-menu-item,.actions-split .action-menu .action-submenu>li._parent>.action-menu-item,.actions-split .action-menu>li._parent>.action-menu-item,.actions-split .actions-split .dropdown-menu .action-submenu .action-submenu>li._parent>.action-menu-item,.actions-split .actions-split .dropdown-menu .action-submenu>li._parent>.action-menu-item,.actions-split .dropdown-menu>li._parent>.action-menu-item{min-width:100%}.abs-action-menu .action-menu-item,.abs-action-menu .item,.actions-split .abs-action-menu .action-submenu .action-menu-item,.actions-split .abs-action-menu .action-submenu .action-submenu .action-menu-item,.actions-split .abs-action-menu .action-submenu .action-submenu .item,.actions-split .abs-action-menu .action-submenu .item,.actions-split .action-menu .action-menu-item,.actions-split .action-menu .action-submenu .action-menu-item,.actions-split .action-menu .action-submenu .item,.actions-split .action-menu .item,.actions-split .actions-split .dropdown-menu .action-submenu .action-menu-item,.actions-split .actions-split .dropdown-menu .action-submenu .action-submenu .action-menu-item,.actions-split .actions-split .dropdown-menu .action-submenu .action-submenu .item,.actions-split .actions-split .dropdown-menu .action-submenu .item,.actions-split .dropdown-menu .action-menu-item,.actions-split .dropdown-menu .item{cursor:pointer;display:block;padding:.6875em 1em}.abs-action-menu .action-submenu,.actions-split .action-menu .action-submenu,.actions-split .action-menu .action-submenu .action-submenu,.actions-split .dropdown-menu .action-submenu{bottom:auto;left:auto;margin-left:0;margin-top:-1px;position:absolute;right:auto;top:auto}.ie9 .abs-action-menu .action-submenu,.ie9 .actions-split .abs-action-menu .action-submenu .action-submenu,.ie9 .actions-split .abs-action-menu .action-submenu .action-submenu .action-submenu,.ie9 .actions-split .action-menu .action-submenu,.ie9 .actions-split .action-menu .action-submenu .action-submenu,.ie9 .actions-split .actions-split .dropdown-menu .action-submenu .action-submenu,.ie9 .actions-split .actions-split .dropdown-menu .action-submenu .action-submenu .action-submenu,.ie9 .actions-split .dropdown-menu .action-submenu{margin-left:99%;margin-top:-3.5rem}.abs-action-menu a.action-menu-item,.actions-split .abs-action-menu .action-submenu .action-submenu a.action-menu-item,.actions-split .abs-action-menu .action-submenu a.action-menu-item,.actions-split .action-menu .action-submenu a.action-menu-item,.actions-split .action-menu a.action-menu-item,.actions-split .actions-split .dropdown-menu .action-submenu .action-submenu a.action-menu-item,.actions-split .actions-split .dropdown-menu .action-submenu a.action-menu-item,.actions-split .dropdown-menu a.action-menu-item{color:#333}.abs-action-menu a.action-menu-item:focus,.actions-split .abs-action-menu .action-submenu .action-submenu a.action-menu-item:focus,.actions-split .abs-action-menu .action-submenu a.action-menu-item:focus,.actions-split .action-menu .action-submenu a.action-menu-item:focus,.actions-split .action-menu a.action-menu-item:focus,.actions-split .actions-split .dropdown-menu .action-submenu .action-submenu a.action-menu-item:focus,.actions-split .actions-split .dropdown-menu .action-submenu a.action-menu-item:focus,.actions-split .dropdown-menu a.action-menu-item:focus{background-color:#e3e3e3;box-shadow:none}.abs-action-wrap-triangle{position:relative}.abs-action-wrap-triangle .action-default{width:100%}.abs-action-wrap-triangle .action-default:after,.abs-action-wrap-triangle .action-default:before{border-style:solid;content:'';height:0;position:absolute;top:0;width:0}.abs-action-wrap-triangle .action-default:active,.abs-action-wrap-triangle .action-default:focus,.abs-action-wrap-triangle .action-default:hover{box-shadow:none}._keyfocus .abs-action-wrap-triangle .action-default:focus{box-shadow:0 0 0 1px #007bdb}.ie10 .abs-action-wrap-triangle .action-default.disabled,.ie10 .abs-action-wrap-triangle .action-default[disabled],.ie9 .abs-action-wrap-triangle .action-default.disabled,.ie9 .abs-action-wrap-triangle .action-default[disabled]{background-color:#fcfcfc;opacity:1;text-shadow:none}.abs-action-wrap-triangle-right{display:inline-block;padding-right:1.6rem;position:relative}.abs-action-wrap-triangle-right .action-default:after,.abs-action-wrap-triangle-right .action-default:before{border-color:transparent transparent transparent #e3e3e3;border-width:1.7rem 0 1.6rem 1.7rem;left:100%;margin-left:-1.7rem}.abs-action-wrap-triangle-right .action-default:before{border-left-color:#949494;right:-1px}.abs-action-wrap-triangle-right .action-default:active:after,.abs-action-wrap-triangle-right .action-default:focus:after,.abs-action-wrap-triangle-right .action-default:hover:after{border-left-color:#dbdbdb}.ie10 .abs-action-wrap-triangle-right .action-default.disabled:after,.ie10 .abs-action-wrap-triangle-right .action-default[disabled]:after,.ie9 .abs-action-wrap-triangle-right .action-default.disabled:after,.ie9 .abs-action-wrap-triangle-right .action-default[disabled]:after{border-color:transparent transparent transparent #fcfcfc}.abs-action-wrap-triangle-right .action-primary:after{border-color:transparent transparent transparent #eb5202}.abs-action-wrap-triangle-right .action-primary:active:after,.abs-action-wrap-triangle-right .action-primary:focus:after,.abs-action-wrap-triangle-right .action-primary:hover:after{border-left-color:#ba4000}.abs-action-wrap-triangle-left{display:inline-block;padding-left:1.6rem}.abs-action-wrap-triangle-left .action-default{text-indent:-.85rem}.abs-action-wrap-triangle-left .action-default:after,.abs-action-wrap-triangle-left .action-default:before{border-color:transparent #e3e3e3 transparent transparent;border-width:1.7rem 1.7rem 1.6rem 0;margin-right:-1.7rem;right:100%}.abs-action-wrap-triangle-left .action-default:before{border-right-color:#949494;left:-1px}.abs-action-wrap-triangle-left .action-default:active:after,.abs-action-wrap-triangle-left .action-default:focus:after,.abs-action-wrap-triangle-left .action-default:hover:after{border-right-color:#dbdbdb}.ie10 .abs-action-wrap-triangle-left .action-default.disabled:after,.ie10 .abs-action-wrap-triangle-left .action-default[disabled]:after,.ie9 .abs-action-wrap-triangle-left .action-default.disabled:after,.ie9 .abs-action-wrap-triangle-left .action-default[disabled]:after{border-color:transparent #fcfcfc transparent transparent}.abs-action-wrap-triangle-left .action-primary:after{border-color:transparent #eb5202 transparent transparent}.abs-action-wrap-triangle-left .action-primary:active:after,.abs-action-wrap-triangle-left .action-primary:focus:after,.abs-action-wrap-triangle-left .action-primary:hover:after{border-right-color:#ba4000}.action-default,button{background:#e3e3e3;border-color:#adadad;color:#514943}.action-default:active,.action-default:focus,.action-default:hover,button:active,button:focus,button:hover{background-color:#dbdbdb;color:#514943;text-decoration:none}.action-primary{background-color:#eb5202;border-color:#eb5202;color:#fff;text-shadow:1px 1px 0 rgba(0,0,0,.25)}.action-primary:active,.action-primary:focus,.action-primary:hover{background-color:#ba4000;border-color:#b84002;box-shadow:0 0 0 1px #007bdb;color:#fff;text-decoration:none}.action-primary.disabled,.action-primary[disabled]{cursor:default;opacity:.5;pointer-events:none}.action-secondary{background-color:#514943;border-color:#514943;color:#fff;text-shadow:1px 1px 1px rgba(0,0,0,.3)}.action-secondary:active,.action-secondary:focus,.action-secondary:hover{background-color:#35302c;border-color:#35302c;box-shadow:0 0 0 1px #007bdb;color:#fff;text-decoration:none}.action-secondary:active{background-color:#35302c}.action-quaternary,.action-tertiary{background-color:transparent;border-color:transparent;text-shadow:none}.action-quaternary:active,.action-quaternary:focus,.action-quaternary:hover,.action-tertiary:active,.action-tertiary:focus,.action-tertiary:hover{background-color:transparent;border-color:transparent;box-shadow:none}.action-tertiary{color:#008bdb}.action-tertiary:active,.action-tertiary:focus,.action-tertiary:hover{color:#0fa7ff;text-decoration:underline}.action-quaternary{color:#333}.action-quaternary:active,.action-quaternary:focus,.action-quaternary:hover{color:#1a1a1a}.action-close>span{clip:rect(0,0,0,0);overflow:hidden;position:absolute}.action-close:active{-ms-transform:scale(0.9);transform:scale(0.9)}.action-close:before{content:'\e62f';transition:color .1s linear}.action-close:hover{cursor:pointer;text-decoration:none}.abs-action-menu .action-submenu,.abs-action-menu .action-submenu .action-submenu,.action-menu,.action-menu .action-submenu,.actions-split .action-menu .action-submenu,.actions-split .action-menu .action-submenu .action-submenu,.actions-split .dropdown-menu .action-submenu,.actions-split .dropdown-menu .action-submenu .action-submenu{background-color:#fff;border:1px solid #007bdb;border-radius:1px;box-shadow:1px 1px 5px rgba(0,0,0,.5);color:#333;display:none;font-weight:400;left:0;list-style:none;margin:2px 0 0;min-width:0;padding:0;position:absolute;right:0;top:100%}.abs-action-menu .action-submenu .action-submenu._active,.abs-action-menu .action-submenu._active,.action-menu .action-submenu._active,.action-menu._active,.actions-split .action-menu .action-submenu .action-submenu._active,.actions-split .action-menu .action-submenu._active,.actions-split .dropdown-menu .action-submenu .action-submenu._active,.actions-split .dropdown-menu .action-submenu._active{display:block}.abs-action-menu .action-submenu .action-submenu>li,.abs-action-menu .action-submenu>li,.action-menu .action-submenu>li,.action-menu>li,.actions-split .action-menu .action-submenu .action-submenu>li,.actions-split .action-menu .action-submenu>li,.actions-split .dropdown-menu .action-submenu .action-submenu>li,.actions-split .dropdown-menu .action-submenu>li{border:none;display:block;padding:0;transition:background-color .1s linear}.abs-action-menu .action-submenu .action-submenu>li>a:hover,.abs-action-menu .action-submenu>li>a:hover,.action-menu .action-submenu>li>a:hover,.action-menu>li>a:hover,.actions-split .action-menu .action-submenu .action-submenu>li>a:hover,.actions-split .action-menu .action-submenu>li>a:hover,.actions-split .dropdown-menu .action-submenu .action-submenu>li>a:hover,.actions-split .dropdown-menu .action-submenu>li>a:hover{text-decoration:none}.abs-action-menu .action-submenu .action-submenu>li._visible,.abs-action-menu .action-submenu .action-submenu>li:hover,.abs-action-menu .action-submenu>li._visible,.abs-action-menu .action-submenu>li:hover,.action-menu .action-submenu>li._visible,.action-menu .action-submenu>li:hover,.action-menu>li._visible,.action-menu>li:hover,.actions-split .action-menu .action-submenu .action-submenu>li._visible,.actions-split .action-menu .action-submenu .action-submenu>li:hover,.actions-split .action-menu .action-submenu>li._visible,.actions-split .action-menu .action-submenu>li:hover,.actions-split .dropdown-menu .action-submenu .action-submenu>li._visible,.actions-split .dropdown-menu .action-submenu .action-submenu>li:hover,.actions-split .dropdown-menu .action-submenu>li._visible,.actions-split .dropdown-menu .action-submenu>li:hover{background-color:#e3e3e3}.abs-action-menu .action-submenu .action-submenu>li:active,.abs-action-menu .action-submenu>li:active,.action-menu .action-submenu>li:active,.action-menu>li:active,.actions-split .action-menu .action-submenu .action-submenu>li:active,.actions-split .action-menu .action-submenu>li:active,.actions-split .dropdown-menu .action-submenu .action-submenu>li:active,.actions-split .dropdown-menu .action-submenu>li:active{background-color:#cacaca}.abs-action-menu .action-submenu .action-submenu>li._parent,.abs-action-menu .action-submenu>li._parent,.action-menu .action-submenu>li._parent,.action-menu>li._parent,.actions-split .action-menu .action-submenu .action-submenu>li._parent,.actions-split .action-menu .action-submenu>li._parent,.actions-split .dropdown-menu .action-submenu .action-submenu>li._parent,.actions-split .dropdown-menu .action-submenu>li._parent{-webkit-flex-direction:row;display:flex;-ms-flex-direction:row;flex-direction:row}.abs-action-menu .action-submenu .action-submenu>li._parent>.action-menu-item,.abs-action-menu .action-submenu>li._parent>.action-menu-item,.action-menu .action-submenu>li._parent>.action-menu-item,.action-menu>li._parent>.action-menu-item,.actions-split .action-menu .action-submenu .action-submenu>li._parent>.action-menu-item,.actions-split .action-menu .action-submenu>li._parent>.action-menu-item,.actions-split .dropdown-menu .action-submenu .action-submenu>li._parent>.action-menu-item,.actions-split .dropdown-menu .action-submenu>li._parent>.action-menu-item{min-width:100%}.abs-action-menu .action-submenu .action-menu-item,.abs-action-menu .action-submenu .action-submenu .action-menu-item,.abs-action-menu .action-submenu .action-submenu .item,.abs-action-menu .action-submenu .item,.action-menu .action-menu-item,.action-menu .action-submenu .action-menu-item,.action-menu .action-submenu .item,.action-menu .item,.actions-split .action-menu .action-submenu .action-menu-item,.actions-split .action-menu .action-submenu .action-submenu .action-menu-item,.actions-split .action-menu .action-submenu .action-submenu .item,.actions-split .action-menu .action-submenu .item,.actions-split .dropdown-menu .action-submenu .action-menu-item,.actions-split .dropdown-menu .action-submenu .action-submenu .action-menu-item,.actions-split .dropdown-menu .action-submenu .action-submenu .item,.actions-split .dropdown-menu .action-submenu .item{cursor:pointer;display:block;padding:.6875em 1em}.abs-action-menu .action-submenu .action-submenu,.action-menu .action-submenu,.actions-split .action-menu .action-submenu .action-submenu,.actions-split .dropdown-menu .action-submenu .action-submenu{bottom:auto;left:auto;margin-left:0;margin-top:-1px;position:absolute;right:auto;top:auto}.ie9 .abs-action-menu .action-submenu .action-submenu,.ie9 .abs-action-menu .action-submenu .action-submenu .action-submenu,.ie9 .action-menu .action-submenu,.ie9 .action-menu .action-submenu .action-submenu,.ie9 .actions-split .action-menu .action-submenu .action-submenu,.ie9 .actions-split .action-menu .action-submenu .action-submenu .action-submenu,.ie9 .actions-split .dropdown-menu .action-submenu .action-submenu,.ie9 .actions-split .dropdown-menu .action-submenu .action-submenu .action-submenu{margin-left:99%;margin-top:-3.5rem}.abs-action-menu .action-submenu .action-submenu a.action-menu-item,.abs-action-menu .action-submenu a.action-menu-item,.action-menu .action-submenu a.action-menu-item,.action-menu a.action-menu-item,.actions-split .action-menu .action-submenu .action-submenu a.action-menu-item,.actions-split .action-menu .action-submenu a.action-menu-item,.actions-split .dropdown-menu .action-submenu .action-submenu a.action-menu-item,.actions-split .dropdown-menu .action-submenu a.action-menu-item{color:#333}.abs-action-menu .action-submenu .action-submenu a.action-menu-item:focus,.abs-action-menu .action-submenu a.action-menu-item:focus,.action-menu .action-submenu a.action-menu-item:focus,.action-menu a.action-menu-item:focus,.actions-split .action-menu .action-submenu .action-submenu a.action-menu-item:focus,.actions-split .action-menu .action-submenu a.action-menu-item:focus,.actions-split .dropdown-menu .action-submenu .action-submenu a.action-menu-item:focus,.actions-split .dropdown-menu .action-submenu a.action-menu-item:focus{background-color:#e3e3e3;box-shadow:none}.messages .message:last-child{margin:0 0 2rem}.message{background:#fffbbb;border:none;border-radius:0;color:#333;font-size:1.4rem;margin:0 0 1px;padding:1.8rem 4rem 1.8rem 5.5rem;position:relative;text-shadow:none}.message:before{background:0 0;border:0;color:#007bdb;content:'\e61a';font-family:Icons;font-size:1.9rem;font-style:normal;font-weight:400;height:auto;left:1.9rem;line-height:inherit;margin-top:-1.3rem;position:absolute;speak:none;text-shadow:none;top:50%;width:auto}.message-notice:before{color:#007bdb;content:'\e61a'}.message-warning:before{color:#eb5202;content:'\e623'}.message-error{background:#fcc}.message-error:before{color:#e22626;content:'\e632';font-size:1.5rem;left:2.2rem;margin-top:-1rem}.message-success:before{color:#79a22e;content:'\e62d'}.message-spinner:before{display:none}.message-spinner .spinner{font-size:2.5rem;left:1.5rem;position:absolute;top:1.5rem}.message-in-rating-edit{margin-left:1.8rem;margin-right:1.8rem}.modal-popup .action-close,.modal-slide .action-close{color:#736963;position:absolute;right:0;top:0;z-index:1}.modal-popup .action-close:active,.modal-slide .action-close:active{-ms-transform:none;transform:none}.modal-popup .action-close:active:before,.modal-slide .action-close:active:before{font-size:1.8rem}.modal-popup .action-close:hover:before,.modal-slide .action-close:hover:before{color:#58504b}.modal-popup .action-close:before,.modal-slide .action-close:before{font-size:2rem}.modal-popup .action-close:focus,.modal-slide .action-close:focus{background-color:transparent}.modal-popup.prompt .prompt-message{padding:2rem 0}.modal-popup.prompt .prompt-message input{width:100%}.modal-popup.confirm .modal-inner-wrap .message,.modal-popup.prompt .modal-inner-wrap .message{background:#fff}.modal-popup.modal-system-messages .modal-inner-wrap{background:#fffbbb}.modal-popup._image-box .modal-inner-wrap{margin:5rem auto;max-width:78rem;position:static}.modal-popup._image-box .thumbnail-preview{padding-bottom:3rem;text-align:center}.modal-popup._image-box .thumbnail-preview .thumbnail-preview-image-block{border:1px solid #ccc;margin:0 auto 2rem;max-width:58rem;padding:2rem}.modal-popup._image-box .thumbnail-preview .thumbnail-preview-image{max-height:54rem}.modal-popup .modal-title{font-size:2.4rem;margin-right:6.4rem}.modal-popup .modal-footer{padding-top:2.6rem;text-align:right}.modal-popup .action-close{padding:3rem}.modal-popup .action-close:active,.modal-popup .action-close:focus{background:0 0;padding-right:3.1rem;padding-top:3.1rem}.modal-slide .modal-content-new-attribute{-webkit-overflow-scrolling:touch;overflow:auto;padding-bottom:0}.modal-slide .modal-content-new-attribute iframe{margin-bottom:-2.5rem}.modal-slide .modal-title{font-size:2.1rem;margin-right:5.7rem}.modal-slide .action-close{padding:2.1rem 2.6rem}.modal-slide .action-close:active{padding-right:2.7rem;padding-top:2.2rem}.modal-slide .page-main-actions{margin-bottom:.6rem;margin-top:2.1rem}.modal-slide .magento-message{padding:0 3rem 3rem;position:relative}.modal-slide .magento-message .insert-title-inner,.modal-slide .main-col .insert-title-inner{border-bottom:1px solid #adadad;margin:0 0 2rem;padding-bottom:.5rem}.modal-slide .magento-message .insert-actions,.modal-slide .main-col .insert-actions{float:right}.modal-slide .magento-message .title,.modal-slide .main-col .title{font-size:1.6rem;padding-top:.5rem}.modal-slide .main-col,.modal-slide .side-col{float:left;padding-bottom:0}.modal-slide .main-col:after,.modal-slide .side-col:after{display:none}.modal-slide .side-col{width:20%}.modal-slide .main-col{padding-right:0;width:80%}.modal-slide .content-footer .form-buttons{float:right}.modal-title{font-weight:400;margin-bottom:0;min-height:1em}.modal-title span{font-size:1.4rem;font-style:italic;margin-left:1rem}.spinner{display:inline-block;font-size:4rem;height:1em;margin-right:1.5rem;position:relative;width:1em}.spinner>span:nth-child(1){animation-delay:.27s;-ms-transform:rotate(-315deg);transform:rotate(-315deg)}.spinner>span:nth-child(2){animation-delay:.36s;-ms-transform:rotate(-270deg);transform:rotate(-270deg)}.spinner>span:nth-child(3){animation-delay:.45s;-ms-transform:rotate(-225deg);transform:rotate(-225deg)}.spinner>span:nth-child(4){animation-delay:.54s;-ms-transform:rotate(-180deg);transform:rotate(-180deg)}.spinner>span:nth-child(5){animation-delay:.63s;-ms-transform:rotate(-135deg);transform:rotate(-135deg)}.spinner>span:nth-child(6){animation-delay:.72s;-ms-transform:rotate(-90deg);transform:rotate(-90deg)}.spinner>span:nth-child(7){animation-delay:.81s;-ms-transform:rotate(-45deg);transform:rotate(-45deg)}.spinner>span:nth-child(8){animation-delay:.9;-ms-transform:rotate(0deg);transform:rotate(0deg)}@keyframes fade{0%{background-color:#514943}100%{background-color:#fff}}.spinner>span{-ms-transform:scale(0.4);transform:scale(0.4);animation-name:fade;animation-duration:.72s;animation-iteration-count:infinite;animation-direction:linear;background-color:#fff;border-radius:6px;clip:rect(0 .28571429em .1em 0);height:.1em;margin-top:.5em;position:absolute;width:1em}.ie9 .spinner{background:url(../images/ajax-loader.gif) center no-repeat}.ie9 .spinner>span{display:none}.popup-loading{background:rgba(255,255,255,.8);border-color:#ef672f;color:#ef672f;font-size:14px;font-weight:700;left:50%;margin-left:-100px;padding:100px 0 10px;position:fixed;text-align:center;top:40%;width:200px;z-index:1003}.popup-loading:after{background-image:url(../images/loader-1.gif);content:'';height:64px;left:50%;margin:-32px 0 0 -32px;position:absolute;top:40%;width:64px;z-index:2}.loading-mask,.loading-old{background:rgba(255,255,255,.4);bottom:0;left:0;position:fixed;right:0;top:0;z-index:2003}.loading-mask img,.loading-old img{display:none}.loading-mask p,.loading-old p{margin-top:118px}.loading-mask .loader,.loading-old .loader{background:url(../images/loader-1.gif) 50% 30% no-repeat #f7f3eb;border-radius:5px;bottom:0;color:#575757;font-size:14px;font-weight:700;height:160px;left:0;margin:auto;opacity:.95;position:absolute;right:0;text-align:center;top:0;width:160px}.admin-user{float:right;line-height:1.36;margin-left:.3rem;z-index:490}.admin-user._active .admin__action-dropdown,.admin-user.active .admin__action-dropdown{border-color:#007bdb;box-shadow:1px 1px 5px rgba(0,0,0,.5)}.admin-user .admin__action-dropdown{height:3.3rem;padding:.7rem 2.8rem .4rem 4rem}.admin-user .admin__action-dropdown._active:after,.admin-user .admin__action-dropdown.active:after{-ms-transform:rotate(180deg);transform:rotate(180deg)}.admin-user .admin__action-dropdown:after{border-color:#777 transparent transparent;border-style:solid;border-width:.5rem .4rem 0;content:'';height:0;margin-top:-.2rem;position:absolute;right:1.3rem;top:50%;transition:all .2s linear;width:0}._active .admin-user .admin__action-dropdown:after,.active .admin-user .admin__action-dropdown:after{-ms-transform:rotate(180deg);transform:rotate(180deg)}.admin-user .admin__action-dropdown:hover:after{border-color:#000 transparent transparent}.admin-user .admin__action-dropdown:before{color:#777;content:'\e600';font-size:2rem;left:1.1rem;margin-top:-1.1rem;position:absolute;top:50%}.admin-user .admin__action-dropdown:hover:before{color:#333}.admin-user .admin__action-dropdown-menu{min-width:20rem;padding-left:1rem;padding-right:1rem}.admin-user .admin__action-dropdown-menu>li>a{padding-left:.5em;padding-right:1.8rem;transition:background-color .1s linear;white-space:nowrap}.admin-user .admin__action-dropdown-menu>li>a:hover{background-color:#e0f6fe;color:#333}.admin-user .admin__action-dropdown-menu>li>a:active{background-color:#c7effd;bottom:-1px;position:relative}.admin-user .admin__action-dropdown-menu .admin-user-name{text-overflow:ellipsis;white-space:nowrap;display:inline-block;max-width:20rem;overflow:hidden;vertical-align:top}.admin-user-account-text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:inline-block;max-width:11.2rem}.search-global{float:right;margin-right:-.3rem;position:relative;z-index:480}.search-global-field{min-width:5rem}.search-global-field._active .search-global-input{background-color:#fff;border-color:#007bdb;box-shadow:1px 1px 5px rgba(0,0,0,.5);padding-right:4rem;width:25rem}.search-global-field._active .search-global-action{display:block;height:3.3rem;position:absolute;right:0;text-indent:-100%;top:0;width:5rem;z-index:3}.search-global-field .autocomplete-results{height:3.3rem;position:absolute;right:0;top:0;width:25rem}.search-global-field .search-global-menu{border:1px solid #007bdb;border-top-color:transparent;box-shadow:1px 1px 5px rgba(0,0,0,.5);left:0;margin-top:-2px;padding:0;position:absolute;right:0;top:100%;z-index:2}.search-global-field .search-global-menu:after{background-color:#fff;content:'';height:5px;left:0;position:absolute;right:0;top:-5px}.search-global-field .search-global-menu>li{background-color:#fff;border-top:1px solid #ddd;display:block;font-size:1.2rem;padding:.75rem 1.4rem .55rem}.search-global-field .search-global-menu>li._active{background-color:#e0f6fe}.search-global-field .search-global-menu .title{display:block;font-size:1.4rem}.search-global-field .search-global-menu .type{color:#1a1a1a;display:block}.search-global-label{cursor:pointer;height:3.3rem;padding:.75rem 1.4rem .55rem;position:absolute;right:0;top:0;z-index:2}.search-global-label:active{-ms-transform:scale(0.9);transform:scale(0.9)}.search-global-label:hover:before{color:#000}.search-global-label:before{color:#777;content:'\e60c';font-size:2rem}.search-global-input{background-color:transparent;border:1px solid transparent;font-size:1.4rem;height:3.3rem;padding:.75rem 1.4rem .55rem;position:absolute;right:0;top:0;transition:all .1s linear,width .3s linear;width:5rem;z-index:1}.search-global-action{display:none}.notifications-wrapper{float:right;line-height:1;position:relative}.notifications-wrapper.active{z-index:500}.notifications-wrapper.active .notifications-action{border-color:#007bdb;box-shadow:1px 1px 5px rgba(0,0,0,.5)}.notifications-wrapper.active .notifications-action:after{background-color:#fff;border:none;content:'';display:block;height:6px;left:-6px;margin-top:0;position:absolute;right:0;top:100%;width:auto}.notifications-wrapper .admin__action-dropdown-menu{padding:1rem 0 0;width:32rem}.notifications-action{color:#777;height:3.3rem;padding:.75rem 2rem .65rem}.notifications-action:after{display:none}.notifications-action:before{content:'\e607';font-size:1.9rem;margin-right:0}.notifications-action:active:before{position:relative;top:1px}.notifications-action .notifications-counter{background-color:#e22626;border-radius:1em;color:#fff;display:inline-block;font-size:1.1rem;font-weight:700;left:50%;margin-left:.3em;margin-top:-1.1em;padding:.3em .5em;position:absolute;top:50%}.notifications-entry{line-height:1.36;padding:.6rem 2rem .8rem;position:relative;transition:background-color .1s linear}.notifications-entry:hover{background-color:#e0f6fe}.notifications-entry.notifications-entry-last{margin:0 2rem;padding:.3rem 0 1.3rem;text-align:center}.notifications-entry.notifications-entry-last:hover{background-color:transparent}.notifications-entry+.notifications-entry-last{border-top:1px solid #ddd;padding-bottom:.6rem}.notifications-entry ._cutted{cursor:pointer}.notifications-entry ._cutted .notifications-entry-description-start:after{content:'...'}.notifications-entry-title{color:#ef672f;display:block;font-size:1.1rem;font-weight:700;margin-bottom:.7rem;margin-right:1em}.notifications-entry-description{color:#333;font-size:1.1rem;margin-bottom:.8rem}.notifications-entry-description-end{display:none}.notifications-entry-description-end._show{display:inline}.notifications-entry-time{color:#777;font-size:1.1rem}.notifications-close{line-height:1;padding:1rem;position:absolute;right:0;top:.6rem}.notifications-close:before{color:#ccc;content:'\e620';transition:color .1s linear}.notifications-close:hover:before{color:#b3b3b3}.notifications-close:active{-ms-transform:scale(0.95);transform:scale(0.95)}.page-header-actions{padding-top:1.1rem}.page-header-hgroup{padding-right:1.5rem}.page-title{color:#333;font-size:2.8rem}.page-header{padding:1.5rem 3rem}.menu-wrapper{display:inline-block;position:relative;width:8.8rem;z-index:700}.menu-wrapper:before{background-color:#373330;bottom:0;content:'';left:0;position:fixed;top:0;width:8.8rem;z-index:699}.menu-wrapper._fixed{left:0;position:fixed;top:0}.menu-wrapper._fixed~.page-wrapper{margin-left:8.8rem}.menu-wrapper .logo{display:block;height:8.8rem;padding:2.4rem 0 2.2rem;position:relative;text-align:center;z-index:700}._keyfocus .menu-wrapper .logo:focus{background-color:#4a4542;box-shadow:none}._keyfocus .menu-wrapper .logo:focus+.admin__menu .level-0:first-child>a{background-color:#373330}._keyfocus .menu-wrapper .logo:focus+.admin__menu .level-0:first-child>a:after{display:none}.menu-wrapper .logo:hover .logo-img{-webkit-filter:brightness(1.1);filter:brightness(1.1)}.menu-wrapper .logo:active .logo-img{-ms-transform:scale(0.95);transform:scale(0.95)}.menu-wrapper .logo .logo-img{height:4.2rem;transition:-webkit-filter .2s linear,filter .2s linear,transform .1s linear;width:3.5rem}.abs-menu-separator,.admin__menu .item-partners>a:after,.admin__menu .level-0:first-child>a:after{background-color:#736963;content:'';display:block;height:1px;left:0;margin-left:16%;position:absolute;top:0;width:68%}.admin__menu li{display:block}.admin__menu .level-0:first-child>a{position:relative}.admin__menu .level-0._active>a,.admin__menu .level-0:hover>a{color:#f7f3eb}.admin__menu .level-0._active>a{background-color:#524d49}.admin__menu .level-0:hover>a{background-color:#4a4542}.admin__menu .level-0>a{color:#aaa6a0;display:block;font-size:1rem;letter-spacing:.025em;min-height:6.2rem;padding:1.2rem .5rem .5rem;position:relative;text-align:center;text-decoration:none;text-transform:uppercase;transition:background-color .1s linear;word-wrap:break-word;z-index:700}.admin__menu .level-0>a:focus{box-shadow:none}.admin__menu .level-0>a:before{content:'\e63a';display:block;font-size:2.2rem;height:2.2rem}.admin__menu .level-0>.submenu{background-color:#4a4542;box-shadow:0 0 3px #000;left:100%;min-height:calc(8.8rem + 2rem + 100%);padding:2rem 0 0;position:absolute;top:0;-ms-transform:translateX(-100%);transform:translateX(-100%);transition-duration:.3s;transition-property:transform,visibility;transition-timing-function:ease-in-out;visibility:hidden;z-index:697}.ie10 .admin__menu .level-0>.submenu,.ie11 .admin__menu .level-0>.submenu{height:100%}.admin__menu .level-0._show>.submenu{-ms-transform:translateX(0);transform:translateX(0);visibility:visible;z-index:698}.admin__menu .level-1{margin-left:1.5rem;margin-right:1.5rem}.admin__menu [class*=level-]:not(.level-0) a{display:block;padding:1.25rem 1.5rem}.admin__menu [class*=level-]:not(.level-0) a:hover{background-color:#403934}.admin__menu [class*=level-]:not(.level-0) a:active{background-color:#322c29;padding-bottom:1.15rem;padding-top:1.35rem}.admin__menu .submenu li{min-width:23.8rem}.admin__menu .submenu a{color:#fcfcfc;transition:background-color .1s linear}.admin__menu .submenu a:focus,.admin__menu .submenu a:hover{box-shadow:none;text-decoration:none}._keyfocus .admin__menu .submenu a:focus{background-color:#403934}._keyfocus .admin__menu .submenu a:active{background-color:#322c29}.admin__menu .submenu .parent{margin-bottom:4.5rem}.admin__menu .submenu .parent .submenu-group-title{color:#a79d95;display:block;font-size:1.6rem;font-weight:600;margin-bottom:.7rem;padding:1.25rem 1.5rem;pointer-events:none}.admin__menu .submenu .column{display:table-cell}.admin__menu .submenu-title{color:#fff;display:block;font-size:2.2rem;font-weight:600;margin-bottom:4.2rem;margin-left:3rem;margin-right:5.8rem}.admin__menu .submenu-sub-title{color:#fff;display:block;font-size:1.2rem;margin:-3.8rem 5.8rem 3.8rem 3rem}.admin__menu .action-close{padding:2.4rem 2.8rem;position:absolute;right:0;top:0}.admin__menu .action-close:before{color:#a79d95;font-size:1.7rem}.admin__menu .action-close:hover:before{color:#fff}.admin__menu .item-dashboard>a:before{content:'\e604';font-size:1.8rem;padding-top:.4rem}.admin__menu .item-sales>a:before{content:'\e60b'}.admin__menu .item-catalog>a:before{content:'\e608'}.admin__menu .item-customer>a:before{content:'\e603';font-size:2.6rem;position:relative;top:-.4rem}.admin__menu .item-marketing>a:before{content:'\e609';font-size:2rem;padding-top:.2rem}.admin__menu .item-content>a:before{content:'\e602';font-size:2.4rem;position:relative;top:-.2rem}.admin__menu .item-report>a:before{content:'\e60a'}.admin__menu .item-stores>a:before{content:'\e60d';font-size:1.9rem;padding-top:.3rem}.admin__menu .item-system>a:before{content:'\e610'}.admin__menu .item-partners._active>a:after,.admin__menu .item-system._current+.item-partners>a:after{display:none}.admin__menu .item-partners>a{padding-bottom:1rem}.admin__menu .item-partners>a:before{content:'\e612'}.admin__menu .level-0>.submenu>ul>.level-1:only-of-type>.submenu-group-title,.admin__menu .submenu .column:only-of-type .submenu-group-title{display:none}.admin__menu-overlay{bottom:0;left:0;position:fixed;right:0;top:0;z-index:697}.store-switcher{color:#333;float:left;font-size:1.3rem;margin-top:.7rem}.store-switcher .admin__action-dropdown{background-color:#f8f8f8;margin-left:.5em}.store-switcher .dropdown{display:inline-block;position:relative}.store-switcher .dropdown:after,.store-switcher .dropdown:before{content:'';display:table}.store-switcher .dropdown:after{clear:both}.store-switcher .dropdown .action.toggle{cursor:pointer;display:inline-block;text-decoration:none}.store-switcher .dropdown .action.toggle:after{-webkit-font-smoothing:antialiased;font-size:22px;line-height:2;color:#333;content:'\e607';font-family:icons-blank-theme;margin:0;vertical-align:top;display:inline-block;font-weight:400;overflow:hidden;speak:none;text-align:center}.store-switcher .dropdown .action.toggle:active:after,.store-switcher .dropdown .action.toggle:hover:after{color:#333}.store-switcher .dropdown .action.toggle.active{display:inline-block;text-decoration:none}.store-switcher .dropdown .action.toggle.active:after{-webkit-font-smoothing:antialiased;font-size:22px;line-height:2;color:#333;content:'\e618';font-family:icons-blank-theme;margin:0;vertical-align:top;display:inline-block;font-weight:400;overflow:hidden;speak:none;text-align:center}.store-switcher .dropdown .action.toggle.active:active:after,.store-switcher .dropdown .action.toggle.active:hover:after{color:#333}.store-switcher .dropdown .dropdown-menu{margin:4px 0 0;padding:0;list-style:none;background:#fff;border:1px solid #aaa6a0;min-width:19.5rem;z-index:100;box-sizing:border-box;display:none;position:absolute;top:100%;box-shadow:1px 1px 5px rgba(0,0,0,.5)}.store-switcher .dropdown .dropdown-menu li{margin:0;padding:0}.store-switcher .dropdown .dropdown-menu li:hover{background:0 0;cursor:pointer}.store-switcher .dropdown.active{overflow:visible}.store-switcher .dropdown.active .dropdown-menu{display:block}.store-switcher .dropdown-menu{left:0;margin-top:.5em;max-height:250px;overflow-y:auto;padding-top:.25em}.store-switcher .dropdown-menu li{border:0;cursor:default}.store-switcher .dropdown-menu li:hover{cursor:default}.store-switcher .dropdown-menu li a,.store-switcher .dropdown-menu li span{color:#333;display:block;padding:.5rem 1.3rem}.store-switcher .dropdown-menu li a{text-decoration:none}.store-switcher .dropdown-menu li a:hover{background:#e9e9e9}.store-switcher .dropdown-menu li span{color:#adadad;cursor:default}.store-switcher .dropdown-menu li.current span{background:#eee;color:#333}.store-switcher .dropdown-menu .store-switcher-store a,.store-switcher .dropdown-menu .store-switcher-store span{padding-left:2.6rem}.store-switcher .dropdown-menu .store-switcher-store-view a,.store-switcher .dropdown-menu .store-switcher-store-view span{padding-left:3.9rem}.store-switcher .dropdown-menu .dropdown-toolbar{border-top:1px solid #ebebeb;margin-top:1rem}.store-switcher .dropdown-menu .dropdown-toolbar a:before{content:'\e610';margin-right:.25em;position:relative;top:1px}.store-switcher-label{font-weight:700}.store-switcher-alt{display:inline-block;position:relative}.store-switcher-alt.active .dropdown-menu{display:block}.store-switcher-alt .dropdown-menu{margin-top:2px;white-space:nowrap}.store-switcher-alt .dropdown-menu ul{list-style:none;margin:0;padding:0}.store-switcher-alt strong{color:#a79d95;display:block;font-size:14px;font-weight:500;line-height:1.333;padding:5px 10px}.store-switcher-alt .store-selected{color:#676056;cursor:pointer;font-size:12px;font-weight:400;line-height:1.333}.store-switcher-alt .store-selected:after{-webkit-font-smoothing:antialiased;color:#afadac;content:'\e02c';font-style:normal;font-weight:400;margin:0 0 0 3px;speak:none;vertical-align:text-top}.store-switcher-alt .store-switcher-store,.store-switcher-alt .store-switcher-website{padding:0}.store-switcher-alt .store-switcher-store:hover,.store-switcher-alt .store-switcher-website:hover{background:0 0}.store-switcher-alt .manage-stores,.store-switcher-alt .store-switcher-all,.store-switcher-alt .store-switcher-store-view{padding:0}.store-switcher-alt .manage-stores>a,.store-switcher-alt .store-switcher-all>a{color:#676056;display:block;font-size:12px;padding:8px 15px;text-decoration:none}.store-switcher-website{margin:5px 0 0}.store-switcher-website>strong{padding-left:13px}.store-switcher-store{margin:1px 0 0}.store-switcher-store>strong{padding-left:20px}.store-switcher-store>ul{margin-top:1px}.store-switcher-store-view:first-child{border-top:1px solid #e5e5e5}.store-switcher-store-view>a{color:#333;display:block;font-size:13px;padding:5px 15px 5px 24px;text-decoration:none}.store-view:not(.store-switcher){float:left}.store-view .store-switcher-label{display:inline-block;margin-top:1rem}.tooltip{margin-left:.5em}.tooltip .help a,.tooltip .help span{cursor:pointer;display:inline-block;height:22px;position:relative;vertical-align:middle;width:22px;z-index:2}.tooltip .help a:before,.tooltip .help span:before{color:#333;content:'\e633';font-size:1.7rem}.tooltip .help a:hover{text-decoration:none}.tooltip .tooltip-content{background:#000;border-radius:3px;color:#fff;display:none;margin-left:-19px;margin-top:10px;max-width:200px;padding:4px 8px;position:absolute;text-shadow:none;z-index:20}.tooltip .tooltip-content:before{border-bottom:5px solid #000;border-left:5px solid transparent;border-right:5px solid transparent;content:'';height:0;left:20px;opacity:.8;position:absolute;top:-5px;width:0}.tooltip .tooltip-content.loading{position:absolute}.tooltip .tooltip-content.loading:before{border-bottom-color:rgba(0,0,0,.3)}.tooltip:hover>.tooltip-content{display:block}.page-actions._fixed,.page-main-actions:not(._hidden){background:#f8f8f8;border-bottom:1px solid #e3e3e3;border-top:1px solid #e3e3e3;padding:1.5rem}.page-main-actions{margin:0 0 3rem}.page-main-actions._hidden .store-switcher{display:none}.page-main-actions._hidden .page-actions-placeholder{min-height:50px}.page-actions{float:right}.page-main-actions .page-actions._fixed{left:8.8rem;position:fixed;right:0;top:0;z-index:501}.page-main-actions .page-actions._fixed .page-actions-inner:before{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#333;content:attr(data-title);float:left;font-size:2.8rem;margin-top:.3rem;max-width:50%}.page-actions .page-actions-buttons>button,.page-actions>button{float:right;margin-left:1.3rem}.page-actions .page-actions-buttons>button.action-back,.page-actions .page-actions-buttons>button.back,.page-actions>button.action-back,.page-actions>button.back{float:left;-ms-flex-order:-1;order:-1}.page-actions .page-actions-buttons>button.action-back:before,.page-actions .page-actions-buttons>button.back:before,.page-actions>button.action-back:before,.page-actions>button.back:before{content:'\e626';margin-right:.5em;position:relative;top:1px}.page-actions .page-actions-buttons>button.action-primary,.page-actions .page-actions-buttons>button.primary,.page-actions>button.action-primary,.page-actions>button.primary{-ms-flex-order:2;order:2}.page-actions .page-actions-buttons>button.save:not(.primary),.page-actions>button.save:not(.primary){-ms-flex-order:1;order:1}.page-actions .page-actions-buttons>button.delete,.page-actions>button.delete{-ms-flex-order:-1;order:-1}.page-actions .actions-split{float:right;margin-left:1.3rem;-ms-flex-order:2;order:2}.page-actions .actions-split .dropdown-menu .item{display:block}.page-actions-buttons{float:right;-ms-flex-pack:end;justify-content:flex-end;display:-ms-flexbox;display:flex}.customer-index-edit .page-actions-buttons{background-color:transparent}.admin__page-nav{background:#f1f1f1;border:1px solid #e3e3e3}.admin__page-nav._collapsed:first-child{border-bottom:none}.admin__page-nav._collapsed._show{border-bottom:1px solid #e3e3e3}.admin__page-nav._collapsed._show ._collapsible{background:#f1f1f1}.admin__page-nav._collapsed._show ._collapsible:after{content:'\e62b'}.admin__page-nav._collapsed._show ._collapsible+.admin__page-nav-items{display:block}.admin__page-nav._collapsed._hide .admin__page-nav-title-messages,.admin__page-nav._collapsed._hide .admin__page-nav-title-messages ._active{display:inline-block}.admin__page-nav+._collapsed{border-bottom:none;border-top:none}.admin__page-nav-title{border-bottom:1px solid #e3e3e3;color:#303030;display:block;font-size:1.4rem;line-height:1.2;margin:0 0 -1px;padding:1.8rem 1.5rem;position:relative;text-transform:uppercase}.admin__page-nav-title._collapsible{background:#fff;cursor:pointer;margin:0;padding-right:3.5rem;transition:border-color .1s ease-out,background-color .1s ease-out}.admin__page-nav-title._collapsible+.admin__page-nav-items{display:none;margin-top:-1px}.admin__page-nav-title._collapsible:after{content:'\e628';font-size:1.3rem;font-weight:700;position:absolute;right:1.8rem;top:2rem}.admin__page-nav-title._collapsible:hover{background:#f1f1f1}.admin__page-nav-title._collapsible:last-child{margin:0 0 -1px}.admin__page-nav-title strong{font-weight:700}.admin__page-nav-title .admin__page-nav-title-messages{display:none}.admin__page-nav-items{list-style-type:none;margin:0;padding:1rem 0 1.3rem}.admin__page-nav-item{border-left:3px solid transparent;margin-left:.7rem;padding:0;position:relative;transition:border-color .1s ease-out,background-color .1s ease-out}.admin__page-nav-item:hover{border-color:#e4e4e4}.admin__page-nav-item:hover .admin__page-nav-link{background:#e4e4e4;color:#303030;text-decoration:none}.admin__page-nav-item._active,.admin__page-nav-item.ui-state-active{border-color:#eb5202}.admin__page-nav-item._active .admin__page-nav-link,.admin__page-nav-item.ui-state-active .admin__page-nav-link{background:#fff;border-color:#e3e3e3;border-right:1px solid #fff;color:#303030;margin-right:-1px;font-weight:600}.admin__page-nav-item._loading:before,.admin__page-nav-item.ui-tabs-loading:before{display:none}.admin__page-nav-item._loading .admin__page-nav-item-message-loader,.admin__page-nav-item.ui-tabs-loading .admin__page-nav-item-message-loader{display:inline-block}.admin__page-nav-link{border:1px solid transparent;border-width:1px 0;color:#303030;display:block;font-weight:500;line-height:1.2;margin:0 0 -1px;padding:2rem 4rem 2rem 1rem;transition:border-color .1s ease-out,background-color .1s ease-out;word-wrap:break-word}.admin__page-nav-item-messages{display:inline-block}.admin__page-nav-item-messages .admin__page-nav-item-message-tooltip{background:#f1f1f1;border:1px solid #f1f1f1;border-radius:1px;bottom:3.7rem;box-shadow:0 3px 9px 0 rgba(0,0,0,.3);display:none;font-size:1.4rem;font-weight:400;left:-1rem;line-height:1.36;padding:1.5rem;position:absolute;text-transform:none;width:27rem;word-break:normal;z-index:2}.admin__page-nav-item-messages .admin__page-nav-item-message-tooltip:after,.admin__page-nav-item-messages .admin__page-nav-item-message-tooltip:before{border:15px solid transparent;height:0;width:0;border-top-color:#f1f1f1;content:'';display:block;left:2rem;position:absolute;top:100%;z-index:3}.admin__page-nav-item-messages .admin__page-nav-item-message-tooltip:after{border-top-color:#f1f1f1;margin-top:-1px;z-index:4}.admin__page-nav-item-messages .admin__page-nav-item-message-tooltip:before{border-top-color:#bfbfbf;margin-top:1px}.admin__page-nav-item-message-loader{display:none;margin-top:-1rem;position:absolute;right:0;top:50%}.admin__page-nav-item-message-loader .spinner{font-size:2rem;margin-right:1.5rem}._loading>.admin__page-nav-item-messages .admin__page-nav-item-message-loader{display:inline-block}.admin__page-nav-item-message{position:relative}.admin__page-nav-item-message:hover{z-index:500}.admin__page-nav-item-message:hover .admin__page-nav-item-message-tooltip{display:block}.admin__page-nav-item-message._changed,.admin__page-nav-item-message._error{display:none}.admin__page-nav-item-message .admin__page-nav-item-message-icon{display:inline-block;font-size:1.4rem;padding-left:.8em;vertical-align:baseline}.admin__page-nav-item-message .admin__page-nav-item-message-icon:after{color:#666;content:'\e631'}._changed:not(._error)>.admin__page-nav-item-messages ._changed{display:inline-block}._error .admin__page-nav-item-message-icon:after{color:#eb5202;content:'\e623'}._error>.admin__page-nav-item-messages ._error{display:inline-block}._error>.admin__page-nav-item-messages ._error .spinner{font-size:2rem;margin-right:1.5rem}._error .admin__page-nav-item-message-tooltip{background:#f1f1f1;border:1px solid #f1f1f1;border-radius:1px;bottom:3.7rem;box-shadow:0 3px 9px 0 rgba(0,0,0,.3);display:none;font-weight:400;left:-1rem;line-height:1.36;padding:2rem;position:absolute;text-transform:none;width:27rem;word-break:normal;z-index:2}._error .admin__page-nav-item-message-tooltip:after,._error .admin__page-nav-item-message-tooltip:before{border:15px solid transparent;height:0;width:0;border-top-color:#f1f1f1;content:'';display:block;left:2rem;position:absolute;top:100%;z-index:3}._error .admin__page-nav-item-message-tooltip:after{border-top-color:#f1f1f1;margin-top:-1px;z-index:4}._error .admin__page-nav-item-message-tooltip:before{border-top-color:#bfbfbf}.admin__data-grid-wrap-static .data-grid{box-sizing:border-box}.admin__data-grid-wrap-static .data-grid thead{color:#333}.admin__data-grid-wrap-static .data-grid tr:nth-child(even) td{background-color:#f5f5f5}.admin__data-grid-wrap-static .data-grid tr:nth-child(even) td._dragging{background-color:rgba(245,245,245,.95)}.admin__data-grid-wrap-static .data-grid ul{margin-left:1rem;padding-left:1rem}.admin__data-grid-wrap-static .admin__data-grid-loading-mask{background:rgba(255,255,255,.5);bottom:0;left:0;position:absolute;right:0;top:0;z-index:399}.admin__data-grid-wrap-static .admin__data-grid-loading-mask .grid-loader{background:url(../images/loader-2.gif) 50% 50% no-repeat;bottom:0;height:149px;left:0;margin:auto;position:absolute;right:0;top:0;width:218px}.data-grid-filters-actions-wrap{float:right}.data-grid-search-control-wrap{float:left;max-width:45.5rem;position:relative;width:35%}.data-grid-search-control-wrap :-ms-input-placeholder{font-style:italic}.data-grid-search-control-wrap ::-webkit-input-placeholder{font-style:italic}.data-grid-search-control-wrap ::-moz-placeholder{font-style:italic}.data-grid-search-control-wrap .action-submit{background-color:transparent;border:none;border-radius:0;box-shadow:none;margin:0;padding:.6rem 2rem .2rem;position:absolute;right:0;top:1px}.data-grid-search-control-wrap .action-submit:hover{background-color:transparent;border:none;box-shadow:none}.data-grid-search-control-wrap .action-submit:active{-ms-transform:scale(0.9);transform:scale(0.9)}.data-grid-search-control-wrap .action-submit:hover:before{color:#1a1a1a}._keyfocus .data-grid-search-control-wrap .action-submit:focus{box-shadow:0 0 0 1px #008bdb}.data-grid-search-control-wrap .action-submit:before{content:'\e60c';font-size:2rem;transition:color .1s linear}.data-grid-search-control-wrap .action-submit>span{clip:rect(0,0,0,0);overflow:hidden;position:absolute}.data-grid-search-control-wrap .abs-action-menu .action-submenu,.data-grid-search-control-wrap .abs-action-menu .action-submenu .action-submenu,.data-grid-search-control-wrap .action-menu,.data-grid-search-control-wrap .action-menu .action-submenu,.data-grid-search-control-wrap .actions-split .action-menu .action-submenu,.data-grid-search-control-wrap .actions-split .action-menu .action-submenu .action-submenu,.data-grid-search-control-wrap .actions-split .dropdown-menu .action-submenu,.data-grid-search-control-wrap .actions-split .dropdown-menu .action-submenu .action-submenu{max-height:19.25rem;overflow-y:auto;z-index:398}.data-grid-search-control-wrap .action-menu-item._selected{background-color:#e0f6fe}.data-grid-search-control-wrap .data-grid-search-label{display:none}.data-grid-search-control{padding-right:6rem;width:100%}.data-grid-filters-action-wrap{float:left;padding-left:2rem}.data-grid-filters-action-wrap .action-default{font-size:1.3rem;margin-bottom:1rem;padding-left:1.7rem;padding-right:2.1rem;padding-top:.7rem}.data-grid-filters-action-wrap .action-default._active{background-color:#fff;border-bottom-color:#fff;border-right-color:#ccc;font-weight:600;margin:-.1rem 0 0;padding-bottom:1.6rem;padding-top:.8rem;position:relative;z-index:281}.data-grid-filters-action-wrap .action-default._active:after{background-color:#eb5202;bottom:100%;content:'';height:3px;left:-1px;position:absolute;right:-1px}.data-grid-filters-action-wrap .action-default:before{color:#333;content:'\e605';font-size:1.8rem;margin-right:.4rem;position:relative;top:-1px;vertical-align:top}.data-grid-filters-action-wrap .filters-active{display:none}.admin__action-grid-select .admin__control-select{margin:-.5rem .5rem 0 0;padding-bottom:.6rem;padding-top:.6rem}.admin__data-grid-filters-wrap{opacity:0;visibility:hidden;clear:both;font-size:1.3rem;transition:opacity .3s ease}.admin__data-grid-filters-wrap._show{opacity:1;visibility:visible;border-bottom:1px solid #ccc;border-top:1px solid #ccc;margin-bottom:.7rem;padding:3.6rem 0 3rem;position:relative;top:-1px;z-index:280}.admin__data-grid-filters-wrap._show .admin__data-grid-filters,.admin__data-grid-filters-wrap._show .admin__data-grid-filters-footer{display:block}.admin__data-grid-filters-wrap .admin__form-field-label,.admin__data-grid-filters-wrap .admin__form-field-legend{display:block;font-weight:700;margin:0 0 .3rem;text-align:left}.admin__data-grid-filters-wrap .admin__form-field{display:inline-block;margin-bottom:2em;margin-left:0;padding-left:2rem;padding-right:2rem;vertical-align:top;width:calc(100% / 4 - 4px)}.admin__data-grid-filters-wrap .admin__form-field .admin__form-field{display:block;float:none;margin-bottom:1.5rem;padding-left:0;padding-right:0;width:auto}.admin__data-grid-filters-wrap .admin__form-field .admin__form-field:last-child{margin-bottom:0}.admin__data-grid-filters-wrap .admin__form-field .admin__form-field .admin__form-field-label{border:1px solid transparent;float:left;font-weight:400;line-height:1.36;margin-bottom:0;padding-bottom:.6rem;padding-right:1em;padding-top:.6rem;width:25%}.admin__data-grid-filters-wrap .admin__form-field .admin__form-field .admin__form-field-control{margin-left:25%}.admin__data-grid-filters-wrap .admin__action-multiselect,.admin__data-grid-filters-wrap .admin__control-select,.admin__data-grid-filters-wrap .admin__control-text,.admin__data-grid-filters-wrap .admin__form-field-label{font-size:1.3rem}.admin__data-grid-filters-wrap .admin__control-select{height:3.2rem;padding-top:.5rem}.admin__data-grid-filters-wrap .admin__action-multiselect:before{height:3.2rem;width:3.2rem}.admin__data-grid-filters-wrap .admin__control-select,.admin__data-grid-filters-wrap .admin__control-text._has-datepicker{width:100%}.admin__data-grid-filters{display:none;margin-left:-2rem;margin-right:-2rem}.admin__filters-legend{clip:rect(0,0,0,0);overflow:hidden;position:absolute}.admin__data-grid-filters-footer{display:none;font-size:1.4rem}.admin__data-grid-filters-footer .admin__footer-main-actions{margin-left:25%;text-align:right}.admin__data-grid-filters-footer .admin__footer-secondary-actions{float:left;width:50%}.admin__data-grid-filters-current{border-bottom:.1rem solid #ccc;border-top:.1rem solid #ccc;display:none;font-size:1.3rem;margin-bottom:.9rem;padding-bottom:.8rem;padding-top:1.1rem;width:100%}.admin__data-grid-filters-current._show{display:table;position:relative;top:-1px;z-index:3}.admin__data-grid-filters-current._show+.admin__data-grid-filters-wrap._show{margin-top:-1rem}.admin__current-filters-actions-wrap,.admin__current-filters-list-wrap,.admin__current-filters-title-wrap{display:table-cell;vertical-align:top}.admin__current-filters-title{margin-right:1em;white-space:nowrap}.admin__current-filters-list-wrap{width:100%}.admin__current-filters-list{margin-bottom:0}.admin__current-filters-list>li{display:inline-block;font-weight:600;margin:0 1rem .5rem;padding-right:2.6rem;position:relative}.admin__current-filters-list .action-remove{background-color:transparent;border:none;border-radius:0;box-shadow:none;margin:0;padding:0;line-height:1;position:absolute;right:0;top:1px}.admin__current-filters-list .action-remove:hover{background-color:transparent;border:none;box-shadow:none}.admin__current-filters-list .action-remove:hover:before{color:#949494}.admin__current-filters-list .action-remove:active{-ms-transform:scale(0.9);transform:scale(0.9)}.admin__current-filters-list .action-remove:before{color:#adadad;content:'\e620';font-size:1.6rem;transition:color .1s linear}.admin__current-filters-list .action-remove>span{clip:rect(0,0,0,0);overflow:hidden;position:absolute}.admin__current-filters-actions-wrap .action-clear{border:none;padding-bottom:0;padding-top:0;white-space:nowrap}.admin__data-grid-pager-wrap{float:right;text-align:right}.admin__data-grid-pager{display:inline-block;margin-left:3rem}.admin__data-grid-pager .admin__control-text::-webkit-inner-spin-button,.admin__data-grid-pager .admin__control-text::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.admin__data-grid-pager .admin__control-text{-moz-appearance:textfield;text-align:center;width:4.4rem}.action-next,.action-previous{width:4.4rem}.action-next:before,.action-previous:before{font-weight:700}.action-next>span,.action-previous>span{clip:rect(0,0,0,0);overflow:hidden;position:absolute}.action-previous{margin-right:2.5rem;text-indent:-.25em}.action-previous:before{content:'\e629'}.action-next{margin-left:1.5rem;text-indent:.1em}.action-next:before{content:'\e62a'}.admin__data-grid-action-bookmarks{opacity:.98}.admin__data-grid-action-bookmarks .admin__action-dropdown-text:after{left:0;right:-6px}.admin__data-grid-action-bookmarks._active{z-index:290}.admin__data-grid-action-bookmarks .admin__action-dropdown .admin__action-dropdown-text{display:inline-block;max-width:15rem;min-width:4.9rem;vertical-align:top;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.admin__data-grid-action-bookmarks .admin__action-dropdown:before{content:'\e60f'}.admin__data-grid-action-bookmarks .admin__action-dropdown-menu{font-size:1.3rem;left:0;padding:1rem 0;right:auto}.admin__data-grid-action-bookmarks .admin__action-dropdown-menu>li{padding:0 5rem 0 0;position:relative;white-space:nowrap}.admin__data-grid-action-bookmarks .admin__action-dropdown-menu>li:not(.action-dropdown-menu-action){transition:background-color .1s linear}.admin__data-grid-action-bookmarks .admin__action-dropdown-menu>li:not(.action-dropdown-menu-action):hover{background-color:#e3e3e3}.admin__data-grid-action-bookmarks .admin__action-dropdown-menu .action-dropdown-menu-item{max-width:23rem;min-width:18rem;white-space:normal;word-break:break-all}.admin__data-grid-action-bookmarks .admin__action-dropdown-menu .action-dropdown-menu-item-edit{display:none;padding-bottom:1rem;padding-left:1rem;padding-top:1rem}.admin__data-grid-action-bookmarks .admin__action-dropdown-menu .action-dropdown-menu-item-edit .action-dropdown-menu-item-actions{padding-bottom:1rem;padding-top:1rem}.admin__data-grid-action-bookmarks .admin__action-dropdown-menu .action-dropdown-menu-action{padding-left:1rem;padding-top:1rem}.admin__data-grid-action-bookmarks .admin__action-dropdown-menu .action-dropdown-menu-action+.action-dropdown-menu-item-last{padding-top:.5rem}.admin__data-grid-action-bookmarks .admin__action-dropdown-menu .action-dropdown-menu-action>a{color:#008bdb;text-decoration:none;display:inline-block;padding-left:1.1rem}.admin__data-grid-action-bookmarks .admin__action-dropdown-menu .action-dropdown-menu-action>a:hover{color:#0fa7ff;text-decoration:underline}.admin__data-grid-action-bookmarks .admin__action-dropdown-menu .action-dropdown-menu-item-last{padding-bottom:0}.admin__data-grid-action-bookmarks .admin__action-dropdown-menu ._edit .action-dropdown-menu-item{display:none}.admin__data-grid-action-bookmarks .admin__action-dropdown-menu ._edit .action-dropdown-menu-item-edit{display:block}.admin__data-grid-action-bookmarks .admin__action-dropdown-menu ._active .action-dropdown-menu-link{font-weight:600}.admin__data-grid-action-bookmarks .admin__action-dropdown-menu .admin__control-text{font-size:1.3rem;min-width:15rem;width:calc(100% - 4rem)}.ie9 .admin__data-grid-action-bookmarks .admin__action-dropdown-menu .admin__control-text{width:15rem}.admin__data-grid-action-bookmarks .admin__action-dropdown-menu .action-dropdown-menu-item-actions{border-left:1px solid #fff;bottom:0;position:absolute;right:0;top:0;width:5rem}.admin__data-grid-action-bookmarks .admin__action-dropdown-menu .action-dropdown-menu-link{color:#333;display:block;text-decoration:none;padding:1rem 1rem 1rem 2.1rem}.admin__data-grid-action-bookmarks .action-delete,.admin__data-grid-action-bookmarks .action-edit,.admin__data-grid-action-bookmarks .action-submit{background-color:transparent;border:none;border-radius:0;box-shadow:none;margin:0;vertical-align:top}.admin__data-grid-action-bookmarks .action-delete:hover,.admin__data-grid-action-bookmarks .action-edit:hover,.admin__data-grid-action-bookmarks .action-submit:hover{background-color:transparent;border:none;box-shadow:none}.admin__data-grid-action-bookmarks .action-delete:before,.admin__data-grid-action-bookmarks .action-edit:before,.admin__data-grid-action-bookmarks .action-submit:before{font-size:1.7rem}.admin__data-grid-action-bookmarks .action-delete>span,.admin__data-grid-action-bookmarks .action-edit>span,.admin__data-grid-action-bookmarks .action-submit>span{clip:rect(0,0,0,0);overflow:hidden;position:absolute}.admin__data-grid-action-bookmarks .action-delete,.admin__data-grid-action-bookmarks .action-edit{padding:.6rem 1.4rem}.admin__data-grid-action-bookmarks .action-delete:active,.admin__data-grid-action-bookmarks .action-edit:active{-ms-transform:scale(0.9);transform:scale(0.9)}.admin__data-grid-action-bookmarks .action-submit{padding:.6rem 1rem .6rem .8rem}.admin__data-grid-action-bookmarks .action-submit:active{position:relative;right:-1px}.admin__data-grid-action-bookmarks .action-submit:before{content:'\e625'}.admin__data-grid-action-bookmarks .action-delete:before{content:'\e630'}.admin__data-grid-action-bookmarks .action-edit{padding-top:.8rem}.admin__data-grid-action-bookmarks .action-edit:before{content:'\e631'}.admin__data-grid-action-columns._active{opacity:.98;z-index:290}.admin__data-grid-action-columns .admin__action-dropdown:before{content:'\e610';font-size:1.8rem;margin-right:.7rem;vertical-align:top}.admin__data-grid-action-columns-menu{color:#303030;font-size:1.3rem;overflow:hidden;padding:2.2rem 3.5rem 1rem;z-index:1}.admin__data-grid-action-columns-menu._overflow .admin__action-dropdown-menu-header{border-bottom:1px solid #d1d1d1}.admin__data-grid-action-columns-menu._overflow .admin__action-dropdown-menu-content{width:49.2rem}.admin__data-grid-action-columns-menu._overflow .admin__action-dropdown-menu-footer{border-top:1px solid #d1d1d1;padding-top:2.5rem}.admin__data-grid-action-columns-menu .admin__action-dropdown-menu-content{max-height:22.85rem;overflow-y:auto;padding-top:1.5rem;position:relative;width:47.4rem}.admin__data-grid-action-columns-menu .admin__field-option{float:left;height:1.9rem;margin-bottom:1.5rem;padding:0 1rem 0 0;width:15.8rem}.admin__data-grid-action-columns-menu .admin__field-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:block}.admin__data-grid-action-columns-menu .admin__action-dropdown-menu-header{padding-bottom:1.5rem}.admin__data-grid-action-columns-menu .admin__action-dropdown-menu-footer{padding:1rem 0 2rem}.admin__data-grid-action-columns-menu .admin__action-dropdown-footer-main-actions{margin-left:25%;text-align:right}.admin__data-grid-action-columns-menu .admin__action-dropdown-footer-secondary-actions{float:left;margin-left:-1em}.admin__data-grid-action-export._active{opacity:.98;z-index:290}.admin__data-grid-action-export .admin__action-dropdown:before{content:'\e635';font-size:1.7rem;left:.3rem;margin-right:.7rem;vertical-align:top}.admin__data-grid-action-export-menu{padding-left:2rem;padding-right:2rem;padding-top:1rem}.admin__data-grid-action-export-menu .admin__action-dropdown-footer-main-actions{padding-bottom:2rem;padding-top:2.5rem;white-space:nowrap}.sticky-header{background-color:#f8f8f8;border-bottom:1px solid #e3e3e3;box-shadow:0 5px 5px 0 rgba(0,0,0,.25);left:8.8rem;margin-top:-1px;padding:.5rem 3rem 0;position:fixed;right:0;top:77px;z-index:398}.sticky-header .admin__data-grid-wrap{margin-bottom:0;overflow-x:visible;padding-bottom:0}.sticky-header .admin__data-grid-header-row{position:relative;text-align:right}.sticky-header .admin__data-grid-header-row:last-child{margin:0}.sticky-header .admin__data-grid-actions-wrap,.sticky-header .admin__data-grid-filters-wrap,.sticky-header .admin__data-grid-pager-wrap,.sticky-header .data-grid-filters-actions-wrap,.sticky-header .data-grid-search-control-wrap{display:inline-block;float:none;vertical-align:top}.sticky-header .action-select-wrap{float:left;margin-right:1.5rem;width:16.66666667%}.sticky-header .admin__control-support-text{float:left}.sticky-header .data-grid-search-control-wrap{margin:-.5rem 0 0 1.1rem;width:auto}.sticky-header .data-grid-search-control-wrap .data-grid-search-label{box-sizing:border-box;cursor:pointer;display:block;min-width:3.8rem;padding:1.2rem .6rem 1.7rem;position:relative;text-align:center}.sticky-header .data-grid-search-control-wrap .data-grid-search-label:before{color:#333;content:'\e60c';font-size:2rem;transition:color .1s linear}.sticky-header .data-grid-search-control-wrap .data-grid-search-label:hover:before{color:#000}.sticky-header .data-grid-search-control-wrap .data-grid-search-label span{display:none}.sticky-header .data-grid-filters-actions-wrap{margin:-.5rem 0 0 1.1rem;padding-left:0;position:relative}.sticky-header .data-grid-filters-actions-wrap .action-default{background-color:transparent;border:1px solid transparent;box-sizing:border-box;min-width:3.8rem;padding:1.2rem .6rem 1.7rem;text-align:center;transition:all .15s ease}.sticky-header .data-grid-filters-actions-wrap .action-default span{display:none}.sticky-header .data-grid-filters-actions-wrap .action-default:before{margin:0}.sticky-header .data-grid-filters-actions-wrap .action-default._active{background-color:#fff;border-color:#adadad #adadad #fff;box-shadow:1px 1px 5px rgba(0,0,0,.5);z-index:210}.sticky-header .data-grid-filters-actions-wrap .action-default._active:after{background-color:#fff;content:'';height:6px;left:-2px;position:absolute;right:-6px;top:100%}.sticky-header .data-grid-filters-action-wrap{padding:0}.sticky-header .admin__data-grid-filters-wrap{background-color:#fff;border:1px solid #adadad;box-shadow:0 5px 5px 0 rgba(0,0,0,.25);left:0;padding-left:3.5rem;padding-right:3.5rem;position:absolute;top:100%;width:100%;z-index:209}.sticky-header .admin__data-grid-filters-current+.admin__data-grid-filters-wrap._show{margin-top:-6px}.sticky-header .filters-active{background-color:#e04f00;border-radius:10px;color:#fff;display:block;font-size:1.4rem;font-weight:700;padding:.1rem .7rem;position:absolute;right:-7px;top:0;z-index:211}.sticky-header .filters-active:empty{padding-bottom:0;padding-top:0}.sticky-header .admin__data-grid-actions-wrap{margin:-.5rem 0 0 1.1rem;padding-right:.3rem}.sticky-header .admin__data-grid-actions-wrap .admin__action-dropdown{background-color:transparent;box-sizing:border-box;min-width:3.8rem;padding-left:.6rem;padding-right:.6rem;text-align:center}.sticky-header .admin__data-grid-actions-wrap .admin__action-dropdown .admin__action-dropdown-text{display:inline-block;max-width:0;min-width:0;overflow:hidden}.sticky-header .admin__data-grid-actions-wrap .admin__action-dropdown:before{margin:0}.sticky-header .admin__data-grid-actions-wrap .admin__action-dropdown-wrap{margin-right:1.1rem}.sticky-header .admin__data-grid-actions-wrap .admin__action-dropdown-wrap:after,.sticky-header .admin__data-grid-actions-wrap .admin__action-dropdown:after{display:none}.sticky-header .admin__data-grid-actions-wrap ._active .admin__action-dropdown{background-color:#fff}.sticky-header .admin__data-grid-action-bookmarks .admin__action-dropdown:before{position:relative;top:-3px}.sticky-header .admin__data-grid-filters-current{border-bottom:0;border-top:0;margin-bottom:0;padding-bottom:0;padding-top:0}.sticky-header .admin__data-grid-pager .admin__control-text,.sticky-header .admin__data-grid-pager-wrap .admin__control-support-text,.sticky-header .data-grid-search-control-wrap .action-submit,.sticky-header .data-grid-search-control-wrap .data-grid-search-control{display:none}.sticky-header .action-next{margin:0}.sticky-header .data-grid{margin-bottom:-1px}.data-grid-cap-left,.data-grid-cap-right{background-color:#f8f8f8;bottom:-2px;position:absolute;top:6rem;width:3rem;z-index:201}.data-grid-cap-left{left:0}.admin__data-grid-header{font-size:1.4rem}.admin__data-grid-header-row+.admin__data-grid-header-row{margin-top:1.1rem}.admin__data-grid-header-row:last-child{margin-bottom:0}.admin__data-grid-header-row .action-select-wrap{display:block}.admin__data-grid-header-row .action-select{width:100%}.admin__data-grid-actions-wrap{float:right;margin-left:1.1rem;margin-top:-.5rem;text-align:right}.admin__data-grid-actions-wrap .admin__action-dropdown-wrap{position:relative;text-align:left;vertical-align:middle}.admin__data-grid-actions-wrap .admin__action-dropdown-wrap._active+.admin__action-dropdown-wrap:after,.admin__data-grid-actions-wrap .admin__action-dropdown-wrap._active:after,.admin__data-grid-actions-wrap .admin__action-dropdown-wrap._hide+.admin__action-dropdown-wrap:after,.admin__data-grid-actions-wrap .admin__action-dropdown-wrap:first-child:after{display:none}.admin__data-grid-actions-wrap .admin__action-dropdown-wrap._active .admin__action-dropdown,.admin__data-grid-actions-wrap .admin__action-dropdown-wrap._active .admin__action-dropdown-menu{border-color:#adadad}.admin__data-grid-actions-wrap .admin__action-dropdown-wrap:after{border-left:1px solid #ccc;content:'';height:3.2rem;left:0;position:absolute;top:.5rem;z-index:3}.admin__data-grid-actions-wrap .admin__action-dropdown{padding-bottom:1.7rem;padding-top:1.2rem}.admin__data-grid-actions-wrap .admin__action-dropdown:after{margin-top:-.4rem}.admin__data-grid-outer-wrap{min-height:8rem;position:relative}.admin__data-grid-wrap{margin-bottom:2rem;max-width:100%;overflow-x:auto;padding-bottom:1rem;padding-top:2rem}.admin__data-grid-loading-mask{background:rgba(255,255,255,.5);bottom:0;left:0;position:absolute;right:0;top:0;z-index:399}.admin__data-grid-loading-mask .spinner{font-size:4rem;left:50%;margin-left:-2rem;margin-top:-2rem;position:absolute;top:50%}.ie9 .admin__data-grid-loading-mask .spinner{background:url(../images/loader-2.gif) 50% 50% no-repeat;bottom:0;height:149px;left:0;margin:auto;position:absolute;right:0;top:0;width:218px}.data-grid-cell-content{display:inline-block;overflow:hidden;width:100%}body._in-resize{cursor:col-resize;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}body._in-resize *,body._in-resize .data-grid-th,body._in-resize .data-grid-th._draggable,body._in-resize .data-grid-th._sortable{cursor:col-resize!important}._layout-fixed{table-layout:fixed}.data-grid{border:none;font-size:1.3rem;margin-bottom:0;width:100%}.data-grid:not(._dragging-copy) ._odd-row td._dragging{background-color:#d0d0d0}.data-grid:not(._dragging-copy) ._dragging{background-color:#d9d9d9;color:rgba(48,48,48,.95)}.data-grid:not(._dragging-copy) ._dragging a{color:rgba(0,139,219,.95)}.data-grid:not(._dragging-copy) ._dragging a:hover{color:rgba(15,167,255,.95)}.data-grid._dragged{outline:#007bdb solid 1px}.data-grid thead{background-color:transparent}.data-grid tfoot th{padding:1rem}.data-grid tr._odd-row td{background-color:#f5f5f5}.data-grid tr._odd-row td._update-status-active{background:#89e1ff}.data-grid tr._odd-row td._update-status-upcoming{background:#b7ee63}.data-grid tr:hover td._update-status-active,.data-grid tr:hover td._update-status-upcoming{background-color:#e5f7fe}.data-grid tr.data-grid-tr-no-data td{font-size:1.6rem;padding:3rem;text-align:center}.data-grid tr.data-grid-tr-no-data:hover td{background-color:#fff;cursor:default}.data-grid tr:active td{background-color:#e0f6fe}.data-grid tr:hover td{background-color:#e5f7fe}.data-grid tr._dragged td{background:#d0d0d0}.data-grid tr._dragover-top td{box-shadow:inset 0 3px 0 0 #008bdb}.data-grid tr._dragover-bottom td{box-shadow:inset 0 -3px 0 0 #008bdb}.data-grid tr:not(.data-grid-editable-row):last-child td{border-bottom:.1rem solid #d6d6d6}.data-grid tr ._clickable,.data-grid tr._clickable{cursor:pointer}.data-grid tr._disabled{pointer-events:none}.data-grid td,.data-grid th{font-size:1.3rem;line-height:1.36;transition:background-color .1s linear;vertical-align:top}.data-grid td._resizing,.data-grid th._resizing{border-left:1px solid #007bdb;border-right:1px solid #007bdb}.data-grid td._hidden,.data-grid th._hidden{display:none}.data-grid td._fit,.data-grid th._fit{width:1%}.data-grid td{background-color:#fff;border-left:.1rem dashed #d6d6d6;border-right:.1rem dashed #d6d6d6;color:#303030;padding:1rem}.data-grid td:first-child{border-left-style:solid}.data-grid td:last-child{border-right-style:solid}.data-grid td .action-select-wrap{position:static}.data-grid td .action-select{color:#008bdb;text-decoration:none;background-color:transparent;border:none;font-size:1.3rem;padding:0 3rem 0 0;position:relative}.data-grid td .action-select:hover{color:#0fa7ff;text-decoration:underline}.data-grid td .action-select:hover:after{border-color:#0fa7ff transparent transparent}.data-grid td .action-select:after{border-color:#008bdb transparent transparent;margin:.6rem 0 0 .7rem;right:auto;top:auto}.data-grid td .action-select:before{display:none}.data-grid td .abs-action-menu .action-submenu,.data-grid td .abs-action-menu .action-submenu .action-submenu,.data-grid td .action-menu,.data-grid td .action-menu .action-submenu,.data-grid td .actions-split .action-menu .action-submenu,.data-grid td .actions-split .action-menu .action-submenu .action-submenu,.data-grid td .actions-split .dropdown-menu .action-submenu,.data-grid td .actions-split .dropdown-menu .action-submenu .action-submenu{left:auto;min-width:10rem;right:0;text-align:left;top:auto;z-index:1}.data-grid td._update-status-active{background:#bceeff}.data-grid td._update-status-upcoming{background:#ccf391}.data-grid th{background-color:#514943;border:.1rem solid #8a837f;border-left-color:transparent;color:#fff;font-weight:600;padding:0;text-align:left}.data-grid th:first-child{border-left-color:#8a837f}.data-grid th._dragover-left{box-shadow:inset 3px 0 0 0 #fff;z-index:2}.data-grid th._dragover-right{box-shadow:inset -3px 0 0 0 #fff}.data-grid .shadow-div{cursor:col-resize;height:100%;margin-right:-5px;position:absolute;right:0;top:0;width:10px}.data-grid .data-grid-th{background-clip:padding-box;color:#fff;padding:1rem;position:relative;vertical-align:middle}.data-grid .data-grid-th._resize-visible .shadow-div{cursor:auto;display:none}.data-grid .data-grid-th._draggable{cursor:grab}.data-grid .data-grid-th._sortable{cursor:pointer;transition:background-color .1s linear;z-index:1}.data-grid .data-grid-th._sortable:focus,.data-grid .data-grid-th._sortable:hover{background-color:#5f564f}.data-grid .data-grid-th._sortable:active{padding-bottom:.9rem;padding-top:1.1rem}.data-grid .data-grid-th.required>span:after{color:#f38a5e;content:'*';margin-left:.3rem}.data-grid .data-grid-checkbox-cell{overflow:hidden;padding:0;vertical-align:top;width:5.2rem}.data-grid .data-grid-checkbox-cell:hover{cursor:default}.data-grid .data-grid-thumbnail-cell{text-align:center;width:7rem}.data-grid .data-grid-thumbnail-cell img{border:1px solid #d6d6d6;width:5rem}.data-grid .data-grid-multicheck-cell{padding:1rem 1rem .9rem;text-align:center;vertical-align:middle}.data-grid .data-grid-onoff-cell{text-align:center;width:12rem}.data-grid .data-grid-actions-cell{padding-left:2rem;padding-right:2rem;text-align:center;width:1%}.data-grid._hidden{display:none}.data-grid._dragging-copy{box-shadow:1px 1px 5px rgba(0,0,0,.5);left:0;opacity:.95;position:fixed;top:0;z-index:1000}.data-grid._dragging-copy .data-grid-th{border:1px solid #007bdb;border-bottom:none}.data-grid._dragging-copy .data-grid-th,.data-grid._dragging-copy .data-grid-th._sortable{cursor:grabbing}.data-grid._dragging-copy tr:last-child td{border-bottom:1px solid #007bdb}.data-grid._dragging-copy td{border-left:1px solid #007bdb;border-right:1px solid #007bdb}.data-grid._dragging-copy._in-edit .data-grid-editable-row.data-grid-bulk-edit-panel td,.data-grid._dragging-copy._in-edit .data-grid-editable-row.data-grid-bulk-edit-panel td:before,.data-grid._dragging-copy._in-edit .data-grid-editable-row.data-grid-bulk-edit-panel:hover td{background-color:rgba(255,251,230,.95)}.data-grid._dragging-copy._in-edit .data-grid-editable-row td,.data-grid._dragging-copy._in-edit .data-grid-editable-row:hover td{background-color:rgba(255,255,255,.95)}.data-grid._dragging-copy._in-edit .data-grid-editable-row td:after,.data-grid._dragging-copy._in-edit .data-grid-editable-row td:before{left:0;right:0}.data-grid._dragging-copy._in-edit .data-grid-editable-row td:before{background-color:rgba(255,255,255,.95)}.data-grid._dragging-copy._in-edit .data-grid-editable-row td:only-child{border-left:1px solid #007bdb;border-right:1px solid #007bdb;left:0}.data-grid._dragging-copy._in-edit .data-grid-editable-row .admin__control-select,.data-grid._dragging-copy._in-edit .data-grid-editable-row .admin__control-text{opacity:.5}.data-grid .data-grid-controls-row td{padding-top:1.6rem}.data-grid .data-grid-controls-row td.data-grid-checkbox-cell{padding-top:.6rem}.data-grid .data-grid-controls-row td [class*=admin__control-],.data-grid .data-grid-controls-row td button{margin-top:-1.7rem}.data-grid._in-edit tr:hover td{background-color:#e6e6e6}.data-grid._in-edit ._odd-row.data-grid-editable-row td,.data-grid._in-edit ._odd-row.data-grid-editable-row:hover td{background-color:#fff}.data-grid._in-edit ._odd-row td,.data-grid._in-edit ._odd-row:hover td{background-color:#dcdcdc}.data-grid._in-edit .data-grid-editable-row-actions td,.data-grid._in-edit .data-grid-editable-row-actions:hover td{background-color:#fff}.data-grid._in-edit td{background-color:#e6e6e6;pointer-events:none}.data-grid._in-edit .data-grid-checkbox-cell{pointer-events:auto}.data-grid._in-edit .data-grid-editable-row{border:.1rem solid #adadad;border-bottom-color:#c2c2c2}.data-grid._in-edit .data-grid-editable-row:hover td{background-color:#fff}.data-grid._in-edit .data-grid-editable-row td{background-color:#fff;border-bottom-color:#fff;border-left-style:hidden;border-right-style:hidden;border-top-color:#fff;pointer-events:auto;vertical-align:middle}.data-grid._in-edit .data-grid-editable-row td:first-child{border-left-color:#adadad;border-left-style:solid}.data-grid._in-edit .data-grid-editable-row td:first-child:after,.data-grid._in-edit .data-grid-editable-row td:first-child:before{left:0}.data-grid._in-edit .data-grid-editable-row td:last-child{border-right-color:#adadad;border-right-style:solid;left:-.1rem}.data-grid._in-edit .data-grid-editable-row td:last-child:after,.data-grid._in-edit .data-grid-editable-row td:last-child:before{right:0}.data-grid._in-edit .data-grid-editable-row .admin__control-select,.data-grid._in-edit .data-grid-editable-row .admin__control-text{width:100%}.data-grid._in-edit .data-grid-bulk-edit-panel td{vertical-align:bottom}.data-grid .data-grid-editable-row td{border-left-color:#fff;border-left-style:solid;position:relative;z-index:1}.data-grid .data-grid-editable-row td:after{bottom:0;box-shadow:0 5px 5px rgba(0,0,0,.25);content:'';height:.9rem;left:0;margin-top:-1rem;position:absolute;right:0}.data-grid .data-grid-editable-row td:before{background-color:#fff;bottom:0;content:'';height:1rem;left:-10px;position:absolute;right:-10px;z-index:1}.data-grid .data-grid-editable-row.data-grid-editable-row-actions td,.data-grid .data-grid-editable-row.data-grid-editable-row-actions:hover td{background-color:#fff}.data-grid .data-grid-editable-row.data-grid-editable-row-actions td:first-child{border-left-color:#fff;border-right-color:#fff}.data-grid .data-grid-editable-row.data-grid-editable-row-actions td:last-child{left:0}.data-grid .data-grid-editable-row.data-grid-bulk-edit-panel td,.data-grid .data-grid-editable-row.data-grid-bulk-edit-panel td:before,.data-grid .data-grid-editable-row.data-grid-bulk-edit-panel:hover td{background-color:#fffbe6}.data-grid .data-grid-editable-row-actions{left:50%;margin-left:-12.5rem;margin-top:-2px;position:absolute;text-align:center}.data-grid .data-grid-editable-row-actions td{width:25rem}.data-grid .data-grid-editable-row-actions [class*=action-]{min-width:9rem}.data-grid .data-grid-draggable-row-cell{width:1%}.data-grid .data-grid-draggable-row-cell .draggable-handle{padding:0}.data-grid-th._sortable._ascend,.data-grid-th._sortable._descend{padding-right:2.7rem}.data-grid-th._sortable._ascend:before,.data-grid-th._sortable._descend:before{margin-top:-1em;position:absolute;right:1rem;top:50%}.data-grid-th._sortable._ascend:before{content:'\2193'}.data-grid-th._sortable._descend:before{content:'\2191'}.data-grid-checkbox-cell-inner{display:block;padding:1.1rem 1.8rem .9rem;text-align:right}.data-grid-checkbox-cell-inner:hover{cursor:pointer}.data-grid-state-cell-inner{display:block;padding:1.1rem 1.8rem .9rem;text-align:center}.data-grid-state-cell-inner>span{display:inline-block;font-style:italic;padding:.6rem 0}.data-grid-row-parent._active>td .data-grid-checkbox-cell-inner:before{content:'\e62b'}.data-grid-row-parent>td .data-grid-checkbox-cell-inner{padding-left:3.7rem;position:relative}.data-grid-row-parent>td .data-grid-checkbox-cell-inner:before{content:'\e628';font-size:1rem;font-weight:700;left:1.35rem;position:absolute;top:1.6rem}.data-grid-th._col-xs{width:1%}.data-grid-info-panel{box-shadow:0 0 5px rgba(0,0,0,.5);margin:2rem .1rem -2rem}.data-grid-info-panel .messages{overflow:hidden}.data-grid-info-panel .messages .message{margin:1rem}.data-grid-info-panel .messages .message:last-child{margin-bottom:1rem}.data-grid-info-panel-actions{padding:1rem;text-align:right}.data-grid-editable-row .admin__field-control{position:relative}.data-grid-editable-row .admin__field-control._error:after{border-color:transparent #ee7d7d transparent transparent;border-style:solid;border-width:0 12px 12px 0;content:'';position:absolute;right:0;top:0}.data-grid-editable-row .admin__field-control._error .admin__control-text{border-color:#ee7d7d}.data-grid-editable-row .admin__field-control._focus:after{display:none}.data-grid-editable-row .admin__field-error{bottom:100%;box-shadow:1px 1px 5px rgba(0,0,0,.5);left:0;margin:0 auto 1.5rem;max-width:32rem;position:absolute;right:0}.data-grid-editable-row .admin__field-error:after,.data-grid-editable-row .admin__field-error:before{border-style:solid;content:'';left:50%;position:absolute;top:100%}.data-grid-editable-row .admin__field-error:after{border-color:#fffbbb transparent transparent;border-width:10px 10px 0;margin-left:-10px;z-index:1}.data-grid-editable-row .admin__field-error:before{border-color:#ee7d7d transparent transparent;border-width:11px 12px 0;margin-left:-12px}.data-grid-bulk-edit-panel .admin__field-label-vertical{display:block;font-size:1.2rem;margin-bottom:.5rem;text-align:left}.data-grid-row-changed{cursor:default;display:block;opacity:.5;position:relative;width:100%;z-index:1}.data-grid-row-changed:after{content:'\e631';display:inline-block}.data-grid-row-changed .data-grid-row-changed-tooltip{background:#f1f1f1;border:1px solid #f1f1f1;border-radius:1px;bottom:100%;box-shadow:0 3px 9px 0 rgba(0,0,0,.3);display:none;font-weight:400;line-height:1.36;margin-bottom:1.5rem;padding:1rem;position:absolute;right:-1rem;text-transform:none;width:27rem;word-break:normal;z-index:2}.data-grid-row-changed._changed{opacity:1;z-index:3}.data-grid-row-changed._changed:hover .data-grid-row-changed-tooltip{display:block}.data-grid-row-changed._changed:hover:before{background:#f1f1f1;border:1px solid #f1f1f1;bottom:100%;box-shadow:4px 4px 3px -1px rgba(0,0,0,.15);content:'';display:block;height:1.6rem;left:50%;margin:0 0 .7rem -.8rem;position:absolute;-ms-transform:rotate(45deg);transform:rotate(45deg);width:1.6rem;z-index:3}.ie9 .data-grid-row-changed._changed:hover:before{display:none}.admin__data-grid-outer-wrap .data-grid-checkbox-cell{overflow:hidden}.admin__data-grid-outer-wrap .data-grid-checkbox-cell-inner{position:relative}.admin__data-grid-outer-wrap .data-grid-checkbox-cell-inner:before{bottom:0;content:'';height:500%;left:0;position:absolute;right:0;top:0}.admin__data-grid-wrap-static .data-grid-checkbox-cell:hover{cursor:pointer}.admin__data-grid-wrap-static .data-grid-checkbox-cell-inner{margin:1.1rem 1.8rem .9rem;padding:0}.adminhtml-cms-hierarchy-index .admin__data-grid-wrap-static .data-grid-actions-cell:first-child{padding:0}.adminhtml-export-index .admin__data-grid-wrap-static .data-grid-checkbox-cell-inner{margin:0;padding:1.1rem 1.8rem 1.9rem}.admin__control-addon [class*=admin__control-][class]~[class*=admin__addon-]:last-child:before,.admin__control-file-label:before,.admin__control-multiselect,.admin__control-select,.admin__control-text,.admin__control-textarea,.selectmenu{-webkit-appearance:none;background-color:#fff;border:1px solid #adadad;border-radius:1px;box-shadow:none;color:#303030;font-size:1.4rem;font-weight:400;height:auto;line-height:1.36;padding:.6rem 1rem;transition:border-color .1s linear;vertical-align:baseline;width:auto}.admin__control-addon [class*=admin__control-][class]:hover~[class*=admin__addon-]:last-child:before,.admin__control-multiselect:hover,.admin__control-select:hover,.admin__control-text:hover,.admin__control-textarea:hover,.selectmenu:hover,.selectmenu:hover .selectmenu-toggle:before{border-color:#878787}.admin__control-addon [class*=admin__control-][class]:focus~[class*=admin__addon-]:last-child:before,.admin__control-file:active+.admin__control-file-label:before,.admin__control-file:focus+.admin__control-file-label:before,.admin__control-multiselect:focus,.admin__control-select:focus,.admin__control-text:focus,.admin__control-textarea:focus,.selectmenu._focus,.selectmenu._focus .selectmenu-toggle:before{border-color:#007bdb;box-shadow:none;outline:0}.admin__control-addon [class*=admin__control-][class][disabled]~[class*=admin__addon-]:last-child:before,.admin__control-file[disabled]+.admin__control-file-label:before,.admin__control-multiselect[disabled],.admin__control-select[disabled],.admin__control-text[disabled],.admin__control-textarea[disabled]{background-color:#e9e9e9;border-color:#adadad;color:#303030;cursor:not-allowed;opacity:.5}.admin__field-row[class]>.admin__field-control,.admin__fieldset>.admin__field.admin__field-wide[class]>.admin__field-control{clear:left;float:none;text-align:left;width:auto}.admin__field-row[class]:not(.admin__field-option)>.admin__field-label,.admin__fieldset>.admin__field.admin__field-wide[class]:not(.admin__field-option)>.admin__field-label{display:block;line-height:1.4rem;margin-bottom:.86rem;margin-top:-.14rem;text-align:left;width:auto}.admin__field-row[class]:not(.admin__field-option)>.admin__field-label:before,.admin__fieldset>.admin__field.admin__field-wide[class]:not(.admin__field-option)>.admin__field-label:before{display:none}.admin__field-row[class]:not(.admin__field-option)._required>.admin__field-label span,.admin__field-row[class]:not(.admin__field-option).required>.admin__field-label span,.admin__fieldset>.admin__field.admin__field-wide[class]:not(.admin__field-option)._required>.admin__field-label span,.admin__fieldset>.admin__field.admin__field-wide[class]:not(.admin__field-option).required>.admin__field-label span{padding-left:1.5rem}.admin__field-row[class]:not(.admin__field-option)._required>.admin__field-label span:after,.admin__field-row[class]:not(.admin__field-option).required>.admin__field-label span:after,.admin__fieldset>.admin__field.admin__field-wide[class]:not(.admin__field-option)._required>.admin__field-label span:after,.admin__fieldset>.admin__field.admin__field-wide[class]:not(.admin__field-option).required>.admin__field-label span:after{left:0;margin-left:30px}.admin__legend{font-size:1.8rem;font-weight:600;margin-bottom:3rem}.admin__control-checkbox,.admin__control-radio{cursor:pointer;opacity:.01;overflow:hidden;position:absolute;vertical-align:top}.admin__control-checkbox:after,.admin__control-radio:after{display:none}.admin__control-checkbox+label,.admin__control-radio+label{cursor:pointer;display:inline-block}.admin__control-checkbox+label:before,.admin__control-radio+label:before{background-color:#fff;border:1px solid #adadad;color:transparent;float:left;height:1.6rem;text-align:center;vertical-align:top;width:1.6rem}.admin__control-checkbox+.admin__field-label,.admin__control-radio+.admin__field-label{padding-left:2.6rem}.admin__control-checkbox+.admin__field-label:before,.admin__control-radio+.admin__field-label:before{margin:1px 1rem 0 -2.6rem}.admin__control-checkbox:checked+label:before,.admin__control-radio:checked+label:before{color:#514943}.admin__control-checkbox.disabled+label,.admin__control-checkbox[disabled]+label,.admin__control-radio.disabled+label,.admin__control-radio[disabled]+label{color:#303030;cursor:default;opacity:.5}.admin__control-checkbox.disabled+label:before,.admin__control-checkbox[disabled]+label:before,.admin__control-radio.disabled+label:before,.admin__control-radio[disabled]+label:before{background-color:#e9e9e9;border-color:#adadad;cursor:default}._keyfocus .admin__control-checkbox:not(.disabled):focus+label:before,._keyfocus .admin__control-checkbox:not([disabled]):focus+label:before,._keyfocus .admin__control-radio:not(.disabled):focus+label:before,._keyfocus .admin__control-radio:not([disabled]):focus+label:before{border-color:#007bdb}.admin__control-checkbox:not(.disabled):hover+label:before,.admin__control-checkbox:not([disabled]):hover+label:before,.admin__control-radio:not(.disabled):hover+label:before,.admin__control-radio:not([disabled]):hover+label:before{border-color:#878787}.admin__control-radio+label:before{border-radius:1.6rem;content:'';transition:border-color .1s linear,color .1s ease-in}.admin__control-radio.admin__control-radio+label:before{line-height:140%}.admin__control-radio:checked+label{position:relative}.admin__control-radio:checked+label:after{background-color:#514943;border-radius:50%;content:'';height:10px;left:3px;position:absolute;top:4px;width:10px}.admin__control-radio:checked:not(.disabled):hover,.admin__control-radio:checked:not(.disabled):hover+label,.admin__control-radio:checked:not([disabled]):hover,.admin__control-radio:checked:not([disabled]):hover+label{cursor:default}.admin__control-radio:checked:not(.disabled):hover+label:before,.admin__control-radio:checked:not([disabled]):hover+label:before{border-color:#adadad}.admin__control-checkbox+label:before{border-radius:1px;content:'';font-size:0;transition:font-size .1s ease-out,color .1s ease-out,border-color .1s linear}.admin__control-checkbox:checked+label:before{content:'\e62d';font-size:1.1rem;line-height:125%}.admin__control-checkbox:not(:checked)._indeterminate+label:before,.admin__control-checkbox:not(:checked):indeterminate+label:before{color:#514943;content:'-';font-family:'Open Sans','Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.4rem;font-weight:700}input[type=checkbox].admin__control-checkbox,input[type=radio].admin__control-checkbox{margin:0;position:absolute}.admin__control-text{min-width:4rem}.admin__control-select{-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;appearance:none;background-image:url(../images/arrows-bg.svg),linear-gradient(#e3e3e3,#e3e3e3),linear-gradient(#adadad,#adadad);background-position:calc(100% - 12px) -34px,100%,calc(100% - 3.2rem) 0;background-size:auto,3.2rem 100%,1px 100%;background-repeat:no-repeat;max-width:100%;min-width:8.5rem;padding-bottom:.5rem;padding-right:4.4rem;padding-top:.5rem;transition:border-color .1s linear}.admin__control-select:hover{border-color:#878787;cursor:pointer}.admin__control-select:focus{background-image:url(../images/arrows-bg.svg),linear-gradient(#e3e3e3,#e3e3e3),linear-gradient(#007bdb,#007bdb);background-position:calc(100% - 12px) 13px,100%,calc(100% - 3.2rem) 0;border-color:#007bdb}.admin__control-select::-ms-expand{display:none}.ie9 .admin__control-select{background-image:none;padding-right:1rem}option:empty{display:none}.admin__control-multiselect{height:auto;max-width:100%;min-width:15rem;overflow:auto;padding:0;resize:both}.admin__control-multiselect optgroup,.admin__control-multiselect option{padding:.5rem 1rem}.admin__control-file-wrapper{display:inline-block;padding:.5rem 1rem;position:relative;z-index:1}.admin__control-file-label:before{content:'';left:0;position:absolute;top:0;width:100%;z-index:0}.admin__control-file{background:0 0;border:0;padding-top:.7rem;position:relative;width:auto;z-index:1}.admin__control-support-text{border:1px solid transparent;display:inline-block;font-size:1.4rem;line-height:1.36;padding-bottom:.6rem;padding-top:.6rem}.admin__control-support-text+[class*=admin__control-],[class*=admin__control-]+.admin__control-support-text{margin-left:.7rem}.admin__control-service{float:left;margin:.8rem 0 0 3rem}.admin__control-textarea{height:8.48rem;line-height:1.18;padding-top:.8rem;resize:vertical}.admin__control-addon{-ms-flex-direction:row;flex-direction:row;display:inline-flex;-ms-flex-flow:row nowrap;flex-flow:row nowrap;position:relative;width:100%;z-index:1}.admin__control-addon>[class*=admin__addon-],.admin__control-addon>[class*=admin__control-]{-ms-flex-preferred-size:auto;flex-basis:auto;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;position:relative;z-index:1}.admin__control-addon .admin__control-select{width:auto}.admin__control-addon .admin__control-text{margin:.1rem;padding:.5rem .9rem;width:100%}.admin__control-addon [class*=admin__control-][class]{appearence:none;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;-ms-flex-order:1;order:1;-ms-flex-negative:1;flex-shrink:1;background-color:transparent;border-color:transparent;box-shadow:none;vertical-align:top}.admin__control-addon [class*=admin__control-][class]+[class*=admin__control-]{border-left-color:#adadad}.admin__control-addon [class*=admin__control-][class] :focus{box-shadow:0}.admin__control-addon [class*=admin__control-][class]~[class*=admin__addon-]:last-child{padding-left:1rem;position:static!important;z-index:0}.admin__control-addon [class*=admin__control-][class]~[class*=admin__addon-]:last-child>*{position:relative;vertical-align:top;z-index:1}.admin__control-addon [class*=admin__control-][class]~[class*=admin__addon-]:last-child:empty{padding:0}.admin__control-addon [class*=admin__control-][class]~[class*=admin__addon-]:last-child:before{bottom:0;box-sizing:border-box;content:'';left:0;position:absolute;top:0;width:100%;z-index:-1}.admin__addon-prefix,.admin__addon-suffix{border:0;box-sizing:border-box;color:#858585;display:inline-block;font-size:1.4rem;font-weight:400;height:3.2rem;line-height:3.2rem;padding:0}.admin__addon-suffix{-ms-flex-order:3;order:3}.admin__addon-suffix:last-child{padding-right:1rem}.admin__addon-prefix{-ms-flex-order:0;order:0}.ie9 .admin__control-addon:after{clear:both;content:'';display:block;height:0;overflow:hidden}.ie9 .admin__addon{min-width:0;overflow:hidden;text-align:right;white-space:nowrap;width:auto}.ie9 .admin__addon [class*=admin__control-]{display:inline}.ie9 .admin__addon-prefix{float:left}.ie9 .admin__addon-suffix{float:right}.admin__control-collapsible{width:100%}.admin__control-collapsible ._dragged .admin__collapsible-block-wrapper .admin__collapsible-title{background:#d0d0d0}.admin__control-collapsible ._dragover-bottom .admin__collapsible-block-wrapper:before,.admin__control-collapsible ._dragover-top .admin__collapsible-block-wrapper:before{background:#008bdb;content:'';display:block;height:3px;left:0;position:absolute;right:0}.admin__control-collapsible ._dragover-top .admin__collapsible-block-wrapper:before{top:-3px}.admin__control-collapsible ._dragover-bottom .admin__collapsible-block-wrapper:before{bottom:-3px}.admin__control-collapsible .admin__collapsible-block-wrapper.fieldset-wrapper{border:0;margin:0;position:relative}.admin__control-collapsible .admin__collapsible-block-wrapper.fieldset-wrapper .fieldset-wrapper-title{background:#f8f8f8;border:2px solid #ccc}.admin__control-collapsible .admin__collapsible-block-wrapper .fieldset-wrapper-title .admin__collapsible-title{font-size:1.4rem;font-weight:400;line-height:1;padding:1.6rem 4rem 1.6rem 3.8rem}.admin__control-collapsible .admin__collapsible-block-wrapper .fieldset-wrapper-title .admin__collapsible-title:before{left:1rem;right:auto;top:1.4rem}.admin__control-collapsible .admin__collapsible-block-wrapper .fieldset-wrapper-title .action-delete{background-color:transparent;border-color:transparent;box-shadow:none;padding:0;position:absolute;right:1rem;top:1.4rem}.admin__control-collapsible .admin__collapsible-block-wrapper .fieldset-wrapper-title .action-delete:hover{background-color:transparent;border-color:transparent;box-shadow:none}.admin__control-collapsible .admin__collapsible-block-wrapper .fieldset-wrapper-title .action-delete:before{content:'\e630';font-size:2rem}.admin__control-collapsible .admin__collapsible-block-wrapper .fieldset-wrapper-title .action-delete>span{display:none}.admin__control-collapsible .admin__collapsible-content{background-color:#fff;margin-bottom:1rem}.admin__control-collapsible .admin__collapsible-content>.fieldset-wrapper{border:1px solid #ccc;margin-top:-1px;padding:1rem}.admin__control-collapsible .admin__collapsible-content .admin__fieldset{padding:0}.admin__control-collapsible .admin__collapsible-content .admin__field:last-child{margin-bottom:0}.admin__control-table-wrapper{max-width:100%;overflow-x:auto;overflow-y:hidden}.admin__control-table{width:100%}.admin__control-table thead{background-color:transparent}.admin__control-table tbody td{vertical-align:top}.admin__control-table tfoot th{padding-bottom:1.3rem}.admin__control-table tfoot th.validation{padding-bottom:0;padding-top:0}.admin__control-table tfoot td{border-top:1px solid #fff}.admin__control-table tfoot .admin__control-table-pagination{float:right;padding-bottom:0}.admin__control-table tfoot .action-previous{margin-right:.5rem}.admin__control-table tfoot .action-next{margin-left:.9rem}.admin__control-table tr:last-child td{border-bottom:none}.admin__control-table tr._dragover-top td{box-shadow:inset 0 3px 0 0 #008bdb}.admin__control-table tr._dragover-bottom td{box-shadow:inset 0 -3px 0 0 #008bdb}.admin__control-table tr._dragged td,.admin__control-table tr._dragged th{background:#d0d0d0}.admin__control-table td,.admin__control-table th{background-color:#efefef;border:0;border-bottom:1px solid #fff;padding:1.3rem 1rem 1.3rem 0;text-align:left;vertical-align:top}.admin__control-table td:first-child,.admin__control-table th:first-child{padding-left:1rem}.admin__control-table td>.admin__control-select,.admin__control-table td>.admin__control-text,.admin__control-table th>.admin__control-select,.admin__control-table th>.admin__control-text{width:100%}.admin__control-table td._hidden,.admin__control-table th._hidden{display:none}.admin__control-table td._fit,.admin__control-table th._fit{width:1px}.admin__control-table th{color:#303030;font-size:1.4rem;font-weight:600;vertical-align:bottom}.admin__control-table th._required span:after{color:#eb5202;content:'*'}.admin__control-table .control-table-actions-th{white-space:nowrap}.admin__control-table .control-table-actions-cell{padding-top:1.8rem;text-align:center;width:1%}.admin__control-table .control-table-options-th{text-align:center;width:10rem}.admin__control-table .control-table-options-cell{text-align:center}.admin__control-table .control-table-text{line-height:3.2rem}.admin__control-table .col-draggable{padding-top:2.2rem;width:1%}.admin__control-table .action-delete{background-color:transparent;border-color:transparent;box-shadow:none;padding-left:0;padding-right:0}.admin__control-table .action-delete:hover{background-color:transparent;border-color:transparent;box-shadow:none}.admin__control-table .action-delete:before{content:'\e630';font-size:2rem}.admin__control-table .action-delete>span{display:none}.admin__control-table .draggable-handle{padding:0}.admin__control-table._dragged{outline:#007bdb solid 1px}.admin__control-table-action{background-color:#efefef;border-top:1px solid #fff;padding:1.3rem 1rem}.admin__dynamic-rows._dragged{opacity:.95;position:absolute;z-index:999}.admin__dynamic-rows.admin__control-table .admin__control-fields>.admin__field{border:0;padding:0}.admin__dynamic-rows td>.admin__field{border:0;margin:0;padding:0}.admin__control-table-pagination{padding-bottom:1rem}.admin__control-table-pagination .admin__data-grid-pager{float:right}.admin__field-tooltip{display:inline-block;margin-top:.5rem;max-width:45px;overflow:visible;vertical-align:top;width:0}.admin__field-tooltip:hover{position:relative;z-index:500}.admin__field-option .admin__field-tooltip{margin-top:.5rem}.admin__field-tooltip .admin__field-tooltip-action{margin-left:2rem;position:relative;z-index:2;display:inline-block;text-decoration:none}.admin__field-tooltip .admin__field-tooltip-action:before{-webkit-font-smoothing:antialiased;font-size:2.2rem;line-height:1;color:#514943;content:'\e633';font-family:Icons;vertical-align:middle;display:inline-block;font-weight:400;overflow:hidden;speak:none;text-align:center}.admin__field-tooltip .admin__control-text:focus+.admin__field-tooltip-content,.admin__field-tooltip:hover .admin__field-tooltip-content{display:block}.admin__field-tooltip .admin__field-tooltip-content{bottom:3.8rem;display:none;right:-2.3rem}.admin__field-tooltip .admin__field-tooltip-content:after,.admin__field-tooltip .admin__field-tooltip-content:before{border:1.6rem solid transparent;height:0;width:0;border-top-color:#afadac;content:'';display:block;position:absolute;right:2rem;top:100%;z-index:3}.admin__field-tooltip .admin__field-tooltip-content:after{border-top-color:#fffbbb;margin-top:-1px;z-index:4}.abs-admin__field-tooltip-content,.admin__field-tooltip .admin__field-tooltip-content{box-shadow:0 2px 8px 0 rgba(0,0,0,.3);background:#fffbbb;border:1px solid #afadac;border-radius:1px;padding:1.5rem 2.5rem;position:absolute;width:32rem;z-index:1}.admin__field-fallback-reset{font-size:1.25rem;white-space:nowrap;width:30px}.admin__field-fallback-reset>span{margin-left:.5rem;position:relative}.admin__field-fallback-reset:active{-ms-transform:scale(0.98);transform:scale(0.98)}.admin__field-fallback-reset:before{transition:color .1s linear;content:'\e642';font-size:1.3rem;margin-left:.5rem}.admin__field-fallback-reset:hover{cursor:pointer;text-decoration:none}.admin__field-fallback-reset:focus{background:0 0}.abs-field-size-x-small,.abs-field-sizes.admin__field-x-small>.admin__field-control,.admin__field.admin__field-x-small>.admin__field-control,.admin__fieldset>.admin__field.admin__field-x-small>.admin__field-control,[class*=admin__control-grouped]>.admin__field.admin__field-x-small>.admin__field-control{width:8rem}.abs-field-size-small,.abs-field-sizes.admin__field-small>.admin__field-control,.admin__control-grouped-date>.admin__field-date.admin__field>.admin__field-control,.admin__field.admin__field-small>.admin__field-control,.admin__fieldset>.admin__field.admin__field-small>.admin__field-control,[class*=admin__control-grouped]>.admin__field.admin__field-small>.admin__field-control{width:15rem}.abs-field-size-medium,.abs-field-sizes.admin__field-medium>.admin__field-control,.admin__field.admin__field-medium>.admin__field-control,.admin__fieldset>.admin__field.admin__field-medium>.admin__field-control,[class*=admin__control-grouped]>.admin__field.admin__field-medium>.admin__field-control{width:34rem}.abs-field-size-large,.abs-field-sizes.admin__field-large>.admin__field-control,.admin__field.admin__field-large>.admin__field-control,.admin__fieldset>.admin__field.admin__field-large>.admin__field-control,[class*=admin__control-grouped]>.admin__field.admin__field-large>.admin__field-control{width:64rem}.abs-field-no-label,.admin__field-group-additional,.admin__field-no-label,.admin__fieldset>.admin__field.admin__field-no-label>.admin__field-control{margin-left:calc((100%) * .25 + 30px)}.admin__fieldset{border:0;margin:0;min-width:0;padding:0}.admin__fieldset .fieldset-wrapper.admin__fieldset-section>.fieldset-wrapper-title{padding-left:1rem}.admin__fieldset .fieldset-wrapper.admin__fieldset-section>.fieldset-wrapper-title strong{font-size:1.7rem;font-weight:600}.admin__fieldset .fieldset-wrapper.admin__fieldset-section .admin__fieldset-wrapper-content>.admin__fieldset{padding-top:1rem}.admin__fieldset .fieldset-wrapper.admin__fieldset-section:last-child .admin__fieldset-wrapper-content>.admin__fieldset{padding-bottom:0}.admin__fieldset>.admin__field{border:0;margin:0 0 0 -30px;padding:0}.admin__fieldset>.admin__field:after{clear:both;content:'';display:table}.admin__fieldset>.admin__field>.admin__field-control{width:calc((100%) * .5 - 30px);float:left;margin-left:30px}.admin__fieldset>.admin__field>.admin__field-label{width:calc((100%) * .25 - 30px);float:left;margin-left:30px}.admin__fieldset>.admin__field.admin__field-no-label>.admin__field-label{display:none}.admin__fieldset>.admin__field+.admin__field._empty._no-header{margin-top:-3rem}.admin__fieldset-product-websites{position:relative;z-index:300}.admin__fieldset-note{margin-bottom:2rem}.admin__form-field{border:0;margin:0;padding:0}.admin__field-control .admin__control-text,.admin__field-control .admin__control-textarea,.admin__form-field-control .admin__control-text,.admin__form-field-control .admin__control-textarea{width:100%}.admin__field-label{color:#303030;cursor:pointer;margin:0;text-align:right}.admin__field-label+br{display:none}.admin__field:not(.admin__field-option)>.admin__field-label{font-family:'Open Sans','Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.4rem;font-weight:600;line-height:3.2rem;padding:0;white-space:nowrap}.admin__field:not(.admin__field-option)>.admin__field-label:before{opacity:0;visibility:hidden;content:'.';margin-left:-7px;overflow:hidden}.admin__field:not(.admin__field-option)>.admin__field-label span{display:inline-block;line-height:1.2;vertical-align:middle;white-space:normal}.admin__field:not(.admin__field-option)>.admin__field-label span[data-config-scope]{position:relative}._required>.admin__field-label>span:after,.required>.admin__field-label>span:after{color:#eb5202;content:'*';display:inline-block;font-size:1.6rem;font-weight:500;line-height:1;margin-left:10px;margin-top:.2rem;position:absolute;z-index:1}._disabled>.admin__field-label{color:#999;cursor:default}.admin__field{margin-bottom:0}.admin__field+.admin__field{margin-top:1.5rem}.admin__field:not(.admin__field-option)~.admin__field-option{margin-top:.5rem}.admin__field.admin__field-option~.admin__field-option{margin-top:.9rem}.admin__field~.admin__field-option:last-child{margin-bottom:.8rem}.admin__fieldset>.admin__field{margin-bottom:3rem;position:relative}.admin__field legend.admin__field-label{opacity:0}.admin__field[data-config-scope]:before{color:gray;content:attr(data-config-scope);display:inline-block;font-size:1.2rem;left:calc((100%) * .75 - 30px);line-height:3.2rem;margin-left:60px;position:absolute;width:calc((100%) * .25 - 30px)}.admin__field-control .admin__field[data-config-scope]:nth-child(n+2):before{content:''}.admin__field._error .admin__field-control [class*=admin__addon-]:before,.admin__field._error .admin__field-control [class*=admin__control-] [class*=admin__addon-]:before,.admin__field._error .admin__field-control>[class*=admin__control-]{border-color:#e22626}.admin__field._disabled,.admin__field._disabled:hover{box-shadow:inherit;cursor:inherit;opacity:1;outline:inherit}.admin__field._hidden{display:none}.admin__field-control+.admin__field-control{margin-top:1.5rem}.admin__field-control._with-tooltip>.admin__control-addon,.admin__field-control._with-tooltip>.admin__control-select,.admin__field-control._with-tooltip>.admin__control-text,.admin__field-control._with-tooltip>.admin__control-textarea,.admin__field-control._with-tooltip>.admin__field-option{max-width:calc(100% - 45px - 4px)}.admin__field-control._with-tooltip .admin__field-tooltip{width:auto}.admin__field-control._with-tooltip .admin__field-option{display:inline-block}.admin__field-control._with-reset>.admin__control-addon,.admin__field-control._with-reset>.admin__control-text,.admin__field-control._with-reset>.admin__control-textarea{width:calc(100% - 30px - .5rem - 4px)}.admin__field-control._with-reset .admin__field-fallback-reset{margin-left:.5rem;margin-top:1rem;vertical-align:top}.admin__field-control._with-reset._with-tooltip>.admin__control-addon,.admin__field-control._with-reset._with-tooltip>.admin__control-text,.admin__field-control._with-reset._with-tooltip>.admin__control-textarea{width:calc(100% - 30px - .5rem - 45px - 8px)}.admin__fieldset>.admin__field-collapsible{margin-bottom:0}.admin__fieldset>.admin__field-collapsible .admin__field-control{border-top:1px solid #ccc;display:block;font-size:1.7rem;font-weight:700;padding:1.7rem 0;width:calc(97%)}.admin__fieldset>.admin__field-collapsible .admin__field-option{padding-top:0}.admin__field-collapsible+div{margin-top:2.5rem}.admin__field-collapsible .admin__control-radio+label:before{height:1.8rem;width:1.8rem}.admin__field-collapsible .admin__control-radio:checked+label:after{left:4px;top:5px}.admin__field-error{background:#fffbbb;border:1px solid #ee7d7d;box-sizing:border-box;color:#555;display:block;font-size:1.2rem;font-weight:400;line-height:1.2;margin:.2rem 0 0;padding:.8rem 1rem .9rem}.admin__field-note{color:#303030;font-size:1.2rem;margin:10px 0 0;padding:0}.admin__additional-info{padding-top:1rem}.admin__field-option{padding-top:.7rem}.admin__field-option .admin__field-label{text-align:left}.admin__field-control>.admin__field-option:nth-child(1):nth-last-child(2),.admin__field-control>.admin__field-option:nth-child(2):nth-last-child(1){display:inline-block}.admin__field-control>.admin__field-option:nth-child(1):nth-last-child(2)+.admin__field-option,.admin__field-control>.admin__field-option:nth-child(2):nth-last-child(1)+.admin__field-option{display:inline-block;margin-left:41px;margin-top:0}.admin__field-control>.admin__field-option:nth-child(1):nth-last-child(2)+.admin__field-option:before,.admin__field-control>.admin__field-option:nth-child(2):nth-last-child(1)+.admin__field-option:before{background:#cacaca;content:'';display:inline-block;height:20px;margin-left:-20px;position:absolute;width:1px}.admin__field-value{display:inline-block;padding-top:.7rem}.admin__field-service{padding-top:1rem}.admin__control-fields>.admin__field:first-child,[class*=admin__control-grouped]>.admin__field:first-child{position:static}.admin__control-fields>.admin__field:first-child>.admin__field-label,[class*=admin__control-grouped]>.admin__field:first-child>.admin__field-label{width:calc((100%) * .25 - 30px);float:left;margin-left:30px;background:#fff;cursor:pointer;left:0;position:absolute;top:0}.admin__control-fields>.admin__field:first-child>.admin__field-label span:before,[class*=admin__control-grouped]>.admin__field:first-child>.admin__field-label span:before{display:block}.admin__control-fields>.admin__field._disabled>.admin__field-label,[class*=admin__control-grouped]>.admin__field._disabled>.admin__field-label{cursor:default}.admin__control-fields>.admin__field>.admin__field-label span:before,[class*=admin__control-grouped]>.admin__field>.admin__field-label span:before{display:none}.admin__control-fields .admin__field-label~.admin__field-control{width:100%}.admin__control-fields .admin__field-option{padding-top:0}[class*=admin__control-grouped]{box-sizing:border-box;display:table;width:100%}[class*=admin__control-grouped]>.admin__field{display:table-cell;vertical-align:top}[class*=admin__control-grouped]>.admin__field>.admin__field-control{float:none;width:100%}[class*=admin__control-grouped]>.admin__field.admin__field-default,[class*=admin__control-grouped]>.admin__field.admin__field-large,[class*=admin__control-grouped]>.admin__field.admin__field-medium,[class*=admin__control-grouped]>.admin__field.admin__field-small,[class*=admin__control-grouped]>.admin__field.admin__field-x-small{width:1px}[class*=admin__control-grouped]>.admin__field.admin__field-default+.admin__field:last-child,[class*=admin__control-grouped]>.admin__field.admin__field-large+.admin__field:last-child,[class*=admin__control-grouped]>.admin__field.admin__field-medium+.admin__field:last-child,[class*=admin__control-grouped]>.admin__field.admin__field-small+.admin__field:last-child,[class*=admin__control-grouped]>.admin__field.admin__field-x-small+.admin__field:last-child{width:auto}[class*=admin__control-grouped]>.admin__field:nth-child(n+2){padding-left:20px}.admin__control-group-equal{table-layout:fixed}.admin__control-group-equal>.admin__field{width:50%}.admin__field-control-group{margin-top:.8rem}.admin__field-control-group>.admin__field{padding:0}.admin__control-grouped-date>.admin__field-date{white-space:nowrap;width:1px}.admin__control-grouped-date>.admin__field-date.admin__field>.admin__field-control{float:left;position:relative}.admin__control-grouped-date>.admin__field-date+.admin__field:last-child{width:auto}.admin__control-grouped-date>.admin__field-date+.admin__field-date>.admin__field-label{float:left;padding-right:20px}.admin__control-grouped-date .ui-datepicker-trigger{left:100%;top:0}.admin__field-group-columns.admin__field-control.admin__control-grouped{width:calc((100%) * 1 - 30px);float:left;margin-left:30px}.admin__field-group-columns>.admin__field:first-child>.admin__field-label{float:none;margin:0;opacity:1;position:static;text-align:left}.admin__field-group-columns .admin__control-select{width:100%}.admin__field-group-additional{clear:both}.admin__field-group-additional .action-advanced{margin-top:1rem}.admin__field-group-additional .action-secondary{width:100%}.admin__field-group-show-label{white-space:nowrap}.admin__field-group-show-label>.admin__field-control,.admin__field-group-show-label>.admin__field-label{display:inline-block;vertical-align:top}.admin__field-group-show-label>.admin__field-label{margin-right:20px}.admin__field-complex{margin:1rem 0 3rem;padding-left:1rem}.admin__field:not(._hidden)+.admin__field-complex{margin-top:3rem}.admin__field-complex .admin__field-complex-title{clear:both;color:#303030;font-size:1.7rem;font-weight:600;letter-spacing:.025em;margin-bottom:1rem}.admin__field-complex .admin__field-complex-elements{float:right;max-width:40%}.admin__field-complex .admin__field-complex-elements button{margin-left:1rem}.admin__field-complex .admin__field-complex-content{max-width:60%;overflow:hidden}.admin__field-complex .admin__field-complex-text{margin-left:-1rem}.admin__field-complex+.admin__field._empty._no-header{margin-top:-3rem}.admin__legend{float:left;position:static;width:100%}.admin__legend+br{clear:left;display:block;height:0;overflow:hidden}.message{margin-bottom:3rem}.message-icon-top:before{margin-top:0;top:1.8rem}.nav{background-color:#f8f8f8;border-bottom:1px solid #e3e3e3;border-top:1px solid #e3e3e3;display:none;margin-bottom:3rem;padding:2.2rem 1.5rem 0 0}.nav .btn-group,.nav-bar-outer-actions{float:right;margin-bottom:1.7rem}.nav .btn-group .btn-wrap,.nav-bar-outer-actions .btn-wrap{float:right;margin-left:.5rem;margin-right:.5rem}.nav .btn-group .btn-wrap .btn,.nav-bar-outer-actions .btn-wrap .btn{padding-left:.5rem;padding-right:.5rem}.nav-bar-outer-actions{margin-top:-10.6rem;padding-right:1.5rem}.btn-wrap-try-again{width:9.5rem}.btn-wrap-next,.btn-wrap-prev{width:8.5rem}.nav-bar{counter-reset:i;float:left;margin:0 1rem 1.7rem 0;padding:0;position:relative;white-space:nowrap}.nav-bar:before{background-color:#d4d4d4;background-repeat:repeat-x;background-image:linear-gradient(to bottom,#d1d1d1 0,#d4d4d4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#d1d1d1', endColorstr='#d4d4d4', GradientType=0);border-bottom:1px solid #d9d9d9;border-top:1px solid #bfbfbf;content:'';height:1rem;left:5.15rem;position:absolute;right:5.15rem;top:.7rem}.nav-bar>li{display:inline-block;font-size:0;position:relative;vertical-align:top;width:10.3rem}.nav-bar>li:first-child:after{display:none}.nav-bar>li:after{background-color:#514943;content:'';height:.5rem;left:calc(-50% + .25rem);position:absolute;right:calc(50% + .7rem);top:.9rem}.nav-bar>li.disabled:before,.nav-bar>li.ui-state-disabled:before{bottom:0;content:'';left:0;position:absolute;right:0;top:0;z-index:1}.nav-bar>li.active~li:after,.nav-bar>li.ui-state-active~li:after{display:none}.nav-bar>li.active~li a:after,.nav-bar>li.ui-state-active~li a:after{background-color:transparent;border-color:transparent;color:#a6a6a6}.nav-bar>li.active a,.nav-bar>li.ui-state-active a{color:#000}.nav-bar>li.active a:hover,.nav-bar>li.ui-state-active a:hover{cursor:default}.nav-bar>li.active a:after,.nav-bar>li.ui-state-active a:after{background-color:#fff;content:''}.nav-bar a{color:#514943;display:block;font-size:1.2rem;font-weight:600;line-height:1.2;overflow:hidden;padding:3rem .5em 0;position:relative;text-align:center;text-overflow:ellipsis}.nav-bar a:hover{text-decoration:none}.nav-bar a:after{background-color:#514943;border:.4rem solid #514943;border-radius:100%;color:#fff;content:counter(i);counter-increment:i;height:1.5rem;left:50%;line-height:.6;margin-left:-.8rem;position:absolute;right:auto;text-align:center;top:.4rem;width:1.5rem}.nav-bar a:before{background-color:#d6d6d6;border:1px solid transparent;border-bottom-color:#d9d9d9;border-radius:100%;border-top-color:#bfbfbf;content:'';height:2.3rem;left:50%;line-height:1;margin-left:-1.2rem;position:absolute;top:0;width:2.3rem}.tooltip{display:block;font-family:'Open Sans','Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.19rem;font-weight:400;line-height:1.4;opacity:0;position:absolute;visibility:visible;z-index:10}.tooltip.in{opacity:.9}.tooltip.top{margin-top:-4px;padding:8px 0}.tooltip.right{margin-left:4px;padding:0 8px}.tooltip.bottom{margin-top:4px;padding:8px 0}.tooltip.left{margin-left:-4px;padding:0 8px}.tooltip p:last-child{margin-bottom:0}.tooltip-inner{background-color:#fff;border:1px solid #adadad;border-radius:0;box-shadow:1px 1px 1px #ccc;color:#41362f;max-width:31rem;padding:.5em 1em;text-decoration:none}.tooltip-arrow,.tooltip-arrow:after{border:solid transparent;height:0;position:absolute;width:0}.tooltip-arrow:after{content:'';position:absolute}.tooltip.top .tooltip-arrow,.tooltip.top .tooltip-arrow:after{border-top-color:#949494;border-width:8px 8px 0;bottom:0;left:50%;margin-left:-8px}.tooltip.top-left .tooltip-arrow,.tooltip.top-left .tooltip-arrow:after{border-top-color:#949494;border-width:8px 8px 0;bottom:0;margin-bottom:-8px;right:8px}.tooltip.top-right .tooltip-arrow,.tooltip.top-right .tooltip-arrow:after{border-top-color:#949494;border-width:8px 8px 0;bottom:0;left:8px;margin-bottom:-8px}.tooltip.right .tooltip-arrow,.tooltip.right .tooltip-arrow:after{border-right-color:#949494;border-width:8px 8px 8px 0;left:1px;margin-top:-8px;top:50%}.tooltip.right .tooltip-arrow:after{border-right-color:#fff;border-width:6px 7px 6px 0;margin-left:0;margin-top:-6px}.tooltip.left .tooltip-arrow,.tooltip.left .tooltip-arrow:after{border-left-color:#949494;border-width:8px 0 8px 8px;margin-top:-8px;right:0;top:50%}.tooltip.bottom .tooltip-arrow,.tooltip.bottom .tooltip-arrow:after{border-bottom-color:#949494;border-width:0 8px 8px;left:50%;margin-left:-8px;top:0}.tooltip.bottom-left .tooltip-arrow,.tooltip.bottom-left .tooltip-arrow:after{border-bottom-color:#949494;border-width:0 8px 8px;margin-top:-8px;right:8px;top:0}.tooltip.bottom-right .tooltip-arrow,.tooltip.bottom-right .tooltip-arrow:after{border-bottom-color:#949494;border-width:0 8px 8px;left:8px;margin-top:-8px;top:0}.password-strength{display:block;margin:0 -.3rem 1em;white-space:nowrap}.password-strength.password-strength-too-short .password-strength-item:first-child,.password-strength.password-strength-weak .password-strength-item:first-child,.password-strength.password-strength-weak .password-strength-item:first-child+.password-strength-item{background-color:#e22626}.password-strength.password-strength-fair .password-strength-item:first-child,.password-strength.password-strength-fair .password-strength-item:first-child+.password-strength-item,.password-strength.password-strength-fair .password-strength-item:first-child+.password-strength-item+.password-strength-item{background-color:#ef672f}.password-strength.password-strength-good .password-strength-item:first-child,.password-strength.password-strength-good .password-strength-item:first-child+.password-strength-item,.password-strength.password-strength-good .password-strength-item:first-child+.password-strength-item+.password-strength-item,.password-strength.password-strength-good .password-strength-item:first-child+.password-strength-item+.password-strength-item+.password-strength-item,.password-strength.password-strength-strong .password-strength-item{background-color:#79a22e}.password-strength .password-strength-item{background-color:#ccc;display:inline-block;font-size:0;height:1.4rem;margin-right:.3rem;width:calc(20% - .6rem)}@keyframes progress-bar-stripes{from{background-position:4rem 0}to{background-position:0 0}}.progress{background-color:#fafafa;border:1px solid #ccc;clear:left;height:3rem;margin-bottom:3rem;overflow:hidden}.progress-bar{background-color:#79a22e;color:#fff;float:left;font-size:1.19rem;height:100%;line-height:3rem;text-align:center;transition:width .6s ease;width:0}.progress-bar.active{animation:progress-bar-stripes 2s linear infinite}.progress-bar-text-description{margin-bottom:1.6rem}.progress-bar-text-progress{text-align:right}.page-columns .page-inner-sidebar{margin:0 0 3rem}.page-header{margin-bottom:2.7rem;padding-bottom:2rem;position:relative}.page-header:before{border-bottom:1px solid #e3e3e3;bottom:0;content:'';display:block;height:1px;left:3rem;position:absolute;right:3rem}.container .page-header:before{content:normal}.page-header .message{margin-bottom:1.8rem}.page-header .message+.message{margin-top:-1.5rem}.page-header .admin__action-dropdown,.page-header .search-global-input{transition:none}.container .page-header{margin-bottom:0}.page-title-wrapper{margin-top:1.1rem}.container .page-title-wrapper{background:url(../../pub/images/logo.svg) no-repeat;min-height:41px;padding:4px 0 0 45px}.admin__menu .level-0:first-child>a{margin-top:1.6rem}.admin__menu .level-0:first-child>a:after{top:-1.6rem}.admin__menu .level-0:first-child._active>a:after{display:block}.admin__menu .level-0>a{padding-bottom:1.3rem;padding-top:1.3rem}.admin__menu .level-0>a:before{margin-bottom:.7rem}.admin__menu .item-home>a:before{content:'\e611';font-size:2.3rem;padding-top:-.1rem}.admin__menu .item-component>a:before{content:'\e612'}.admin__menu .item-extension>a:before{content:'\e612'}.admin__menu .item-module>a:before{content:'\e647'}.admin__menu .item-upgrade>a:before{content:'\e614'}.admin__menu .item-system-config>a:before{content:'\e610'}.admin__menu .item-tools>a:before{content:'\e613'}.modal-sub-title{font-size:1.7rem;font-weight:600}.modal-connect-signin .modal-inner-wrap{max-width:80rem}@keyframes ngdialog-fadeout{0%{opacity:1}100%{opacity:0}}@keyframes ngdialog-fadein{0%{opacity:0}100%{opacity:1}}.ngdialog{-webkit-overflow-scrolling:touch;bottom:0;box-sizing:border-box;left:0;overflow:auto;position:fixed;right:0;top:0;z-index:999}.ngdialog *,.ngdialog:after,.ngdialog:before{box-sizing:inherit}.ngdialog.ngdialog-disabled-animation *{animation:none!important}.ngdialog.ngdialog-closing .ngdialog-content,.ngdialog.ngdialog-closing .ngdialog-overlay{-webkit-animation:ngdialog-fadeout .5s;-webkit-backface-visibility:hidden;animation:ngdialog-fadeout .5s}.ngdialog-overlay{-webkit-animation:ngdialog-fadein .5s;-webkit-backface-visibility:hidden;animation:ngdialog-fadein .5s;background:rgba(0,0,0,.4);bottom:0;left:0;position:fixed;right:0;top:0}.ngdialog-content{-webkit-animation:ngdialog-fadein .5s;-webkit-backface-visibility:hidden;animation:ngdialog-fadein .5s}body.ngdialog-open{overflow:hidden}.component-indicator{border-radius:50%;cursor:help;display:inline-block;height:16px;text-align:center;vertical-align:middle;width:16px}.component-indicator::after,.component-indicator::before{background:#fff;display:block;opacity:0;position:absolute;transition:opacity .2s linear .1s;visibility:hidden}.component-indicator::before{border:1px solid #adadad;border-radius:1px;box-shadow:0 0 2px rgba(0,0,0,.4);content:attr(data-label);font-size:1.2rem;margin:30px 0 0 -10px;min-width:50px;padding:4px 5px}.component-indicator::after{border-color:#999;border-style:solid;border-width:1px 0 0 1px;box-shadow:-1px -1px 1px rgba(0,0,0,.1);content:'';height:10px;margin:9px 0 0 5px;-ms-transform:rotate(45deg);transform:rotate(45deg);width:10px}.component-indicator:hover::after,.component-indicator:hover::before{opacity:1;transition:opacity .2s linear;visibility:visible}.component-indicator span{display:block;height:16px;overflow:hidden;width:16px}.component-indicator span:before{content:'';display:block;font-family:Icons;font-size:16px;height:100%;line-height:16px;width:100%}.component-indicator._on{background:#79a22e}.component-indicator._off{background:#e22626}.component-indicator._off span:before{background:#fff;height:4px;margin:8px auto 20px;width:12px}.component-indicator._info{background:0 0}.component-indicator._info span{width:21px}.component-indicator._info span:before{color:#008bdb;content:'\e648';font-family:Icons;font-size:16px}.component-indicator._tooltip{background:0 0;margin:0 0 8px 5px}.component-indicator._tooltip a{width:21px}.component-indicator._tooltip a:hover{text-decoration:none}.component-indicator._tooltip a:before{color:#514943;content:'\e633';font-family:Icons;font-size:16px}.col-manager-item-name .data-grid-data{padding-left:5px}.col-manager-item-name .ng-hide+.data-grid-data{padding-left:24px}.col-manager-item-name ._hide-dependencies,.col-manager-item-name ._show-dependencies{cursor:pointer;padding-left:24px;position:relative}.col-manager-item-name ._hide-dependencies:before,.col-manager-item-name ._show-dependencies:before{display:block;font-family:Icons;font-size:12px;left:0;position:absolute;top:1px}.col-manager-item-name ._show-dependencies:before{content:'\e62b'}.col-manager-item-name ._hide-dependencies:before{content:'\e628'}.col-manager-item-name ._no-dependencies{padding-left:24px}.product-modules-block{font-size:1.2rem;padding:15px 0 0}.col-manager-item-name .product-modules-block{padding-left:1rem}.product-modules-descriprion,.product-modules-title{font-weight:700;margin:0 0 7px}.product-modules-list{font-size:1.1rem;list-style:none;margin:0}.col-manager-item-name .product-modules-list{margin-left:15px}.col-manager-item-name .product-modules-list li{padding:0 0 0 15px;position:relative}.product-modules-list li{margin:0 0 .5rem}.product-modules-list .component-indicator{height:10px;left:0;position:absolute;top:3px;width:10px}.module-summary{white-space:nowrap}.module-summary-title{font-size:2.1rem;margin-right:1rem}.app-updater .nav{display:block;margin-bottom:3.1rem;margin-top:-2.8rem}.app-updater .nav-bar-outer-actions{margin-top:1rem;padding-right:0}.app-updater .nav-bar-outer-actions .btn-wrap-cancel{margin-right:2.6rem}.main{padding-bottom:2rem;padding-top:3rem}.menu-wrapper .logo-static{pointer-events:none}.header{display:none}.header .logo{float:left;height:4.1rem;width:3.5rem}.header-title{font-size:2.8rem;letter-spacing:.02em;line-height:1.4;margin:2.5rem 0 3.5rem 5rem}.page-title{margin-bottom:1rem}.page-sub-title{font-size:2rem}.accent-box{margin-bottom:2rem}.accent-box .btn-prime{margin-top:1.5rem}.spinner.side{float:left;font-size:2.4rem;margin-left:2rem;margin-top:-5px}.page-landing{margin:7.6% auto 0;max-width:44rem;text-align:center}.page-landing .logo{height:5.6rem;margin-bottom:2rem;width:19.2rem}.page-landing .text-version{margin-bottom:3rem}.page-landing .text-welcome{margin-bottom:6.5rem}.page-landing .text-terms{margin-bottom:2.5rem;text-align:center}.page-landing .btn-submit,.page-license .license-text{margin-bottom:2rem}.page-license .page-license-footer{text-align:right}.readiness-check-item{margin-bottom:4rem;min-height:2.5rem}.readiness-check-item .spinner{float:left;font-size:2.5rem;margin:-.4rem 0 0 1.7rem}.readiness-check-title{font-size:1.4rem;font-weight:700;margin-bottom:.1rem;margin-left:5.7rem}.readiness-check-content{margin-left:5.7rem;margin-right:22rem;position:relative}.readiness-check-content .readiness-check-title{margin-left:0}.readiness-check-content .list{margin-top:-.3rem}.readiness-check-side{left:100%;padding-left:2.4rem;position:absolute;top:0;width:22rem}.readiness-check-side .side-title{margin-bottom:0}.readiness-check-icon{float:left;margin-left:1.7rem;margin-top:.3rem}.extensions-information{margin-bottom:5rem}.extensions-information h3{font-size:1.4rem;margin-bottom:1.3rem}.extensions-information .message{margin-bottom:2.5rem}.extensions-information .message:before{margin-top:0;top:1.8rem}.extensions-information .extensions-container{padding:0 2rem}.extensions-information .list{margin-bottom:1rem}.extensions-information .list select{cursor:pointer}.extensions-information .list select:disabled{background:#ccc;cursor:default}.extensions-information .list .extension-delete{font-size:1.7rem;padding-top:0}.delete-modal-wrap{padding:0 4% 4rem}.delete-modal-wrap h3{font-size:3.4rem;display:inline-block;font-weight:300;margin:0 0 2rem;padding:.9rem 0 0;vertical-align:top}.delete-modal-wrap .actions{padding:3rem 0 0}.page-web-configuration .form-el-insider-wrap{width:auto}.page-web-configuration .form-el-insider{width:15.4rem}.page-web-configuration .form-el-insider-input .form-el-input{width:16.5rem}.customize-your-store .advanced-modules-count,.customize-your-store .advanced-modules-select{padding-left:1.5rem}.customize-your-store .customize-your-store-advanced{min-width:0}.customize-your-store .message-error:before{margin-top:0;top:1.8rem}.customize-your-store .message-error a{color:#333;text-decoration:underline}.customize-your-store .message-error .form-label:before{background:#fff}.customize-your-store .customize-database-clean p{margin-top:2.5rem}.content-install{margin-bottom:2rem}.console{border:1px solid #ccc;font-family:'Courier New',Courier,monospace;font-weight:300;height:20rem;margin:1rem 0 2rem;overflow-y:auto;padding:1.5rem 2rem 2rem;resize:vertical}.console .text-danger{color:#e22626}.console .text-success{color:#090}.console .hidden{display:none}.content-success .btn-prime{margin-top:1.5rem}.jumbo-title{font-size:3.6rem}.jumbo-title .jumbo-icon{font-size:3.8rem;margin-right:.25em;position:relative;top:.15em}.install-database-clean{margin-top:4rem}.install-database-clean .btn{margin-right:1rem}.page-sub-title{margin-bottom:2.1rem;margin-top:3rem}.multiselect-custom{max-width:71.1rem}.content-install{margin-top:3.7rem}.home-page-inner-wrap{margin:0 auto;max-width:91rem}.setup-home-title{margin-bottom:3.9rem;padding-top:1.8rem;text-align:center}.setup-home-item{background-color:#fafafa;border:1px solid #ccc;color:#333;display:block;margin-bottom:2rem;margin-left:1.3rem;margin-right:1.3rem;min-height:30rem;padding:2rem;text-align:center}.setup-home-item:hover{border-color:#8c8c8c;color:#333;text-decoration:none;transition:border-color .1s linear}.setup-home-item:active{-ms-transform:scale(0.99);transform:scale(0.99)}.setup-home-item:before{display:block;font-size:7rem;margin-bottom:3.3rem;margin-top:4rem}.setup-home-item-component:before,.setup-home-item-extension:before{content:'\e612'}.setup-home-item-module:before{content:'\e647'}.setup-home-item-upgrade:before{content:'\e614'}.setup-home-item-configuration:before{content:'\e610'}.setup-home-item-title{display:block;font-size:1.8rem;letter-spacing:.025em;margin-bottom:1rem}.setup-home-item-description{display:block}.extension-manager-wrap{border:1px solid #bbb;margin:0 0 4rem}.extension-manager-account{font-size:2.1rem;display:inline-block;font-weight:400}.extension-manager-title{font-size:3.2rem;background-color:#f8f8f8;border-bottom:1px solid #e3e3e3;color:#41362f;font-weight:600;line-height:1.2;padding:2rem}.extension-manager-content{padding:2.5rem 2rem 2rem}.extension-manager-items{list-style:none;margin:0;text-align:center}.extension-manager-items .btn{border:1px solid #adadad;display:block;margin:1rem auto 0}.extension-manager-items .item-title{font-size:2.1rem;display:inline-block;text-align:left}.extension-manager-items .item-number{font-size:4.1rem;display:inline-block;line-height:.8;margin:0 5px 1.5rem 0;vertical-align:top}.extension-manager-items .item-date{font-size:2.6rem;margin-top:1px}.extension-manager-items .item-date-title{font-size:1.5rem}.extension-manager-items .item-install{margin:0 0 2rem}.sync-login-wrap{padding:0 10% 4rem}.sync-login-wrap .legend{font-size:2.6rem;color:#eb5202;float:left;font-weight:300;line-height:1.2;margin:-1rem 0 2.5rem;position:static;width:100%}.sync-login-wrap .legend._hidden{display:none}.sync-login-wrap .login-header{font-size:3.4rem;font-weight:300;margin:0 0 2rem}.sync-login-wrap .login-header span{display:inline-block;padding:.9rem 0 0;vertical-align:top}.sync-login-wrap h4{font-size:1.4rem;margin:0 0 2rem}.sync-login-wrap .sync-login-steps{margin:0 0 2rem 1.5rem}.sync-login-wrap .sync-login-steps li{padding:0 0 0 1rem}.sync-login-wrap .form-row .form-label{display:inline-block}.sync-login-wrap .form-row .form-label.required{padding-left:1.5rem}.sync-login-wrap .form-row .form-label.required:after{left:0;position:absolute;right:auto}.sync-login-wrap .form-row{max-width:28rem}.sync-login-wrap .form-actions{display:table;margin-top:-1.3rem}.sync-login-wrap .form-actions .links{display:table-header-group}.sync-login-wrap .form-actions .actions{padding:3rem 0 0}@media all and (max-width:1047px){.admin__menu .submenu li{min-width:19.8rem}.nav{padding-bottom:5.38rem;padding-left:1.5rem;text-align:center}.nav-bar{display:inline-block;float:none;margin-right:0;vertical-align:top}.nav .btn-group,.nav-bar-outer-actions{display:inline-block;float:none;margin-top:-8.48rem;text-align:center;vertical-align:top;width:100%}.nav-bar-outer-actions{padding-right:0}.nav-bar-outer-actions .outer-actions-inner-wrap{display:inline-block}.app-updater .nav{padding-bottom:1.7rem}.app-updater .nav-bar-outer-actions{margin-top:2rem}}@media all and (min-width:768px){.page-layout-admin-2columns-left .page-columns{margin-left:-30px}.page-layout-admin-2columns-left .page-columns:after{clear:both;content:'';display:table}.page-layout-admin-2columns-left .page-columns .main-col{width:calc((100%) * .75 - 30px);float:right}.page-layout-admin-2columns-left .page-columns .side-col{width:calc((100%) * .25 - 30px);float:left;margin-left:30px}.col-m-1,.col-m-10,.col-m-11,.col-m-12,.col-m-2,.col-m-3,.col-m-4,.col-m-5,.col-m-6,.col-m-7,.col-m-8,.col-m-9{float:left}.col-m-12{width:100%}.col-m-11{width:91.66666667%}.col-m-10{width:83.33333333%}.col-m-9{width:75%}.col-m-8{width:66.66666667%}.col-m-7{width:58.33333333%}.col-m-6{width:50%}.col-m-5{width:41.66666667%}.col-m-4{width:33.33333333%}.col-m-3{width:25%}.col-m-2{width:16.66666667%}.col-m-1{width:8.33333333%}.col-m-pull-12{right:100%}.col-m-pull-11{right:91.66666667%}.col-m-pull-10{right:83.33333333%}.col-m-pull-9{right:75%}.col-m-pull-8{right:66.66666667%}.col-m-pull-7{right:58.33333333%}.col-m-pull-6{right:50%}.col-m-pull-5{right:41.66666667%}.col-m-pull-4{right:33.33333333%}.col-m-pull-3{right:25%}.col-m-pull-2{right:16.66666667%}.col-m-pull-1{right:8.33333333%}.col-m-pull-0{right:auto}.col-m-push-12{left:100%}.col-m-push-11{left:91.66666667%}.col-m-push-10{left:83.33333333%}.col-m-push-9{left:75%}.col-m-push-8{left:66.66666667%}.col-m-push-7{left:58.33333333%}.col-m-push-6{left:50%}.col-m-push-5{left:41.66666667%}.col-m-push-4{left:33.33333333%}.col-m-push-3{left:25%}.col-m-push-2{left:16.66666667%}.col-m-push-1{left:8.33333333%}.col-m-push-0{left:auto}.col-m-offset-12{margin-left:100%}.col-m-offset-11{margin-left:91.66666667%}.col-m-offset-10{margin-left:83.33333333%}.col-m-offset-9{margin-left:75%}.col-m-offset-8{margin-left:66.66666667%}.col-m-offset-7{margin-left:58.33333333%}.col-m-offset-6{margin-left:50%}.col-m-offset-5{margin-left:41.66666667%}.col-m-offset-4{margin-left:33.33333333%}.col-m-offset-3{margin-left:25%}.col-m-offset-2{margin-left:16.66666667%}.col-m-offset-1{margin-left:8.33333333%}.col-m-offset-0{margin-left:0}.page-columns{margin-left:-30px}.page-columns:after{clear:both;content:'';display:table}.page-columns .page-inner-content{width:calc((100%) * .75 - 30px);float:right}.page-columns .page-inner-sidebar{width:calc((100%) * .25 - 30px);float:left;margin-left:30px}}@media all and (min-width:1048px){.col-l-1,.col-l-10,.col-l-11,.col-l-12,.col-l-2,.col-l-3,.col-l-4,.col-l-5,.col-l-6,.col-l-7,.col-l-8,.col-l-9{float:left}.col-l-12{width:100%}.col-l-11{width:91.66666667%}.col-l-10{width:83.33333333%}.col-l-9{width:75%}.col-l-8{width:66.66666667%}.col-l-7{width:58.33333333%}.col-l-6{width:50%}.col-l-5{width:41.66666667%}.col-l-4{width:33.33333333%}.col-l-3{width:25%}.col-l-2{width:16.66666667%}.col-l-1{width:8.33333333%}.col-l-pull-12{right:100%}.col-l-pull-11{right:91.66666667%}.col-l-pull-10{right:83.33333333%}.col-l-pull-9{right:75%}.col-l-pull-8{right:66.66666667%}.col-l-pull-7{right:58.33333333%}.col-l-pull-6{right:50%}.col-l-pull-5{right:41.66666667%}.col-l-pull-4{right:33.33333333%}.col-l-pull-3{right:25%}.col-l-pull-2{right:16.66666667%}.col-l-pull-1{right:8.33333333%}.col-l-pull-0{right:auto}.col-l-push-12{left:100%}.col-l-push-11{left:91.66666667%}.col-l-push-10{left:83.33333333%}.col-l-push-9{left:75%}.col-l-push-8{left:66.66666667%}.col-l-push-7{left:58.33333333%}.col-l-push-6{left:50%}.col-l-push-5{left:41.66666667%}.col-l-push-4{left:33.33333333%}.col-l-push-3{left:25%}.col-l-push-2{left:16.66666667%}.col-l-push-1{left:8.33333333%}.col-l-push-0{left:auto}.col-l-offset-12{margin-left:100%}.col-l-offset-11{margin-left:91.66666667%}.col-l-offset-10{margin-left:83.33333333%}.col-l-offset-9{margin-left:75%}.col-l-offset-8{margin-left:66.66666667%}.col-l-offset-7{margin-left:58.33333333%}.col-l-offset-6{margin-left:50%}.col-l-offset-5{margin-left:41.66666667%}.col-l-offset-4{margin-left:33.33333333%}.col-l-offset-3{margin-left:25%}.col-l-offset-2{margin-left:16.66666667%}.col-l-offset-1{margin-left:8.33333333%}.col-l-offset-0{margin-left:0}}@media all and (min-width:1440px){.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9{float:left}.col-xl-12{width:100%}.col-xl-11{width:91.66666667%}.col-xl-10{width:83.33333333%}.col-xl-9{width:75%}.col-xl-8{width:66.66666667%}.col-xl-7{width:58.33333333%}.col-xl-6{width:50%}.col-xl-5{width:41.66666667%}.col-xl-4{width:33.33333333%}.col-xl-3{width:25%}.col-xl-2{width:16.66666667%}.col-xl-1{width:8.33333333%}.col-xl-pull-12{right:100%}.col-xl-pull-11{right:91.66666667%}.col-xl-pull-10{right:83.33333333%}.col-xl-pull-9{right:75%}.col-xl-pull-8{right:66.66666667%}.col-xl-pull-7{right:58.33333333%}.col-xl-pull-6{right:50%}.col-xl-pull-5{right:41.66666667%}.col-xl-pull-4{right:33.33333333%}.col-xl-pull-3{right:25%}.col-xl-pull-2{right:16.66666667%}.col-xl-pull-1{right:8.33333333%}.col-xl-pull-0{right:auto}.col-xl-push-12{left:100%}.col-xl-push-11{left:91.66666667%}.col-xl-push-10{left:83.33333333%}.col-xl-push-9{left:75%}.col-xl-push-8{left:66.66666667%}.col-xl-push-7{left:58.33333333%}.col-xl-push-6{left:50%}.col-xl-push-5{left:41.66666667%}.col-xl-push-4{left:33.33333333%}.col-xl-push-3{left:25%}.col-xl-push-2{left:16.66666667%}.col-xl-push-1{left:8.33333333%}.col-xl-push-0{left:auto}.col-xl-offset-12{margin-left:100%}.col-xl-offset-11{margin-left:91.66666667%}.col-xl-offset-10{margin-left:83.33333333%}.col-xl-offset-9{margin-left:75%}.col-xl-offset-8{margin-left:66.66666667%}.col-xl-offset-7{margin-left:58.33333333%}.col-xl-offset-6{margin-left:50%}.col-xl-offset-5{margin-left:41.66666667%}.col-xl-offset-4{margin-left:33.33333333%}.col-xl-offset-3{margin-left:25%}.col-xl-offset-2{margin-left:16.66666667%}.col-xl-offset-1{margin-left:8.33333333%}.col-xl-offset-0{margin-left:0}}@media all and (max-width:767px){.abs-clearer-mobile:after,.nav-bar:after{clear:both;content:'';display:table}.list-definition>dt{float:none}.list-definition>dd{margin-left:0}.form-row .form-label{text-align:left}.form-row .form-label.required:after{position:static}.nav{padding-bottom:0;padding-left:0;padding-right:0}.nav-bar-outer-actions{margin-top:0}.nav-bar{display:block;margin-bottom:0;margin-left:auto;margin-right:auto;width:30.9rem}.nav-bar:before{display:none}.nav-bar>li{float:left;min-height:9rem}.nav-bar>li:after{display:none}.nav-bar>li:nth-child(4n){clear:both}.nav-bar a{line-height:1.4}.tooltip{display:none!important}.readiness-check-content{margin-right:2rem}.readiness-check-side{padding:2rem 0;position:static}.form-el-insider,.form-el-insider-wrap,.page-web-configuration .form-el-insider-input,.page-web-configuration .form-el-insider-input .form-el-input{display:block;width:100%}}@media all and (max-width:479px){.nav-bar{width:23.175rem}.nav-bar>li{width:7.725rem}.nav .btn-group .btn-wrap-try-again,.nav-bar-outer-actions .btn-wrap-try-again{clear:both;display:block;float:none;margin-left:auto;margin-right:auto;margin-top:1rem;padding-top:1rem}}
diff --git a/setup/view/magento/setup/navigation/side-menu.phtml b/setup/view/magento/setup/navigation/side-menu.phtml
index d41b306a75f..58d12a4de44 100644
--- a/setup/view/magento/setup/navigation/side-menu.phtml
+++ b/setup/view/magento/setup/navigation/side-menu.phtml
@@ -39,7 +39,7 @@
                 <span>Extension Manager</span>
             </a>
         </li>
-        <li class="item-component level-0"   ng-class="{_active: $state.current.type === 'module'}">
+        <li class="item-module level-0"   ng-class="{_active: $state.current.type === 'module'}">
             <a href="" ui-sref="root.module">
                 <span>Module Manager</span>
             </a>
-- 
GitLab


From 9d0befb24b4dd81f1568155b23ec9451fea290b8 Mon Sep 17 00:00:00 2001
From: Jeroen van Leusden <jeroen@h-o.nl>
Date: Fri, 13 Oct 2017 13:46:00 +0200
Subject: [PATCH 015/380] Translate order getCreatedAtFormatted() to store
 locale

---
 app/code/Magento/Sales/Model/Order.php        | 20 +++++++++--
 .../Sales/Test/Unit/Model/OrderTest.php       | 34 ++++++++++++++++++-
 2 files changed, 51 insertions(+), 3 deletions(-)

diff --git a/app/code/Magento/Sales/Model/Order.php b/app/code/Magento/Sales/Model/Order.php
index 250aa510eaf..50497e8d47b 100644
--- a/app/code/Magento/Sales/Model/Order.php
+++ b/app/code/Magento/Sales/Model/Order.php
@@ -7,6 +7,8 @@ namespace Magento\Sales\Model;
 
 use Magento\Directory\Model\Currency;
 use Magento\Framework\Api\AttributeValueFactory;
+use Magento\Framework\App\ObjectManager;
+use Magento\Framework\Locale\ResolverInterface;
 use Magento\Framework\Pricing\PriceCurrencyInterface;
 use Magento\Sales\Api\Data\OrderInterface;
 use Magento\Sales\Api\Data\OrderStatusHistoryInterface;
@@ -212,6 +214,11 @@ class Order extends AbstractModel implements EntityInterface, OrderInterface
      */
     protected $_currencyFactory;
 
+    /**
+     * @var \Magento\Eav\Model\Config
+     */
+    private $_eavConfig;
+
     /**
      * @var \Magento\Sales\Model\Order\Status\HistoryFactory
      */
@@ -267,6 +274,11 @@ class Order extends AbstractModel implements EntityInterface, OrderInterface
      */
     protected $timezone;
 
+    /**
+     * @var ResolverInterface
+     */
+    private $localeResolver;
+
     /**
      * @param \Magento\Framework\Model\Context $context
      * @param \Magento\Framework\Registry $registry
@@ -295,6 +307,7 @@ class Order extends AbstractModel implements EntityInterface, OrderInterface
      * @param \Magento\Framework\Model\ResourceModel\AbstractResource $resource
      * @param \Magento\Framework\Data\Collection\AbstractDb $resourceCollection
      * @param array $data
+     * @param ResolverInterface $localeResolver
      * @SuppressWarnings(PHPMD.ExcessiveParameterList)
      */
     public function __construct(
@@ -324,7 +337,8 @@ class Order extends AbstractModel implements EntityInterface, OrderInterface
         \Magento\Catalog\Model\ResourceModel\Product\CollectionFactory $productListFactory,
         \Magento\Framework\Model\ResourceModel\AbstractResource $resource = null,
         \Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null,
-        array $data = []
+        array $data = [],
+        ResolverInterface $localeResolver = null
     ) {
         $this->_storeManager = $storeManager;
         $this->_orderConfig = $orderConfig;
@@ -346,6 +360,8 @@ class Order extends AbstractModel implements EntityInterface, OrderInterface
         $this->_trackCollectionFactory = $trackCollectionFactory;
         $this->salesOrderCollectionFactory = $salesOrderCollectionFactory;
         $this->priceCurrency = $priceCurrency;
+        $this->localeResolver = $localeResolver ?: ObjectManager::getInstance()->get(ResolverInterface::class);
+
         parent::__construct(
             $context,
             $registry,
@@ -1830,7 +1846,7 @@ class Order extends AbstractModel implements EntityInterface, OrderInterface
             new \DateTime($this->getCreatedAt()),
             $format,
             $format,
-            null,
+            $this->localeResolver->getDefaultLocale(),
             $this->timezone->getConfigTimezone('store', $this->getStore())
         );
     }
diff --git a/app/code/Magento/Sales/Test/Unit/Model/OrderTest.php b/app/code/Magento/Sales/Test/Unit/Model/OrderTest.php
index dab92632426..fb197063875 100644
--- a/app/code/Magento/Sales/Test/Unit/Model/OrderTest.php
+++ b/app/code/Magento/Sales/Test/Unit/Model/OrderTest.php
@@ -7,6 +7,8 @@ namespace Magento\Sales\Test\Unit\Model;
 
 use Magento\Catalog\Api\Data\ProductInterface;
 use Magento\Catalog\Model\ResourceModel\Product\CollectionFactory as ProductCollectionFactory;
+use Magento\Framework\Locale\ResolverInterface;
+use Magento\Framework\Stdlib\DateTime\TimezoneInterface;
 use Magento\Sales\Api\Data\OrderInterface;
 use Magento\Sales\Model\Order;
 use Magento\Sales\Model\ResourceModel\Order\Status\History\CollectionFactory as HistoryCollectionFactory;
@@ -73,6 +75,16 @@ class OrderTest extends \PHPUnit\Framework\TestCase
      */
     protected $productCollectionFactoryMock;
 
+    /**
+     * @var ResolverInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $localeResolver;
+
+    /**
+     * @var TimezoneInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $timezone;
+
     protected function setUp()
     {
         $helper = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
@@ -124,6 +136,8 @@ class OrderTest extends \PHPUnit\Framework\TestCase
             true,
             ['round']
         );
+        $this->localeResolver = $this->createMock(ResolverInterface::class);
+        $this->timezone = $this->createMock(TimezoneInterface::class);
         $this->incrementId = '#00000001';
         $this->eventManager = $this->createMock(\Magento\Framework\Event\Manager::class);
         $context = $this->createPartialMock(\Magento\Framework\Model\Context::class, ['getEventDispatcher']);
@@ -138,7 +152,9 @@ class OrderTest extends \PHPUnit\Framework\TestCase
                 'historyCollectionFactory' => $this->historyCollectionFactoryMock,
                 'salesOrderCollectionFactory' => $this->salesOrderCollectionFactoryMock,
                 'priceCurrency' => $this->priceCurrency,
-                'productListFactory' => $this->productCollectionFactoryMock
+                'productListFactory' => $this->productCollectionFactoryMock,
+                'localeResolver' => $this->localeResolver,
+                'timezone' => $this->timezone,
             ]
         );
     }
@@ -1044,6 +1060,22 @@ class OrderTest extends \PHPUnit\Framework\TestCase
         );
     }
 
+    public function testGetCreatedAtFormattedUsesCorrectLocale()
+    {
+        $localeCode = 'nl_NL';
+
+        $this->localeResolver->expects($this->once())->method('getDefaultLocale')->willReturn($localeCode);
+        $this->timezone->expects($this->once())->method('formatDateTime')
+            ->with(
+                $this->anything(),
+                $this->anything(),
+                $this->anything(),
+                $localeCode
+            );
+
+        $this->order->getCreatedAtFormatted(\IntlDateFormatter::SHORT);
+    }
+
     public function notInvoicingStatesProvider()
     {
         return [
-- 
GitLab


From 1d998f9c45856497332daddd930786ee42d458cb Mon Sep 17 00:00:00 2001
From: Mayank <mayankz@emiprotechnologies.com>
Date: Fri, 13 Oct 2017 18:19:11 +0530
Subject: [PATCH 016/380] Magento 2.2.0 Product Repeat Isuue after filter on
 category listing page.Issue : #11139

---
 .../Catalog/Block/Product/ProductList/Toolbar.php        | 9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/app/code/Magento/Catalog/Block/Product/ProductList/Toolbar.php b/app/code/Magento/Catalog/Block/Product/ProductList/Toolbar.php
index f461b525152..46080ab5c33 100644
--- a/app/code/Magento/Catalog/Block/Product/ProductList/Toolbar.php
+++ b/app/code/Magento/Catalog/Block/Product/ProductList/Toolbar.php
@@ -192,7 +192,14 @@ class Toolbar extends \Magento\Framework\View\Element\Template
             $this->_collection->setPageSize($limit);
         }
         if ($this->getCurrentOrder()) {
-            $this->_collection->setOrder($this->getCurrentOrder(), $this->getCurrentDirection());
+            if (($this->getCurrentOrder()) == 'position') {
+                $this->_collection->addAttributeToSort(
+                    $this->getCurrentOrder(),
+                    $this->getCurrentDirection()
+                )->addAttributeToSort('entity_id', $this->getCurrentDirection());
+            } else {
+                $this->_collection->setOrder($this->getCurrentOrder(), $this->getCurrentDirection());
+            }
         }
         return $this;
     }
-- 
GitLab


From 3c3168bdfbe43379e485ff91e708a045dd767e67 Mon Sep 17 00:00:00 2001
From: marina <marina.gociu@gmail.com>
Date: Fri, 13 Oct 2017 20:43:15 +0300
Subject: [PATCH 017/380] Update scheduledGenerateSitemaps unit test

---
 .../Sitemap/Test/Unit/Model/ObserverTest.php  | 56 +++++++++++++++++--
 1 file changed, 51 insertions(+), 5 deletions(-)

diff --git a/app/code/Magento/Sitemap/Test/Unit/Model/ObserverTest.php b/app/code/Magento/Sitemap/Test/Unit/Model/ObserverTest.php
index 92e6f4e2e22..904360ffb38 100644
--- a/app/code/Magento/Sitemap/Test/Unit/Model/ObserverTest.php
+++ b/app/code/Magento/Sitemap/Test/Unit/Model/ObserverTest.php
@@ -96,11 +96,11 @@ class ObserverTest extends \PHPUnit\Framework\TestCase
         );
     }
 
-    /**
-     * @expectedException \Exception
-     */
-    public function testScheduledGenerateSitemapsThrowsException()
+    public function testScheduledGenerateSitemapsSendsExceptionEmail()
     {
+        $exception = 'Sitemap Exception';
+        $transport = $this->createMock(\Magento\Framework\Mail\TransportInterface::class);
+
         $this->scopeConfigMock->expects($this->once())->method('isSetFlag')->willReturn(true);
 
         $this->collectionFactoryMock->expects($this->once())
@@ -111,7 +111,53 @@ class ObserverTest extends \PHPUnit\Framework\TestCase
             ->method('getIterator')
             ->willReturn(new \ArrayIterator([$this->sitemapMock]));
 
-        $this->sitemapMock->expects($this->once())->method('generateXml')->willThrowException(new \Exception());
+        $this->sitemapMock->expects($this->once())->method('generateXml')->willThrowException(new \Exception($exception));
+
+        $this->scopeConfigMock->expects($this->at(1))
+            ->method('getValue')
+            ->with(
+                \Magento\Sitemap\Model\Observer::XML_PATH_ERROR_RECIPIENT,
+                \Magento\Store\Model\ScopeInterface::SCOPE_STORE
+            )
+            ->willReturn('error-recipient@example.com');
+
+        $this->inlineTranslationMock->expects($this->once())
+            ->method('suspend');
+
+        $this->transportBuilderMock->expects($this->once())
+            ->method('setTemplateIdentifier')
+            ->will($this->returnSelf());
+
+        $this->transportBuilderMock->expects($this->once())
+            ->method('setTemplateOptions')
+            ->with([
+                'area' => \Magento\Backend\App\Area\FrontNameResolver::AREA_CODE,
+                'store' => \Magento\Store\Model\Store::DEFAULT_STORE_ID,
+            ])
+            ->will($this->returnSelf());
+
+        $this->transportBuilderMock->expects($this->once())
+            ->method('setTemplateVars')
+            ->with(['warnings' => $exception])
+            ->will($this->returnSelf());
+
+        $this->transportBuilderMock->expects($this->once())
+            ->method('setFrom')
+            ->will($this->returnSelf());
+
+        $this->transportBuilderMock->expects($this->once())
+            ->method('addTo')
+            ->will($this->returnSelf());
+
+        $this->transportBuilderMock->expects($this->once())
+            ->method('getTransport')
+            ->willReturn($transport);
+
+        $transport->expects($this->once())
+            ->method('sendMessage');
+
+        $this->inlineTranslationMock->expects($this->once())
+            ->method('resume');
 
         $this->observer->scheduledGenerateSitemaps();
     }
-- 
GitLab


From 86f1419e2a3ef386f1ebe3b68b23ab3050c2f7bb Mon Sep 17 00:00:00 2001
From: marina <marina.gociu@gmail.com>
Date: Sun, 15 Oct 2017 16:27:05 +0300
Subject: [PATCH 018/380] Fix code style

---
 app/code/Magento/Sitemap/Test/Unit/Model/ObserverTest.php | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/app/code/Magento/Sitemap/Test/Unit/Model/ObserverTest.php b/app/code/Magento/Sitemap/Test/Unit/Model/ObserverTest.php
index 904360ffb38..e099d5b9025 100644
--- a/app/code/Magento/Sitemap/Test/Unit/Model/ObserverTest.php
+++ b/app/code/Magento/Sitemap/Test/Unit/Model/ObserverTest.php
@@ -111,7 +111,9 @@ class ObserverTest extends \PHPUnit\Framework\TestCase
             ->method('getIterator')
             ->willReturn(new \ArrayIterator([$this->sitemapMock]));
 
-        $this->sitemapMock->expects($this->once())->method('generateXml')->willThrowException(new \Exception($exception));
+        $this->sitemapMock->expects($this->once())
+            ->method('generateXml')
+            ->willThrowException(new \Exception($exception));
 
         $this->scopeConfigMock->expects($this->at(1))
             ->method('getValue')
-- 
GitLab


From 16590f018ab3c110d6999ebb467cd18592287f1c Mon Sep 17 00:00:00 2001
From: marina <marina.gociu@gmail.com>
Date: Sun, 15 Oct 2017 17:27:25 +0300
Subject: [PATCH 019/380] Add suppress warning for coupling between objects

---
 app/code/Magento/Sitemap/Test/Unit/Model/ObserverTest.php | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/app/code/Magento/Sitemap/Test/Unit/Model/ObserverTest.php b/app/code/Magento/Sitemap/Test/Unit/Model/ObserverTest.php
index e099d5b9025..ac88f23ff9d 100644
--- a/app/code/Magento/Sitemap/Test/Unit/Model/ObserverTest.php
+++ b/app/code/Magento/Sitemap/Test/Unit/Model/ObserverTest.php
@@ -7,6 +7,10 @@ namespace Magento\Sitemap\Test\Unit\Model;
 
 use Magento\Framework\TestFramework\Unit\Helper\ObjectManager;
 
+/**
+ * Class ObserverTest
+ * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
+ */
 class ObserverTest extends \PHPUnit\Framework\TestCase
 {
     /**
-- 
GitLab


From 42072dd20ac633ce678946586de6d73b83e9a43b Mon Sep 17 00:00:00 2001
From: Marius Grad <grad_marius@yahoo.com>
Date: Sun, 15 Oct 2017 21:21:59 +0300
Subject: [PATCH 020/380] solve the toolbar problem when this is removed from
 the layout, code format on construcor of the product list block class

---
 .../Catalog/Block/Product/ListProduct.php     | 74 ++++++++++++++-----
 1 file changed, 54 insertions(+), 20 deletions(-)

diff --git a/app/code/Magento/Catalog/Block/Product/ListProduct.php b/app/code/Magento/Catalog/Block/Product/ListProduct.php
index 7289aa85ea0..83065e81c7c 100644
--- a/app/code/Magento/Catalog/Block/Product/ListProduct.php
+++ b/app/code/Magento/Catalog/Block/Product/ListProduct.php
@@ -7,13 +7,18 @@
 namespace Magento\Catalog\Block\Product;
 
 use Magento\Catalog\Api\CategoryRepositoryInterface;
+use Magento\Catalog\Block\Product\Context;
 use Magento\Catalog\Block\Product\ProductList\Toolbar;
+use Magento\Catalog\Helper\Product\ProductList;
 use Magento\Catalog\Model\Category;
+use Magento\Catalog\Model\Layer\Resolver;
 use Magento\Catalog\Model\Product;
 use Magento\Catalog\Model\ResourceModel\Product\Collection;
 use Magento\Eav\Model\Entity\Collection\AbstractCollection;
+use Magento\Framework\Data\Helper\PostHelper;
 use Magento\Framework\DataObject\IdentityInterface;
 use Magento\Framework\Exception\NoSuchEntityException;
+use Magento\Framework\Url\Helper\Data;
 
 /**
  * Product list
@@ -33,7 +38,7 @@ class ListProduct extends AbstractProduct implements IdentityInterface
     /**
      * Product Collection
      *
-     * @var AbstractCollection
+     * @var \Magento\Eav\Model\Entity\Collection\AbstractCollection
      */
     protected $_productCollection;
 
@@ -55,30 +60,39 @@ class ListProduct extends AbstractProduct implements IdentityInterface
     protected $urlHelper;
 
     /**
-     * @var CategoryRepositoryInterface
+     * @var \Magento\Catalog\Api\CategoryRepositoryInterface
      */
     protected $categoryRepository;
 
     /**
-     * @param Context $context
+     * @var \Magento\Catalog\Helper\Product\ProductList
+     */
+    protected $productListHelper;
+
+    /**
+     * 
+     * @param \Magento\Catalog\Helper\Product\ProductList $productListHelper
+     * @param \Magento\Catalog\Block\Product\Context $context
      * @param \Magento\Framework\Data\Helper\PostHelper $postDataHelper
      * @param \Magento\Catalog\Model\Layer\Resolver $layerResolver
-     * @param CategoryRepositoryInterface $categoryRepository
+     * @param \Magento\Catalog\Api\CategoryRepositoryInterface $categoryRepository
      * @param \Magento\Framework\Url\Helper\Data $urlHelper
      * @param array $data
      */
     public function __construct(
-        \Magento\Catalog\Block\Product\Context $context,
-        \Magento\Framework\Data\Helper\PostHelper $postDataHelper,
-        \Magento\Catalog\Model\Layer\Resolver $layerResolver,
+        ProductList $productListHelper,
+        Context $context,
+        PostHelper $postDataHelper,
+        Resolver $layerResolver,
         CategoryRepositoryInterface $categoryRepository,
-        \Magento\Framework\Url\Helper\Data $urlHelper,
+        Data $urlHelper,
         array $data = []
     ) {
         $this->_catalogLayer = $layerResolver->get();
         $this->_postDataHelper = $postDataHelper;
         $this->categoryRepository = $categoryRepository;
         $this->urlHelper = $urlHelper;
+        $this->productListHelper = $productListHelper;
         parent::__construct(
             $context,
             $data
@@ -137,7 +151,12 @@ class ListProduct extends AbstractProduct implements IdentityInterface
      */
     public function getMode()
     {
-        return $this->getChildBlock('toolbar')->getCurrentMode();
+        if ($this->getChildBlock('toolbar')) {
+            return $this->getChildBlock('toolbar')->getCurrentMode();
+        }
+        // if toolbar is removed from layout, use the general configuration for product list mode
+        // - config path catalog/frontend/list_mode
+        return $this->productListHelper->getDefaultViewMode($this->getModes());
     }
 
     /**
@@ -148,27 +167,43 @@ class ListProduct extends AbstractProduct implements IdentityInterface
     protected function _beforeToHtml()
     {
         $collection = $this->_getProductCollection();
-        $this->configureToolbar($this->getToolbarBlock(), $collection);
+
+        $this->addToobarBlock($collection);
+
         $collection->load();
 
         return parent::_beforeToHtml();
     }
 
+    /**
+     * Add toolbar block to product listing
+     *
+     * @param \Magento\Catalog\Model\ResourceModel\Product\Collection $collection
+     */
+    private function addToobarBlock(Collection $collection)
+    {
+        $toolbar = $this->getToolbarBlock();
+        if ($toolbar) {
+            $this->configureToolbar($toolbar, $collection);
+        }
+    }
+
     /**
      * Retrieve Toolbar block
      *
-     * @return Toolbar
+     * @return Toolbar|false
      */
     public function getToolbarBlock()
     {
+        $block = false;
+
         $blockName = $this->getToolbarBlockName();
-        if ($blockName) {
-            $block = $this->getLayout()->getBlock($blockName);
-            if ($block) {
-                return $block;
-            }
+        if (!$blockName) {
+            return $block;
         }
-        $block = $this->getLayout()->createBlock($this->_defaultToolbarBlock, uniqid(microtime()));
+
+        $block = $this->getLayout()->getBlock($blockName);
+
         return $block;
     }
 
@@ -386,9 +421,8 @@ class ListProduct extends AbstractProduct implements IdentityInterface
         if ($origCategory) {
             $layer->setCurrentCategory($origCategory);
         }
-
-        $toolbar = $this->getToolbarBlock();
-        $this->configureToolbar($toolbar, $collection);
+        
+        $this->addToobarBlock($collection);
 
         $this->_eventManager->dispatch(
             'catalog_block_product_list_collection',
-- 
GitLab


From 30c48813ed20ffb24192ef79b6f8ea2b3e6a0ba7 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Adri=C3=A1n=20Mart=C3=ADnez?=
 <adrian.martinez@interactiv4.com>
Date: Sun, 15 Oct 2017 01:03:56 +0200
Subject: [PATCH 021/380] REST API - Only associate automatically product with
 all websites when creating product in All Store Views scope

---
 app/code/Magento/Catalog/Model/ProductRepository.php | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/app/code/Magento/Catalog/Model/ProductRepository.php b/app/code/Magento/Catalog/Model/ProductRepository.php
index 4a72539e982..f7545ee1c10 100644
--- a/app/code/Magento/Catalog/Model/ProductRepository.php
+++ b/app/code/Magento/Catalog/Model/ProductRepository.php
@@ -340,16 +340,17 @@ class ProductRepository implements \Magento\Catalog\Api\ProductRepositoryInterfa
         foreach ($productData as $key => $value) {
             $product->setData($key, $value);
         }
-        $this->assignProductToWebsites($product);
+        $this->assignProductToWebsites($product, $createNew);
 
         return $product;
     }
 
     /**
      * @param \Magento\Catalog\Model\Product $product
+     * @param bool $createNew
      * @return void
      */
-    private function assignProductToWebsites(\Magento\Catalog\Model\Product $product)
+    private function assignProductToWebsites(\Magento\Catalog\Model\Product $product, $createNew)
     {
         $websiteIds = $product->getWebsiteIds();
 
@@ -362,7 +363,7 @@ class ProductRepository implements \Magento\Catalog\Api\ProductRepositoryInterfa
             );
         }
 
-        if ($this->storeManager->getStore(true)->getCode() == \Magento\Store\Model\Store::ADMIN_CODE) {
+        if ($createNew && $this->storeManager->getStore(true)->getCode() == \Magento\Store\Model\Store::ADMIN_CODE) {
             $websiteIds = array_keys($this->storeManager->getWebsites());
         }
 
-- 
GitLab


From 906daf673c4dd55a7f0452fb1b58797abf217cc9 Mon Sep 17 00:00:00 2001
From: Mayank <mayankzalavadia@gmail.com>
Date: Mon, 16 Oct 2017 10:14:36 +0530
Subject: [PATCH 022/380] Redundant round brackets removed from Magento 2.2.0
 layer navigation return no products when 2 filters selected.

---
 app/code/Magento/Catalog/Block/Product/ProductList/Toolbar.php | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/app/code/Magento/Catalog/Block/Product/ProductList/Toolbar.php b/app/code/Magento/Catalog/Block/Product/ProductList/Toolbar.php
index 46080ab5c33..df98969c262 100644
--- a/app/code/Magento/Catalog/Block/Product/ProductList/Toolbar.php
+++ b/app/code/Magento/Catalog/Block/Product/ProductList/Toolbar.php
@@ -192,7 +192,7 @@ class Toolbar extends \Magento\Framework\View\Element\Template
             $this->_collection->setPageSize($limit);
         }
         if ($this->getCurrentOrder()) {
-            if (($this->getCurrentOrder()) == 'position') {
+            if ($this->getCurrentOrder() == 'position') {
                 $this->_collection->addAttributeToSort(
                     $this->getCurrentOrder(),
                     $this->getCurrentDirection()
-- 
GitLab


From 9dbe44493b92407c9b02217966224cb021175c48 Mon Sep 17 00:00:00 2001
From: Marius Grad <grad_marius@yahoo.com>
Date: Mon, 16 Oct 2017 08:49:07 +0300
Subject: [PATCH 023/380] Remove the product list helper from constructor for
 backward compatibility. Use the default toolbar to get current listing mode.
 Refactor the code.

---
 .../Catalog/Block/Product/ListProduct.php     | 74 ++++++++++++-------
 1 file changed, 47 insertions(+), 27 deletions(-)

diff --git a/app/code/Magento/Catalog/Block/Product/ListProduct.php b/app/code/Magento/Catalog/Block/Product/ListProduct.php
index 83065e81c7c..0b197f93d4d 100644
--- a/app/code/Magento/Catalog/Block/Product/ListProduct.php
+++ b/app/code/Magento/Catalog/Block/Product/ListProduct.php
@@ -9,7 +9,6 @@ namespace Magento\Catalog\Block\Product;
 use Magento\Catalog\Api\CategoryRepositoryInterface;
 use Magento\Catalog\Block\Product\Context;
 use Magento\Catalog\Block\Product\ProductList\Toolbar;
-use Magento\Catalog\Helper\Product\ProductList;
 use Magento\Catalog\Model\Category;
 use Magento\Catalog\Model\Layer\Resolver;
 use Magento\Catalog\Model\Product;
@@ -65,13 +64,6 @@ class ListProduct extends AbstractProduct implements IdentityInterface
     protected $categoryRepository;
 
     /**
-     * @var \Magento\Catalog\Helper\Product\ProductList
-     */
-    protected $productListHelper;
-
-    /**
-     * 
-     * @param \Magento\Catalog\Helper\Product\ProductList $productListHelper
      * @param \Magento\Catalog\Block\Product\Context $context
      * @param \Magento\Framework\Data\Helper\PostHelper $postDataHelper
      * @param \Magento\Catalog\Model\Layer\Resolver $layerResolver
@@ -80,7 +72,6 @@ class ListProduct extends AbstractProduct implements IdentityInterface
      * @param array $data
      */
     public function __construct(
-        ProductList $productListHelper,
         Context $context,
         PostHelper $postDataHelper,
         Resolver $layerResolver,
@@ -92,7 +83,6 @@ class ListProduct extends AbstractProduct implements IdentityInterface
         $this->_postDataHelper = $postDataHelper;
         $this->categoryRepository = $categoryRepository;
         $this->urlHelper = $urlHelper;
-        $this->productListHelper = $productListHelper;
         parent::__construct(
             $context,
             $data
@@ -154,9 +144,31 @@ class ListProduct extends AbstractProduct implements IdentityInterface
         if ($this->getChildBlock('toolbar')) {
             return $this->getChildBlock('toolbar')->getCurrentMode();
         }
-        // if toolbar is removed from layout, use the general configuration for product list mode
-        // - config path catalog/frontend/list_mode
-        return $this->productListHelper->getDefaultViewMode($this->getModes());
+
+        return $this->getDefaultListingMode();
+    }
+
+    /**
+     * Get listing mode for products if toolbar is removed from layout.
+     * Use the general configuration for product list mode from config path catalog/frontend/list_mode as default value
+    // or mode data from block declaration from layout.
+     *
+     * @return string
+     */
+    private function getDefaultListingMode()
+    {
+        // default Toolbar when the toolbar layout is not used
+        $defaultToolbar = $this->getToolbarBlock();
+        $availableModes = $defaultToolbar->getModes();
+
+        // layout config mode
+        $mode = $this->getData('mode');
+        if (!$mode && !isset($availableModes[$mode])) {
+            // default config mode
+            $mode = $defaultToolbar->getCurrentMode();
+        }
+
+        return $mode;
     }
 
     /**
@@ -168,7 +180,7 @@ class ListProduct extends AbstractProduct implements IdentityInterface
     {
         $collection = $this->_getProductCollection();
 
-        $this->addToobarBlock($collection);
+        $this->addToolbarBlock($collection);
 
         $collection->load();
 
@@ -176,33 +188,41 @@ class ListProduct extends AbstractProduct implements IdentityInterface
     }
 
     /**
-     * Add toolbar block to product listing
+     * Add toolbar block from product listing layout
      *
      * @param \Magento\Catalog\Model\ResourceModel\Product\Collection $collection
      */
-    private function addToobarBlock(Collection $collection)
+    private function addToolbarBlock(Collection $collection)
     {
-        $toolbar = $this->getToolbarBlock();
-        if ($toolbar) {
-            $this->configureToolbar($toolbar, $collection);
+        $toolbarLayout = false;
+
+        $blockName = $this->getToolbarBlockName();
+
+        if ($blockName) {
+            $toolbarLayout = $this->getLayout()->getBlock($blockName);
+        }
+
+        if ($toolbarLayout) {
+            $this->configureToolbar($toolbarLayout, $collection);
         }
     }
 
     /**
-     * Retrieve Toolbar block
+     * Retrieve Toolbar block from layout or a default Toolbar
      *
-     * @return Toolbar|false
+     * @return Toolbar
      */
     public function getToolbarBlock()
     {
-        $block = false;
-
         $blockName = $this->getToolbarBlockName();
-        if (!$blockName) {
-            return $block;
+
+        if ($blockName) {
+            $block = $this->getLayout()->getBlock($blockName);
         }
 
-        $block = $this->getLayout()->getBlock($blockName);
+        if (!$block) {
+            $block = $this->getLayout()->createBlock($this->_defaultToolbarBlock, uniqid(microtime()));
+        }
 
         return $block;
     }
@@ -422,7 +442,7 @@ class ListProduct extends AbstractProduct implements IdentityInterface
             $layer->setCurrentCategory($origCategory);
         }
         
-        $this->addToobarBlock($collection);
+        $this->addToolbarBlock($collection);
 
         $this->_eventManager->dispatch(
             'catalog_block_product_list_collection',
-- 
GitLab


From 49fdfaee640a79ef6278e9df247a07217d9d597c Mon Sep 17 00:00:00 2001
From: Marius Grad <grad_marius@yahoo.com>
Date: Mon, 16 Oct 2017 10:56:16 +0300
Subject: [PATCH 024/380] refactor the code on get toolbar block from layout,
 fix condition on using the mode layout configuration

---
 .../Catalog/Block/Product/ListProduct.php     | 35 ++++++++++++-------
 1 file changed, 22 insertions(+), 13 deletions(-)

diff --git a/app/code/Magento/Catalog/Block/Product/ListProduct.php b/app/code/Magento/Catalog/Block/Product/ListProduct.php
index 0b197f93d4d..abcc1063376 100644
--- a/app/code/Magento/Catalog/Block/Product/ListProduct.php
+++ b/app/code/Magento/Catalog/Block/Product/ListProduct.php
@@ -163,7 +163,8 @@ class ListProduct extends AbstractProduct implements IdentityInterface
 
         // layout config mode
         $mode = $this->getData('mode');
-        if (!$mode && !isset($availableModes[$mode])) {
+
+        if (!$mode || !isset($availableModes[$mode])) {
             // default config mode
             $mode = $defaultToolbar->getCurrentMode();
         }
@@ -194,13 +195,7 @@ class ListProduct extends AbstractProduct implements IdentityInterface
      */
     private function addToolbarBlock(Collection $collection)
     {
-        $toolbarLayout = false;
-
-        $blockName = $this->getToolbarBlockName();
-
-        if ($blockName) {
-            $toolbarLayout = $this->getLayout()->getBlock($blockName);
-        }
+        $toolbarLayout = $this->getToolbarFromLayout();
 
         if ($toolbarLayout) {
             $this->configureToolbar($toolbarLayout, $collection);
@@ -214,11 +209,7 @@ class ListProduct extends AbstractProduct implements IdentityInterface
      */
     public function getToolbarBlock()
     {
-        $blockName = $this->getToolbarBlockName();
-
-        if ($blockName) {
-            $block = $this->getLayout()->getBlock($blockName);
-        }
+        $block = $this->getToolbarFromLayout();
 
         if (!$block) {
             $block = $this->getLayout()->createBlock($this->_defaultToolbarBlock, uniqid(microtime()));
@@ -227,6 +218,24 @@ class ListProduct extends AbstractProduct implements IdentityInterface
         return $block;
     }
 
+    /**
+     * Get toolbar block from layout
+     *
+     * @return bool|Toolbar
+     */
+    private function getToolbarFromLayout()
+    {
+        $blockName = $this->getToolbarBlockName();
+
+        $toolbarLayout = false;
+
+        if ($blockName) {
+            $toolbarLayout = $this->getLayout()->getBlock($blockName);
+        }
+
+        return $toolbarLayout;
+    }
+
     /**
      * Retrieve additional blocks html
      *
-- 
GitLab


From b58bc135d12135242139fa5cb550f44a2a1652cf Mon Sep 17 00:00:00 2001
From: joost-florijn-kega <joost.florijn@kega.nl>
Date: Mon, 16 Oct 2017 11:49:23 +0200
Subject: [PATCH 025/380] do the stock check on default level because the stock
 on website level isn't updated and should be ignored

Product's are linked to categories without notice of any website. The visual merchandiser shows to lowest price of in stock and active simples that are associated with the configurable. The stock check ignores the website scope so if a simple is in stock on the website level but out of stock on default level it should been ignored to determine the lowest price. This commit fixes that issue.
---
 .../ResourceModel/Product/StockStatusBaseSelectProcessor.php  | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/app/code/Magento/CatalogInventory/Model/ResourceModel/Product/StockStatusBaseSelectProcessor.php b/app/code/Magento/CatalogInventory/Model/ResourceModel/Product/StockStatusBaseSelectProcessor.php
index 9f89d380a8f..b80c26c53a7 100644
--- a/app/code/Magento/CatalogInventory/Model/ResourceModel/Product/StockStatusBaseSelectProcessor.php
+++ b/app/code/Magento/CatalogInventory/Model/ResourceModel/Product/StockStatusBaseSelectProcessor.php
@@ -56,7 +56,9 @@ class StockStatusBaseSelectProcessor implements BaseSelectProcessorInterface
                 ['stock' => $stockStatusTable],
                 sprintf('stock.product_id = %s.entity_id', BaseSelectProcessorInterface::PRODUCT_TABLE_ALIAS),
                 []
-            )->where('stock.stock_status = ?', Stock::STOCK_IN_STOCK);
+            )
+                ->where('stock.stock_status = ?', Stock::STOCK_IN_STOCK)
+                ->where('stock.website_id = ?', 0);
         }
 
         return $select;
-- 
GitLab


From b6ed2d9b31de64b234540abfd28f55485c4556bd Mon Sep 17 00:00:00 2001
From: Marius Grad <grad_marius@yahoo.com>
Date: Mon, 16 Oct 2017 13:03:51 +0300
Subject: [PATCH 026/380] Update the toolbar test with product list collection.
 The toolbar HTML depends on product collection. Because you can remove the
 toolbar from layout, there is no reason for parent class to add the product
 collection to default toolbar if the toolbar is never used. That is why the
 test toolbar coverage needs to include a product collection before checking
 the toolbar HTML.

---
 .../testsuite/Magento/Catalog/Block/Product/ListTest.php       | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/dev/tests/integration/testsuite/Magento/Catalog/Block/Product/ListTest.php b/dev/tests/integration/testsuite/Magento/Catalog/Block/Product/ListTest.php
index 17c0f451f90..43240824d43 100644
--- a/dev/tests/integration/testsuite/Magento/Catalog/Block/Product/ListTest.php
+++ b/dev/tests/integration/testsuite/Magento/Catalog/Block/Product/ListTest.php
@@ -62,6 +62,9 @@ class ListTest extends \PHPUnit\Framework\TestCase
         /* In order to initialize toolbar collection block toHtml should be called before toolbar toHtml */
         $this->assertEmpty($parent->toHtml(), 'Block HTML'); /* Template not specified */
         $this->assertEquals('grid', $parent->getMode(), 'Default Mode'); /* default mode */
+
+        /* In order to use toolbar html you need a collection to be set to toolbar block */
+        $parent->getToolbarBlock()->setCollection($parent->getLoadedProductCollection());
         $this->assertNotEmpty($parent->getToolbarHtml(), 'Toolbar HTML'); /* toolbar for one simple product */
     }
 
-- 
GitLab


From 9cd20c03f9c4f3d7dd79865addf8dac9aa6139db Mon Sep 17 00:00:00 2001
From: Marius Grad <grad_marius@yahoo.com>
Date: Mon, 16 Oct 2017 15:46:14 +0300
Subject: [PATCH 027/380] Update the toolbar coverage test to use the a layout
 toolbar declaration present in default layout. Remove the previews correction
 made because it's not solve the problem where is checking if the toolbar HTML
 is not empty.

---
 .../testsuite/Magento/Catalog/Block/Product/ListTest.php    | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/dev/tests/integration/testsuite/Magento/Catalog/Block/Product/ListTest.php b/dev/tests/integration/testsuite/Magento/Catalog/Block/Product/ListTest.php
index 43240824d43..8773256b857 100644
--- a/dev/tests/integration/testsuite/Magento/Catalog/Block/Product/ListTest.php
+++ b/dev/tests/integration/testsuite/Magento/Catalog/Block/Product/ListTest.php
@@ -55,6 +55,9 @@ class ListTest extends \PHPUnit\Framework\TestCase
         $parent = $this->_getLayout()->createBlock(\Magento\Catalog\Block\Product\ListProduct::class, 'parent');
 
         /* Prepare toolbar block */
+        $this->_getLayout()->createBlock(\Magento\Catalog\Block\Product\ProductList\Toolbar::class, 'product_list_toolbar');
+        $parent->setToolbarBlockName('product_list_toolbar');
+
         $toolbar = $parent->getToolbarBlock();
         $this->assertInstanceOf(\Magento\Catalog\Block\Product\ProductList\Toolbar::class, $toolbar, 'Default Toolbar');
 
@@ -62,9 +65,6 @@ class ListTest extends \PHPUnit\Framework\TestCase
         /* In order to initialize toolbar collection block toHtml should be called before toolbar toHtml */
         $this->assertEmpty($parent->toHtml(), 'Block HTML'); /* Template not specified */
         $this->assertEquals('grid', $parent->getMode(), 'Default Mode'); /* default mode */
-
-        /* In order to use toolbar html you need a collection to be set to toolbar block */
-        $parent->getToolbarBlock()->setCollection($parent->getLoadedProductCollection());
         $this->assertNotEmpty($parent->getToolbarHtml(), 'Toolbar HTML'); /* toolbar for one simple product */
     }
 
-- 
GitLab


From 2adefdff73c62d829d1969b3abc988992bd3da39 Mon Sep 17 00:00:00 2001
From: Marius Grad <grad_marius@yahoo.com>
Date: Mon, 16 Oct 2017 19:26:15 +0300
Subject: [PATCH 028/380] fix static line limit test

---
 .../testsuite/Magento/Catalog/Block/Product/ListTest.php       | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/dev/tests/integration/testsuite/Magento/Catalog/Block/Product/ListTest.php b/dev/tests/integration/testsuite/Magento/Catalog/Block/Product/ListTest.php
index 8773256b857..f68e509e4a8 100644
--- a/dev/tests/integration/testsuite/Magento/Catalog/Block/Product/ListTest.php
+++ b/dev/tests/integration/testsuite/Magento/Catalog/Block/Product/ListTest.php
@@ -55,7 +55,8 @@ class ListTest extends \PHPUnit\Framework\TestCase
         $parent = $this->_getLayout()->createBlock(\Magento\Catalog\Block\Product\ListProduct::class, 'parent');
 
         /* Prepare toolbar block */
-        $this->_getLayout()->createBlock(\Magento\Catalog\Block\Product\ProductList\Toolbar::class, 'product_list_toolbar');
+        $this->_getLayout()
+            ->createBlock(\Magento\Catalog\Block\Product\ProductList\Toolbar::class, 'product_list_toolbar');
         $parent->setToolbarBlockName('product_list_toolbar');
 
         $toolbar = $parent->getToolbarBlock();
-- 
GitLab


From ed52dc9b33ac855df73075334b26b657a87e2489 Mon Sep 17 00:00:00 2001
From: Todd Christensen <tchristensen@somethingdigital.com>
Date: Wed, 18 Oct 2017 18:20:47 -0700
Subject: [PATCH 029/380] Correct flat indexing with staging and > 500 cats.

Previously, the array was prefilled with entity_id values to ensure those categories
were indexed.  Unfortunately, when using row_id, it was using entity_ids.

When chunking at 500, this could cause an overlapping row to be processed twice (the
second time with missing non-static attributes), and cause a duplicate key error.
---
 .../Indexer/Category/Flat/AbstractAction.php  | 33 +++++++++++++++++--
 1 file changed, 31 insertions(+), 2 deletions(-)

diff --git a/app/code/Magento/Catalog/Model/Indexer/Category/Flat/AbstractAction.php b/app/code/Magento/Catalog/Model/Indexer/Category/Flat/AbstractAction.php
index 24d81f0054c..c5efbc61969 100644
--- a/app/code/Magento/Catalog/Model/Indexer/Category/Flat/AbstractAction.php
+++ b/app/code/Magento/Catalog/Model/Indexer/Category/Flat/AbstractAction.php
@@ -369,9 +369,11 @@ class AbstractAction
         }
         $values = [];
 
-        foreach ($entityIds as $entityId) {
-            $values[$entityId] = [];
+        $linkIds = $this->getLinkIds($entityIds);
+        foreach ($linkIds as $linkId) {
+            $values[$linkId] = [];
         }
+
         $attributes = $this->getAttributes();
         $attributesType = ['varchar', 'int', 'decimal', 'text', 'datetime'];
         foreach ($attributesType as $type) {
@@ -385,9 +387,36 @@ class AbstractAction
                 }
             }
         }
+
         return $values;
     }
 
+    /**
+     * Translate entity ids into link ids
+     *
+     * Used for rows with no EAV attributes set.
+     *
+     * @param array $entityIds
+     * @return array
+     */
+    private function getLinkIds(array $entityIds)
+    {
+        $linkField = $this->getCategoryMetadata()->getLinkField();
+        if ($linkField === 'entity_id') {
+            return $entityIds;
+        }
+
+        $select = $this->connection->select()->from(
+            ['e' => $this->connection->getTableName($this->getTableName('catalog_category_entity'))],
+            [$linkField]
+        )->where(
+            'e.entity_id IN (?)',
+            $entityIds
+        );
+
+        return $this->connection->fetchCol($select);
+    }
+
     /**
      * Return attribute values for given entities and store of specific attribute type
      *
-- 
GitLab


From 9380c95ba8a12eac0f57b92a682b932b1ceb6a1f Mon Sep 17 00:00:00 2001
From: Anton Evers <anton@eve.rs>
Date: Thu, 19 Oct 2017 13:14:58 +0600
Subject: [PATCH 030/380] Even existing credit memos should be refundable if
 their state is open

Credit memos can have the state open: `\Magento\Sales\Model\Order\Creditmemo::STATE_OPEN`.
This means that it is possible to have a creditmemo with an ID which still has to be refunded.
I'm creating a module that introduces a validation step for refund payments before the actual refund can take place. It uses the open state of credit memos to wait for approval and then refunds the creditmemo. Right now the credit memo is not refundable once it has an ID. I think this is incorrect in case of open credit memos.
---
 app/code/Magento/Sales/Model/Service/CreditmemoService.php | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/app/code/Magento/Sales/Model/Service/CreditmemoService.php b/app/code/Magento/Sales/Model/Service/CreditmemoService.php
index 2f08c26de90..c7541e6cb7e 100644
--- a/app/code/Magento/Sales/Model/Service/CreditmemoService.php
+++ b/app/code/Magento/Sales/Model/Service/CreditmemoService.php
@@ -195,7 +195,7 @@ class CreditmemoService implements \Magento\Sales\Api\CreditmemoManagementInterf
      */
     protected function validateForRefund(\Magento\Sales\Api\Data\CreditmemoInterface $creditmemo)
     {
-        if ($creditmemo->getId()) {
+        if ($creditmemo->getId() && $creditmemo->getState() !== \Magento\Sales\Model\Order\Creditmemo::STATE_OPEN) {
             throw new \Magento\Framework\Exception\LocalizedException(
                 __('We cannot register an existing credit memo.')
             );
-- 
GitLab


From 33aa293e2337101aac6250a9bdf9c93bf8af3377 Mon Sep 17 00:00:00 2001
From: marina <marina.gociu@gmail.com>
Date: Thu, 19 Oct 2017 18:38:43 +0300
Subject: [PATCH 031/380] Add price calculation improvement for product option
 value price

The price calculation relied on the getFinalPrice value, which if
called without the qty parameter will not consider tier prices.
This method was not updated when the price improvements have been
added around 4 years ago. See similar update that was added for
Magento\Catalog\Model\Product\Option.

Resolves: #5774
---
 app/code/Magento/Catalog/Model/Product/Option/Value.php | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/app/code/Magento/Catalog/Model/Product/Option/Value.php b/app/code/Magento/Catalog/Model/Product/Option/Value.php
index 0e86510ebce..62c215e8d59 100644
--- a/app/code/Magento/Catalog/Model/Product/Option/Value.php
+++ b/app/code/Magento/Catalog/Model/Product/Option/Value.php
@@ -11,6 +11,7 @@ namespace Magento\Catalog\Model\Product\Option;
 use Magento\Catalog\Model\Product;
 use Magento\Catalog\Model\Product\Option;
 use Magento\Framework\Model\AbstractModel;
+use Magento\Catalog\Pricing\Price\BasePrice;
 
 /**
  * Catalog product option select type model
@@ -223,7 +224,7 @@ class Value extends AbstractModel implements \Magento\Catalog\Api\Data\ProductCu
     public function getPrice($flag = false)
     {
         if ($flag && $this->getPriceType() == self::TYPE_PERCENT) {
-            $basePrice = $this->getOption()->getProduct()->getFinalPrice();
+            $basePrice = $this->getOption()->getProduct()->getPriceInfo()->getPrice(BasePrice::PRICE_CODE)->getValue();
             $price = $basePrice * ($this->_getData(self::KEY_PRICE) / 100);
             return $price;
         }
-- 
GitLab


From 8623d65edd1388a03fb1004451cea8a336fc310c Mon Sep 17 00:00:00 2001
From: Ji Lu <jilu1@magento.com>
Date: Thu, 22 Jun 2017 23:23:01 +0300
Subject: [PATCH 032/380] MQE-136: Added Allure reporting to functional tests

---
 dev/tests/functional/composer.json            |  3 +-
 dev/tests/functional/phpunit.xml.dist         | 14 ++++++++
 .../functional/utils/generateAllureReport.php | 32 +++++++++++++++++++
 3 files changed, 48 insertions(+), 1 deletion(-)
 create mode 100644 dev/tests/functional/utils/generateAllureReport.php

diff --git a/dev/tests/functional/composer.json b/dev/tests/functional/composer.json
index f92311f6ef3..7db2cea72b5 100644
--- a/dev/tests/functional/composer.json
+++ b/dev/tests/functional/composer.json
@@ -3,7 +3,8 @@
         "magento/mtf": "1.0.0-rc56",
         "php": "7.0.2|~7.0.6|~7.1.0",
         "phpunit/phpunit": "~4.8.0|~5.5.0",
-        "phpunit/phpunit-selenium": ">=1.2"
+        "phpunit/phpunit-selenium": ">=1.2",
+        "allure-framework/allure-phpunit": "~1.2.0"
     },
     "suggest": {
         "netwing/selenium-server-standalone": "dev-master",
diff --git a/dev/tests/functional/phpunit.xml.dist b/dev/tests/functional/phpunit.xml.dist
index 698ce305327..e4b9e4c4950 100644
--- a/dev/tests/functional/phpunit.xml.dist
+++ b/dev/tests/functional/phpunit.xml.dist
@@ -26,6 +26,20 @@
             </arguments>
         </listener>
         <listener class="Magento\Mtf\System\Event\StateListener" />
+        <listener class="Yandex\Allure\Adapter\AllureAdapter">
+            <arguments>
+                <string>var/allure-results</string> <!-- XML files output directory -->
+                <boolean>false</boolean> <!-- Whether to delete previous results on rerun -->
+                <array> <!-- A list of custom annotations to ignore (optional) -->
+                    <element key="0">
+                        <string>ZephyrId</string>
+                    </element>
+                    <element key="1">
+                        <string>Group</string>
+                    </element>
+                </array>
+            </arguments>
+        </listener>
     </listeners>
 
     <php>
diff --git a/dev/tests/functional/utils/generateAllureReport.php b/dev/tests/functional/utils/generateAllureReport.php
new file mode 100644
index 00000000000..0f417d68b67
--- /dev/null
+++ b/dev/tests/functional/utils/generateAllureReport.php
@@ -0,0 +1,32 @@
+<?php
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+/**
+ * Generate Allure report using Allure Commandline (CLI).
+ *
+ * Allure CLI is a Java application so it's available for all platforms.
+ * You have to manually install Java 1.7+ before using Allure CLI.
+ * Information on how to install Allure CLI can be found at:
+ * http://wiki.qatools.ru/display/AL/Allure+Commandline
+ */
+
+// Explicitly define Allure CLI executable if it's not available in your PATH.
+define('ALLURE_CLI', 'allure');
+
+$mtfRoot = dirname(dirname(__FILE__));
+$mtfRoot = str_replace('\\', '/', $mtfRoot);
+define('MTF_BP', $mtfRoot);
+
+// Allure test results directory which needs to match what's defined in phpunit.xml.
+$allureResultsDir = MTF_BP . '/var/allure-results/';
+// Allure report directory.
+$allureReportDir = MTF_BP . '/var/allure-report/';
+
+// Generate report using Allure CLI.
+exec(ALLURE_CLI . ' generate ' . $allureResultsDir . ' -o '. $allureReportDir);
+
+// Open report using Allure CLI.
+exec(ALLURE_CLI . ' report open --report-dir ' . $allureReportDir);
-- 
GitLab


From 759a6115c3fd62377d6f5073092803c5f3843d48 Mon Sep 17 00:00:00 2001
From: Alex Kolesnyk <okolesnyk@magento.com>
Date: Wed, 20 Sep 2017 12:18:15 +0300
Subject: [PATCH 033/380] MQE-279: Create repositories in magento organization

---
 dev/tests/acceptance/.env.example             |  22 ++
 dev/tests/acceptance/.gitignore               |   7 +
 dev/tests/acceptance/LICENSE.txt              |  48 ++++
 dev/tests/acceptance/LICENSE_AFL.txt          |  48 ++++
 dev/tests/acceptance/README.md                | 228 ++++++++++++++++
 dev/tests/acceptance/RoboFile.php             | 157 +++++++++++
 dev/tests/acceptance/codeception.dist.yml     |  33 +++
 dev/tests/acceptance/tests/_bootstrap.php     |  24 ++
 dev/tests/acceptance/tests/_data/dump.sql     |   1 +
 .../tests/functional.suite.dist.yml           |  33 +++
 .../AdminNotification/LICENSE.txt             |  48 ++++
 .../AdminNotification/LICENSE_AFL.txt         |  48 ++++
 .../AdminNotification/README.md               |   3 +
 .../AdminNotification/composer.json           |  47 ++++
 .../AdvancedPricingImportExport/LICENSE.txt   |  48 ++++
 .../LICENSE_AFL.txt                           |  48 ++++
 .../AdvancedPricingImportExport/README.md     |   3 +
 .../AdvancedPricingImportExport/composer.json |  56 ++++
 .../FunctionalTest/Analytics/LICENSE.txt      |  48 ++++
 .../FunctionalTest/Analytics/LICENSE_AFL.txt  |  48 ++++
 .../FunctionalTest/Analytics/README.md        |   3 +
 .../FunctionalTest/Analytics/composer.json    |  53 ++++
 .../FunctionalTest/Authorization/LICENSE.txt  |  48 ++++
 .../Authorization/LICENSE_AFL.txt             |  48 ++++
 .../FunctionalTest/Authorization/README.md    |   3 +
 .../Authorization/composer.json               |  50 ++++
 .../FunctionalTest/Authorizenet/LICENSE.txt   |  48 ++++
 .../Authorizenet/LICENSE_AFL.txt              |  48 ++++
 .../FunctionalTest/Authorizenet/README.md     |   3 +
 .../FunctionalTest/Authorizenet/composer.json |  56 ++++
 .../Backend/Cest/AdminLoginCest.xml           |  29 +++
 .../Backend/Data/BackenedData.xml             |   8 +
 .../FunctionalTest/Backend/LICENSE.txt        |  48 ++++
 .../FunctionalTest/Backend/LICENSE_AFL.txt    |  48 ++++
 .../Backend/Page/AdminLoginPage.xml           |   8 +
 .../Magento/FunctionalTest/Backend/README.md  |   3 +
 .../Backend/Section/AdminLoginFormSection.xml |  10 +
 .../Backend/Section/AdminMessagesSection.xml  |   8 +
 .../FunctionalTest/Backend/composer.json      |  64 +++++
 .../Magento/FunctionalTest/Backup/LICENSE.txt |  48 ++++
 .../FunctionalTest/Backup/LICENSE_AFL.txt     |  48 ++++
 .../Magento/FunctionalTest/Backup/README.md   |   3 +
 .../FunctionalTest/Backup/composer.json       |  51 ++++
 .../FunctionalTest/Braintree/LICENSE.txt      |  48 ++++
 .../FunctionalTest/Braintree/LICENSE_AFL.txt  |  48 ++++
 .../FunctionalTest/Braintree/README.md        |   3 +
 .../FunctionalTest/Braintree/composer.json    |  61 +++++
 .../Magento/FunctionalTest/Bundle/LICENSE.txt |  48 ++++
 .../FunctionalTest/Bundle/LICENSE_AFL.txt     |  48 ++++
 .../Magento/FunctionalTest/Bundle/README.md   |   3 +
 .../FunctionalTest/Bundle/composer.json       |  64 +++++
 .../BundleImportExport/LICENSE.txt            |  48 ++++
 .../BundleImportExport/LICENSE_AFL.txt        |  48 ++++
 .../BundleImportExport/README.md              |   3 +
 .../BundleImportExport/composer.json          |  54 ++++
 .../CacheInvalidate/LICENSE.txt               |  48 ++++
 .../CacheInvalidate/LICENSE_AFL.txt           |  48 ++++
 .../FunctionalTest/CacheInvalidate/README.md  |   3 +
 .../CacheInvalidate/composer.json             |  50 ++++
 .../FunctionalTest/Captcha/LICENSE.txt        |  48 ++++
 .../FunctionalTest/Captcha/LICENSE_AFL.txt    |  48 ++++
 .../Magento/FunctionalTest/Captcha/README.md  |   3 +
 .../FunctionalTest/Captcha/composer.json      |  53 ++++
 .../Catalog/Cest/AdminCreateCategoryCest.xml  |  44 ++++
 .../AdminCreateConfigurableProductCest.xml    | 130 ++++++++++
 .../Cest/AdminCreateSimpleProductCest.xml     |  65 +++++
 .../Catalog/Data/CategoryData.xml             |  17 ++
 .../CustomAttributeCategoryUrlKeyData.xml     |   9 +
 .../Data/CustomAttributeProductUrlKeyData.xml |   9 +
 .../Data/ProductConfigurableAttributeData.xml |  21 ++
 .../Catalog/Data/ProductData.xml              |  28 ++
 .../Data/ProductExtensionAttributeData.xml    |   8 +
 .../Catalog/Data/StockItemData.xml            |   9 +
 .../FunctionalTest/Catalog/LICENSE.txt        |  48 ++++
 .../FunctionalTest/Catalog/LICENSE_AFL.txt    |  48 ++++
 .../Catalog/Metadata/category-meta.xml        |  56 ++++
 .../Metadata/custom_attribute-meta.xml        |  13 +
 .../Catalog/Metadata/product-meta.xml         |  67 +++++
 .../product_extension_attribute-meta.xml      |  11 +
 .../Catalog/Metadata/product_link-meta.xml    |  25 ++
 .../product_link_extension_attribute-meta.xml |  13 +
 .../Catalog/Metadata/product_option-meta.xml  |  41 +++
 .../Metadata/product_option_value-meta.xml    |  21 ++
 .../Catalog/Metadata/stock_item-meta.xml      |  13 +
 .../Catalog/Page/AdminCategoryPage.xml        |  11 +
 .../Catalog/Page/AdminProductEditPage.xml     |  10 +
 .../Catalog/Page/AdminProductIndexPage.xml    |  10 +
 .../Catalog/Page/StorefrontCategoryPage.xml   |   8 +
 .../Catalog/Page/StorefrontProductPage.xml    |  11 +
 .../Magento/FunctionalTest/Catalog/README.md  |   3 +
 .../AdminCategoryBasicFieldSection.xml        |  10 +
 .../AdminCategoryMainActionsSection.xml       |   8 +
 .../Section/AdminCategoryMessagesSection.xml  |   8 +
 .../Section/AdminCategorySEOSection.xml       |  12 +
 .../AdminCategorySidebarActionSection.xml     |   9 +
 .../AdminCategorySidebarTreeSection.xml       |   9 +
 .../Section/AdminProductFormActionSection.xml |   8 +
 .../Section/AdminProductFormSection.xml       |  51 ++++
 .../Section/AdminProductGridActionSection.xml |  10 +
 .../Section/AdminProductGridSection.xml       |   9 +
 .../Section/AdminProductMessagesSection.xml   |   8 +
 .../Section/AdminProductSEOSection.xml        |   9 +
 .../Section/StorefrontCategoryMainSection.xml |  12 +
 .../Section/StorefrontMessagesSection.xml     |   8 +
 .../Section/StorefrontMiniCartSection.xml     |  10 +
 .../StorefrontProductInfoDetailsSection.xml   |   8 +
 .../StorefrontProductInfoMainSection.xml      |  14 +
 .../FunctionalTest/Catalog/composer.json      |  72 +++++
 .../CatalogAnalytics/LICENSE.txt              |  48 ++++
 .../CatalogAnalytics/LICENSE_AFL.txt          |  48 ++++
 .../FunctionalTest/CatalogAnalytics/README.md |   3 +
 .../CatalogAnalytics/composer.json            |  50 ++++
 .../CatalogImportExport/LICENSE.txt           |  48 ++++
 .../CatalogImportExport/LICENSE_AFL.txt       |  48 ++++
 .../CatalogImportExport/README.md             |   3 +
 .../CatalogImportExport/composer.json         |  58 +++++
 .../CatalogInventory/LICENSE.txt              |  48 ++++
 .../CatalogInventory/LICENSE_AFL.txt          |  48 ++++
 .../FunctionalTest/CatalogInventory/README.md |   3 +
 .../CatalogInventory/composer.json            |  56 ++++
 .../FunctionalTest/CatalogRule/LICENSE.txt    |  48 ++++
 .../CatalogRule/LICENSE_AFL.txt               |  48 ++++
 .../FunctionalTest/CatalogRule/README.md      |   3 +
 .../FunctionalTest/CatalogRule/composer.json  |  56 ++++
 .../CatalogRuleConfigurable/LICENSE.txt       |  48 ++++
 .../CatalogRuleConfigurable/LICENSE_AFL.txt   |  48 ++++
 .../CatalogRuleConfigurable/README.md         |   3 +
 .../CatalogRuleConfigurable/composer.json     |  52 ++++
 .../FunctionalTest/CatalogSearch/LICENSE.txt  |  48 ++++
 .../CatalogSearch/LICENSE_AFL.txt             |  48 ++++
 .../FunctionalTest/CatalogSearch/README.md    |   3 +
 .../CatalogSearch/composer.json               |  59 +++++
 .../CatalogUrlRewrite/LICENSE.txt             |  48 ++++
 .../CatalogUrlRewrite/LICENSE_AFL.txt         |  48 ++++
 .../CatalogUrlRewrite/README.md               |   3 +
 .../CatalogUrlRewrite/composer.json           |  57 ++++
 .../FunctionalTest/CatalogWidget/LICENSE.txt  |  48 ++++
 .../CatalogWidget/LICENSE_AFL.txt             |  48 ++++
 .../FunctionalTest/CatalogWidget/README.md    |   3 +
 .../CatalogWidget/composer.json               |  57 ++++
 .../Cest/StorefrontCustomerCheckoutCest.xml   |  86 ++++++
 .../Cest/StorefrontGuestCheckoutCest.xml      |  82 ++++++
 .../FunctionalTest/Checkout/LICENSE.txt       |  48 ++++
 .../FunctionalTest/Checkout/LICENSE_AFL.txt   |  48 ++++
 .../Checkout/Page/CheckoutPage.xml            |  13 +
 .../Checkout/Page/CheckoutSuccessPage.xml     |   8 +
 .../Checkout/Page/GuestCheckoutPage.xml       |   9 +
 .../Magento/FunctionalTest/Checkout/README.md |   3 +
 .../Section/CheckoutOrderSummarySection.xml   |  11 +
 .../Section/CheckoutPaymentSection.xml        |  10 +
 .../CheckoutShippingGuestInfoSection.xml      |  15 ++
 .../CheckoutShippingMethodsSection.xml        |   9 +
 .../Section/CheckoutShippingSection.xml       |   9 +
 .../Section/CheckoutSuccessMainSection.xml    |  10 +
 .../Section/GuestCheckoutPaymentSection.xml   |  10 +
 .../Section/GuestCheckoutShippingSection.xml  |  17 ++
 .../FunctionalTest/Checkout/composer.json     |  67 +++++
 .../CheckoutAgreements/LICENSE.txt            |  48 ++++
 .../CheckoutAgreements/LICENSE_AFL.txt        |  48 ++++
 .../CheckoutAgreements/README.md              |   3 +
 .../CheckoutAgreements/composer.json          |  53 ++++
 .../Cms/Cest/AdminCreateCmsPageCest.xml       |  45 ++++
 .../FunctionalTest/Cms/Data/CmsPageData.xml   |  11 +
 .../Magento/FunctionalTest/Cms/LICENSE.txt    |  48 ++++
 .../FunctionalTest/Cms/LICENSE_AFL.txt        |  48 ++++
 .../Cms/Page/CmsNewPagePage.xml               |  11 +
 .../FunctionalTest/Cms/Page/CmsPagesPage.xml  |   8 +
 .../Magento/FunctionalTest/Cms/README.md      |   3 +
 .../Section/CmsNewPagePageActionsSection.xml  |   8 +
 .../CmsNewPagePageBasicFieldsSection.xml      |   8 +
 .../Section/CmsNewPagePageContentSection.xml  |  10 +
 .../Cms/Section/CmsNewPagePageSeoSection.xml  |   9 +
 .../Section/CmsPagesPageActionsSection.xml    |   8 +
 .../Magento/FunctionalTest/Cms/composer.json  |  58 +++++
 .../FunctionalTest/CmsUrlRewrite/LICENSE.txt  |  48 ++++
 .../CmsUrlRewrite/LICENSE_AFL.txt             |  48 ++++
 .../FunctionalTest/CmsUrlRewrite/README.md    |   6 +
 .../CmsUrlRewrite/composer.json               |  52 ++++
 .../Magento/FunctionalTest/Config/LICENSE.txt |  48 ++++
 .../FunctionalTest/Config/LICENSE_AFL.txt     |  48 ++++
 .../Magento/FunctionalTest/Config/README.md   |   8 +
 .../FunctionalTest/Config/composer.json       |  54 ++++
 .../ConfigurableImportExport/LICENSE.txt      |  48 ++++
 .../ConfigurableImportExport/LICENSE_AFL.txt  |  48 ++++
 .../ConfigurableImportExport/composer.json    |  54 ++++
 .../Data/ConfigurableProductData.xml          |   8 +
 .../ConfigurableProduct/LICENSE.txt           |  48 ++++
 .../ConfigurableProduct/LICENSE_AFL.txt       |  48 ++++
 .../ConfigurableProduct/README.md             |   3 +
 .../ConfigurableProduct/composer.json         |  60 +++++
 .../ConfigurableProductSales/LICENSE.txt      |  48 ++++
 .../ConfigurableProductSales/LICENSE_AFL.txt  |  48 ++++
 .../ConfigurableProductSales/README.md        |   3 +
 .../ConfigurableProductSales/composer.json    |  52 ++++
 .../FunctionalTest/Contact/LICENSE.txt        |  48 ++++
 .../FunctionalTest/Contact/LICENSE_AFL.txt    |  48 ++++
 .../Magento/FunctionalTest/Contact/README.md  |   3 +
 .../FunctionalTest/Contact/composer.json      |  53 ++++
 .../Magento/FunctionalTest/Cookie/LICENSE.txt |  48 ++++
 .../FunctionalTest/Cookie/LICENSE_AFL.txt     |  48 ++++
 .../Magento/FunctionalTest/Cookie/README.md   |   3 +
 .../FunctionalTest/Cookie/composer.json       |  50 ++++
 .../FunctionalTest/CurrencySymbol/LICENSE.txt |  48 ++++
 .../CurrencySymbol/LICENSE_AFL.txt            |  48 ++++
 .../FunctionalTest/CurrencySymbol/README.md   |   3 +
 .../CurrencySymbol/composer.json              |  54 ++++
 .../Customer/Cest/AdminCreateCustomerCest.xml |  43 +++
 .../Cest/StorefrontCreateCustomerCest.xml     |  35 +++
 .../StorefrontExistingCustomerLoginCest.xml   |  36 +++
 .../Customer/Data/AddressData.xml             |  45 ++++
 .../Customer/Data/CustomAttributeData.xml     |   9 +
 .../Customer/Data/CustomerData.xml            |  41 +++
 .../Data/ExtensionAttributeSimple.xml         |   8 +
 .../Customer/Data/RegionData.xml              |  14 +
 .../FunctionalTest/Customer/LICENSE.txt       |  48 ++++
 .../FunctionalTest/Customer/LICENSE_AFL.txt   |  48 ++++
 .../Customer/Metadata/address-meta.xml        |  56 ++++
 .../Metadata/custom_attribute-meta.xml        |  13 +
 .../Customer/Metadata/customer-meta.xml       |  73 ++++++
 .../customer_extension_attribute-meta.xml     |  13 +
 ...stomer_nested_extension_attribute-meta.xml |  15 ++
 .../empty_extension_attribute-meta.xml        |   9 +
 .../Customer/Metadata/region-meta.xml         |  17 ++
 .../Customer/Page/AdminCustomerPage.xml       |  11 +
 .../Customer/Page/AdminNewCustomerPage.xml    |   9 +
 .../Page/StorefrontCustomerCreatePage.xml     |   8 +
 .../Page/StorefrontCustomerDashboardPage.xml  |   8 +
 .../Page/StorefrontCustomerSignInPage.xml     |   8 +
 .../Customer/Page/StorefrontHomePage.xml      |   8 +
 .../Magento/FunctionalTest/Customer/README.md |   3 +
 .../Section/AdminCustomerFiltersSection.xml   |  10 +
 .../Section/AdminCustomerGridSection.xml      |   8 +
 .../AdminCustomerMainActionsSection.xml       |   8 +
 .../Section/AdminCustomerMessagesSection.xml  |   8 +
 ...inNewCustomerAccountInformationSection.xml |  10 +
 .../AdminNewCustomerMainActionsSection.xml    |   8 +
 .../StorefrontCustomerCreateFormSection.xml   |  13 +
 ...omerDashboardAccountInformationSection.xml |   8 +
 .../StorefrontCustomerSignInFormSection.xml   |  10 +
 .../Section/StorefrontPanelHeaderSection.xml  |   8 +
 .../FunctionalTest/Customer/composer.json     |  68 +++++
 .../CustomerAnalytics/LICENSE.txt             |  48 ++++
 .../CustomerAnalytics/LICENSE_AFL.txt         |  48 ++++
 .../CustomerAnalytics/README.md               |   3 +
 .../CustomerAnalytics/composer.json           |  50 ++++
 .../CustomerImportExport/LICENSE.txt          |  48 ++++
 .../CustomerImportExport/LICENSE_AFL.txt      |  48 ++++
 .../CustomerImportExport/README.md            |   3 +
 .../CustomerImportExport/composer.json        |  55 ++++
 .../FunctionalTest/Developer/LICENSE.txt      |  48 ++++
 .../FunctionalTest/Developer/LICENSE_AFL.txt  |  48 ++++
 .../FunctionalTest/Developer/README.md        |   3 +
 .../FunctionalTest/Developer/composer.json    |  51 ++++
 .../Magento/FunctionalTest/Dhl/LICENSE.txt    |  48 ++++
 .../FunctionalTest/Dhl/LICENSE_AFL.txt        |  48 ++++
 .../Magento/FunctionalTest/Dhl/README.md      |   3 +
 .../Magento/FunctionalTest/Dhl/composer.json  |  58 +++++
 .../FunctionalTest/Directory/LICENSE.txt      |  48 ++++
 .../FunctionalTest/Directory/LICENSE_AFL.txt  |  48 ++++
 .../FunctionalTest/Directory/README.md        |   3 +
 .../FunctionalTest/Directory/composer.json    |  52 ++++
 .../FunctionalTest/Downloadable/LICENSE.txt   |  48 ++++
 .../Downloadable/LICENSE_AFL.txt              |  48 ++++
 .../FunctionalTest/Downloadable/README.md     |   3 +
 .../FunctionalTest/Downloadable/composer.json |  65 +++++
 .../DownloadableImportExport/LICENSE.txt      |  48 ++++
 .../DownloadableImportExport/LICENSE_AFL.txt  |  48 ++++
 .../DownloadableImportExport/README.md        |   3 +
 .../DownloadableImportExport/composer.json    |  55 ++++
 .../Magento/FunctionalTest/Eav/LICENSE.txt    |  48 ++++
 .../FunctionalTest/Eav/LICENSE_AFL.txt        |  48 ++++
 .../Magento/FunctionalTest/Eav/README.md      |   3 +
 .../Magento/FunctionalTest/Eav/composer.json  |  54 ++++
 .../Magento/FunctionalTest/Email/LICENSE.txt  |  48 ++++
 .../FunctionalTest/Email/LICENSE_AFL.txt      |  48 ++++
 .../Magento/FunctionalTest/Email/README.md    |   3 +
 .../FunctionalTest/Email/composer.json        |  55 ++++
 .../FunctionalTest/EncryptionKey/LICENSE.txt  |  48 ++++
 .../EncryptionKey/LICENSE_AFL.txt             |  48 ++++
 .../FunctionalTest/EncryptionKey/README.md    |   3 +
 .../EncryptionKey/composer.json               |  51 ++++
 .../Magento/FunctionalTest/Fedex/LICENSE.txt  |  48 ++++
 .../FunctionalTest/Fedex/LICENSE_AFL.txt      |  48 ++++
 .../Magento/FunctionalTest/Fedex/README.md    |   3 +
 .../FunctionalTest/Fedex/composer.json        |  57 ++++
 .../FunctionalTest/GiftMessage/LICENSE.txt    |  48 ++++
 .../GiftMessage/LICENSE_AFL.txt               |  48 ++++
 .../FunctionalTest/GiftMessage/README.md      |   3 +
 .../FunctionalTest/GiftMessage/composer.json  |  57 ++++
 .../FunctionalTest/GoogleAdwords/LICENSE.txt  |  48 ++++
 .../GoogleAdwords/LICENSE_AFL.txt             |  48 ++++
 .../FunctionalTest/GoogleAdwords/README.md    |   3 +
 .../GoogleAdwords/composer.json               |  51 ++++
 .../GoogleAnalytics/LICENSE.txt               |  48 ++++
 .../GoogleAnalytics/LICENSE_AFL.txt           |  48 ++++
 .../FunctionalTest/GoogleAnalytics/README.md  |   3 +
 .../GoogleAnalytics/composer.json             |  52 ++++
 .../GoogleOptimizer/LICENSE.txt               |  48 ++++
 .../GoogleOptimizer/LICENSE_AFL.txt           |  48 ++++
 .../FunctionalTest/GoogleOptimizer/README.md  |   3 +
 .../GoogleOptimizer/composer.json             |  55 ++++
 .../GroupedImportExport/LICENSE.txt           |  48 ++++
 .../GroupedImportExport/LICENSE_AFL.txt       |  48 ++++
 .../GroupedImportExport/README.md             |   3 +
 .../GroupedImportExport/composer.json         |  54 ++++
 .../FunctionalTest/GroupedProduct/LICENSE.txt |  48 ++++
 .../GroupedProduct/LICENSE_AFL.txt            |  48 ++++
 .../FunctionalTest/GroupedProduct/README.md   |   3 +
 .../GroupedProduct/composer.json              |  61 +++++
 .../FunctionalTest/ImportExport/LICENSE.txt   |  48 ++++
 .../ImportExport/LICENSE_AFL.txt              |  48 ++++
 .../FunctionalTest/ImportExport/README.md     |   3 +
 .../FunctionalTest/ImportExport/composer.json |  54 ++++
 .../FunctionalTest/Indexer/LICENSE.txt        |  48 ++++
 .../FunctionalTest/Indexer/LICENSE_AFL.txt    |  48 ++++
 .../Magento/FunctionalTest/Indexer/README.md  |   3 +
 .../FunctionalTest/Indexer/composer.json      |  50 ++++
 .../FunctionalTest/Integration/LICENSE.txt    |  48 ++++
 .../Integration/LICENSE_AFL.txt               |  48 ++++
 .../FunctionalTest/Integration/README.md      |   3 +
 .../FunctionalTest/Integration/composer.json  |  55 ++++
 .../LayeredNavigation/LICENSE.txt             |  48 ++++
 .../LayeredNavigation/LICENSE_AFL.txt         |  48 ++++
 .../LayeredNavigation/README.md               |   3 +
 .../LayeredNavigation/composer.json           |  51 ++++
 .../FunctionalTest/Marketplace/LICENSE.txt    |  48 ++++
 .../Marketplace/LICENSE_AFL.txt               |  48 ++++
 .../FunctionalTest/Marketplace/README.md      |   3 +
 .../FunctionalTest/Marketplace/composer.json  |  50 ++++
 .../FunctionalTest/MediaStorage/LICENSE.txt   |  48 ++++
 .../MediaStorage/LICENSE_AFL.txt              |  48 ++++
 .../FunctionalTest/MediaStorage/README.md     |   3 +
 .../FunctionalTest/MediaStorage/composer.json |  52 ++++
 .../Magento/FunctionalTest/Msrp/LICENSE.txt   |  48 ++++
 .../FunctionalTest/Msrp/LICENSE_AFL.txt       |  48 ++++
 .../Magento/FunctionalTest/Msrp/README.md     |   3 +
 .../Magento/FunctionalTest/Msrp/composer.json |  55 ++++
 .../FunctionalTest/Multishipping/LICENSE.txt  |  48 ++++
 .../Multishipping/LICENSE_AFL.txt             |  48 ++++
 .../FunctionalTest/Multishipping/README.md    |   3 +
 .../Multishipping/composer.json               |  57 ++++
 .../NewRelicReporting/LICENSE.txt             |  48 ++++
 .../NewRelicReporting/LICENSE_AFL.txt         |  48 ++++
 .../NewRelicReporting/README.md               |   3 +
 .../NewRelicReporting/composer.json           |  55 ++++
 .../FunctionalTest/Newsletter/LICENSE.txt     |  48 ++++
 .../FunctionalTest/Newsletter/LICENSE_AFL.txt |  48 ++++
 .../FunctionalTest/Newsletter/README.md       |   3 +
 .../FunctionalTest/Newsletter/composer.json   |  56 ++++
 .../OfflinePayments/LICENSE.txt               |  48 ++++
 .../OfflinePayments/LICENSE_AFL.txt           |  48 ++++
 .../FunctionalTest/OfflinePayments/README.md  |   3 +
 .../OfflinePayments/composer.json             |  51 ++++
 .../OfflineShipping/LICENSE.txt               |  48 ++++
 .../OfflineShipping/LICENSE_AFL.txt           |  48 ++++
 .../FunctionalTest/OfflineShipping/README.md  |   3 +
 .../OfflineShipping/composer.json             |  57 ++++
 .../FunctionalTest/PageCache/LICENSE.txt      |  48 ++++
 .../FunctionalTest/PageCache/LICENSE_AFL.txt  |  48 ++++
 .../FunctionalTest/PageCache/README.md        |   3 +
 .../FunctionalTest/PageCache/composer.json    |  52 ++++
 .../FunctionalTest/Payment/LICENSE.txt        |  48 ++++
 .../FunctionalTest/Payment/LICENSE_AFL.txt    |  48 ++++
 .../Magento/FunctionalTest/Payment/README.md  |   3 +
 .../FunctionalTest/Payment/composer.json      |  55 ++++
 .../Magento/FunctionalTest/Paypal/LICENSE.txt |  48 ++++
 .../FunctionalTest/Paypal/LICENSE_AFL.txt     |  48 ++++
 .../Magento/FunctionalTest/Paypal/README.md   |   3 +
 .../FunctionalTest/Paypal/composer.json       |  64 +++++
 .../FunctionalTest/Persistent/LICENSE.txt     |  48 ++++
 .../FunctionalTest/Persistent/LICENSE_AFL.txt |  48 ++++
 .../FunctionalTest/Persistent/README.md       |   3 +
 .../FunctionalTest/Persistent/composer.json   |  54 ++++
 .../FunctionalTest/ProductAlert/LICENSE.txt   |  48 ++++
 .../ProductAlert/LICENSE_AFL.txt              |  48 ++++
 .../FunctionalTest/ProductAlert/README.md     |   3 +
 .../FunctionalTest/ProductAlert/composer.json |  53 ++++
 .../FunctionalTest/ProductVideo/LICENSE.txt   |  48 ++++
 .../ProductVideo/LICENSE_AFL.txt              |  48 ++++
 .../FunctionalTest/ProductVideo/README.md     |   3 +
 .../FunctionalTest/ProductVideo/composer.json |  54 ++++
 .../Magento/FunctionalTest/Quote/LICENSE.txt  |  48 ++++
 .../FunctionalTest/Quote/LICENSE_AFL.txt      |  48 ++++
 .../Magento/FunctionalTest/Quote/README.md    |   3 +
 .../FunctionalTest/Quote/composer.json        |  63 +++++
 .../FunctionalTest/QuoteAnalytics/LICENSE.txt |  48 ++++
 .../QuoteAnalytics/LICENSE_AFL.txt            |  48 ++++
 .../FunctionalTest/QuoteAnalytics/README.md   |   3 +
 .../QuoteAnalytics/composer.json              |  50 ++++
 .../FunctionalTest/Reports/LICENSE.txt        |  48 ++++
 .../FunctionalTest/Reports/LICENSE_AFL.txt    |  48 ++++
 .../Magento/FunctionalTest/Reports/README.md  |   3 +
 .../FunctionalTest/Reports/composer.json      |  65 +++++
 .../Magento/FunctionalTest/Review/LICENSE.txt |  48 ++++
 .../FunctionalTest/Review/LICENSE_AFL.txt     |  48 ++++
 .../Magento/FunctionalTest/Review/README.md   |   3 +
 .../FunctionalTest/Review/composer.json       |  57 ++++
 .../ReviewAnalytics/LICENSE.txt               |  48 ++++
 .../ReviewAnalytics/LICENSE_AFL.txt           |  48 ++++
 .../FunctionalTest/ReviewAnalytics/README.md  |   3 +
 .../ReviewAnalytics/composer.json             |  50 ++++
 .../Magento/FunctionalTest/Robots/LICENSE.txt |  48 ++++
 .../FunctionalTest/Robots/LICENSE_AFL.txt     |  48 ++++
 .../Magento/FunctionalTest/Robots/README.md   |   3 +
 .../FunctionalTest/Robots/composer.json       |  50 ++++
 .../Magento/FunctionalTest/Rss/LICENSE.txt    |  48 ++++
 .../FunctionalTest/Rss/LICENSE_AFL.txt        |  48 ++++
 .../Magento/FunctionalTest/Rss/README.md      |   3 +
 .../Magento/FunctionalTest/Rss/composer.json  |  52 ++++
 .../Magento/FunctionalTest/Rule/LICENSE.txt   |  48 ++++
 .../FunctionalTest/Rule/LICENSE_AFL.txt       |  48 ++++
 .../Magento/FunctionalTest/Rule/README.md     |   3 +
 .../Magento/FunctionalTest/Rule/composer.json |  53 ++++
 .../Sales/Cest/AdminCreateInvoiceCest.xml     |  89 +++++++
 .../FunctionalTest/Sales/Data/SalesData.xml   |   8 +
 .../Magento/FunctionalTest/Sales/LICENSE.txt  |  48 ++++
 .../FunctionalTest/Sales/LICENSE_AFL.txt      |  48 ++++
 .../Sales/Page/InvoiceDetailsPage.xml         |   8 +
 .../Sales/Page/InvoiceNewPage.xml             |   8 +
 .../Sales/Page/InvoicesPage.xml               |   9 +
 .../Sales/Page/OrderDetailsPage.xml           |  10 +
 .../FunctionalTest/Sales/Page/OrdersPage.xml  |   8 +
 .../Magento/FunctionalTest/Sales/README.md    |   3 +
 .../InvoiceDetailsInformationSection.xml      |   8 +
 .../Sales/Section/InvoiceNewSection.xml       |   8 +
 .../Sales/Section/InvoicesFiltersSection.xml  |   8 +
 .../Sales/Section/InvoicesGridSection.xml     |  10 +
 .../OrderDetailsInformationSection.xml        |  12 +
 .../Section/OrderDetailsInvoicesSection.xml   |   9 +
 .../OrderDetailsMainActionsSection.xml        |  15 ++
 .../Section/OrderDetailsMessagesSection.xml   |   8 +
 .../Section/OrderDetailsOrderViewSection.xml  |   9 +
 .../Sales/Section/OrdersGridSection.xml       |  14 +
 .../FunctionalTest/Sales/composer.json        |  72 +++++
 .../FunctionalTest/SalesAnalytics/LICENSE.txt |  48 ++++
 .../SalesAnalytics/LICENSE_AFL.txt            |  48 ++++
 .../FunctionalTest/SalesAnalytics/README.md   |   3 +
 .../SalesAnalytics/composer.json              |  50 ++++
 .../FunctionalTest/SalesInventory/LICENSE.txt |  48 ++++
 .../SalesInventory/LICENSE_AFL.txt            |  48 ++++
 .../FunctionalTest/SalesInventory/README.md   |   3 +
 .../SalesInventory/composer.json              |  53 ++++
 .../FunctionalTest/SalesRule/LICENSE.txt      |  48 ++++
 .../FunctionalTest/SalesRule/LICENSE_AFL.txt  |  48 ++++
 .../FunctionalTest/SalesRule/README.md        |   3 +
 .../FunctionalTest/SalesRule/composer.json    |  67 +++++
 .../FunctionalTest/SalesSequence/LICENSE.txt  |  48 ++++
 .../SalesSequence/LICENSE_AFL.txt             |  48 ++++
 .../FunctionalTest/SalesSequence/README.md    |   3 +
 .../SalesSequence/composer.json               |  47 ++++
 .../FunctionalTest/SampleData/LICENSE.txt     |  48 ++++
 .../FunctionalTest/SampleData/LICENSE_AFL.txt |  48 ++++
 .../FunctionalTest/SampleData/README.md       |   3 +
 .../FunctionalTest/SampleData/composer.json   |  47 ++++
 .../SampleTests/Cest/MinimumTestCest.xml      |  28 ++
 .../Cest/PersistMultipleEntitiesCest.xml      |  35 +++
 .../SampleTests/Cest/SampleCest.xml           | 245 ++++++++++++++++++
 .../Templates/TemplateCestFile.xml            |  27 ++
 .../Templates/TemplateDataFile.xml            |   8 +
 .../Templates/TemplateMetaDataFile.xml        |  16 ++
 .../Templates/TemplatePageFile.xml            |   8 +
 .../Templates/TemplateSectionFile.xml         |   8 +
 .../Magento/FunctionalTest/Search/LICENSE.txt |  48 ++++
 .../FunctionalTest/Search/LICENSE_AFL.txt     |  48 ++++
 .../Magento/FunctionalTest/Search/README.md   |   3 +
 .../FunctionalTest/Search/composer.json       |  54 ++++
 .../FunctionalTest/Security/LICENSE.txt       |  48 ++++
 .../FunctionalTest/Security/LICENSE_AFL.txt   |  48 ++++
 .../Magento/FunctionalTest/Security/README.md |   3 +
 .../FunctionalTest/Security/composer.json     |  51 ++++
 .../FunctionalTest/SendFriend/LICENSE.txt     |  48 ++++
 .../FunctionalTest/SendFriend/LICENSE_AFL.txt |  48 ++++
 .../FunctionalTest/SendFriend/README.md       |   3 +
 .../FunctionalTest/SendFriend/composer.json   |  52 ++++
 .../FunctionalTest/Shipping/LICENSE.txt       |  48 ++++
 .../FunctionalTest/Shipping/LICENSE_AFL.txt   |  48 ++++
 .../Magento/FunctionalTest/Shipping/README.md |   3 +
 .../FunctionalTest/Shipping/composer.json     |  62 +++++
 .../FunctionalTest/Sitemap/LICENSE.txt        |  48 ++++
 .../FunctionalTest/Sitemap/LICENSE_AFL.txt    |  48 ++++
 .../Magento/FunctionalTest/Sitemap/README.md  |   3 +
 .../FunctionalTest/Sitemap/composer.json      |  58 +++++
 .../Magento/FunctionalTest/Store/LICENSE.txt  |  48 ++++
 .../FunctionalTest/Store/LICENSE_AFL.txt      |  48 ++++
 .../Magento/FunctionalTest/Store/README.md    |   3 +
 .../FunctionalTest/Store/composer.json        |  54 ++++
 .../FunctionalTest/Swagger/LICENSE.txt        |  48 ++++
 .../FunctionalTest/Swagger/LICENSE_AFL.txt    |  48 ++++
 .../Magento/FunctionalTest/Swagger/README.md  |   3 +
 .../FunctionalTest/Swagger/composer.json      |  47 ++++
 .../FunctionalTest/Swatches/LICENSE.txt       |  48 ++++
 .../FunctionalTest/Swatches/LICENSE_AFL.txt   |  48 ++++
 .../Magento/FunctionalTest/Swatches/README.md |   3 +
 .../FunctionalTest/Swatches/composer.json     |  58 +++++
 .../SwatchesLayeredNavigation/LICENSE.txt     |  48 ++++
 .../SwatchesLayeredNavigation/LICENSE_AFL.txt |  48 ++++
 .../SwatchesLayeredNavigation/README.md       |   3 +
 .../SwatchesLayeredNavigation/composer.json   |  47 ++++
 .../Magento/FunctionalTest/Tax/LICENSE.txt    |  48 ++++
 .../FunctionalTest/Tax/LICENSE_AFL.txt        |  48 ++++
 .../Magento/FunctionalTest/Tax/README.md      |   3 +
 .../Magento/FunctionalTest/Tax/composer.json  |  62 +++++
 .../TaxImportExport/LICENSE.txt               |  48 ++++
 .../TaxImportExport/LICENSE_AFL.txt           |  48 ++++
 .../FunctionalTest/TaxImportExport/README.md  |   3 +
 .../TaxImportExport/composer.json             |  53 ++++
 .../Magento/FunctionalTest/Theme/LICENSE.txt  |  48 ++++
 .../FunctionalTest/Theme/LICENSE_AFL.txt      |  48 ++++
 .../Magento/FunctionalTest/Theme/README.md    |   3 +
 .../FunctionalTest/Theme/composer.json        |  58 +++++
 .../FunctionalTest/Translation/LICENSE.txt    |  48 ++++
 .../Translation/LICENSE_AFL.txt               |  48 ++++
 .../FunctionalTest/Translation/README.md      |   3 +
 .../FunctionalTest/Translation/composer.json  |  52 ++++
 .../Magento/FunctionalTest/Ui/LICENSE.txt     |  48 ++++
 .../Magento/FunctionalTest/Ui/LICENSE_AFL.txt |  48 ++++
 .../Magento/FunctionalTest/Ui/README.md       |   3 +
 .../Magento/FunctionalTest/Ui/composer.json   |  53 ++++
 .../Magento/FunctionalTest/Ups/LICENSE.txt    |  48 ++++
 .../FunctionalTest/Ups/LICENSE_AFL.txt        |  48 ++++
 .../Magento/FunctionalTest/Ups/README.md      |   3 +
 .../Magento/FunctionalTest/Ups/composer.json  |  56 ++++
 .../FunctionalTest/UrlRewrite/LICENSE.txt     |  48 ++++
 .../FunctionalTest/UrlRewrite/LICENSE_AFL.txt |  48 ++++
 .../FunctionalTest/UrlRewrite/README.md       |   3 +
 .../FunctionalTest/UrlRewrite/composer.json   |  55 ++++
 .../FunctionalTest/User/Data/UserData.xml     |   9 +
 .../Magento/FunctionalTest/User/LICENSE.txt   |  48 ++++
 .../FunctionalTest/User/LICENSE_AFL.txt       |  48 ++++
 .../Magento/FunctionalTest/User/README.md     |   3 +
 .../Magento/FunctionalTest/User/composer.json |  55 ++++
 .../FunctionalTest/Variable/LICENSE.txt       |  48 ++++
 .../FunctionalTest/Variable/LICENSE_AFL.txt   |  48 ++++
 .../Magento/FunctionalTest/Variable/README.md |   3 +
 .../FunctionalTest/Variable/composer.json     |  52 ++++
 .../Magento/FunctionalTest/Vault/LICENSE.txt  |  48 ++++
 .../FunctionalTest/Vault/LICENSE_AFL.txt      |  48 ++++
 .../Magento/FunctionalTest/Vault/README.md    |   3 +
 .../FunctionalTest/Vault/composer.json        |  55 ++++
 .../FunctionalTest/Version/LICENSE.txt        |  48 ++++
 .../FunctionalTest/Version/LICENSE_AFL.txt    |  48 ++++
 .../Magento/FunctionalTest/Version/README.md  |   3 +
 .../FunctionalTest/Version/composer.json      |  48 ++++
 .../Magento/FunctionalTest/Webapi/LICENSE.txt |  48 ++++
 .../FunctionalTest/Webapi/LICENSE_AFL.txt     |  48 ++++
 .../Magento/FunctionalTest/Webapi/README.md   |   3 +
 .../FunctionalTest/Webapi/composer.json       |  53 ++++
 .../FunctionalTest/WebapiSecurity/LICENSE.txt |  48 ++++
 .../WebapiSecurity/LICENSE_AFL.txt            |  48 ++++
 .../FunctionalTest/WebapiSecurity/README.md   |   3 +
 .../WebapiSecurity/composer.json              |  50 ++++
 .../Magento/FunctionalTest/Weee/LICENSE.txt   |  48 ++++
 .../FunctionalTest/Weee/LICENSE_AFL.txt       |  48 ++++
 .../Magento/FunctionalTest/Weee/README.md     |   3 +
 .../Magento/FunctionalTest/Weee/composer.json |  61 +++++
 .../Magento/FunctionalTest/Widget/LICENSE.txt |  48 ++++
 .../FunctionalTest/Widget/LICENSE_AFL.txt     |  48 ++++
 .../Magento/FunctionalTest/Widget/README.md   |   3 +
 .../FunctionalTest/Widget/composer.json       |  56 ++++
 .../FunctionalTest/Wishlist/LICENSE.txt       |  48 ++++
 .../FunctionalTest/Wishlist/LICENSE_AFL.txt   |  48 ++++
 .../Magento/FunctionalTest/Wishlist/README.md |   3 +
 .../FunctionalTest/Wishlist/composer.json     |  58 +++++
 .../WishlistAnalytics/LICENSE.txt             |  48 ++++
 .../WishlistAnalytics/LICENSE_AFL.txt         |  48 ++++
 .../WishlistAnalytics/README.md               |   3 +
 .../WishlistAnalytics/composer.json           |  50 ++++
 .../tests/functional/_bootstrap.php           |  13 +
 568 files changed, 19782 insertions(+)
 create mode 100644 dev/tests/acceptance/.env.example
 create mode 100755 dev/tests/acceptance/.gitignore
 create mode 100644 dev/tests/acceptance/LICENSE.txt
 create mode 100644 dev/tests/acceptance/LICENSE_AFL.txt
 create mode 100755 dev/tests/acceptance/README.md
 create mode 100644 dev/tests/acceptance/RoboFile.php
 create mode 100644 dev/tests/acceptance/codeception.dist.yml
 create mode 100644 dev/tests/acceptance/tests/_bootstrap.php
 create mode 100644 dev/tests/acceptance/tests/_data/dump.sql
 create mode 100644 dev/tests/acceptance/tests/functional.suite.dist.yml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/AdminNotification/LICENSE.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/AdminNotification/LICENSE_AFL.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/AdminNotification/README.md
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/AdminNotification/composer.json
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/AdvancedPricingImportExport/LICENSE.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/AdvancedPricingImportExport/LICENSE_AFL.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/AdvancedPricingImportExport/README.md
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/AdvancedPricingImportExport/composer.json
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Analytics/LICENSE.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Analytics/LICENSE_AFL.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Analytics/README.md
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Analytics/composer.json
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Authorization/LICENSE.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Authorization/LICENSE_AFL.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Authorization/README.md
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Authorization/composer.json
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Authorizenet/LICENSE.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Authorizenet/LICENSE_AFL.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Authorizenet/README.md
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Authorizenet/composer.json
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/Cest/AdminLoginCest.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/Data/BackenedData.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/LICENSE.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/LICENSE_AFL.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/Page/AdminLoginPage.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/README.md
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/Section/AdminLoginFormSection.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/Section/AdminMessagesSection.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/composer.json
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backup/LICENSE.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backup/LICENSE_AFL.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backup/README.md
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backup/composer.json
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Braintree/LICENSE.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Braintree/LICENSE_AFL.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Braintree/README.md
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Braintree/composer.json
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Bundle/LICENSE.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Bundle/LICENSE_AFL.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Bundle/README.md
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Bundle/composer.json
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/BundleImportExport/LICENSE.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/BundleImportExport/LICENSE_AFL.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/BundleImportExport/README.md
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/BundleImportExport/composer.json
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CacheInvalidate/LICENSE.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CacheInvalidate/LICENSE_AFL.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CacheInvalidate/README.md
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CacheInvalidate/composer.json
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Captcha/LICENSE.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Captcha/LICENSE_AFL.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Captcha/README.md
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Captcha/composer.json
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Cest/AdminCreateCategoryCest.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Cest/AdminCreateConfigurableProductCest.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Cest/AdminCreateSimpleProductCest.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Data/CategoryData.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Data/CustomAttributeCategoryUrlKeyData.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Data/CustomAttributeProductUrlKeyData.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Data/ProductConfigurableAttributeData.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Data/ProductData.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Data/ProductExtensionAttributeData.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Data/StockItemData.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/LICENSE.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/LICENSE_AFL.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/category-meta.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/custom_attribute-meta.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product-meta.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product_extension_attribute-meta.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product_link-meta.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product_link_extension_attribute-meta.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product_option-meta.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product_option_value-meta.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/stock_item-meta.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Page/AdminCategoryPage.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Page/AdminProductEditPage.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Page/AdminProductIndexPage.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Page/StorefrontCategoryPage.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Page/StorefrontProductPage.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/README.md
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminCategoryBasicFieldSection.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminCategoryMainActionsSection.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminCategoryMessagesSection.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminCategorySEOSection.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminCategorySidebarActionSection.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminCategorySidebarTreeSection.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminProductFormActionSection.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminProductFormSection.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminProductGridActionSection.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminProductGridSection.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminProductMessagesSection.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminProductSEOSection.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/StorefrontCategoryMainSection.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/StorefrontMessagesSection.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/StorefrontMiniCartSection.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/StorefrontProductInfoDetailsSection.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/StorefrontProductInfoMainSection.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/composer.json
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogAnalytics/LICENSE.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogAnalytics/LICENSE_AFL.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogAnalytics/README.md
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogAnalytics/composer.json
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogImportExport/LICENSE.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogImportExport/LICENSE_AFL.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogImportExport/README.md
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogImportExport/composer.json
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogInventory/LICENSE.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogInventory/LICENSE_AFL.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogInventory/README.md
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogInventory/composer.json
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogRule/LICENSE.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogRule/LICENSE_AFL.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogRule/README.md
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogRule/composer.json
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogRuleConfigurable/LICENSE.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogRuleConfigurable/LICENSE_AFL.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogRuleConfigurable/README.md
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogRuleConfigurable/composer.json
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogSearch/LICENSE.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogSearch/LICENSE_AFL.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogSearch/README.md
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogSearch/composer.json
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogUrlRewrite/LICENSE.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogUrlRewrite/LICENSE_AFL.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogUrlRewrite/README.md
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogUrlRewrite/composer.json
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogWidget/LICENSE.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogWidget/LICENSE_AFL.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogWidget/README.md
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogWidget/composer.json
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Cest/StorefrontCustomerCheckoutCest.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Cest/StorefrontGuestCheckoutCest.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/LICENSE.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/LICENSE_AFL.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Page/CheckoutPage.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Page/CheckoutSuccessPage.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Page/GuestCheckoutPage.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/README.md
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Section/CheckoutOrderSummarySection.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Section/CheckoutPaymentSection.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Section/CheckoutShippingGuestInfoSection.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Section/CheckoutShippingMethodsSection.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Section/CheckoutShippingSection.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Section/CheckoutSuccessMainSection.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Section/GuestCheckoutPaymentSection.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Section/GuestCheckoutShippingSection.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/composer.json
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CheckoutAgreements/LICENSE.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CheckoutAgreements/LICENSE_AFL.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CheckoutAgreements/README.md
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CheckoutAgreements/composer.json
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Cest/AdminCreateCmsPageCest.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Data/CmsPageData.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/LICENSE.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/LICENSE_AFL.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Page/CmsNewPagePage.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Page/CmsPagesPage.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/README.md
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Section/CmsNewPagePageActionsSection.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Section/CmsNewPagePageBasicFieldsSection.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Section/CmsNewPagePageContentSection.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Section/CmsNewPagePageSeoSection.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Section/CmsPagesPageActionsSection.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/composer.json
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CmsUrlRewrite/LICENSE.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CmsUrlRewrite/LICENSE_AFL.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CmsUrlRewrite/README.md
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CmsUrlRewrite/composer.json
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Config/LICENSE.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Config/LICENSE_AFL.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Config/README.md
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Config/composer.json
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableImportExport/LICENSE.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableImportExport/LICENSE_AFL.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableImportExport/composer.json
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/Data/ConfigurableProductData.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/LICENSE.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/LICENSE_AFL.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/README.md
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/composer.json
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProductSales/LICENSE.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProductSales/LICENSE_AFL.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProductSales/README.md
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProductSales/composer.json
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Contact/LICENSE.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Contact/LICENSE_AFL.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Contact/README.md
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Contact/composer.json
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cookie/LICENSE.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cookie/LICENSE_AFL.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cookie/README.md
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cookie/composer.json
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CurrencySymbol/LICENSE.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CurrencySymbol/LICENSE_AFL.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CurrencySymbol/README.md
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CurrencySymbol/composer.json
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Cest/AdminCreateCustomerCest.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Cest/StorefrontCreateCustomerCest.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Cest/StorefrontExistingCustomerLoginCest.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Data/AddressData.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Data/CustomAttributeData.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Data/CustomerData.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Data/ExtensionAttributeSimple.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Data/RegionData.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/LICENSE.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/LICENSE_AFL.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Metadata/address-meta.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Metadata/custom_attribute-meta.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Metadata/customer-meta.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Metadata/customer_extension_attribute-meta.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Metadata/customer_nested_extension_attribute-meta.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Metadata/empty_extension_attribute-meta.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Metadata/region-meta.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Page/AdminCustomerPage.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Page/AdminNewCustomerPage.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Page/StorefrontCustomerCreatePage.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Page/StorefrontCustomerDashboardPage.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Page/StorefrontCustomerSignInPage.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Page/StorefrontHomePage.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/README.md
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/AdminCustomerFiltersSection.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/AdminCustomerGridSection.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/AdminCustomerMainActionsSection.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/AdminCustomerMessagesSection.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/AdminNewCustomerAccountInformationSection.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/AdminNewCustomerMainActionsSection.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/StorefrontCustomerCreateFormSection.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/StorefrontCustomerDashboardAccountInformationSection.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/StorefrontCustomerSignInFormSection.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/StorefrontPanelHeaderSection.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/composer.json
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CustomerAnalytics/LICENSE.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CustomerAnalytics/LICENSE_AFL.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CustomerAnalytics/README.md
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CustomerAnalytics/composer.json
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CustomerImportExport/LICENSE.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CustomerImportExport/LICENSE_AFL.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CustomerImportExport/README.md
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CustomerImportExport/composer.json
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Developer/LICENSE.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Developer/LICENSE_AFL.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Developer/README.md
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Developer/composer.json
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Dhl/LICENSE.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Dhl/LICENSE_AFL.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Dhl/README.md
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Dhl/composer.json
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Directory/LICENSE.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Directory/LICENSE_AFL.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Directory/README.md
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Directory/composer.json
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Downloadable/LICENSE.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Downloadable/LICENSE_AFL.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Downloadable/README.md
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Downloadable/composer.json
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/DownloadableImportExport/LICENSE.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/DownloadableImportExport/LICENSE_AFL.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/DownloadableImportExport/README.md
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/DownloadableImportExport/composer.json
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Eav/LICENSE.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Eav/LICENSE_AFL.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Eav/README.md
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Eav/composer.json
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Email/LICENSE.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Email/LICENSE_AFL.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Email/README.md
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Email/composer.json
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/EncryptionKey/LICENSE.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/EncryptionKey/LICENSE_AFL.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/EncryptionKey/README.md
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/EncryptionKey/composer.json
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Fedex/LICENSE.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Fedex/LICENSE_AFL.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Fedex/README.md
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Fedex/composer.json
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GiftMessage/LICENSE.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GiftMessage/LICENSE_AFL.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GiftMessage/README.md
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GiftMessage/composer.json
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GoogleAdwords/LICENSE.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GoogleAdwords/LICENSE_AFL.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GoogleAdwords/README.md
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GoogleAdwords/composer.json
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GoogleAnalytics/LICENSE.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GoogleAnalytics/LICENSE_AFL.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GoogleAnalytics/README.md
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GoogleAnalytics/composer.json
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GoogleOptimizer/LICENSE.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GoogleOptimizer/LICENSE_AFL.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GoogleOptimizer/README.md
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GoogleOptimizer/composer.json
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GroupedImportExport/LICENSE.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GroupedImportExport/LICENSE_AFL.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GroupedImportExport/README.md
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GroupedImportExport/composer.json
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GroupedProduct/LICENSE.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GroupedProduct/LICENSE_AFL.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GroupedProduct/README.md
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GroupedProduct/composer.json
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ImportExport/LICENSE.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ImportExport/LICENSE_AFL.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ImportExport/README.md
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ImportExport/composer.json
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Indexer/LICENSE.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Indexer/LICENSE_AFL.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Indexer/README.md
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Indexer/composer.json
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Integration/LICENSE.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Integration/LICENSE_AFL.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Integration/README.md
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Integration/composer.json
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/LayeredNavigation/LICENSE.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/LayeredNavigation/LICENSE_AFL.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/LayeredNavigation/README.md
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/LayeredNavigation/composer.json
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Marketplace/LICENSE.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Marketplace/LICENSE_AFL.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Marketplace/README.md
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Marketplace/composer.json
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/MediaStorage/LICENSE.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/MediaStorage/LICENSE_AFL.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/MediaStorage/README.md
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/MediaStorage/composer.json
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Msrp/LICENSE.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Msrp/LICENSE_AFL.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Msrp/README.md
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Msrp/composer.json
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Multishipping/LICENSE.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Multishipping/LICENSE_AFL.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Multishipping/README.md
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Multishipping/composer.json
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/NewRelicReporting/LICENSE.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/NewRelicReporting/LICENSE_AFL.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/NewRelicReporting/README.md
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/NewRelicReporting/composer.json
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Newsletter/LICENSE.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Newsletter/LICENSE_AFL.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Newsletter/README.md
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Newsletter/composer.json
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/OfflinePayments/LICENSE.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/OfflinePayments/LICENSE_AFL.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/OfflinePayments/README.md
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/OfflinePayments/composer.json
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/OfflineShipping/LICENSE.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/OfflineShipping/LICENSE_AFL.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/OfflineShipping/README.md
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/OfflineShipping/composer.json
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/PageCache/LICENSE.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/PageCache/LICENSE_AFL.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/PageCache/README.md
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/PageCache/composer.json
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Payment/LICENSE.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Payment/LICENSE_AFL.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Payment/README.md
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Payment/composer.json
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Paypal/LICENSE.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Paypal/LICENSE_AFL.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Paypal/README.md
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Paypal/composer.json
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Persistent/LICENSE.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Persistent/LICENSE_AFL.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Persistent/README.md
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Persistent/composer.json
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ProductAlert/LICENSE.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ProductAlert/LICENSE_AFL.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ProductAlert/README.md
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ProductAlert/composer.json
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ProductVideo/LICENSE.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ProductVideo/LICENSE_AFL.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ProductVideo/README.md
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ProductVideo/composer.json
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Quote/LICENSE.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Quote/LICENSE_AFL.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Quote/README.md
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Quote/composer.json
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/QuoteAnalytics/LICENSE.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/QuoteAnalytics/LICENSE_AFL.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/QuoteAnalytics/README.md
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/QuoteAnalytics/composer.json
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Reports/LICENSE.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Reports/LICENSE_AFL.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Reports/README.md
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Reports/composer.json
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Review/LICENSE.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Review/LICENSE_AFL.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Review/README.md
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Review/composer.json
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ReviewAnalytics/LICENSE.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ReviewAnalytics/LICENSE_AFL.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ReviewAnalytics/README.md
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ReviewAnalytics/composer.json
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Robots/LICENSE.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Robots/LICENSE_AFL.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Robots/README.md
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Robots/composer.json
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Rss/LICENSE.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Rss/LICENSE_AFL.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Rss/README.md
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Rss/composer.json
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Rule/LICENSE.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Rule/LICENSE_AFL.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Rule/README.md
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Rule/composer.json
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Cest/AdminCreateInvoiceCest.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Data/SalesData.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/LICENSE.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/LICENSE_AFL.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Page/InvoiceDetailsPage.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Page/InvoiceNewPage.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Page/InvoicesPage.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Page/OrderDetailsPage.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Page/OrdersPage.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/README.md
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Section/InvoiceDetailsInformationSection.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Section/InvoiceNewSection.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Section/InvoicesFiltersSection.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Section/InvoicesGridSection.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Section/OrderDetailsInformationSection.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Section/OrderDetailsInvoicesSection.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Section/OrderDetailsMainActionsSection.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Section/OrderDetailsMessagesSection.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Section/OrderDetailsOrderViewSection.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Section/OrdersGridSection.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/composer.json
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesAnalytics/LICENSE.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesAnalytics/LICENSE_AFL.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesAnalytics/README.md
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesAnalytics/composer.json
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesInventory/LICENSE.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesInventory/LICENSE_AFL.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesInventory/README.md
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesInventory/composer.json
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesRule/LICENSE.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesRule/LICENSE_AFL.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesRule/README.md
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesRule/composer.json
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesSequence/LICENSE.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesSequence/LICENSE_AFL.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesSequence/README.md
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesSequence/composer.json
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleData/LICENSE.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleData/LICENSE_AFL.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleData/README.md
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleData/composer.json
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/MinimumTestCest.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/PersistMultipleEntitiesCest.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/SampleCest.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Templates/TemplateCestFile.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Templates/TemplateDataFile.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Templates/TemplateMetaDataFile.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Templates/TemplatePageFile.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Templates/TemplateSectionFile.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Search/LICENSE.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Search/LICENSE_AFL.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Search/README.md
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Search/composer.json
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Security/LICENSE.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Security/LICENSE_AFL.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Security/README.md
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Security/composer.json
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SendFriend/LICENSE.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SendFriend/LICENSE_AFL.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SendFriend/README.md
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SendFriend/composer.json
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Shipping/LICENSE.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Shipping/LICENSE_AFL.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Shipping/README.md
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Shipping/composer.json
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sitemap/LICENSE.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sitemap/LICENSE_AFL.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sitemap/README.md
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sitemap/composer.json
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/LICENSE.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/LICENSE_AFL.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/README.md
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/composer.json
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Swagger/LICENSE.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Swagger/LICENSE_AFL.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Swagger/README.md
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Swagger/composer.json
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Swatches/LICENSE.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Swatches/LICENSE_AFL.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Swatches/README.md
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Swatches/composer.json
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SwatchesLayeredNavigation/LICENSE.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SwatchesLayeredNavigation/LICENSE_AFL.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SwatchesLayeredNavigation/README.md
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SwatchesLayeredNavigation/composer.json
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Tax/LICENSE.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Tax/LICENSE_AFL.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Tax/README.md
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Tax/composer.json
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/TaxImportExport/LICENSE.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/TaxImportExport/LICENSE_AFL.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/TaxImportExport/README.md
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/TaxImportExport/composer.json
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Theme/LICENSE.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Theme/LICENSE_AFL.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Theme/README.md
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Theme/composer.json
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Translation/LICENSE.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Translation/LICENSE_AFL.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Translation/README.md
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Translation/composer.json
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Ui/LICENSE.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Ui/LICENSE_AFL.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Ui/README.md
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Ui/composer.json
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Ups/LICENSE.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Ups/LICENSE_AFL.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Ups/README.md
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Ups/composer.json
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/UrlRewrite/LICENSE.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/UrlRewrite/LICENSE_AFL.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/UrlRewrite/README.md
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/UrlRewrite/composer.json
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/User/Data/UserData.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/User/LICENSE.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/User/LICENSE_AFL.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/User/README.md
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/User/composer.json
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Variable/LICENSE.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Variable/LICENSE_AFL.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Variable/README.md
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Variable/composer.json
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Vault/LICENSE.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Vault/LICENSE_AFL.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Vault/README.md
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Vault/composer.json
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Version/LICENSE.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Version/LICENSE_AFL.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Version/README.md
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Version/composer.json
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Webapi/LICENSE.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Webapi/LICENSE_AFL.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Webapi/README.md
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Webapi/composer.json
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/WebapiSecurity/LICENSE.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/WebapiSecurity/LICENSE_AFL.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/WebapiSecurity/README.md
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/WebapiSecurity/composer.json
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Weee/LICENSE.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Weee/LICENSE_AFL.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Weee/README.md
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Weee/composer.json
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Widget/LICENSE.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Widget/LICENSE_AFL.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Widget/README.md
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Widget/composer.json
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Wishlist/LICENSE.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Wishlist/LICENSE_AFL.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Wishlist/README.md
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Wishlist/composer.json
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/WishlistAnalytics/LICENSE.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/WishlistAnalytics/LICENSE_AFL.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/WishlistAnalytics/README.md
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/WishlistAnalytics/composer.json
 create mode 100644 dev/tests/acceptance/tests/functional/_bootstrap.php

diff --git a/dev/tests/acceptance/.env.example b/dev/tests/acceptance/.env.example
new file mode 100644
index 00000000000..500d54c3881
--- /dev/null
+++ b/dev/tests/acceptance/.env.example
@@ -0,0 +1,22 @@
+#Copyright © Magento, Inc. All rights reserved.
+#See COPYING.txt for license details.
+
+MAGENTO_BASE_URL=
+
+MAGENTO_BACKEND_NAME=
+MAGENTO_ADMIN_USERNAME=
+MAGENTO_ADMIN_PASSWORD=
+
+#*** Uncomment and set host & port if your dev environment needs different value other than MAGENTO_BASE_URL for Rest Api Requests ***#
+#MAGENTO_RESTAPI_SERVER_HOST=
+#MAGENTO_RESTAPI_SERVER_PORT=
+
+DB_DSN=
+DB_USERNAME=
+DB_PASSWORD=
+
+#*** uncomment these properties to set up a dev environment with symlinked projects***#
+#TESTS_BP=
+#FW_BP=
+#TESTS_MODULE_PATH=
+#MODULE_WHITELIST=
\ No newline at end of file
diff --git a/dev/tests/acceptance/.gitignore b/dev/tests/acceptance/.gitignore
new file mode 100755
index 00000000000..de6a96d05e7
--- /dev/null
+++ b/dev/tests/acceptance/.gitignore
@@ -0,0 +1,7 @@
+.idea
+.env
+codeception.yml
+tests/_output/*
+tests/functional.suite.yml
+tests/functional/Magento/FunctionalTest/_generated
+vendor/*
diff --git a/dev/tests/acceptance/LICENSE.txt b/dev/tests/acceptance/LICENSE.txt
new file mode 100644
index 00000000000..49525fd99da
--- /dev/null
+++ b/dev/tests/acceptance/LICENSE.txt
@@ -0,0 +1,48 @@
+
+Open Software License ("OSL") v. 3.0
+
+This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Open Software License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Open Software License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly. 
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including 'fair use' or 'fair dealing'). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright (C) 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
\ No newline at end of file
diff --git a/dev/tests/acceptance/LICENSE_AFL.txt b/dev/tests/acceptance/LICENSE_AFL.txt
new file mode 100644
index 00000000000..f39d641b18a
--- /dev/null
+++ b/dev/tests/acceptance/LICENSE_AFL.txt
@@ -0,0 +1,48 @@
+
+Academic Free License ("AFL") v. 3.0
+
+This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Academic Free License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, under any license of your choice that does not contradict the terms and conditions, including Licensor's reserved rights and remedies, in this Academic Free License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly.
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including "fair use" or "fair dealing"). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright © 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Academic Free License" or "AFL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
diff --git a/dev/tests/acceptance/README.md b/dev/tests/acceptance/README.md
new file mode 100755
index 00000000000..df6c804815b
--- /dev/null
+++ b/dev/tests/acceptance/README.md
@@ -0,0 +1,228 @@
+# Magento 2 Functional Tests
+ 
+# Built With
+* [Codeception](http://codeception.com/)
+* [Robo](http://robo.li/)
+* [Allure](http://allure.qatools.ru/)
+
+----
+
+# Prerequisites
+* [PHP v7.x](http://php.net/manual/en/install.php)
+* [Composer v1.4.x](https://getcomposer.org/download/)
+* [Java](https://www.java.com/en/download/)
+* [Selenium Server](http://www.seleniumhq.org/download/)
+* [ChromeDriver](https://sites.google.com/a/chromium.org/chromedriver/downloads)
+* [Allure CLI](https://docs.qameta.io/allure/latest/#_installing_a_commandline)
+* [GitHub](https://desktop.github.com/)
+* GitHub Repos:
+  * [CE Tests](https://github.com/magento-pangolin/magento2ce-acceptance-tests)
+  * [EE Tests](https://github.com/magento-pangolin/magento2ee-acceptance-tests)
+* Configure Magento for [Automated Testing](http://devdocs.magento.com/guides/v2.0/mtf/mtf_quickstart/mtf_quickstart_magento.html)
+
+### Recommendations
+* We recommend using [PHPStorm 2017](https://www.jetbrains.com/phpstorm/) for your IDE. They recently added support for [Codeception Test execution](https://blog.jetbrains.com/phpstorm/2017/03/codeception-support-comes-to-phpstorm-2017-1/) which is helpful when debugging.
+* We also recommend updating your [$PATH to include](https://stackoverflow.com/questions/7703041/editing-path-variable-on-mac) `vendor/bin` so you can easily execute the necessary `robo` and `codecept` commands instead of `vendor/bin/robo` or `vendor/bin/codecept`.  
+
+----
+
+# Installation
+You can **either** install through composer **or** clone from git repository.
+## Git
+```
+git clone GITHUB_REPO_URL
+cd magento2ce-acceptance-tests
+composer install
+```
+
+## Composer
+```
+mkdir DIR_NAME
+cd DIR_NAME
+composer create-project --repository-url=GITHUB_REPO_URL magento/magento2ce-acceptance-tests-metapackage
+```
+
+----
+
+# Robo
+Robo is a task runner for PHP that allows you to alias long complex CLI commands to simple commands.
+
+### Example
+
+* Original: `allure generate tests/_output/allure-results/ -o tests/_output/allure-report/`
+* Robo: `robo allure1:generate`
+
+## Available Robo Commands
+You can see a list of all available Robo commands by calling `robo` directly in the Terminal.
+
+##### Codeception Robo Commands
+* `robo`
+  * Lists all available Robo commands.
+* `robo clone:files`
+  * Duplicate the Example configuration files used to customize the Project
+* `robo build:project`
+  * Build the Codeception project
+* `robo generate:pages`
+  * Generate all Page Objects
+* `robo generate:tests`
+  * Generate all Tests in PHP
+* `robo example`
+  * Run all Tests marked with the @group tag 'example', using the Chrome environment
+* `robo chrome`
+  * Run all Acceptance tests using the Chrome environment
+* `robo firefox`
+  * Run all Acceptance tests using the FireFox environment
+* `robo phantomjs`
+  * Run all Acceptance tests using the PhantomJS environment
+* `robo folder ______`
+  * Run all Acceptance tests located under the Directory Path provided using the Chrome environment
+* `robo group ______`
+  * Run all Tests with the specified @group tag, excluding @group 'skip', using the Chrome environment
+  
+##### Allure Robo Commands
+To determine which version of the Allure command you need to use please run `allure --version`.
+
+* `robo allure1:generate`
+  * Allure v1.x.x - Generate the HTML for the Allure report based on the Test XML output
+* `robo allure1:open`
+  * Allure v1.x.x - Open the HTML Allure report
+* `robo allure1:report`
+  * Allure v1.x.x - Generate and open the HTML Allure report
+* `robo allure2:generate`
+  * Allure v2.x.x - Generate the HTML for the Allure report based on the Test XML output
+* `robo allure2:open`
+  * Allure v2.x.x - Open the HTML Allure report
+* `robo allure2:report`
+  * Allure v2.x.x - Generate and open the HTML Allure report
+
+----
+
+# Building The Framework
+After installing the dependencies you will want to build the Codeception project in the [Acceptance Test Framework](https://github.com/magento-pangolin/magento2-acceptance-test-framework), which is a dependency of the CE or EE Tests repo. Run `robo build:project` to complete this task.
+
+`robo build:project`
+
+----
+
+# Configure the Framework
+Before you can generate or run the Tests you will need to clone the Example Configuration files and edit them for your specific Store settings. You can edit these files with out the fear of accidentally committing your credentials or other sensitive information as these files are listed in the *.gitignore* file.
+Run the following command to generate these files:
+
+`robo setup`
+
+In these files you will find key pieces of information that are unique to your local Magento setup that will need to be edited (ex **MAGENTO_BASE_URL**, **MAGENTO_BACKEND_NAME**, **MAGENTO_ADMIN_USERNAME**, **MAGENTO_ADMIN_PASSWORD**, etc...).
+* **tests/acceptance.suite.yml**
+* **codeception.dist.yml**
+* **.env**
+
+----
+
+# Generate PHP files for Tests
+All Tests in the Framework are written in XML and need to have the PHP generated for Codeception to run. Run the following command to generate the PHP files into the following directory: `tests/acceptance/Magento/AcceptanceTest/_generated`
+
+If this directory doesn't exist it will be created.
+
+`robo generate:tests`
+
+----
+
+# Running Tests
+## Start the Selenium Server
+PLEASE NOTE: You will need to have an instance of the Selenium Server running on your machine before you can execute the Tests.
+
+```
+cd [LOCATION_OF_SELENIUM_JAR]
+java -jar selenium-server-standalone-X.X.X.jar
+```
+
+## Run Tests Manually
+You can run the Codeception tests directly without using Robo if you'd like. To do so please run `codecept run acceptance` to execute all Acceptance tests that DO NOT include @env tags. IF a Test includes an [@env tag](http://codeception.com/docs/07-AdvancedUsage#Environments) you MUST include the `--env ENV_NAME` flag.
+
+#### Common Codeception Flags:
+
+* --env
+* --group
+* --skip-group
+* --steps
+* --verbose
+* --debug
+  * [Full List of CLI Flags](http://codeception.com/docs/reference/Commands#Run)
+
+#### Examples
+
+* Run ALL Acceptance Tests without an @env tag: `codecept run acceptance`
+* Run ALL Acceptance Tests without the "skip" @group: `codecept run acceptance --skip-group skip`
+* Run ALL Acceptance Tests with the @group tag "example" without the "skip" @group tests: `codecept run acceptance --group example --skip-group skip`
+
+## Run Tests using Robo
+* Run all Acceptance Tests using the @env tag "chrome": `robo chrome`
+* Run all Acceptance Tests using the @env tag "firefox": `robo firefox`
+* Run all Acceptance Tests using the @env tag "phantomjs": `robo phantomjs`
+* Run all Acceptance Tests using the @group tag "example": `robo example`
+* Run all Acceptance Tests using the provided @group tag: `robo group GROUP_NAME`
+* Run all Acceptance Tests listed under the provided Folder Path: `robo folder tests/acceptance/Magento/AcceptanceTest/MODULE_NAME`
+
+----
+
+# Allure Reports
+### Manually
+You can run the following commands in the Terminal to generate and open an Allure report.
+
+##### Allure v1.x.x
+* Build the Report: `allure generate tests/_output/allure-results/ -o tests/_output/allure-report/`
+* Open the Report: `allure report open --report-dir tests/_output/allure-report/`
+
+##### Allure v2.x.x
+* Build the Report: `allure generate tests/_output/allure-results/ --output tests/_output/allure-report/ --clean`
+* Open the Report: `allure open --port 0 tests/_output/allure-report/`
+
+### Using Robo
+You can run the following Robo commands in the Terminal to generate and open an Allure report (Run the following terminal command for the Allure version: `allure --version`):
+
+##### Allure v1.x.x
+* Build the Report: `robo allure1:generate`
+* Open the Report: `robo allure1:open`
+* Build/Open the Report: `robo allure1:report`
+
+##### Allure v2.x.x
+* Build the Report: `robo allure2:generate`
+* Open the Report: `robo allure2:open`
+* Build/Open the Report: `robo allure2:report`
+
+----
+
+# Composer SymLinking
+Due to the interdependent nature of the 2 repos it is recommended to Symlink the repos so you develop locally easier. Please refer to this GitHub page: https://github.com/gossi/composer-localdev-plugin
+
+----
+
+# Troubleshooting
+* TimeZone Error - http://stackoverflow.com/questions/18768276/codeception-datetime-error
+* TimeZone List - http://php.net/manual/en/timezones.america.php
+* System PATH - Make sure you have `vendor/bin/` and `vendor/` listed in your system path so you can run the  `codecept` and `robo` commands directly:
+
+    `sudo nano /etc/private/paths`
+    
+* StackOverflow Help: https://stackoverflow.com/questions/7703041/editing-path-variable-on-mac
+* Allure `@env error` - Allure recently changed their Codeception Adapter that breaks Codeception when tests include the `@env` tag. A workaround for this error is to revert the changes they made to a function. 
+    * Locate the `AllureAdapter.php` file here: `vendor/allure-framework/allure-codeception/src/Yandex/Allure/Adapter/AllureAdapter.php`
+    * Edit the `_initialize()` function found on line 77 and replace it with the following:
+```
+public function _initialize(array $ignoredAnnotations = [])
+    {
+        parent::_initialize();
+        Annotation\AnnotationProvider::registerAnnotationNamespaces();
+        // Add standard PHPUnit annotations
+        Annotation\AnnotationProvider::addIgnoredAnnotations($this->ignoredAnnotations);
+        // Add custom ignored annotations
+        $ignoredAnnotations = $this->tryGetOption('ignoredAnnotations', []);
+        Annotation\AnnotationProvider::addIgnoredAnnotations($ignoredAnnotations);
+        $outputDirectory = $this->getOutputDirectory();
+        $deletePreviousResults =
+            $this->tryGetOption(DELETE_PREVIOUS_RESULTS_PARAMETER, false);
+        $this->prepareOutputDirectory($outputDirectory, $deletePreviousResults);
+        if (is_null(Model\Provider::getOutputDirectory())) {
+            Model\Provider::setOutputDirectory($outputDirectory);
+        }
+    }
+```
\ No newline at end of file
diff --git a/dev/tests/acceptance/RoboFile.php b/dev/tests/acceptance/RoboFile.php
new file mode 100644
index 00000000000..e41816cccbf
--- /dev/null
+++ b/dev/tests/acceptance/RoboFile.php
@@ -0,0 +1,157 @@
+<?php
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+/** This is project's console commands configuration for Robo task runner.
+ *
+ * @codingStandardsIgnoreFile
+ * @see http://robo.li/
+ */
+class RoboFile extends \Robo\Tasks
+{
+    use Robo\Task\Base\loadShortcuts;
+
+    /**
+     * Complete all Project Setup tasks
+     */
+    function setup()
+    {
+        $this->_exec('vendor/bin/robo clone:files');
+        $this->_exec('vendor/bin/codecept build');
+    }
+
+    /**
+     * Duplicate the Example configuration files used to customize the Project for customization
+     */
+    function cloneFiles()
+    {
+        $this->_exec('cp -vn .env.example .env');
+        $this->_exec('cp -vn codeception.dist.yml codeception.yml');
+        $this->_exec('cp -vn tests/functional.suite.dist.yml tests/functional.suite.yml');
+    }
+
+    /**
+     * Build the Codeception project
+     */
+    function buildProject()
+    {
+        $this->cloneFiles();
+        $this->_exec('vendor/bin/codecept build');
+    }
+
+    /**
+     * Generate all Tests
+     */
+    function generateTests()
+    {
+        require 'tests/functional/_bootstrap.php';
+        \Magento\FunctionalTestingFramework\Util\TestGenerator::getInstance()->createAllCestFiles();
+        $this->say("Generate Tests Command Run");
+    }
+
+    /**
+     * Run all Acceptance tests using the Chrome environment
+     */
+    function chrome()
+    {
+        $this->_exec('codecept run functional --env chrome --skip-group skip');
+    }
+
+    /**
+     * Run all Acceptance tests using the FireFox environment
+     */
+    function firefox()
+    {
+        $this->_exec('codecept run functional --env firefox --skip-group skip');
+    }
+
+    /**
+     * Run all Acceptance tests using the PhantomJS environment
+     */
+    function phantomjs()
+    {
+        $this->_exec('codecept run functional --env phantomjs --skip-group skip');
+    }
+
+    /**
+     * Run all Tests with the specified @group tag, excluding @group 'skip', using the Chrome environment
+     */
+    function group($args = '')
+    {
+        $this->taskExec('codecept run functional --verbose --steps --env chrome --skip-group skip --group')->args($args)->run();
+    }
+
+    /**
+     * Run all Acceptance tests located under the Directory Path provided using the Chrome environment
+     */
+    function folder($args = '')
+    {
+        $this->taskExec('codecept run functional --env chrome')->args($args)->run();
+    }
+
+    /**
+     * Run all Tests marked with the @group tag 'example', using the Chrome environment
+     */
+    function example()
+    {
+        $this->_exec('codecept run --env chrome --group example --skip-group skip');
+    }
+
+    /**
+     * Generate the HTML for the Allure report based on the Test XML output - Allure v1.4.X
+     */
+    function allure1Generate()
+    {
+        return $this->_exec('allure generate tests/_output/allure-results/ -o tests/_output/allure-report/');
+    }
+
+    /**
+     * Generate the HTML for the Allure report based on the Test XML output - Allure v2.3.X
+     */
+    function allure2Generate()
+    {
+        return $this->_exec('allure generate tests/_output/allure-results/ --output tests/_output/allure-report/ --clean');
+    }
+
+    /**
+     * Open the HTML Allure report - Allure v1.4.xX
+     */
+    function allure1Open()
+    {
+        $this->_exec('allure report open --report-dir tests/_output/allure-report/');
+    }
+
+    /**
+     * Open the HTML Allure report - Allure v2.3.X
+     */
+    function allure2Open()
+    {
+        $this->_exec('allure open --port 0 tests/_output/allure-report/');
+    }
+
+    /**
+     * Generate and open the HTML Allure report - Allure v1.4.X
+     */
+    function allure1Report()
+    {
+        $result1 = $this->allure1Generate();
+
+        if ($result1->wasSuccessful()) {
+            $this->allure1Open();
+        }
+    }
+
+    /**
+     * Generate and open the HTML Allure report - Allure v2.3.X
+     */
+    function allure2Report()
+    {
+        $result1 = $this->allure2Generate();
+
+        if ($result1->wasSuccessful()) {
+            $this->allure2Open();
+        }
+    }
+}
diff --git a/dev/tests/acceptance/codeception.dist.yml b/dev/tests/acceptance/codeception.dist.yml
new file mode 100644
index 00000000000..81fcd113db3
--- /dev/null
+++ b/dev/tests/acceptance/codeception.dist.yml
@@ -0,0 +1,33 @@
+# Copyright © Magento, Inc. All rights reserved.
+# See COPYING.txt for license details.
+actor: Tester
+paths:
+    tests: tests
+    log: tests/_output
+    data: tests/_data
+    support: vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework
+    envs: vendor/magento/magento2-functional-testing-framework/etc/_envs
+settings:
+    bootstrap: _bootstrap.php
+    colors: true
+    memory_limit: 1024M
+extensions:
+    enabled:
+        - Codeception\Extension\RunFailed
+        - Yandex\Allure\Adapter\AllureAdapter
+    config:
+        Yandex\Allure\Adapter\AllureAdapter:
+            deletePreviousResults: true
+            outputDirectory: allure-results
+            ignoredAnnotations:
+                - env
+                - zephyrId
+params:
+    - .env
+modules:
+    config:
+        Db:
+            dsn: "%DB_DSN%"
+            user: "%DB_USERNAME%"
+            password: "%DB_PASSWORD%"
+            dump: tests/_data/dump.sql
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/_bootstrap.php b/dev/tests/acceptance/tests/_bootstrap.php
new file mode 100644
index 00000000000..80392c9f53f
--- /dev/null
+++ b/dev/tests/acceptance/tests/_bootstrap.php
@@ -0,0 +1,24 @@
+<?php
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+define('PROJECT_ROOT', dirname(__DIR__));
+require_once PROJECT_ROOT . '/vendor/autoload.php';
+$RELATIVE_FW_PATH = '/vendor/magento/magento2-functional-testing-framework';
+
+//Load constants from .env file
+if (file_exists(PROJECT_ROOT . '/.env')) {
+    $env = new \Dotenv\Loader(PROJECT_ROOT . '/.env');
+    $env->load();
+
+    if (array_key_exists('TESTS_MODULE_PATH', $_ENV) xor array_key_exists('TESTS_BP', $_ENV)) {
+        throw new Exception('You must define both parameters TESTS_BP and TESTS_MODULE_PATH or neither parameter');
+    }
+
+    foreach ($_ENV as $key => $var) {
+        defined($key) || define($key, $var);
+    }
+}
+defined('FW_BP') || define('FW_BP', PROJECT_ROOT . $RELATIVE_FW_PATH);
diff --git a/dev/tests/acceptance/tests/_data/dump.sql b/dev/tests/acceptance/tests/_data/dump.sql
new file mode 100644
index 00000000000..4bc742ce67b
--- /dev/null
+++ b/dev/tests/acceptance/tests/_data/dump.sql
@@ -0,0 +1 @@
+/* Replace this file with actual dump of your database */
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional.suite.dist.yml b/dev/tests/acceptance/tests/functional.suite.dist.yml
new file mode 100644
index 00000000000..12ca2eae436
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional.suite.dist.yml
@@ -0,0 +1,33 @@
+# Copyright © Magento, Inc. All rights reserved.
+# See COPYING.txt for license details.
+
+# Codeception Test Suite Configuration
+#
+# Suite for acceptance tests.
+# Perform tests in browser using the WebDriver or PhpBrowser.
+# If you need both WebDriver and PHPBrowser tests - create a separate suite.
+
+class_name: AcceptanceTester
+namespace: Magento\FunctionalTestingFramework
+modules:
+    enabled:
+        - \Magento\FunctionalTestingFramework\Module\MagentoWebDriver
+        - \Magento\FunctionalTestingFramework\Helper\Acceptance
+        - \Magento\FunctionalTestingFramework\Helper\MagentoFakerData
+        - \Magento\FunctionalTestingFramework\Module\MagentoRestDriver:
+            url: "%MAGENTO_BASE_URL%/rest/default/V1/"
+            username: "%MAGENTO_ADMIN_USERNAME%"
+            password: "%MAGENTO_ADMIN_PASSWORD%"
+            depends: PhpBrowser
+            part: Json
+        - \Magento\FunctionalTestingFramework\Module\MagentoSequence
+        - Asserts
+    config:
+        \Magento\FunctionalTestingFramework\Module\MagentoWebDriver:
+            url: "%MAGENTO_BASE_URL%"
+            backend_name: admin
+            browser: chrome
+            window_size: maximize
+            username: "%MAGENTO_ADMIN_USERNAME%"
+            password: "%MAGENTO_ADMIN_PASSWORD%"
+            pageload_timeout: 30
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/AdminNotification/LICENSE.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/AdminNotification/LICENSE.txt
new file mode 100644
index 00000000000..49525fd99da
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/AdminNotification/LICENSE.txt
@@ -0,0 +1,48 @@
+
+Open Software License ("OSL") v. 3.0
+
+This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Open Software License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Open Software License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly. 
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including 'fair use' or 'fair dealing'). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright (C) 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/AdminNotification/LICENSE_AFL.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/AdminNotification/LICENSE_AFL.txt
new file mode 100644
index 00000000000..f39d641b18a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/AdminNotification/LICENSE_AFL.txt
@@ -0,0 +1,48 @@
+
+Academic Free License ("AFL") v. 3.0
+
+This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Academic Free License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, under any license of your choice that does not contradict the terms and conditions, including Licensor's reserved rights and remedies, in this Academic Free License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly.
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including "fair use" or "fair dealing"). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright © 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Academic Free License" or "AFL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/AdminNotification/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/AdminNotification/README.md
new file mode 100644
index 00000000000..4a84a064d1c
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/AdminNotification/README.md
@@ -0,0 +1,3 @@
+# Magento 2 Acceptance Tests
+
+The Acceptance Tests Module for **Magento_AdminNotification** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/AdminNotification/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/AdminNotification/composer.json
new file mode 100644
index 00000000000..328161117f7
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/AdminNotification/composer.json
@@ -0,0 +1,47 @@
+{
+    "name": "magento/magento2-functional-test-admin-notification",
+    "description": "Magento 2 Acceptance Test Module Admin Notification",
+    "repositories": [
+        {
+            "type" : "composer",
+            "url" : "https://repo.magento.com/"
+        }
+    ],
+    "require": {
+        "php": "~7.0",
+        "codeception/codeception": "2.2|2.3",
+        "allure-framework/allure-codeception": "dev-master",
+        "consolidation/robo": "^1.0.0",
+        "henrikbjorn/lurker": "^1.2",
+        "vlucas/phpdotenv": "~2.4",
+        "magento/magento2-functional-testing-framework": "dev-develop"
+    },
+    "suggest": {
+        "magento/magento2-functional-test-module-store": "dev-master",
+        "magento/magento2-functional-test-module-backend": "dev-master",
+        "magento/magento2-functional-test-media-storage": "dev-master",
+        "magento/magento2-functional-test-module-ui": "dev-master"
+    },
+    "type": "magento2-test-module",
+    "version": "dev-master",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
+    "autoload": {
+        "psr-4": {
+            "Magento\\FunctionalTest\\": [
+                "tests/functional/Magento/FunctionalTest",
+                "generated/Magento/FunctionalTest"
+            ]
+        }
+    },
+    "extra": {
+        "map": [
+            [
+                "*",
+                "tests/functional/Magento/FunctionalTest/AdminNotification"
+            ]
+        ]
+    }
+}
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/AdvancedPricingImportExport/LICENSE.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/AdvancedPricingImportExport/LICENSE.txt
new file mode 100644
index 00000000000..2b7359b7dfc
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/AdvancedPricingImportExport/LICENSE.txt
@@ -0,0 +1,48 @@
+
+Open Software License ("OSL") v. 3.0
+
+This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Open Software License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Open Software License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly.
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including 'fair use' or 'fair dealing'). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright (C) 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/AdvancedPricingImportExport/LICENSE_AFL.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/AdvancedPricingImportExport/LICENSE_AFL.txt
new file mode 100644
index 00000000000..f39d641b18a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/AdvancedPricingImportExport/LICENSE_AFL.txt
@@ -0,0 +1,48 @@
+
+Academic Free License ("AFL") v. 3.0
+
+This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Academic Free License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, under any license of your choice that does not contradict the terms and conditions, including Licensor's reserved rights and remedies, in this Academic Free License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly.
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including "fair use" or "fair dealing"). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright © 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Academic Free License" or "AFL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/AdvancedPricingImportExport/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/AdvancedPricingImportExport/README.md
new file mode 100644
index 00000000000..224e08d3e84
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/AdvancedPricingImportExport/README.md
@@ -0,0 +1,3 @@
+# Magento 2 Acceptance Tests
+
+The Acceptance Tests Module for **Magento_AdvancedPricingImportExport** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/AdvancedPricingImportExport/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/AdvancedPricingImportExport/composer.json
new file mode 100644
index 00000000000..32562af2094
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/AdvancedPricingImportExport/composer.json
@@ -0,0 +1,56 @@
+{
+    "name": "magento/magento2-functional-test-module-advanced-pricing-import-export",
+    "description": "Magento 2 Acceptance Test Module Advanced Pricing Import Export",
+    "repositories": [
+        {
+            "type" : "composer",
+            "url" : "https://repo.magento.com/"
+        }
+    ],
+    "require": {
+        "php": "~7.0",
+        "codeception/codeception": "2.2|2.3",
+        "allure-framework/allure-codeception": "dev-master",
+        "consolidation/robo": "^1.0.0",
+        "henrikbjorn/lurker": "^1.2",
+        "vlucas/phpdotenv": "~2.4",
+        "magento/magento2-functional-testing-framework": "dev-develop"
+    },
+    "suggest": {
+        "magento/magento2-functional-test-module-store": "dev-master",
+        "magento/magento2-functional-test-module-catalog": "dev-master",
+        "magento/magento2-functional-test-module-catalog-inventory": "dev-master",
+        "magento/magento2-functional-test-module-eav": "dev-master",
+        "magento/magento2-functional-test-module-import-export": "dev-master",
+        "magento/magento2-functional-test-module-catalog-import-export": "dev-master",
+        "magento/magento2-functional-test-module-customer": "dev-master"
+    },
+    "type": "magento2-test-module",
+    "version": "dev-master",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
+    "autoload": {
+        "psr-0": {
+            "Yandex": "vendor/allure-framework/allure-codeception/src/"
+        },
+        "psr-4": {
+            "Magento\\FunctionalTestingFramework\\": [
+                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
+            ],
+            "Magento\\FunctionalTest\\": [
+                "tests/functional/Magento/FunctionalTest",
+                "generated/Magento/FunctionalTest"
+            ]
+        }
+    },
+    "extra": {
+        "map": [
+            [
+                "*",
+                "tests/functional/Magento/FunctionalTest/AdvancedPricingImportExport"
+            ]
+        ]
+    }
+}
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Analytics/LICENSE.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Analytics/LICENSE.txt
new file mode 100644
index 00000000000..49525fd99da
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Analytics/LICENSE.txt
@@ -0,0 +1,48 @@
+
+Open Software License ("OSL") v. 3.0
+
+This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Open Software License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Open Software License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly. 
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including 'fair use' or 'fair dealing'). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright (C) 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Analytics/LICENSE_AFL.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Analytics/LICENSE_AFL.txt
new file mode 100644
index 00000000000..f39d641b18a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Analytics/LICENSE_AFL.txt
@@ -0,0 +1,48 @@
+
+Academic Free License ("AFL") v. 3.0
+
+This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Academic Free License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, under any license of your choice that does not contradict the terms and conditions, including Licensor's reserved rights and remedies, in this Academic Free License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly.
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including "fair use" or "fair dealing"). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright © 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Academic Free License" or "AFL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Analytics/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Analytics/README.md
new file mode 100644
index 00000000000..56c1d77deee
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Analytics/README.md
@@ -0,0 +1,3 @@
+# Magento 2 Acceptance Tests
+
+The Acceptance Tests Module for **Magento_Analytics** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Analytics/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Analytics/composer.json
new file mode 100644
index 00000000000..21e343f4169
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Analytics/composer.json
@@ -0,0 +1,53 @@
+{
+    "name": "magento/magento2-functional-test-module-analytics",
+    "description": "Magento 2 Acceptance Test Module Analytics",
+    "repositories": [
+        {
+            "type" : "composer",
+            "url" : "https://repo.magento.com/"
+        }
+    ],
+    "require": {
+        "php": "~7.0",
+        "codeception/codeception": "2.2|2.3",
+        "allure-framework/allure-codeception": "dev-master",
+        "consolidation/robo": "^1.0.0",
+        "henrikbjorn/lurker": "^1.2",
+        "vlucas/phpdotenv": "~2.4",
+        "magento/magento2-functional-testing-framework": "dev-develop"
+    },
+    "suggest": {
+        "magento/magento2-functional-test-module-backend": "dev-master",
+        "magento/magento2-functional-test-module-config": "dev-master",
+        "magento/magento2-functional-test-module-integration": "dev-master",
+        "magento/magento2-functional-test-module-store": "dev-master"
+    },
+    "type": "magento2-test-module",
+    "version": "dev-master",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
+    "autoload": {
+        "psr-0": {
+            "Yandex": "vendor/allure-framework/allure-codeception/src/"
+        },
+        "psr-4": {
+            "Magento\\FunctionalTestingFramework\\": [
+                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
+            ],
+            "Magento\\FunctionalTest\\": [
+                "tests/functional/Magento/FunctionalTest",
+                "generated/Magento/FunctionalTest"
+            ]
+        }
+    },
+    "extra": {
+        "map": [
+            [
+                "*",
+                "tests/functional/Magento/FunctionalTest/Analytics"
+            ]
+        ]
+    }
+}
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Authorization/LICENSE.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Authorization/LICENSE.txt
new file mode 100644
index 00000000000..49525fd99da
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Authorization/LICENSE.txt
@@ -0,0 +1,48 @@
+
+Open Software License ("OSL") v. 3.0
+
+This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Open Software License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Open Software License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly. 
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including 'fair use' or 'fair dealing'). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright (C) 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Authorization/LICENSE_AFL.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Authorization/LICENSE_AFL.txt
new file mode 100644
index 00000000000..f39d641b18a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Authorization/LICENSE_AFL.txt
@@ -0,0 +1,48 @@
+
+Academic Free License ("AFL") v. 3.0
+
+This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Academic Free License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, under any license of your choice that does not contradict the terms and conditions, including Licensor's reserved rights and remedies, in this Academic Free License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly.
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including "fair use" or "fair dealing"). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright © 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Academic Free License" or "AFL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Authorization/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Authorization/README.md
new file mode 100644
index 00000000000..b540c210faf
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Authorization/README.md
@@ -0,0 +1,3 @@
+# Magento 2 Acceptance Tests
+
+The Acceptance Tests Module for **Magento_Authorization** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Authorization/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Authorization/composer.json
new file mode 100644
index 00000000000..6c0ac320087
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Authorization/composer.json
@@ -0,0 +1,50 @@
+{
+    "name": "magento/magento2-functional-test-module-authorization",
+    "description": "Magento 2 Acceptance Test Module Authorization",
+    "repositories": [
+        {
+            "type" : "composer",
+            "url" : "https://repo.magento.com/"
+        }
+    ],
+    "require": {
+        "php": "~7.0",
+        "codeception/codeception": "2.2|2.3",
+        "allure-framework/allure-codeception": "dev-master",
+        "consolidation/robo": "^1.0.0",
+        "henrikbjorn/lurker": "^1.2",
+        "vlucas/phpdotenv": "~2.4",
+        "magento/magento2-functional-testing-framework": "dev-develop"
+    },
+    "suggest": {
+        "magento/magento2-functional-test-module-backend": "dev-master"
+    },
+    "type": "magento2-test-module",
+    "version": "dev-master",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
+    "autoload": {
+        "psr-0": {
+            "Yandex": "vendor/allure-framework/allure-codeception/src/"
+        },
+        "psr-4": {
+            "Magento\\FunctionalTestingFramework\\": [
+                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
+            ],
+            "Magento\\FunctionalTest\\": [
+                "tests/functional/Magento/FunctionalTest",
+                "generated/Magento/FunctionalTest"
+            ]
+        }
+    },
+    "extra": {
+        "map": [
+            [
+                "*",
+                "tests/functional/Magento/FunctionalTest/Authorization"
+            ]
+        ]
+    }
+}
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Authorizenet/LICENSE.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Authorizenet/LICENSE.txt
new file mode 100644
index 00000000000..49525fd99da
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Authorizenet/LICENSE.txt
@@ -0,0 +1,48 @@
+
+Open Software License ("OSL") v. 3.0
+
+This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Open Software License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Open Software License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly. 
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including 'fair use' or 'fair dealing'). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright (C) 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Authorizenet/LICENSE_AFL.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Authorizenet/LICENSE_AFL.txt
new file mode 100644
index 00000000000..f39d641b18a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Authorizenet/LICENSE_AFL.txt
@@ -0,0 +1,48 @@
+
+Academic Free License ("AFL") v. 3.0
+
+This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Academic Free License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, under any license of your choice that does not contradict the terms and conditions, including Licensor's reserved rights and remedies, in this Academic Free License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly.
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including "fair use" or "fair dealing"). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright © 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Academic Free License" or "AFL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Authorizenet/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Authorizenet/README.md
new file mode 100644
index 00000000000..86a31896a22
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Authorizenet/README.md
@@ -0,0 +1,3 @@
+# Magento 2 Acceptance Tests
+
+The Acceptance Tests Module for **Magento_Authorizenet** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Authorizenet/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Authorizenet/composer.json
new file mode 100644
index 00000000000..898a84016c6
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Authorizenet/composer.json
@@ -0,0 +1,56 @@
+{
+    "name": "magento/magento2-functional-test-module-authorizenet",
+    "description": "Magento 2 Acceptance Test Module Authorizenet",
+    "repositories": [
+        {
+            "type" : "composer",
+            "url" : "https://repo.magento.com/"
+        }
+    ],
+    "require": {
+        "php": "~7.0",
+        "codeception/codeception": "2.2|2.3",
+        "allure-framework/allure-codeception": "dev-master",
+        "consolidation/robo": "^1.0.0",
+        "henrikbjorn/lurker": "^1.2",
+        "vlucas/phpdotenv": "~2.4",
+        "magento/magento2-functional-testing-framework": "dev-develop"
+    },
+    "suggest": {
+        "magento/magento2-functional-test-module-backend": "dev-master",
+        "magento/magento2-functional-test-module-sales": "dev-master",
+        "magento/magento2-functional-test-module-store": "dev-master",
+        "magento/magento2-functional-test-module-quote": "dev-master",
+        "magento/magento2-functional-test-module-checkout": "dev-master",
+        "magento/magento2-functional-test-module-payment": "dev-master",
+        "magento/magento2-functional-test-module-catalog": "dev-master"
+    },
+    "type": "magento2-test-module",
+    "version": "dev-master",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
+    "autoload": {
+        "psr-0": {
+            "Yandex": "vendor/allure-framework/allure-codeception/src/"
+        },
+        "psr-4": {
+            "Magento\\FunctionalTestingFramework\\": [
+                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
+            ],
+            "Magento\\FunctionalTest\\": [
+                "tests/functional/Magento/FunctionalTest",
+                "generated/Magento/FunctionalTest"
+            ]
+        }
+    },
+    "extra": {
+        "map": [
+            [
+                "*",
+                "tests/functional/Magento/FunctionalTest/Authorizenet"
+            ]
+        ]
+    }
+}
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/Cest/AdminLoginCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/Cest/AdminLoginCest.xml
new file mode 100644
index 00000000000..c46766e6acf
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/Cest/AdminLoginCest.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Test/etc/testSchema.xsd">
+    <cest name="AdminLoginCest">
+        <annotations>
+            <features value="Admin Login"/>
+            <stories value="Login on the Admin Login page"/>
+            <group value="example"/>
+            <group value="login"/>
+            <env value="chrome"/>
+            <env value="firefox"/>
+            <env value="phantomjs"/>
+        </annotations>
+        <test name="LoginAsAdmin">
+            <annotations>
+                <title value="You should be able to log into the Magento Admin backend."/>
+                <description value="You should be able to log into the Magento Admin backend."/>
+                <severity value="CRITICAL"/>
+                <testCaseId value="MAGETWO-71572"/>
+            </annotations>
+            <amOnPage url="{{AdminLoginPage}}" mergeKey="amOnAdminLoginPage"/>
+            <fillField selector="{{AdminLoginFormSection.username}}" userInput="{{_ENV.MAGENTO_ADMIN_USERNAME}}" mergeKey="fillUsername"/>
+            <fillField selector="{{AdminLoginFormSection.password}}" userInput="{{_ENV.MAGENTO_ADMIN_PASSWORD}}" mergeKey="fillPassword"/>
+            <click selector="{{AdminLoginFormSection.signIn}}" mergeKey="clickOnSignIn"/>
+            <seeInCurrentUrl url="{{AdminLoginPage}}" mergeKey="seeAdminLoginUrl"/>
+        </test>
+    </cest>
+</config>
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/Data/BackenedData.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/Data/BackenedData.xml
new file mode 100644
index 00000000000..039472445b4
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/Data/BackenedData.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataProfileSchema.xsd">
+    <entity name="backendDatadOne" type="backend">
+        <data key="backendConfigName">data</data>
+    </entity>
+</config>
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/LICENSE.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/LICENSE.txt
new file mode 100644
index 00000000000..49525fd99da
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/LICENSE.txt
@@ -0,0 +1,48 @@
+
+Open Software License ("OSL") v. 3.0
+
+This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Open Software License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Open Software License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly. 
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including 'fair use' or 'fair dealing'). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright (C) 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/LICENSE_AFL.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/LICENSE_AFL.txt
new file mode 100644
index 00000000000..f39d641b18a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/LICENSE_AFL.txt
@@ -0,0 +1,48 @@
+
+Academic Free License ("AFL") v. 3.0
+
+This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Academic Free License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, under any license of your choice that does not contradict the terms and conditions, including Licensor's reserved rights and remedies, in this Academic Free License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly.
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including "fair use" or "fair dealing"). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright © 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Academic Free License" or "AFL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/Page/AdminLoginPage.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/Page/AdminLoginPage.xml
new file mode 100644
index 00000000000..910450187ad
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/Page/AdminLoginPage.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/PageObject.xsd">
+    <page name="AdminLoginPage" urlPath="admin/admin" module="Magento_Backend">
+        <section name="AdminLoginFormSection"/>
+    </page>
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/README.md
new file mode 100644
index 00000000000..4cbe742ea6b
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/README.md
@@ -0,0 +1,3 @@
+# Magento 2 Acceptance Tests
+
+The Acceptance Tests Module for **Magento_Backend** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/Section/AdminLoginFormSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/Section/AdminLoginFormSection.xml
new file mode 100644
index 00000000000..11768b4c83d
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/Section/AdminLoginFormSection.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
+    <section name="AdminLoginFormSection">
+        <element name="username" type="input" locator="#username"/>
+        <element name="password" type="input" locator="#login"/>
+        <element name="signIn" type="button" locator=".actions .action-primary" timeout="30"/>
+    </section>
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/Section/AdminMessagesSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/Section/AdminMessagesSection.xml
new file mode 100644
index 00000000000..ebc99031eac
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/Section/AdminMessagesSection.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
+    <section name="AdminMessagesSection">
+        <element name="test" type="input" locator=".test"/>
+    </section>
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/composer.json
new file mode 100644
index 00000000000..6aa559de5c3
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/composer.json
@@ -0,0 +1,64 @@
+{
+    "name": "magento/magento2-functional-test-module-backend",
+    "description": "Magento 2 Acceptance Test Module Backend",
+    "repositories": [
+        {
+            "type" : "composer",
+            "url" : "https://repo.magento.com/"
+        }
+    ],
+    "require": {
+        "php": "~7.0",
+        "codeception/codeception": "2.2|2.3",
+        "allure-framework/allure-codeception": "dev-master",
+        "consolidation/robo": "^1.0.0",
+        "henrikbjorn/lurker": "^1.2",
+        "vlucas/phpdotenv": "~2.4",
+        "magento/magento2-functional-testing-framework": "dev-develop"
+    },
+    "suggest": {
+        "magento/magento2-functional-test-module-store": "dev-master",
+        "magento/magento2-functional-test-module-directory": "dev-master",
+        "magento/magento2-functional-test-module-developer": "dev-master",
+        "magento/magento2-functional-test-module-eav": "dev-master",
+        "magento/magento2-functional-test-module-reports": "dev-master",
+        "magento/magento2-functional-test-module-sales": "dev-master",
+        "magento/magento2-functional-test-module-quote": "dev-master",
+        "magento/magento2-functional-test-module-catalog": "dev-master",
+        "magento/magento2-functional-test-module-user": "dev-master",
+        "magento/magento2-functional-test-module-security": "dev-master",
+        "magento/magento2-functional-test-module-backup": "dev-master",
+        "magento/magento2-functional-test-module-customer": "dev-master",
+        "magento/magento2-functional-test-module-translation": "dev-master",
+        "magento/magento2-functional-test-module-config": "dev-master",
+        "magento/magento2-functional-test-module-require-js": "dev-master"
+    },
+    "type": "magento2-test-module",
+    "version": "dev-master",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
+    "autoload": {
+        "psr-0": {
+            "Yandex": "vendor/allure-framework/allure-codeception/src/"
+        },
+        "psr-4": {
+            "Magento\\FunctionalTestingFramework\\": [
+                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
+            ],
+            "Magento\\FunctionalTest\\": [
+                "tests/functional/Magento/FunctionalTest",
+                "generated/Magento/FunctionalTest"
+            ]
+        }
+    },
+    "extra": {
+        "map": [
+            [
+                "*",
+                "tests/functional/Magento/FunctionalTest/Backend"
+            ]
+        ]
+    }
+}
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backup/LICENSE.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backup/LICENSE.txt
new file mode 100644
index 00000000000..49525fd99da
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backup/LICENSE.txt
@@ -0,0 +1,48 @@
+
+Open Software License ("OSL") v. 3.0
+
+This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Open Software License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Open Software License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly. 
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including 'fair use' or 'fair dealing'). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright (C) 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backup/LICENSE_AFL.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backup/LICENSE_AFL.txt
new file mode 100644
index 00000000000..f39d641b18a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backup/LICENSE_AFL.txt
@@ -0,0 +1,48 @@
+
+Academic Free License ("AFL") v. 3.0
+
+This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Academic Free License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, under any license of your choice that does not contradict the terms and conditions, including Licensor's reserved rights and remedies, in this Academic Free License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly.
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including "fair use" or "fair dealing"). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright © 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Academic Free License" or "AFL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backup/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backup/README.md
new file mode 100644
index 00000000000..962fdffd88d
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backup/README.md
@@ -0,0 +1,3 @@
+# Magento 2 Acceptance Tests
+
+The Acceptance Tests Module for **Magento_Backup** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backup/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backup/composer.json
new file mode 100644
index 00000000000..95dc878ef34
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backup/composer.json
@@ -0,0 +1,51 @@
+{
+    "name": "magento/magento2-functional-test-module-backup",
+    "description": "Magento 2 Acceptance Test Module Backup",
+    "repositories": [
+        {
+            "type" : "composer",
+            "url" : "https://repo.magento.com/"
+        }
+    ],
+    "require": {
+        "php": "~7.0",
+        "codeception/codeception": "2.2|2.3",
+        "allure-framework/allure-codeception": "dev-master",
+        "consolidation/robo": "^1.0.0",
+        "henrikbjorn/lurker": "^1.2",
+        "vlucas/phpdotenv": "~2.4",
+        "magento/magento2-functional-testing-framework": "dev-develop"
+    },
+    "suggest": {
+        "magento/magento2-functional-test-module-store": "dev-master",
+        "magento/magento2-functional-test-module-backup": "dev-master"
+    },
+    "type": "magento2-test-module",
+    "version": "dev-master",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
+    "autoload": {
+        "psr-0": {
+            "Yandex": "vendor/allure-framework/allure-codeception/src/"
+        },
+        "psr-4": {
+            "Magento\\FunctionalTestingFramework\\": [
+                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
+            ],
+            "Magento\\FunctionalTest\\": [
+                "tests/functional/Magento/FunctionalTest",
+                "generated/Magento/FunctionalTest"
+            ]
+        }
+    },
+    "extra": {
+        "map": [
+            [
+                "*",
+                "tests/functional/Magento/FunctionalTest/Backup"
+            ]
+        ]
+    }
+}
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Braintree/LICENSE.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Braintree/LICENSE.txt
new file mode 100644
index 00000000000..49525fd99da
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Braintree/LICENSE.txt
@@ -0,0 +1,48 @@
+
+Open Software License ("OSL") v. 3.0
+
+This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Open Software License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Open Software License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly. 
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including 'fair use' or 'fair dealing'). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright (C) 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Braintree/LICENSE_AFL.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Braintree/LICENSE_AFL.txt
new file mode 100644
index 00000000000..f39d641b18a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Braintree/LICENSE_AFL.txt
@@ -0,0 +1,48 @@
+
+Academic Free License ("AFL") v. 3.0
+
+This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Academic Free License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, under any license of your choice that does not contradict the terms and conditions, including Licensor's reserved rights and remedies, in this Academic Free License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly.
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including "fair use" or "fair dealing"). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright © 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Academic Free License" or "AFL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Braintree/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Braintree/README.md
new file mode 100644
index 00000000000..a4217e846b5
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Braintree/README.md
@@ -0,0 +1,3 @@
+# Magento 2 Acceptance Tests
+
+The Acceptance Tests Module for **Magento_Braintree** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Braintree/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Braintree/composer.json
new file mode 100644
index 00000000000..c9eeab4fdb5
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Braintree/composer.json
@@ -0,0 +1,61 @@
+{
+    "name": "magento/magento2-functional-test-module-braintree",
+    "description": "Magento 2 Acceptance Test Module Braintree",
+    "repositories": [
+        {
+            "type" : "composer",
+            "url" : "https://repo.magento.com/"
+        }
+    ],
+    "require": {
+        "php": "~7.0",
+        "codeception/codeception": "2.2|2.3",
+        "allure-framework/allure-codeception": "dev-master",
+        "consolidation/robo": "^1.0.0",
+        "henrikbjorn/lurker": "^1.2",
+        "vlucas/phpdotenv": "~2.4",
+        "magento/magento2-functional-testing-framework": "dev-develop"
+    },
+    "suggest": {
+        "magento/magento2-functional-test-module-config": "dev-master",
+        "magento/magento2-functional-test-module-directory": "dev-master",
+        "magento/magento2-functional-test-module-payment": "dev-master",
+        "magento/magento2-functional-test-module-checkout": "dev-master",
+        "magento/magento2-functional-test-module-sales": "dev-master",
+        "magento/magento2-functional-test-module-backend": "dev-master",
+        "magento/magento2-functional-test-module-vault": "dev-master",
+        "magento/magento2-functional-test-module-customer": "dev-master",
+        "magento/magento2-functional-test-module-catalog": "dev-master",
+        "magento/magento2-functional-test-module-quote": "dev-master",
+        "magento/magento2-functional-test-module-paypal": "dev-master",
+        "magento/magento2-functional-test-module-ui": "dev-master"
+    },
+    "type": "magento2-test-module",
+    "version": "dev-master",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
+    "autoload": {
+        "psr-0": {
+            "Yandex": "vendor/allure-framework/allure-codeception/src/"
+        },
+        "psr-4": {
+            "Magento\\FunctionalTestingFramework\\": [
+                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
+            ],
+            "Magento\\FunctionalTest\\": [
+                "tests/functional/Magento/FunctionalTest",
+                "generated/Magento/FunctionalTest"
+            ]
+        }
+    },
+    "extra": {
+        "map": [
+            [
+                "*",
+                "tests/functional/Magento/FunctionalTest/Braintree"
+            ]
+        ]
+    }
+}
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Bundle/LICENSE.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Bundle/LICENSE.txt
new file mode 100644
index 00000000000..49525fd99da
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Bundle/LICENSE.txt
@@ -0,0 +1,48 @@
+
+Open Software License ("OSL") v. 3.0
+
+This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Open Software License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Open Software License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly. 
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including 'fair use' or 'fair dealing'). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright (C) 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Bundle/LICENSE_AFL.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Bundle/LICENSE_AFL.txt
new file mode 100644
index 00000000000..f39d641b18a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Bundle/LICENSE_AFL.txt
@@ -0,0 +1,48 @@
+
+Academic Free License ("AFL") v. 3.0
+
+This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Academic Free License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, under any license of your choice that does not contradict the terms and conditions, including Licensor's reserved rights and remedies, in this Academic Free License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly.
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including "fair use" or "fair dealing"). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright © 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Academic Free License" or "AFL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Bundle/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Bundle/README.md
new file mode 100644
index 00000000000..95794907f2c
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Bundle/README.md
@@ -0,0 +1,3 @@
+# Magento 2 Acceptance Tests
+
+The Acceptance Tests Module for **Magento_Bundle** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Bundle/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Bundle/composer.json
new file mode 100644
index 00000000000..649a2f29700
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Bundle/composer.json
@@ -0,0 +1,64 @@
+{
+    "name": "magento/magento2-functional-test-module-bundle",
+    "description": "Magento 2 Acceptance Test Module Bundle",
+    "repositories": [
+        {
+            "type" : "composer",
+            "url" : "https://repo.magento.com/"
+        }
+    ],
+    "require": {
+        "php": "~7.0",
+        "codeception/codeception": "2.2|2.3",
+        "allure-framework/allure-codeception": "dev-master",
+        "consolidation/robo": "^1.0.0",
+        "henrikbjorn/lurker": "^1.2",
+        "vlucas/phpdotenv": "~2.4",
+        "magento/magento2-functional-testing-framework": "dev-develop"
+    },
+    "suggest": {
+        "magento/magento2-functional-test-module-store": "dev-master",
+        "magento/magento2-functional-test-module-catalog": "dev-master",
+        "magento/magento2-functional-test-module-tax": "dev-master",
+        "magento/magento2-functional-test-module-backend": "dev-master",
+        "magento/magento2-functional-test-module-sales": "dev-master",
+        "magento/magento2-functional-test-module-checkout": "dev-master",
+        "magento/magento2-functional-test-module-catalog-inventory": "dev-master",
+        "magento/magento2-functional-test-module-customer": "dev-master",
+        "magento/magento2-functional-test-module-catalog-rule": "dev-master",
+        "magento/magento2-functional-test-module-eav": "dev-master",
+        "magento/magento2-functional-test-module-config": "dev-master",
+        "magento/magento2-functional-test-module-gift-message": "dev-master",
+        "magento/magento2-functional-test-module-quote": "dev-master",
+        "magento/magento2-functional-test-module-media-storage": "dev-master",
+        "magento/magento2-functional-test-module-ui": "dev-master"
+    },
+    "type": "magento2-test-module",
+    "version": "dev-master",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
+    "autoload": {
+        "psr-0": {
+            "Yandex": "vendor/allure-framework/allure-codeception/src/"
+        },
+        "psr-4": {
+            "Magento\\FunctionalTestingFramework\\": [
+                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
+            ],
+            "Magento\\FunctionalTest\\": [
+                "tests/functional/Magento/FunctionalTest",
+                "generated/Magento/FunctionalTest"
+            ]
+        }
+    },
+    "extra": {
+        "map": [
+            [
+                "*",
+                "tests/functional/Magento/FunctionalTest/Bundle"
+            ]
+        ]
+    }
+}
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/BundleImportExport/LICENSE.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/BundleImportExport/LICENSE.txt
new file mode 100644
index 00000000000..49525fd99da
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/BundleImportExport/LICENSE.txt
@@ -0,0 +1,48 @@
+
+Open Software License ("OSL") v. 3.0
+
+This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Open Software License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Open Software License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly. 
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including 'fair use' or 'fair dealing'). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright (C) 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/BundleImportExport/LICENSE_AFL.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/BundleImportExport/LICENSE_AFL.txt
new file mode 100644
index 00000000000..f39d641b18a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/BundleImportExport/LICENSE_AFL.txt
@@ -0,0 +1,48 @@
+
+Academic Free License ("AFL") v. 3.0
+
+This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Academic Free License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, under any license of your choice that does not contradict the terms and conditions, including Licensor's reserved rights and remedies, in this Academic Free License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly.
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including "fair use" or "fair dealing"). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright © 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Academic Free License" or "AFL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/BundleImportExport/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/BundleImportExport/README.md
new file mode 100644
index 00000000000..83453308c0c
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/BundleImportExport/README.md
@@ -0,0 +1,3 @@
+# Magento 2 Acceptance Tests
+
+The Acceptance Tests Module for **Magento_BundleImportExport** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/BundleImportExport/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/BundleImportExport/composer.json
new file mode 100644
index 00000000000..2abf6a22a8e
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/BundleImportExport/composer.json
@@ -0,0 +1,54 @@
+{
+    "name": "magento/magento2-functional-test-module-bundle-import-export",
+    "description": "Magento 2 Acceptance Test Module Bundle Import Export",
+    "repositories": [
+        {
+            "type" : "composer",
+            "url" : "https://repo.magento.com/"
+        }
+    ],
+    "require": {
+        "php": "~7.0",
+        "codeception/codeception": "2.2|2.3",
+        "allure-framework/allure-codeception": "dev-master",
+        "consolidation/robo": "^1.0.0",
+        "henrikbjorn/lurker": "^1.2",
+        "vlucas/phpdotenv": "~2.4",
+        "magento/magento2-functional-testing-framework": "dev-develop"
+    },
+    "suggest": {
+        "magento/magento2-functional-test-module-catalog": "dev-master",
+        "magento/magento2-functional-test-module-import-export": "dev-master",
+        "magento/magento2-functional-test-module-catalog-import-export": "dev-master",
+        "magento/magento2-functional-test-module-bundle": "dev-master",
+        "magento/magento2-functional-test-module-eav": "dev-master"
+    },
+    "type": "magento2-test-module",
+    "version": "dev-master",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
+    "autoload": {
+        "psr-0": {
+            "Yandex": "vendor/allure-framework/allure-codeception/src/"
+        },
+        "psr-4": {
+            "Magento\\FunctionalTestingFramework\\": [
+                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
+            ],
+            "Magento\\FunctionalTest\\": [
+                "tests/functional/Magento/FunctionalTest",
+                "generated/Magento/FunctionalTest"
+            ]
+        }
+    },
+    "extra": {
+        "map": [
+            [
+                "*",
+                "tests/functional/Magento/FunctionalTest/BundleImportExport"
+            ]
+        ]
+    }
+}
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CacheInvalidate/LICENSE.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CacheInvalidate/LICENSE.txt
new file mode 100644
index 00000000000..49525fd99da
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CacheInvalidate/LICENSE.txt
@@ -0,0 +1,48 @@
+
+Open Software License ("OSL") v. 3.0
+
+This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Open Software License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Open Software License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly. 
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including 'fair use' or 'fair dealing'). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright (C) 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CacheInvalidate/LICENSE_AFL.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CacheInvalidate/LICENSE_AFL.txt
new file mode 100644
index 00000000000..f39d641b18a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CacheInvalidate/LICENSE_AFL.txt
@@ -0,0 +1,48 @@
+
+Academic Free License ("AFL") v. 3.0
+
+This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Academic Free License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, under any license of your choice that does not contradict the terms and conditions, including Licensor's reserved rights and remedies, in this Academic Free License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly.
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including "fair use" or "fair dealing"). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright © 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Academic Free License" or "AFL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CacheInvalidate/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CacheInvalidate/README.md
new file mode 100644
index 00000000000..34d8ae9c366
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CacheInvalidate/README.md
@@ -0,0 +1,3 @@
+# Magento 2 Acceptance Tests
+
+The Acceptance Tests Module for **Magento_CacheInvalidate** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CacheInvalidate/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CacheInvalidate/composer.json
new file mode 100644
index 00000000000..9ac9043f1b1
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CacheInvalidate/composer.json
@@ -0,0 +1,50 @@
+{
+    "name": "magento/magento2-functional-test-module-cache-invalidate",
+    "description": "Magento 2 Acceptance Test Module Cache Invalidate",
+    "repositories": [
+        {
+            "type" : "composer",
+            "url" : "https://repo.magento.com/"
+        }
+    ],
+    "require": {
+        "php": "~7.0",
+        "codeception/codeception": "2.2|2.3",
+        "allure-framework/allure-codeception": "dev-master",
+        "consolidation/robo": "^1.0.0",
+        "henrikbjorn/lurker": "^1.2",
+        "vlucas/phpdotenv": "~2.4",
+        "magento/magento2-functional-testing-framework": "dev-develop"
+    },
+    "suggest": {
+        "magento/magento2-functional-test-module-page-cache": "dev-master"
+    },
+    "type": "magento2-test-module",
+    "version": "dev-master",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
+    "autoload": {
+        "psr-0": {
+            "Yandex": "vendor/allure-framework/allure-codeception/src/"
+        },
+        "psr-4": {
+            "Magento\\FunctionalTestingFramework\\": [
+                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
+            ],
+            "Magento\\FunctionalTest\\": [
+                "tests/functional/Magento/FunctionalTest",
+                "generated/Magento/FunctionalTest"
+            ]
+        }
+    },
+    "extra": {
+        "map": [
+            [
+                "*",
+                "tests/functional/Magento/FunctionalTest/CacheInvalidate"
+            ]
+        ]
+    }
+}
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Captcha/LICENSE.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Captcha/LICENSE.txt
new file mode 100644
index 00000000000..49525fd99da
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Captcha/LICENSE.txt
@@ -0,0 +1,48 @@
+
+Open Software License ("OSL") v. 3.0
+
+This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Open Software License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Open Software License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly. 
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including 'fair use' or 'fair dealing'). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright (C) 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Captcha/LICENSE_AFL.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Captcha/LICENSE_AFL.txt
new file mode 100644
index 00000000000..f39d641b18a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Captcha/LICENSE_AFL.txt
@@ -0,0 +1,48 @@
+
+Academic Free License ("AFL") v. 3.0
+
+This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Academic Free License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, under any license of your choice that does not contradict the terms and conditions, including Licensor's reserved rights and remedies, in this Academic Free License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly.
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including "fair use" or "fair dealing"). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright © 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Academic Free License" or "AFL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Captcha/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Captcha/README.md
new file mode 100644
index 00000000000..3eee7b92bd3
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Captcha/README.md
@@ -0,0 +1,3 @@
+# Magento 2 Acceptance Tests
+
+The Acceptance Tests Module for **Magento_Captcha** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Captcha/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Captcha/composer.json
new file mode 100644
index 00000000000..60fff5eb2fe
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Captcha/composer.json
@@ -0,0 +1,53 @@
+{
+    "name": "magento/magento2-functional-test-module-captcha",
+    "description": "Magento 2 Acceptance Test Module Captcha",
+    "repositories": [
+        {
+            "type" : "composer",
+            "url" : "https://repo.magento.com/"
+        }
+    ],
+    "require": {
+        "php": "~7.0",
+        "codeception/codeception": "2.2|2.3",
+        "allure-framework/allure-codeception": "dev-master",
+        "consolidation/robo": "^1.0.0",
+        "henrikbjorn/lurker": "^1.2",
+        "vlucas/phpdotenv": "~2.4",
+        "magento/magento2-functional-testing-framework": "dev-develop"
+    },
+    "suggest": {
+        "magento/magento2-functional-test-module-store": "dev-master",
+        "magento/magento2-functional-test-module-customer": "dev-master",
+        "magento/magento2-functional-test-module-checkout": "dev-master",
+        "magento/magento2-functional-test-module-backend": "dev-master"
+    },
+    "type": "magento2-test-module",
+    "version": "dev-master",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
+    "autoload": {
+        "psr-0": {
+            "Yandex": "vendor/allure-framework/allure-codeception/src/"
+        },
+        "psr-4": {
+            "Magento\\FunctionalTestingFramework\\": [
+                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
+            ],
+            "Magento\\FunctionalTest\\": [
+                "tests/functional/Magento/FunctionalTest",
+                "generated/Magento/FunctionalTest"
+            ]
+        }
+    },
+    "extra": {
+        "map": [
+            [
+                "*",
+                "tests/functional/Magento/FunctionalTest/Captcha"
+            ]
+        ]
+    }
+}
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Cest/AdminCreateCategoryCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Cest/AdminCreateCategoryCest.xml
new file mode 100644
index 00000000000..f731830f291
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Cest/AdminCreateCategoryCest.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Test/etc/testSchema.xsd">
+    <cest name="AdminCreateCategoryCest">
+        <annotations>
+            <features value="Category Creation"/>
+            <stories value="Create a Category via the Admin"/>
+            <group value="category"/>
+            <env value="chrome"/>
+            <env value="firefox"/>
+            <env value="phantomjs"/>
+        </annotations>
+        <after>
+            <amOnPage url="admin/admin/auth/logout/" mergeKey="amOnLogoutPage"/>
+        </after>
+        <test name="CreateCategoryViaAdmin">
+            <annotations>
+                <title value="You should be able to create a Category in the admin back-end."/>
+                <description value="You should be able to create a Category in the admin back-end."/>
+                <severity value="CRITICAL"/>
+                <testCaseId value="MAGETWO-72102"/>
+            </annotations>
+            <amOnPage url="{{AdminLoginPage}}" mergeKey="amOnAdminLoginPage"/>
+            <fillField selector="{{AdminLoginFormSection.username}}" userInput="{{_ENV.MAGENTO_ADMIN_USERNAME}}" mergeKey="fillUsername"/>
+            <fillField selector="{{AdminLoginFormSection.password}}" userInput="{{_ENV.MAGENTO_ADMIN_PASSWORD}}" mergeKey="fillPassword"/>
+            <click selector="{{AdminLoginFormSection.signIn}}" mergeKey="clickOnSignIn"/>
+            <amOnPage url="{{AdminCategoryPage}}" mergeKey="navigateToCategoryPage"/>
+            <waitForPageLoad mergeKey="waitForPageLoad1"/>
+            <click selector="{{AdminCategorySidebarActionSection.AddSubcategoryButton}}" mergeKey="clickOnAddSubCategory"/>
+            <fillField selector="{{AdminCategoryBasicFieldSection.CategoryNameInput}}" userInput="{{SimpleSubCategory.name}}" mergeKey="enterCategoryName"/>
+            <click selector="{{AdminCategorySEOSection.SectionHeader}}" mergeKey="openSEO"/>
+            <fillField selector="{{AdminCategorySEOSection.UrlKeyInput}}" userInput="{{SimpleSubCategory.name_lwr}}" mergeKey="enterURLKey"/>
+            <click selector="{{AdminCategoryMainActionsSection.SaveButton}}" mergeKey="saveCategory"/>
+            <seeElement selector="{{AdminCategoryMessagesSection.SuccessMessage}}" mergeKey="assertSuccess"/>
+
+            <!-- Literal URL below, need to refactor line + StorefrontCategoryPage when support for variable URL is implemented-->
+            <amOnPage url="/{{SimpleSubCategory.name_lwr}}.html" mergeKey="goToCategoryFrontPage"/>
+            <waitForPageLoad mergeKey="waitForPageLoad2"/>
+            <seeInTitle userInput="{{SimpleSubCategory.name}}" mergeKey="assertTitle"/>
+            <see selector="{{StorefrontCategoryMainSection.CategoryTitle}}" userInput="{{SimpleSubCategory.name_lwr}}" mergeKey="assertInfo1"/>
+        </test>
+    </cest>
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Cest/AdminCreateConfigurableProductCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Cest/AdminCreateConfigurableProductCest.xml
new file mode 100644
index 00000000000..fa5cbd2d2f0
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Cest/AdminCreateConfigurableProductCest.xml
@@ -0,0 +1,130 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Test/etc/testSchema.xsd">
+    <cest name="AdminCreateConfigurableProductCest">
+        <annotations>
+            <features value="Product Creation"/>
+            <stories value="Create a Configurable Product via the Admin"/>
+            <group value="configurable"/>
+            <group value="product"/>
+            <env value="chrome"/>
+            <env value="firefox"/>
+            <env value="phantomjs"/>
+        </annotations>
+        <before>
+            <loginAsAdmin mergeKey="loginAsAdmin"/>
+        </before>
+        <after>
+            <amOnPage url="admin/admin/auth/logout/" mergeKey="amOnLogoutPage"/>
+        </after>
+        <test name="CreateConfigurableProductViaAdmin">
+            <annotations>
+                <title value="Create a Configurable Product via the Admin."/>
+                <description value="You should be able to create a Configurable Product via the Admin."/>
+                <severity value="CRITICAL"/>
+                <testCaseId value="MAGETWO-26041"/>
+            </annotations>
+
+            <amOnPage url="{{AdminCategoryPage.urlPath}}" mergeKey="amOnCategoryGridPage"/>
+            <waitForPageLoad mergeKey="waitForPageLoad1"/>
+
+            <click selector="{{AdminCategorySidebarActionSection.AddSubcategoryButton}}" mergeKey="clickOnAddSubCategory"/>
+            <fillField selector="{{AdminCategoryBasicFieldSection.CategoryNameInput}}" userInput="{{_defaultCategory.name}}" mergeKey="enterCategoryName"/>
+            <click selector="{{AdminCategorySEOSection.SectionHeader}}" mergeKey="clickOnSeoSection"/>
+            <fillField selector="{{AdminCategorySEOSection.UrlKeyInput}}" userInput="{{_defaultCategory.name_lwr}}" mergeKey="enterUrlKey"/>
+            <click selector="{{AdminCategoryMainActionsSection.SaveButton}}" mergeKey="clickOnSaveCategory"/>
+            <seeElement selector="{{AdminCategoryMessagesSection.SuccessMessage}}" mergeKey="assertSuccessMessage"/>
+
+            <amOnPage url="{{AdminProductIndexPage.urlPath}}" mergeKey="amOnProductGridPage"/>
+            <waitForPageLoad mergeKey="waitForPageLoad2"/>
+            <click selector="{{AdminProductGridActionSection.addProductToggle}}" mergeKey="clickOnAddProductToggle"/>
+            <click selector="{{AdminProductGridActionSection.addConfigurableProduct}}" mergeKey="clickOnAddConfigurableProduct"/>
+            <fillField userInput="{{_defaultProduct.name}}" selector="{{AdminProductFormSection.productName}}" mergeKey="fillName"/>
+            <fillField userInput="{{_defaultProduct.sku}}" selector="{{AdminProductFormSection.productSku}}" mergeKey="fillSKU"/>
+            <fillField userInput="{{_defaultProduct.price}}" selector="{{AdminProductFormSection.productPrice}}" mergeKey="fillPrice"/>
+            <fillField userInput="{{_defaultProduct.quantity}}" selector="{{AdminProductFormSection.productQuantity}}" mergeKey="fillQuantity"/>
+            <searchAndMultiSelectOption selector="{{AdminProductFormSection.categoriesDropdown}}" parameterArray="['{{_defaultCategory.name}}']" mergeKey="searchAndSelectCategory"/>
+            <click selector="{{AdminProductSEOSection.sectionHeader}}" mergeKey="openSeoSection"/>
+            <fillField userInput="{{_defaultProduct.urlKey}}" selector="{{AdminProductSEOSection.urlKeyInput}}" mergeKey="fillUrlKey"/>
+
+            <click selector="{{AdminProductFormConfigurationsSection.createConfigurations}}" mergeKey="clickOnCreateConfigurations"/>
+            <click selector="{{AdminCreateProductConfigurationsPanel.createNewAttribute}}" mergeKey="clickOnNewAttribute"/>
+            <switchToIFrame selector="{{AdminNewAttributePanel.newAttributeIFrame}}" mergeKey="switchToNewAttributeIFrame"/>
+            <fillField selector="{{AdminNewAttributePanel.defaultLabel}}" userInput="{{colorProductAttribute.default_label}}" mergeKey="fillDefaultLabel"/>
+            <click selector="{{AdminNewAttributePanel.saveAttribute}}" mergeKey="clickOnNewAttributePanel"/>
+
+            <switchToIFrame mergeKey="switchOutOfIFrame"/>
+            <click selector="{{AdminCreateProductConfigurationsPanel.filters}}" mergeKey="clickOnFilters"/>
+            <fillField userInput="{{colorProductAttribute.default_label}}" selector="{{AdminCreateProductConfigurationsPanel.attributeCode}}" mergeKey="fillFilterAttributeCodeField"/>
+            <click selector="{{AdminCreateProductConfigurationsPanel.applyFilters}}" mergeKey="clickApplyFiltersButton"/>
+            <click selector="{{AdminCreateProductConfigurationsPanel.firstCheckbox}}" mergeKey="clickOnFirstCheckbox"/>
+            <click selector="{{AdminCreateProductConfigurationsPanel.next}}" mergeKey="clickOnNextButton1"/>
+
+            <click selector="{{AdminCreateProductConfigurationsPanel.createNewValue}}" mergeKey="clickOnCreateNewValue1"/>
+            <fillField userInput="{{colorProductAttribute1.name}}" selector="{{AdminCreateProductConfigurationsPanel.attributeName}}" mergeKey="fillFieldForNewAttribute1"/>
+            <click selector="{{AdminCreateProductConfigurationsPanel.saveAttribute}}" mergeKey="clickOnSaveNewAttribute1"/>
+
+            <click selector="{{AdminCreateProductConfigurationsPanel.createNewValue}}" mergeKey="clickOnCreateNewValue2"/>
+            <fillField userInput="{{colorProductAttribute2.name}}" selector="{{AdminCreateProductConfigurationsPanel.attributeName}}" mergeKey="fillFieldForNewAttribute2"/>
+            <click selector="{{AdminCreateProductConfigurationsPanel.saveAttribute}}" mergeKey="clickOnSaveNewAttribute2"/>
+
+            <click selector="{{AdminCreateProductConfigurationsPanel.createNewValue}}" mergeKey="clickOnCreateNewValue3"/>
+            <fillField userInput="{{colorProductAttribute3.name}}" selector="{{AdminCreateProductConfigurationsPanel.attributeName}}" mergeKey="fillFieldForNewAttribute3"/>
+            <click selector="{{AdminCreateProductConfigurationsPanel.saveAttribute}}" mergeKey="clickOnSaveNewAttribute3"/>
+
+            <click selector="{{AdminCreateProductConfigurationsPanel.selectAll}}" mergeKey="clickOnSelectAll"/>
+            <click selector="{{AdminCreateProductConfigurationsPanel.next}}" mergeKey="clickOnNextButton2"/>
+
+            <click selector="{{AdminCreateProductConfigurationsPanel.applyUniquePricesByAttributeToEachSku}}" mergeKey="clickOnApplyUniquePricesByAttributeToEachSku"/>
+            <selectOption selector="{{AdminCreateProductConfigurationsPanel.selectAttribute}}" userInput="{{colorProductAttribute.default_label}}" mergeKey="selectAttributes"/>
+            <fillField selector="{{AdminCreateProductConfigurationsPanel.attribute1}}" userInput="{{colorProductAttribute1.price}}" mergeKey="fillAttributePrice1"/>
+            <fillField selector="{{AdminCreateProductConfigurationsPanel.attribute2}}" userInput="{{colorProductAttribute2.price}}" mergeKey="fillAttributePrice2"/>
+            <fillField selector="{{AdminCreateProductConfigurationsPanel.attribute3}}" userInput="{{colorProductAttribute3.price}}" mergeKey="fillAttributePrice3"/>
+
+            <click selector="{{AdminCreateProductConfigurationsPanel.applySingleQuantityToEachSkus}}" mergeKey="clickOnApplySingleQuantityToEachSku"/>
+            <fillField selector="{{AdminCreateProductConfigurationsPanel.quantity}}" userInput="1" mergeKey="enterAttributeQuantity"/>
+            <click selector="{{AdminCreateProductConfigurationsPanel.next}}" mergeKey="clickOnNextButton3"/>
+            <click selector="{{AdminCreateProductConfigurationsPanel.next}}" mergeKey="clickOnNextButton4"/>
+
+            <click selector="{{AdminProductFormActionSection.saveButton}}" mergeKey="clickOnSaveButton2"/>
+            <click selector="{{AdminChooseAffectedAttributeSetPopup.confirm}}" mergeKey="clickOnConfirmInPopup"/>
+
+            <seeElement selector="{{AdminProductMessagesSection.successMessage}}" mergeKey="seeSaveProductMessage"/>
+            <seeInTitle userInput="{{_defaultProduct.name}}" mergeKey="seeProductNameInTitle"/>
+
+            <seeNumberOfElements selector="{{AdminProductFormConfigurationsSection.currentVariationsRows}}" userInput="3" mergeKey="seeNumberOfRows"/>
+            <see selector="{{AdminProductFormConfigurationsSection.currentVariationsNameCells}}" userInput="{{colorProductAttribute1.name}}" mergeKey="seeAttributeName1InField"/>
+            <see selector="{{AdminProductFormConfigurationsSection.currentVariationsNameCells}}" userInput="{{colorProductAttribute2.name}}" mergeKey="seeAttributeName2InField"/>
+            <see selector="{{AdminProductFormConfigurationsSection.currentVariationsNameCells}}" userInput="{{colorProductAttribute3.name}}" mergeKey="seeAttributeName3InField"/>
+            <see selector="{{AdminProductFormConfigurationsSection.currentVariationsSkuCells}}" userInput="{{colorProductAttribute1.name}}" mergeKey="seeAttributeSku1InField"/>
+            <see selector="{{AdminProductFormConfigurationsSection.currentVariationsSkuCells}}" userInput="{{colorProductAttribute2.name}}" mergeKey="seeAttributeSku2InField"/>
+            <see selector="{{AdminProductFormConfigurationsSection.currentVariationsSkuCells}}" userInput="{{colorProductAttribute3.name}}" mergeKey="seeAttributeSku3InField"/>
+            <see selector="{{AdminProductFormConfigurationsSection.currentVariationsPriceCells}}" userInput="{{colorProductAttribute1.price}}" mergeKey="seeUniquePrice1InField"/>
+            <see selector="{{AdminProductFormConfigurationsSection.currentVariationsPriceCells}}" userInput="{{colorProductAttribute2.price}}" mergeKey="seeUniquePrice2InField"/>
+            <see selector="{{AdminProductFormConfigurationsSection.currentVariationsPriceCells}}" userInput="{{colorProductAttribute3.price}}" mergeKey="seeUniquePrice3InField"/>
+            <see selector="{{AdminProductFormConfigurationsSection.currentVariationsQuantityCells}}" userInput="{{colorProductAttribute.attribute_quantity}}" mergeKey="seeQuantityInField"/>
+
+            <amOnPage url="/" mergeKey="amOnStorefront"/>
+            <waitForPageLoad mergeKey="waitForPageLoad3"/>
+
+            <click userInput="{{_defaultCategory.name}}" mergeKey="clickOnCategoryName"/>
+            <waitForPageLoad mergeKey="waitForPageLoad4"/>
+
+            <see userInput="{{_defaultProduct.name}}" mergeKey="assertProductPresent"/>
+            <see userInput="{{colorProductAttribute1.price}}" mergeKey="assertProductPricePresent"/>
+            <click userInput="{{_defaultProduct.name}}" mergeKey="clickOnProductName"/>
+            <waitForPageLoad mergeKey="waitForPageLoad5"/>
+
+            <seeInTitle userInput="{{_defaultProduct.name}}" mergeKey="assertProductNameTitle"/>
+            <see userInput="{{_defaultProduct.name}}" selector="{{StorefrontProductInfoMainSection.productName}}" mergeKey="assertProductName"/>
+            <see userInput="{{colorProductAttribute1.price}}" selector="{{StorefrontProductInfoMainSection.productPrice}}" mergeKey="assertProductPrice"/>
+            <see userInput="{{_defaultProduct.sku}}" selector="{{StorefrontProductInfoMainSection.productSku}}" mergeKey="assertProductSku"/>
+
+            <see selector="{{StorefrontProductInfoMainSection.productAttributeTitle1}}" userInput="{{colorProductAttribute.default_label}}" mergeKey="seeColorAttributeName1"/>
+            <see selector="{{StorefrontProductInfoMainSection.productAttributeOptions1}}" userInput="{{colorProductAttribute1.name}}" mergeKey="seeInDropDown1"/>
+            <see selector="{{StorefrontProductInfoMainSection.productAttributeOptions1}}" userInput="{{colorProductAttribute2.name}}" mergeKey="seeInDropDown2"/>
+            <see selector="{{StorefrontProductInfoMainSection.productAttributeOptions1}}" userInput="{{colorProductAttribute3.name}}" mergeKey="seeInDropDown3"/>
+        </test>
+    </cest>
+</config>
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Cest/AdminCreateSimpleProductCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Cest/AdminCreateSimpleProductCest.xml
new file mode 100644
index 00000000000..a32a80a6d91
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Cest/AdminCreateSimpleProductCest.xml
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Test/etc/testSchema.xsd">
+    <cest name="AdminCreateSimpleProductCest">
+        <annotations>
+            <features value="Product Creation"/>
+            <stories value="Create a Simple Product via Admin"/>
+            <group value="product"/>
+            <env value="chrome"/>
+            <env value="firefox"/>
+            <env value="phantomjs"/>
+        </annotations>
+        <before>
+            <createData entity="_defaultCategory" mergeKey="createPreReqCategory"/>
+        </before>
+        <test name="CreateSimpleProductViaAdmin">
+            <annotations>
+                <title value="You should be able to create a Simple Product in the admin back-end."/>
+                <description value="You should be able to create a Simple Product in the admin back-end."/>
+                <severity value="CRITICAL"/>
+                <testCaseId value="MAGETWO-23414"/>
+            </annotations>
+            <amOnPage url="{{AdminLoginPage.url}}" mergeKey="navigateToAdmin"/>
+            <fillField userInput="{{_ENV.MAGENTO_ADMIN_USERNAME}}" selector="{{AdminLoginFormSection.username}}" mergeKey="fillUsername"/>
+            <fillField userInput="{{_ENV.MAGENTO_ADMIN_PASSWORD}}" selector="{{AdminLoginFormSection.password}}" mergeKey="fillPassword"/>
+            <click selector="{{AdminLoginFormSection.signIn}}" mergeKey="clickLogin"/>
+            <amOnPage url="{{AdminProductIndexPage.url}}" mergeKey="navigateToProductIndex"/>
+            <click selector="{{AdminProductGridActionSection.addProductToggle}}" mergeKey="clickAddProductDropdown"/>
+            <click selector="{{AdminProductGridActionSection.addSimpleProduct}}" mergeKey="clickAddSimpleProduct"/>
+            <fillField userInput="{{_defaultProduct.name}}" selector="{{AdminProductFormSection.productName}}" mergeKey="fillName"/>
+            <fillField userInput="{{_defaultProduct.sku}}" selector="{{AdminProductFormSection.productSku}}" mergeKey="fillSKU"/>
+            <fillField userInput="{{_defaultProduct.price}}" selector="{{AdminProductFormSection.productPrice}}" mergeKey="fillPrice"/>
+            <fillField userInput="{{_defaultProduct.quantity}}" selector="{{AdminProductFormSection.productQuantity}}" mergeKey="fillQuantity"/>
+            <searchAndMultiSelectOption selector="{{AdminProductFormSection.categoriesDropdown}}" parameterArray="['$$createPreReqCategory.name$$']" mergeKey="searchAndSelectCategory"/>
+            <click selector="{{AdminProductSEOSection.sectionHeader}}" mergeKey="openSeoSection"/>
+            <fillField userInput="{{_defaultProduct.urlKey}}" selector="{{AdminProductSEOSection.urlKeyInput}}" mergeKey="fillUrlKey"/>
+            <click selector="{{AdminProductFormActionSection.saveButton}}" mergeKey="saveProduct"/>
+            <seeElement selector="{{AdminProductMessagesSection.successMessage}}" mergeKey="assertSaveMessageSuccess"/>
+            <seeInField userInput="{{_defaultProduct.name}}" selector="{{AdminProductFormSection.productName}}" mergeKey="assertFieldName"/>
+            <seeInField userInput="{{_defaultProduct.sku}}" selector="{{AdminProductFormSection.productSku}}" mergeKey="assertFieldSku"/>
+            <seeInField userInput="{{_defaultProduct.price}}" selector="{{AdminProductFormSection.productPrice}}" mergeKey="assertFieldPrice"/>
+            <click selector="{{AdminProductSEOSection.sectionHeader}}" mergeKey="openSeoSectionAssert"/>
+            <seeInField userInput="{{_defaultProduct.urlKey}}" selector="{{AdminProductSEOSection.urlKeyInput}}" mergeKey="assertFieldUrlKey"/>
+
+            <!-- Go to storefront category page, assert product visibility -->
+            <amOnPage url="{{StorefrontCategoryPage.url($$createPreReqCategory.name$$)}}" mergeKey="navigateToCategoryPage"/>
+            <waitForPageLoad mergeKey="waitForPageLoad1"/>
+            <see userInput="{{_defaultProduct.name}}" mergeKey="assertProductPresent"/>
+            <see userInput="{{_defaultProduct.price}}" mergeKey="assertProductPricePresent"/>
+
+            <!-- Go to storefront product page, assert product visibility -->
+            <amOnPage url="{{_defaultProduct.urlKey}}.html" mergeKey="navigateToProductPage"/>
+            <waitForPageLoad mergeKey="waitForPageLoad2"/>
+            <seeInTitle userInput="{{_defaultProduct.name}}" mergeKey="assertProductNameTitle"/>
+            <see userInput="{{_defaultProduct.name}}" selector="{{StorefrontProductInfoMainSection.productName}}" mergeKey="assertProductName"/>
+            <see userInput="{{_defaultProduct.price}}" selector="{{StorefrontProductInfoMainSection.productPrice}}" mergeKey="assertProductPrice"/>
+            <see userInput="{{_defaultProduct.sku}}" selector="{{StorefrontProductInfoMainSection.productSku}}" mergeKey="assertProductSku"/>
+        </test>
+        <after>
+            <deleteData createDataKey="createPreReqCategory" mergeKey="deletePreReqCategory"/>
+            <amOnPage url="admin/admin/auth/logout/" mergeKey="amOnLogoutPage"/>
+        </after>
+    </cest>
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Data/CategoryData.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Data/CategoryData.xml
new file mode 100644
index 00000000000..5c6a03c46b3
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Data/CategoryData.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataProfileSchema.xsd">
+    <entity name="_defaultCategory" type="category">
+        <data key="name" unique="suffix">simpleCategory</data>
+        <data key="name_lwr" unique="suffix">simplecategory</data>
+        <data key="is_active">true</data>
+    </entity>
+    <entity name="SimpleSubCategory" type="category">
+        <data key="name" unique="suffix">SimpleSubCategory</data>
+        <data key="name_lwr" unique="suffix">simplesubcategory</data>
+        <data key="is_active">true</data>
+        <data key="include_in_menu">true</data>
+        <!--required-entity type="custom_attribute">CustomAttributeCategoryUrlKey</required-entity-->
+    </entity>
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Data/CustomAttributeCategoryUrlKeyData.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Data/CustomAttributeCategoryUrlKeyData.xml
new file mode 100644
index 00000000000..43348890b94
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Data/CustomAttributeCategoryUrlKeyData.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataProfileSchema.xsd">
+    <entity name="CustomAttributeCategoryUrlKey" type="custom_attribute">
+        <data key="attribute_code">url_key</data>
+        <data key="value" unique="suffix">category</data>
+    </entity>
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Data/CustomAttributeProductUrlKeyData.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Data/CustomAttributeProductUrlKeyData.xml
new file mode 100644
index 00000000000..ccaed86c1e7
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Data/CustomAttributeProductUrlKeyData.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataProfileSchema.xsd">
+    <entity name="CustomAttributeProductUrlKey" type="custom_attribute">
+        <data key="attribute_code">url_key</data>
+        <data key="value" unique="suffix">product</data>
+    </entity>
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Data/ProductConfigurableAttributeData.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Data/ProductConfigurableAttributeData.xml
new file mode 100644
index 00000000000..3cdb6c30c4f
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Data/ProductConfigurableAttributeData.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataProfileSchema.xsd">
+    <entity name="colorProductAttribute" type="product_attribute">
+        <data key="default_label" unique="suffix">Color</data>
+        <data key="attribute_quantity">1</data>
+    </entity>
+    <entity name="colorProductAttribute1" type="product_attribute">
+        <data key="name" unique="suffix">White</data>
+        <data key="price">1.00</data>
+    </entity>
+    <entity name="colorProductAttribute2" type="product_attribute">
+        <data key="name" unique="suffix">Red</data>
+        <data key="price">2.00</data>
+    </entity>
+    <entity name="colorProductAttribute3" type="product_attribute">
+        <data key="name" unique="suffix">Blue</data>
+        <data key="price">3.00</data>
+    </entity>
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Data/ProductData.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Data/ProductData.xml
new file mode 100644
index 00000000000..6ac89d0c2a7
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Data/ProductData.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataProfileSchema.xsd">
+    <entity name="_defaultProduct" type="product">
+        <data key="sku" unique="suffix">testSku</data>
+        <data key="type_id">simple</data>
+        <data key="attribute_set_id">4</data>
+        <data key="visibility">4</data>
+        <data key="name" unique="suffix">testProductName</data>
+        <data key="price">123.00</data>
+        <data key="urlKey" unique="suffix">testurlkey</data>
+        <data key="status">1</data>
+        <data key="quantity">100</data>
+        <required-entity type="product_extension_attribute">EavStockItem</required-entity>
+    </entity>
+    <entity name="SimpleProduct" type="product">
+        <data key="sku" unique="suffix">SimpleProduct</data>
+        <data key="type_id">simple</data>
+        <data key="attribute_set_id">4</data>
+        <data key="name">SimpleProduct</data>
+        <data key="price">123.00</data>
+        <data key="visibility">4</data>
+        <data key="status">1</data>
+        <required-entity type="product_extension_attribute">EavStockItem</required-entity>
+        <!--required-entity type="custom_attribute">CustomAttributeProductUrlKey</required-entity-->
+    </entity>
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Data/ProductExtensionAttributeData.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Data/ProductExtensionAttributeData.xml
new file mode 100644
index 00000000000..d884bebf36d
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Data/ProductExtensionAttributeData.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataProfileSchema.xsd">
+    <entity name="EavStockItem" type="product_extension_attribute">
+        <required-entity type="stock_item">Qty_1000</required-entity>
+    </entity>
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Data/StockItemData.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Data/StockItemData.xml
new file mode 100644
index 00000000000..7711f5dce8e
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Data/StockItemData.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataProfileSchema.xsd">
+    <entity name="Qty_1000" type="stock_item">
+        <data key="qty">1000</data>
+        <data key="is_in_stock">true</data>
+    </entity>
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/LICENSE.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/LICENSE.txt
new file mode 100644
index 00000000000..49525fd99da
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/LICENSE.txt
@@ -0,0 +1,48 @@
+
+Open Software License ("OSL") v. 3.0
+
+This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Open Software License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Open Software License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly. 
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including 'fair use' or 'fair dealing'). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright (C) 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/LICENSE_AFL.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/LICENSE_AFL.txt
new file mode 100644
index 00000000000..f39d641b18a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/LICENSE_AFL.txt
@@ -0,0 +1,48 @@
+
+Academic Free License ("AFL") v. 3.0
+
+This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Academic Free License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, under any license of your choice that does not contradict the terms and conditions, including Licensor's reserved rights and remedies, in this Academic Free License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly.
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including "fair use" or "fair dealing"). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright © 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Academic Free License" or "AFL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/category-meta.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/category-meta.xml
new file mode 100644
index 00000000000..453fe74bfa3
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/category-meta.xml
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataOperation.xsd">
+    <operation name="CreateCategory" dataType="category" type="create" auth="/rest/V1/integration/admin/token" url="/rest/V1/categories" method="POST">
+        <header param="Content-Type">application/json</header>
+        <jsonObject key="category" dataType="category">
+            <entry key="parent_id">integer</entry>
+            <entry key="name">string</entry>
+            <entry key="is_active">boolean</entry>
+            <entry key="position">integer</entry>
+            <entry key="level">integer</entry>
+            <entry key="children">string</entry>
+            <entry key="created_at">string</entry>
+            <entry key="updated_at">string</entry>
+            <entry key="path">string</entry>
+            <entry key="include_in_menu">boolean</entry>
+            <array key="available_sort_by">
+                <value>string</value>
+            </array>
+            <entry key="extension_attributes">empty_extension_attribute</entry>
+            <array key="custom_attributes">
+                <value>custom_attribute</value>
+            </array>
+        </jsonObject>
+    </operation>
+
+    <operation name="UpdateCategory" dataType="category" type="update" auth="/rest/V1/integration/admin/token" url="/rest/V1/categories" method="PUT">
+        <header param="Content-Type">application/json</header>
+        <jsonObject key="category" dataType="category">
+            <entry key="id">integer</entry>
+            <entry key="parent_id">integer</entry>
+            <entry key="name">string</entry>
+            <entry key="is_active">boolean</entry>
+            <entry key="position">integer</entry>
+            <entry key="level">integer</entry>
+            <entry key="children">string</entry>
+            <entry key="created_at">string</entry>
+            <entry key="updated_at">string</entry>
+            <entry key="path">string</entry>
+            <array key="available_sort_by">
+                <value>string</value>
+            </array>
+            <entry key="include_in_menu">boolean</entry>
+            <entry key="extension_attributes">empty_extension_attribute</entry>
+            <array key="custom_attributes">
+                <value>custom_attribute</value>
+            </array>
+        </jsonObject>
+    </operation>
+
+    <operation name="DeleteCategory" dataType="category" type="delete" auth="/rest/V1/integration/admin/token" url="/rest/V1/categories" method="DELETE">
+        <header param="Content-Type">application/json</header>
+        <param key="categoryId" type="path">{id}</param>
+    </operation>
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/custom_attribute-meta.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/custom_attribute-meta.xml
new file mode 100644
index 00000000000..7ad804465c7
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/custom_attribute-meta.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataOperation.xsd">
+    <operation name="CreateCustomAttribute" dataType="custom_attribute" type="create">
+        <entry key="attribute_code">string</entry>
+        <entry key="value">string</entry>
+    </operation>
+    <operation name="UpdateCustomAttribute" dataType="custom_attribute" type="update">
+        <entry key="attribute_code">string</entry>
+        <entry key="value">string</entry>
+    </operation>
+</config>
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product-meta.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product-meta.xml
new file mode 100644
index 00000000000..a2b77297796
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product-meta.xml
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataOperation.xsd">
+    <operation name="CreateProduct" dataType="product" type="create" auth="/rest/V1/integration/admin/token" url="/rest/V1/products" method="POST">
+        <header param="Content-Type">application/json</header>
+        <jsonObject dataType="product" key="product">
+            <entry key="sku">string</entry>
+            <entry key="name">string</entry>
+            <entry key="attribute_set_id">integer</entry>
+            <entry key="price">integer</entry>
+            <entry key="status">integer</entry>
+            <entry key="visibility">integer</entry>
+            <entry key="type_id">string</entry>
+            <entry key="created_at">string</entry>
+            <entry key="updated_at">string</entry>
+            <entry key="weight">integer</entry>
+            <entry key="extension_attributes">product_extension_attribute</entry>
+            <array key="product_links">
+                <value>product_link</value>
+            </array>
+            <array key="custom_attributes">
+                <value>custom_attribute</value>
+            </array>
+            <array key="options">
+                <value>product_option</value>
+            </array>
+        </jsonObject>
+    </operation>
+    <operation name="UpdateProduct" dataType="product" type="update" auth="/rest/V1/integration/admin/token" url="/rest/V1/products" method="PUT">
+        <header param="Content-Type">application/json</header>
+        <jsonObject dataType="product" key="product">
+            <entry key="id">integer</entry>
+            <entry key="sku">string</entry>
+            <entry key="name">string</entry>
+            <entry key="attribute_set_id">integer</entry>
+            <entry key="price">integer</entry>
+            <entry key="status">integer</entry>
+            <entry key="visibility">integer</entry>
+            <entry key="type_id">string</entry>
+            <entry key="created_at">string</entry>
+            <entry key="updated_at">string</entry>
+            <entry key="weight">integer</entry>
+            <entry key="extension_attributes">product_extension_attribute</entry>
+            <array key="product_links">
+                <value>product_link</value>
+            </array>
+            <array key="custom_attributes">
+                <value>custom_attribute</value>
+            </array>
+            <array key="options">
+                <value>product_option</value>
+            </array>
+            <!--array key="media_gallery_entries">
+                <value>media_gallery_entries</value>
+            </array>
+            <array key="tier_prices">
+                <value>tier_prices</value>
+            </array-->
+        </jsonObject>
+        <entry key="saveOptions">boolean</entry>
+    </operation>
+    <operation name="deleteProduct" dataType="product" type="delete" auth="/rest/V1/integration/admin/token" url="/rest/V1/products" method="DELETE">
+        <header param="Content-Type">application/json</header>
+        <param key="sku" type="path">{sku}</param>
+    </operation>
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product_extension_attribute-meta.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product_extension_attribute-meta.xml
new file mode 100644
index 00000000000..86d3629f48a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product_extension_attribute-meta.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataOperation.xsd">
+    <operation name="CreateProductExtensionAttribute" dataType="product_extension_attribute" type="create">
+        <entry key="stock_item">stock_item</entry>
+    </operation>
+    <operation name="UpdateProductExtensionAttribute" dataType="product_extension_attribute" type="update">
+        <entry key="stock_item">stock_item</entry>
+    </operation>
+</config>
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product_link-meta.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product_link-meta.xml
new file mode 100644
index 00000000000..6400211dedf
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product_link-meta.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataOperation.xsd">
+    <operation name="CreateProductLink" dataType="product_link" type="create">
+        <entry key="sku">string</entry>
+        <entry key="link_type">string</entry>
+        <entry key="linked_product_sku">string</entry>
+        <entry key="linked_product_type">string</entry>
+        <entry key="position">integer</entry>
+        <array key="extension_attributes">
+            <value>product_link_extension_attribute</value>
+        </array>
+    </operation>
+    <operation name="UpdateProductLink" dataType="product_link" type="update">
+        <entry key="sku">string</entry>
+        <entry key="link_type">string</entry>
+        <entry key="linked_product_sku">string</entry>
+        <entry key="linked_product_type">string</entry>
+        <entry key="position">integer</entry>
+        <array key="extension_attributes">
+            <value>product_link_extension_attribute</value>
+        </array>
+    </operation>
+</config>
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product_link_extension_attribute-meta.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product_link_extension_attribute-meta.xml
new file mode 100644
index 00000000000..5371fa1f5e7
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product_link_extension_attribute-meta.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataOperation.xsd">
+    <operation name="CreateProductLinkExtensionAttribute" dataType="product_link_extension_attribute" type="create">
+        <header param="Content-Type">application/json</header>
+        <entry key="qty">integer</entry>
+    </operation>
+    <operation name="UpdateProductLinkExtensionAttribute" dataType="product_link_extension_attribute" type="update">
+        <header param="Content-Type">application/json</header>
+        <entry key="qty">integer</entry>
+    </operation>
+</config>
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product_option-meta.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product_option-meta.xml
new file mode 100644
index 00000000000..5e3f66c51e1
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product_option-meta.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataOperation.xsd">
+    <operation name="CreateProductOption" dataType="product_option" type="create">
+        <entry key="product_sku">string</entry>
+        <entry key="option_id">integer</entry>
+        <entry key="title">string</entry>
+        <entry key="type">string</entry>
+        <entry key="sort_order">integer</entry>
+        <entry key="is_require">boolean</entry>
+        <entry key="price">integer</entry>
+        <entry key="price_type">string</entry>
+        <entry key="sku">string</entry>
+        <entry key="file_extension">string</entry>
+        <entry key="max_characters">integer</entry>
+        <entry key="max_size_x">integer</entry>
+        <entry key="max_size_y">integer</entry>
+        <array key="values">
+            <value>product_option_value</value>
+        </array>
+    </operation>
+    <operation name="UpdateProductOption" dataType="product_option" type="update">
+        <entry key="product_sku">string</entry>
+        <entry key="option_id">integer</entry>
+        <entry key="title">string</entry>
+        <entry key="type">string</entry>
+        <entry key="sort_order">integer</entry>
+        <entry key="is_require">boolean</entry>
+        <entry key="price">integer</entry>
+        <entry key="price_type">string</entry>
+        <entry key="sku">string</entry>
+        <entry key="file_extension">string</entry>
+        <entry key="max_characters">integer</entry>
+        <entry key="max_size_x">integer</entry>
+        <entry key="max_size_y">integer</entry>
+        <array key="values">
+            <value>product_option_value</value>
+        </array>
+    </operation>
+</config>
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product_option_value-meta.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product_option_value-meta.xml
new file mode 100644
index 00000000000..4be46958db3
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product_option_value-meta.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataOperation.xsd">
+    <operation name="CreateProductOptionValue" dataType="product_option_value" type="create">
+        <entry key="title">string</entry>
+        <entry key="sort_order">integer</entry>
+        <entry key="price">integer</entry>
+        <entry key="price_type">string</entry>
+        <entry key="sku">string</entry>
+        <entry key="option_type_id">integer</entry>
+    </operation>
+    <operation name="UpdateProductOptionValue" dataType="product_option_value" type="update">
+        <entry key="title">string</entry>
+        <entry key="sort_order">integer</entry>
+        <entry key="price">integer</entry>
+        <entry key="price_type">string</entry>
+        <entry key="sku">string</entry>
+        <entry key="option_type_id">integer</entry>
+    </operation>
+</config>
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/stock_item-meta.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/stock_item-meta.xml
new file mode 100644
index 00000000000..70626de4211
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/stock_item-meta.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataOperation.xsd">
+    <operation name="CreateStockItem" dataType="stock_item" type="create">
+        <entry key="qty">integer</entry>
+        <entry key="is_in_stock">boolean</entry>
+    </operation>
+    <operation name="UpdateStockItem" dataType="stock_item" type="update">
+        <entry key="qty">integer</entry>
+        <entry key="is_in_stock">boolean</entry>
+    </operation>
+</config>
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Page/AdminCategoryPage.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Page/AdminCategoryPage.xml
new file mode 100644
index 00000000000..b00effeb20e
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Page/AdminCategoryPage.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/PageObject.xsd">
+    <page name="AdminCategoryPage" urlPath="admin/catalog/category/" module="Catalog">
+        <section name="AdminCategorySidebarActionSection"/>
+        <section name="AdminCategorySidebarTreeSection"/>
+        <section name="AdminCategoryBasicFieldSection"/>
+        <section name="AdminCategorySEOSection"/>
+    </page>
+</config>
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Page/AdminProductEditPage.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Page/AdminProductEditPage.xml
new file mode 100644
index 00000000000..907407acf8e
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Page/AdminProductEditPage.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/PageObject.xsd">
+    <page name="AdminProductEditPage" urlPath="admin/catalog/product/new" module="Magento_Catalog">
+        <section name="AdminProductFormSection"/>
+        <section name="AdminProductFormActionSection"/>
+        <section name="AdminMessagesSection"/>
+    </page>
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Page/AdminProductIndexPage.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Page/AdminProductIndexPage.xml
new file mode 100644
index 00000000000..b3f5ef1ba11
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Page/AdminProductIndexPage.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/PageObject.xsd">
+    <page name="AdminProductIndexPage" urlPath="admin/catalog/product/index" module="Magento_Catalog">
+        <section name="AdminProductGridActionSection" />
+        <section name="AdminProductGridSection" />
+        <section name="AdminMessagesSection" />
+    </page>
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Page/StorefrontCategoryPage.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Page/StorefrontCategoryPage.xml
new file mode 100644
index 00000000000..1346b05af4c
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Page/StorefrontCategoryPage.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/PageObject.xsd">
+    <page name="StorefrontCategoryPage" urlPath="/{{var1}}.html" module="Category" parameterized="true">
+        <section name="StorefrontCategoryMainSection"/>
+    </page>
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Page/StorefrontProductPage.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Page/StorefrontProductPage.xml
new file mode 100644
index 00000000000..4436742a13b
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Page/StorefrontProductPage.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/PageObject.xsd">
+    <page name="StorefrontProductPage" urlPath="admin/catalog/product/view" module="Magento_Catalog">
+        <section name="StorefrontProductInfoMainSection" />
+        <section name="StorefrontProductInfoDetailsSection" />
+        <section name="StorefrontProductImageSection" />
+        <section name="StorefrontMessagesSection" />
+    </page>
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/README.md
new file mode 100644
index 00000000000..308f84b867a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/README.md
@@ -0,0 +1,3 @@
+# Magento 2 Acceptance Tests
+
+The Acceptance Tests Module for **Magento_Catalog** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminCategoryBasicFieldSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminCategoryBasicFieldSection.xml
new file mode 100644
index 00000000000..f83cc99b1b6
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminCategoryBasicFieldSection.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
+    <section name="AdminCategoryBasicFieldSection">
+        <element name="IncludeInMenu" type="checkbox" locator="input[name='include_in_menu']"/>
+        <element name="EnableCategory" type="checkbox" locator="input[name='is_active']"/>
+        <element name="CategoryNameInput" type="input" locator="input[name='name']"/>
+    </section>
+</config>
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminCategoryMainActionsSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminCategoryMainActionsSection.xml
new file mode 100644
index 00000000000..dbec4c295e4
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminCategoryMainActionsSection.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
+    <section name="AdminCategoryMainActionsSection">
+        <element name="SaveButton" type="button" locator=".page-actions-inner #save" timeout="30"/>
+    </section>
+</config>
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminCategoryMessagesSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminCategoryMessagesSection.xml
new file mode 100644
index 00000000000..e21176d441b
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminCategoryMessagesSection.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
+    <section name="AdminCategoryMessagesSection">
+        <element name="SuccessMessage" type="text" locator=".message-success"/>
+    </section>
+</config>
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminCategorySEOSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminCategorySEOSection.xml
new file mode 100644
index 00000000000..3564a6ca78b
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminCategorySEOSection.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
+    <section name="AdminCategorySEOSection">
+        <element name="SectionHeader" type="button" locator="div[data-index='search_engine_optimization']" timeout="30"/>
+        <element name="UrlKeyInput" type="input" locator="input[name='url_key']"/>
+        <element name="MetaTitleInput" type="input" locator="input[name='meta_title']"/>
+        <element name="MetaKeywordsInput" type="textarea" locator="textarea[name='meta_keywords']"/>
+        <element name="MetaDescriptionInput" type="textarea" locator="textarea[name='meta_description']"/>
+    </section>
+</config>
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminCategorySidebarActionSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminCategorySidebarActionSection.xml
new file mode 100644
index 00000000000..e3ff829d4ce
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminCategorySidebarActionSection.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
+    <section name="AdminCategorySidebarActionSection">
+        <element name="AddRootCategoryButton" type="button" locator="#add_root_category_button" timeout="30"/>
+        <element name="AddSubcategoryButton" type="button" locator="#add_subcategory_button" timeout="30"/>
+    </section>
+</config>
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminCategorySidebarTreeSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminCategorySidebarTreeSection.xml
new file mode 100644
index 00000000000..ec537ba4830
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminCategorySidebarTreeSection.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
+    <section name="AdminCategorySidebarTreeSection">
+        <element name="Collapse All" type="button" locator=".tree-actions a:first-child"/>
+        <element name="Expand All" type="button" locator=".tree-actions a:last-child"/>
+    </section>
+</config>
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminProductFormActionSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminProductFormActionSection.xml
new file mode 100644
index 00000000000..713e8b71c23
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminProductFormActionSection.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
+    <section name="AdminProductFormActionSection">
+        <element name="saveButton" type="button" locator="#save-button" timeout="30"/>
+    </section>
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminProductFormSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminProductFormSection.xml
new file mode 100644
index 00000000000..1fef90bdd11
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminProductFormSection.xml
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
+    <section name="AdminProductFormSection">
+        <element name="productName" type="input" locator=".admin__field[data-index=name] input"/>
+        <element name="productSku" type="input" locator=".admin__field[data-index=sku] input"/>
+        <element name="productPrice" type="input" locator=".admin__field[data-index=price] input"/>
+        <element name="categoriesDropdown" type="multiselect" locator="div[data-index='category_ids']"/>
+        <element name="productQuantity" type="input" locator=".admin__field[data-index=qty] input"/>
+    </section>
+    <section name="AdminProductFormConfigurationsSection">
+        <element name="createConfigurations" type="button" locator="button[data-index='create_configurable_products_button']" timeout="30"/>
+        <element name="currentVariationsRows" type="button" locator=".data-row"/>
+        <element name="currentVariationsNameCells" type="textarea" locator=".admin__control-fields[data-index='name_container']"/>
+        <element name="currentVariationsSkuCells" type="textarea" locator=".admin__control-fields[data-index='sku_container']"/>
+        <element name="currentVariationsPriceCells" type="textarea" locator=".admin__control-fields[data-index='price_container']"/>
+        <element name="currentVariationsQuantityCells" type="textarea" locator=".admin__control-fields[data-index='quantity_container']"/>
+        <element name="currentVariationsAttributesCells" type="textarea" locator=".admin__control-fields[data-index='attributes']"/>
+    </section>
+    <section name="AdminCreateProductConfigurationsPanel">
+        <element name="next" type="button" locator=".steps-wizard-navigation .action-next-step" timeout="30"/>
+        <element name="createNewAttribute" type="button" locator=".select-attributes-actions button[title='Create New Attribute']" timeout="30"/>
+        <element name="filters" type="button" locator="button[data-action='grid-filter-expand']"/>
+        <element name="attributeCode" type="input" locator=".admin__control-text[name='attribute_code']"/>
+        <element name="applyFilters" type="button" locator="button[data-action='grid-filter-apply']" timeout="30"/>
+        <element name="firstCheckbox" type="input" locator="tr[data-repeat-index='0'] .admin__control-checkbox"/>
+
+        <element name="selectAll" type="button" locator=".action-select-all"/>
+        <element name="createNewValue" type="input" locator=".action-create-new" timeout="30"/>
+        <element name="attributeName" type="input" locator="li[data-attribute-option-title=''] .admin__field-create-new .admin__control-text"/>
+        <element name="saveAttribute" type="button" locator="li[data-attribute-option-title=''] .action-save" timeout="30"/>
+
+        <element name="applyUniquePricesByAttributeToEachSku" type="radio" locator=".admin__field-label[for='apply-unique-prices-radio']"/>
+        <element name="selectAttribute" type="select" locator="#select-each-price" timeout="30"/>
+        <element name="attribute1" type="input" locator="#apply-single-price-input-0"/>
+        <element name="attribute2" type="input" locator="#apply-single-price-input-1"/>
+        <element name="attribute3" type="input" locator="#apply-single-price-input-2"/>
+
+        <element name="applySingleQuantityToEachSkus" type="radio" locator=".admin__field-label[for='apply-single-inventory-radio']" timeout="30"/>
+        <element name="quantity" type="input" locator="#apply-single-inventory-input"/>
+    </section>
+    <section name="AdminNewAttributePanel">
+        <element name="saveAttribute" type="button" locator="#save" timeout="30"/>
+        <element name="newAttributeIFrame" type="iframe" locator="create_new_attribute_container"/>
+        <element name="defaultLabel" type="input" locator="#attribute_label"/>
+    </section>
+    <section name="AdminChooseAffectedAttributeSetPopup">
+        <element name="confirm" type="button" locator="button[data-index='confirm_button']" timeout="30"/>
+    </section>
+</config>
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminProductGridActionSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminProductGridActionSection.xml
new file mode 100644
index 00000000000..1c32564485c
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminProductGridActionSection.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
+    <section name="AdminProductGridActionSection">
+        <element name="addProductToggle" type="button" locator=".action-toggle.primary.add" timeout="30"/>
+        <element name="addSimpleProduct" type="button" locator=".item[data-ui-id='products-list-add-new-product-button-item-simple']" timeout="30"/>
+        <element name="addConfigurableProduct" type="button" locator=".item[data-ui-id='products-list-add-new-product-button-item-configurable']" timeout="30"/>
+    </section>
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminProductGridSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminProductGridSection.xml
new file mode 100644
index 00000000000..f48ece1a3f0
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminProductGridSection.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
+    <section name="AdminProductGridSection">
+        <element name="productGridElement1" type="input" locator="#addLocator" />
+        <element name="productGridElement2" type="text" locator="#addLocator" />
+    </section>
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminProductMessagesSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminProductMessagesSection.xml
new file mode 100644
index 00000000000..c35d1fe21b5
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminProductMessagesSection.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
+    <section name="AdminProductMessagesSection">
+        <element name="successMessage" type="text" locator=".message-success"/>
+    </section>
+</config>
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminProductSEOSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminProductSEOSection.xml
new file mode 100644
index 00000000000..c03899381d1
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminProductSEOSection.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
+    <section name="AdminProductSEOSection">
+        <element name="sectionHeader" type="button" locator="div[data-index='search-engine-optimization']" timeout="30"/>
+        <element name="urlKeyInput" type="input" locator="input[name='product[url_key]']"/>
+    </section>
+</config>
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/StorefrontCategoryMainSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/StorefrontCategoryMainSection.xml
new file mode 100644
index 00000000000..47161b95b62
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/StorefrontCategoryMainSection.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
+    <section name="StorefrontCategoryMainSection">
+        <element name="CategoryTitle" type="text" locator="#page-title-heading span"/>
+        <element name="ProductItemInfo" type="button" locator=".product-item-info"/>
+        <element name="AddToCartBtn" type="button" locator="button.action.tocart.primary"/>
+        <element name="SuccessMsg" type="button" locator="div.message-success"/>
+        <element name="productCount" type="text" locator="#toolbar-amount"/>
+    </section>
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/StorefrontMessagesSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/StorefrontMessagesSection.xml
new file mode 100644
index 00000000000..e662b0914ce
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/StorefrontMessagesSection.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
+    <section name="StorefrontMessagesSection">
+        <element name="test" type="input" locator=".test"/>
+    </section>
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/StorefrontMiniCartSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/StorefrontMiniCartSection.xml
new file mode 100644
index 00000000000..85964f13a4d
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/StorefrontMiniCartSection.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
+    <section name="StorefrontMiniCartSection">
+        <element name="quantity" type="button" locator="span.counter-number"/>
+        <element name="show" type="button" locator="a.showcart"/>
+        <element name="goToCheckout" type="button" locator="#top-cart-btn-checkout"/>
+    </section>
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/StorefrontProductInfoDetailsSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/StorefrontProductInfoDetailsSection.xml
new file mode 100644
index 00000000000..92b84d42a4d
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/StorefrontProductInfoDetailsSection.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
+    <section name="StorefrontProductInfoDetailsSection">
+        <element name="productNameForReview" type="text" locator=".legend.review-legend>strong" />
+    </section>
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/StorefrontProductInfoMainSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/StorefrontProductInfoMainSection.xml
new file mode 100644
index 00000000000..be9cde517b5
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/StorefrontProductInfoMainSection.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
+    <section name="StorefrontProductInfoMainSection">
+        <element name="productName" type="text" locator=".base"/>
+        <element name="productSku" type="text" locator=".product.attribute.sku>.value"/>
+        <element name="productPrice" type="text" locator=".price"/>
+        <element name="productStockStatus" type="text" locator=".stock[title=Availability]>span"/>
+        
+        <element name="productAttributeTitle1" type="text" locator="#product-options-wrapper div[tabindex='0'] label"/>
+        <element name="productAttributeOptions1" type="select" locator="#product-options-wrapper div[tabindex='0'] option"/>
+    </section>
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/composer.json
new file mode 100644
index 00000000000..53c1bafbe43
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/composer.json
@@ -0,0 +1,72 @@
+{
+    "name": "magento/magento2-functional-test-module-catalog",
+    "description": "Magento 2 Acceptance Test Module Catalog",
+    "repositories": [
+        {
+            "type" : "composer",
+            "url" : "https://repo.magento.com/"
+        }
+    ],
+    "require": {
+        "php": "~7.0",
+        "codeception/codeception": "2.2|2.3",
+        "allure-framework/allure-codeception": "dev-master",
+        "consolidation/robo": "^1.0.0",
+        "henrikbjorn/lurker": "^1.2",
+        "vlucas/phpdotenv": "~2.4",
+        "magento/magento2-functional-testing-framework": "dev-develop"
+    },
+    "suggest": {
+        "magento/magento2-functional-test-module-store": "dev-master",
+        "magento/magento2-functional-test-module-eav": "dev-master",
+        "magento/magento2-functional-test-module-cms": "dev-master",
+        "magento/magento2-functional-test-module-indexer": "dev-master",
+        "magento/magento2-functional-test-module-customer": "dev-master",
+        "magento/magento2-functional-test-module-theme": "dev-master",
+        "magento/magento2-functional-test-module-checkout": "dev-master",
+        "magento/magento2-functional-test-module-backend": "dev-master",
+        "magento/magento2-functional-test-module-widget": "dev-master",
+        "magento/magento2-functional-test-module-wishlist": "dev-master",
+        "magento/magento2-functional-test-module-tax": "dev-master",
+        "magento/magento2-functional-test-module-msrp": "dev-master",
+        "magento/magento2-functional-test-module-catalog-inventory": "dev-master",
+        "magento/magento2-functional-test-module-catalog-rule": "dev-master",
+        "magento/magento2-functional-test-module-product-alert": "dev-master",
+        "magento/magento2-functional-test-module-url-rewrite": "dev-master",
+        "magento/magento2-functional-test-module-catalog-url-rewrite": "dev-master",
+        "magento/magento2-functional-test-module-page-cache": "dev-master",
+        "magento/magento2-functional-test-module-config": "dev-master",
+        "magento/magento2-functional-test-module-media-storage": "dev-master",
+        "magento/magento2-functional-test-module-ui": "dev-master",
+        "magento/magento2-functional-test-module-cookie": "dev-master",
+        "magento/magento2-functional-test-module-sales": "dev-master"
+    },
+    "type": "magento2-test-module",
+    "version": "dev-master",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
+    "autoload": {
+        "psr-0": {
+            "Yandex": "vendor/allure-framework/allure-codeception/src/"
+        },
+        "psr-4": {
+            "Magento\\FunctionalTestingFramework\\": [
+                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
+            ],
+            "Magento\\FunctionalTest\\": [
+                "tests/functional/Magento/FunctionalTest",
+                "generated/Magento/FunctionalTest"
+            ]
+        }
+    },
+    "extra": {
+        "map": [
+            [
+                "*",
+                "tests/functional/Magento/FunctionalTest/Catalog"
+            ]
+        ]
+    }
+}
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogAnalytics/LICENSE.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogAnalytics/LICENSE.txt
new file mode 100644
index 00000000000..49525fd99da
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogAnalytics/LICENSE.txt
@@ -0,0 +1,48 @@
+
+Open Software License ("OSL") v. 3.0
+
+This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Open Software License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Open Software License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly. 
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including 'fair use' or 'fair dealing'). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright (C) 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogAnalytics/LICENSE_AFL.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogAnalytics/LICENSE_AFL.txt
new file mode 100644
index 00000000000..f39d641b18a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogAnalytics/LICENSE_AFL.txt
@@ -0,0 +1,48 @@
+
+Academic Free License ("AFL") v. 3.0
+
+This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Academic Free License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, under any license of your choice that does not contradict the terms and conditions, including Licensor's reserved rights and remedies, in this Academic Free License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly.
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including "fair use" or "fair dealing"). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright © 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Academic Free License" or "AFL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogAnalytics/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogAnalytics/README.md
new file mode 100644
index 00000000000..ee39f1deb58
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogAnalytics/README.md
@@ -0,0 +1,3 @@
+# Magento 2 Acceptance Tests
+
+The Acceptance Tests Module for **Magento_CatalogAnalytics** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogAnalytics/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogAnalytics/composer.json
new file mode 100644
index 00000000000..3b45c0b6b63
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogAnalytics/composer.json
@@ -0,0 +1,50 @@
+{
+    "name": "magento/magento2-functional-test-module-catalog-analytics",
+    "description": "Magento 2 Acceptance Test Module Catalog Analytics",
+    "repositories": [
+        {
+            "type" : "composer",
+            "url" : "https://repo.magento.com/"
+        }
+    ],
+    "require": {
+        "php": "~7.0",
+        "codeception/codeception": "2.2|2.3",
+        "allure-framework/allure-codeception": "dev-master",
+        "consolidation/robo": "^1.0.0",
+        "henrikbjorn/lurker": "^1.2",
+        "vlucas/phpdotenv": "~2.4",
+        "magento/magento2-functional-testing-framework": "dev-develop"
+    },
+    "suggest": {
+        "magento/magento2-functional-test-module-catalog": "dev-master"
+    },
+    "type": "magento2-test-module",
+    "version": "dev-master",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
+    "autoload": {
+        "psr-0": {
+            "Yandex": "vendor/allure-framework/allure-codeception/src/"
+        },
+        "psr-4": {
+            "Magento\\FunctionalTestingFramework\\": [
+                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
+            ],
+            "Magento\\FunctionalTest\\": [
+                "tests/functional/Magento/FunctionalTest",
+                "generated/Magento/FunctionalTest"
+            ]
+        }
+    },
+    "extra": {
+        "map": [
+            [
+                "*",
+                "tests/functional/Magento/FunctionalTest/CatalogAnalytics"
+            ]
+        ]
+    }
+}
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogImportExport/LICENSE.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogImportExport/LICENSE.txt
new file mode 100644
index 00000000000..49525fd99da
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogImportExport/LICENSE.txt
@@ -0,0 +1,48 @@
+
+Open Software License ("OSL") v. 3.0
+
+This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Open Software License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Open Software License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly. 
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including 'fair use' or 'fair dealing'). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright (C) 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogImportExport/LICENSE_AFL.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogImportExport/LICENSE_AFL.txt
new file mode 100644
index 00000000000..f39d641b18a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogImportExport/LICENSE_AFL.txt
@@ -0,0 +1,48 @@
+
+Academic Free License ("AFL") v. 3.0
+
+This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Academic Free License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, under any license of your choice that does not contradict the terms and conditions, including Licensor's reserved rights and remedies, in this Academic Free License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly.
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including "fair use" or "fair dealing"). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright © 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Academic Free License" or "AFL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogImportExport/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogImportExport/README.md
new file mode 100644
index 00000000000..9a514f1c83f
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogImportExport/README.md
@@ -0,0 +1,3 @@
+# Magento 2 Acceptance Tests
+
+The Acceptance Tests Module for **Magento_CatalogImportExport** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogImportExport/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogImportExport/composer.json
new file mode 100644
index 00000000000..81ee5ddcfda
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogImportExport/composer.json
@@ -0,0 +1,58 @@
+{
+    "name": "magento/magento2-functional-test-module-catalog-import-export",
+    "description": "Magento 2 Acceptance Test Module Catalog Import Export",
+    "repositories": [
+        {
+            "type" : "composer",
+            "url" : "https://repo.magento.com/"
+        }
+    ],
+    "require": {
+        "php": "~7.0",
+        "codeception/codeception": "2.2|2.3",
+        "allure-framework/allure-codeception": "dev-master",
+        "consolidation/robo": "^1.0.0",
+        "henrikbjorn/lurker": "^1.2",
+        "vlucas/phpdotenv": "~2.4",
+        "magento/magento2-functional-testing-framework": "dev-develop"
+    },
+    "suggest": {
+        "magento/magento2-functional-test-module-catalog": "dev-master",
+        "magento/magento2-functional-test-module-catalog-url-rewrite": "dev-master",
+        "magento/magento2-functional-test-module-eav": "dev-master",
+        "magento/magento2-functional-test-module-import-export": "dev-master",
+        "magento/magento2-functional-test-module-store": "dev-master",
+        "magento/magento2-functional-test-module-tax": "dev-master",
+        "magento/magento2-functional-test-module-catalog-inventory": "dev-master",
+        "magento/magento2-functional-test-module-media-storage": "dev-master",
+        "magento/magento2-functional-test-module-customer": "dev-master"
+    },
+    "type": "magento2-test-module",
+    "version": "dev-master",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
+    "autoload": {
+        "psr-0": {
+            "Yandex": "vendor/allure-framework/allure-codeception/src/"
+        },
+        "psr-4": {
+            "Magento\\FunctionalTestingFramework\\": [
+                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
+            ],
+            "Magento\\FunctionalTest\\": [
+                "tests/functional/Magento/FunctionalTest",
+                "generated/Magento/FunctionalTest"
+            ]
+        }
+    },
+    "extra": {
+        "map": [
+            [
+                "*",
+                "tests/functional/Magento/FunctionalTest/CatalogImportExport"
+            ]
+        ]
+    }
+}
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogInventory/LICENSE.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogInventory/LICENSE.txt
new file mode 100644
index 00000000000..49525fd99da
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogInventory/LICENSE.txt
@@ -0,0 +1,48 @@
+
+Open Software License ("OSL") v. 3.0
+
+This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Open Software License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Open Software License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly. 
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including 'fair use' or 'fair dealing'). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright (C) 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogInventory/LICENSE_AFL.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogInventory/LICENSE_AFL.txt
new file mode 100644
index 00000000000..f39d641b18a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogInventory/LICENSE_AFL.txt
@@ -0,0 +1,48 @@
+
+Academic Free License ("AFL") v. 3.0
+
+This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Academic Free License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, under any license of your choice that does not contradict the terms and conditions, including Licensor's reserved rights and remedies, in this Academic Free License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly.
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including "fair use" or "fair dealing"). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright © 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Academic Free License" or "AFL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogInventory/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogInventory/README.md
new file mode 100644
index 00000000000..03f581dfd23
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogInventory/README.md
@@ -0,0 +1,3 @@
+# Magento 2 Acceptance Tests
+
+The Acceptance Tests Module for **Magento_CatalogInventory** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogInventory/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogInventory/composer.json
new file mode 100644
index 00000000000..de845f8f5a8
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogInventory/composer.json
@@ -0,0 +1,56 @@
+{
+    "name": "magento/magento2-functional-test-module-catalog-inventory",
+    "description": "Magento 2 Acceptance Test Module Catalog Inventory",
+    "repositories": [
+        {
+            "type" : "composer",
+            "url" : "https://repo.magento.com/"
+        }
+    ],
+    "require": {
+        "php": "~7.0",
+        "codeception/codeception": "2.2|2.3",
+        "allure-framework/allure-codeception": "dev-master",
+        "consolidation/robo": "^1.0.0",
+        "henrikbjorn/lurker": "^1.2",
+        "vlucas/phpdotenv": "~2.4",
+        "magento/magento2-functional-testing-framework": "dev-develop"
+    },
+    "suggest": {
+        "magento/magento2-functional-test-module-config": "dev-master",
+        "magento/magento2-functional-test-module-store": "dev-master",
+        "magento/magento2-functional-test-module-catalog": "dev-master",
+        "magento/magento2-functional-test-module-customer": "dev-master",
+        "magento/magento2-functional-test-module-eav": "dev-master",
+        "magento/magento2-functional-test-module-quote": "dev-master",
+        "magento/magento2-functional-test-module-ui": "dev-master"
+    },
+    "type": "magento2-test-module",
+    "version": "dev-master",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
+    "autoload": {
+        "psr-0": {
+            "Yandex": "vendor/allure-framework/allure-codeception/src/"
+        },
+        "psr-4": {
+            "Magento\\FunctionalTestingFramework\\": [
+                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
+            ],
+            "Magento\\FunctionalTest\\": [
+                "tests/functional/Magento/FunctionalTest",
+                "generated/Magento/FunctionalTest"
+            ]
+        }
+    },
+    "extra": {
+        "map": [
+            [
+                "*",
+                "tests/functional/Magento/FunctionalTest/CatalogInventory"
+            ]
+        ]
+    }
+}
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogRule/LICENSE.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogRule/LICENSE.txt
new file mode 100644
index 00000000000..49525fd99da
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogRule/LICENSE.txt
@@ -0,0 +1,48 @@
+
+Open Software License ("OSL") v. 3.0
+
+This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Open Software License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Open Software License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly. 
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including 'fair use' or 'fair dealing'). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright (C) 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogRule/LICENSE_AFL.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogRule/LICENSE_AFL.txt
new file mode 100644
index 00000000000..f39d641b18a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogRule/LICENSE_AFL.txt
@@ -0,0 +1,48 @@
+
+Academic Free License ("AFL") v. 3.0
+
+This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Academic Free License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, under any license of your choice that does not contradict the terms and conditions, including Licensor's reserved rights and remedies, in this Academic Free License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly.
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including "fair use" or "fair dealing"). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright © 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Academic Free License" or "AFL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogRule/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogRule/README.md
new file mode 100644
index 00000000000..0e318cd24b0
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogRule/README.md
@@ -0,0 +1,3 @@
+# Magento 2 Acceptance Tests
+
+The Acceptance Tests Module for **Magento_CatalogRule** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogRule/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogRule/composer.json
new file mode 100644
index 00000000000..3952c494c78
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogRule/composer.json
@@ -0,0 +1,56 @@
+{
+    "name": "magento/magento2-functional-test-module-catalog-rule",
+    "description": "Magento 2 Acceptance Test Module Catalog Rule",
+    "repositories": [
+        {
+            "type" : "composer",
+            "url" : "https://repo.magento.com/"
+        }
+    ],
+    "require": {
+        "php": "~7.0",
+        "codeception/codeception": "2.2|2.3",
+        "allure-framework/allure-codeception": "dev-master",
+        "consolidation/robo": "^1.0.0",
+        "henrikbjorn/lurker": "^1.2",
+        "vlucas/phpdotenv": "~2.4",
+        "magento/magento2-functional-testing-framework": "dev-develop"
+    },
+    "suggest": {
+        "magento/magento2-functional-test-module-store": "dev-master",
+        "magento/magento2-functional-test-module-rule": "dev-master",
+        "magento/magento2-functional-test-module-catalog": "dev-master",
+        "magento/magento2-functional-test-module-customer": "dev-master",
+        "magento/magento2-functional-test-module-backend": "dev-master",
+        "magento/magento2-functional-test-module-eav": "dev-master",
+        "magento/magento2-functional-test-module-ui": "dev-master"
+    },
+    "type": "magento2-test-module",
+    "version": "dev-master",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
+    "autoload": {
+        "psr-0": {
+            "Yandex": "vendor/allure-framework/allure-codeception/src/"
+        },
+        "psr-4": {
+            "Magento\\FunctionalTestingFramework\\": [
+                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
+            ],
+            "Magento\\FunctionalTest\\": [
+                "tests/functional/Magento/FunctionalTest",
+                "generated/Magento/FunctionalTest"
+            ]
+        }
+    },
+    "extra": {
+        "map": [
+            [
+                "*",
+                "tests/functional/Magento/FunctionalTest/CatalogRule"
+            ]
+        ]
+    }
+}
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogRuleConfigurable/LICENSE.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogRuleConfigurable/LICENSE.txt
new file mode 100644
index 00000000000..49525fd99da
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogRuleConfigurable/LICENSE.txt
@@ -0,0 +1,48 @@
+
+Open Software License ("OSL") v. 3.0
+
+This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Open Software License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Open Software License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly. 
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including 'fair use' or 'fair dealing'). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright (C) 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogRuleConfigurable/LICENSE_AFL.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogRuleConfigurable/LICENSE_AFL.txt
new file mode 100644
index 00000000000..f39d641b18a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogRuleConfigurable/LICENSE_AFL.txt
@@ -0,0 +1,48 @@
+
+Academic Free License ("AFL") v. 3.0
+
+This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Academic Free License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, under any license of your choice that does not contradict the terms and conditions, including Licensor's reserved rights and remedies, in this Academic Free License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly.
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including "fair use" or "fair dealing"). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright © 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Academic Free License" or "AFL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogRuleConfigurable/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogRuleConfigurable/README.md
new file mode 100644
index 00000000000..81b8ad86799
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogRuleConfigurable/README.md
@@ -0,0 +1,3 @@
+# Magento 2 Acceptance Tests
+
+The Acceptance Tests Module for **Magento_CatalogRuleConfigurable** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogRuleConfigurable/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogRuleConfigurable/composer.json
new file mode 100644
index 00000000000..a20e6b7a389
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogRuleConfigurable/composer.json
@@ -0,0 +1,52 @@
+{
+    "name": "magento/magento2-functional-test-module-catalog-rule-configurable",
+    "description": "Magento 2 Acceptance Test Module Catalog Rule Configurable",
+    "repositories": [
+        {
+            "type" : "composer",
+            "url" : "https://repo.magento.com/"
+        }
+    ],
+    "require": {
+        "php": "~7.0",
+        "codeception/codeception": "2.2|2.3",
+        "allure-framework/allure-codeception": "dev-master",
+        "consolidation/robo": "^1.0.0",
+        "henrikbjorn/lurker": "^1.2",
+        "vlucas/phpdotenv": "~2.4",
+        "magento/magento2-functional-testing-framework": "dev-develop"
+    },
+    "suggest": {
+        "magento/magento2-functional-test-module-configurable-product": "dev-master",
+        "magento/magento2-functional-test-module-catalog": "dev-master",
+        "magento/magento2-functional-test-module-catalog-rule": "dev-master"
+    },
+    "type": "magento2-test-module",
+    "version": "dev-master",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
+    "autoload": {
+        "psr-0": {
+            "Yandex": "vendor/allure-framework/allure-codeception/src/"
+        },
+        "psr-4": {
+            "Magento\\FunctionalTestingFramework\\": [
+                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
+            ],
+            "Magento\\FunctionalTest\\": [
+                "tests/functional/Magento/FunctionalTest",
+                "generated/Magento/FunctionalTest"
+            ]
+        }
+    },
+    "extra": {
+        "map": [
+            [
+                "*",
+                "tests/functional/Magento/FunctionalTest/CatalogRuleConfigurable"
+            ]
+        ]
+    }
+}
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogSearch/LICENSE.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogSearch/LICENSE.txt
new file mode 100644
index 00000000000..49525fd99da
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogSearch/LICENSE.txt
@@ -0,0 +1,48 @@
+
+Open Software License ("OSL") v. 3.0
+
+This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Open Software License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Open Software License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly. 
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including 'fair use' or 'fair dealing'). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright (C) 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogSearch/LICENSE_AFL.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogSearch/LICENSE_AFL.txt
new file mode 100644
index 00000000000..f39d641b18a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogSearch/LICENSE_AFL.txt
@@ -0,0 +1,48 @@
+
+Academic Free License ("AFL") v. 3.0
+
+This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Academic Free License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, under any license of your choice that does not contradict the terms and conditions, including Licensor's reserved rights and remedies, in this Academic Free License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly.
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including "fair use" or "fair dealing"). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright © 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Academic Free License" or "AFL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogSearch/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogSearch/README.md
new file mode 100644
index 00000000000..85ed3bcf15d
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogSearch/README.md
@@ -0,0 +1,3 @@
+# Magento 2 Acceptance Tests
+
+The Acceptance Tests Module for **Magento_CatalogSearch** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogSearch/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogSearch/composer.json
new file mode 100644
index 00000000000..cb88f4139c8
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogSearch/composer.json
@@ -0,0 +1,59 @@
+{
+    "name": "magento/magento2-functional-test-module-catalog-search",
+    "description": "Magento 2 Acceptance Test Module Catalog Search",
+    "repositories": [
+        {
+            "type" : "composer",
+            "url" : "https://repo.magento.com/"
+        }
+    ],
+    "require": {
+        "php": "~7.0",
+        "codeception/codeception": "2.2|2.3",
+        "allure-framework/allure-codeception": "dev-master",
+        "consolidation/robo": "^1.0.0",
+        "henrikbjorn/lurker": "^1.2",
+        "vlucas/phpdotenv": "~2.4",
+        "magento/magento2-functional-testing-framework": "dev-develop"
+    },
+    "suggest": {
+        "magento/magento2-functional-test-module-store": "dev-master",
+        "magento/magento2-functional-test-module-catalog": "dev-master",
+        "magento/magento2-functional-test-module-search": "dev-master",
+        "magento/magento2-functional-test-module-customer": "dev-master",
+        "magento/magento2-functional-test-module-directory": "dev-master",
+        "magento/magento2-functional-test-module-eav": "dev-master",
+        "magento/magento2-functional-test-module-backend": "dev-master",
+        "magento/magento2-functional-test-module-theme": "dev-master",
+        "magento/magento2-functional-test-module-ui": "dev-master",
+        "magento/magento2-functional-test-module-catalog-inventory": "dev-master"
+    },
+    "type": "magento2-test-module",
+    "version": "dev-master",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
+    "autoload": {
+        "psr-0": {
+            "Yandex": "vendor/allure-framework/allure-codeception/src/"
+        },
+        "psr-4": {
+            "Magento\\FunctionalTestingFramework\\": [
+                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
+            ],
+            "Magento\\FunctionalTest\\": [
+                "tests/functional/Magento/FunctionalTest",
+                "generated/Magento/FunctionalTest"
+            ]
+        }
+    },
+    "extra": {
+        "map": [
+            [
+                "*",
+                "tests/functional/Magento/FunctionalTest/CatalogSearch"
+            ]
+        ]
+    }
+}
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogUrlRewrite/LICENSE.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogUrlRewrite/LICENSE.txt
new file mode 100644
index 00000000000..49525fd99da
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogUrlRewrite/LICENSE.txt
@@ -0,0 +1,48 @@
+
+Open Software License ("OSL") v. 3.0
+
+This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Open Software License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Open Software License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly. 
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including 'fair use' or 'fair dealing'). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright (C) 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogUrlRewrite/LICENSE_AFL.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogUrlRewrite/LICENSE_AFL.txt
new file mode 100644
index 00000000000..f39d641b18a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogUrlRewrite/LICENSE_AFL.txt
@@ -0,0 +1,48 @@
+
+Academic Free License ("AFL") v. 3.0
+
+This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Academic Free License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, under any license of your choice that does not contradict the terms and conditions, including Licensor's reserved rights and remedies, in this Academic Free License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly.
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including "fair use" or "fair dealing"). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright © 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Academic Free License" or "AFL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogUrlRewrite/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogUrlRewrite/README.md
new file mode 100644
index 00000000000..7329f664baa
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogUrlRewrite/README.md
@@ -0,0 +1,3 @@
+# Magento 2 Acceptance Tests
+
+The Acceptance Tests Module for **Magento_CatalogUrlRewrite** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogUrlRewrite/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogUrlRewrite/composer.json
new file mode 100644
index 00000000000..a563bff42a4
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogUrlRewrite/composer.json
@@ -0,0 +1,57 @@
+{
+    "name": "magento/magento2-functional-test-module-catalog-url-rewrite",
+    "description": "Magento 2 Acceptance Test Module Catalog Url Rewrite",
+    "repositories": [
+        {
+            "type" : "composer",
+            "url" : "https://repo.magento.com/"
+        }
+    ],
+    "require": {
+        "php": "~7.0",
+        "codeception/codeception": "2.2|2.3",
+        "allure-framework/allure-codeception": "dev-master",
+        "consolidation/robo": "^1.0.0",
+        "henrikbjorn/lurker": "^1.2",
+        "vlucas/phpdotenv": "~2.4",
+        "magento/magento2-functional-testing-framework": "dev-develop"
+    },
+    "suggest": {
+        "magento/magento2-functional-test-module-backend": "dev-master",
+        "magento/magento2-functional-test-module-catalog": "dev-master",
+        "magento/magento2-functional-test-module-catalog-import-export": "dev-master",
+        "magento/magento2-functional-test-module-eav": "dev-master",
+        "magento/magento2-functional-test-module-import-export": "dev-master",
+        "magento/magento2-functional-test-module-store": "dev-master",
+        "magento/magento2-functional-test-module-url-rewrite": "dev-master",
+        "magento/magento2-functional-test-module-ui": "dev-master"
+    },
+    "type": "magento2-test-module",
+    "version": "dev-master",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
+    "autoload": {
+        "psr-0": {
+            "Yandex": "vendor/allure-framework/allure-codeception/src/"
+        },
+        "psr-4": {
+            "Magento\\FunctionalTestingFramework\\": [
+                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
+            ],
+            "Magento\\FunctionalTest\\": [
+                "tests/functional/Magento/FunctionalTest",
+                "generated/Magento/FunctionalTest"
+            ]
+        }
+    },
+    "extra": {
+        "map": [
+            [
+                "*",
+                "tests/functional/Magento/FunctionalTest/CatalogUrlRewrite"
+            ]
+        ]
+    }
+}
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogWidget/LICENSE.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogWidget/LICENSE.txt
new file mode 100644
index 00000000000..49525fd99da
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogWidget/LICENSE.txt
@@ -0,0 +1,48 @@
+
+Open Software License ("OSL") v. 3.0
+
+This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Open Software License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Open Software License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly. 
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including 'fair use' or 'fair dealing'). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright (C) 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogWidget/LICENSE_AFL.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogWidget/LICENSE_AFL.txt
new file mode 100644
index 00000000000..f39d641b18a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogWidget/LICENSE_AFL.txt
@@ -0,0 +1,48 @@
+
+Academic Free License ("AFL") v. 3.0
+
+This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Academic Free License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, under any license of your choice that does not contradict the terms and conditions, including Licensor's reserved rights and remedies, in this Academic Free License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly.
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including "fair use" or "fair dealing"). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright © 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Academic Free License" or "AFL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogWidget/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogWidget/README.md
new file mode 100644
index 00000000000..b05124ac4bb
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogWidget/README.md
@@ -0,0 +1,3 @@
+# Magento 2 Acceptance Tests
+
+The Acceptance Tests Module for **Magento_CatalogWidget** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogWidget/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogWidget/composer.json
new file mode 100644
index 00000000000..457c7c30dff
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogWidget/composer.json
@@ -0,0 +1,57 @@
+{
+    "name": "magento/magento2-functional-test-module-catalog-widget",
+    "description": "Magento 2 Acceptance Test Module Catalog Widget",
+    "repositories": [
+        {
+            "type" : "composer",
+            "url" : "https://repo.magento.com/"
+        }
+    ],
+    "require": {
+        "php": "~7.0",
+        "codeception/codeception": "2.2|2.3",
+        "allure-framework/allure-codeception": "dev-master",
+        "consolidation/robo": "^1.0.0",
+        "henrikbjorn/lurker": "^1.2",
+        "vlucas/phpdotenv": "~2.4",
+        "magento/magento2-functional-testing-framework": "dev-develop"
+    },
+    "suggest": {
+        "magento/magento2-functional-test-module-catalog": "dev-master",
+        "magento/magento2-functional-test-module-widget": "dev-master",
+        "magento/magento2-functional-test-module-backend": "dev-master",
+        "magento/magento2-functional-test-module-rule": "dev-master",
+        "magento/magento2-functional-test-module-eav": "dev-master",
+        "magento/magento2-functional-test-module-customer": "dev-master",
+        "magento/magento2-functional-test-module-store": "dev-master",
+        "magento/magento2-functional-test-module-wishlist": "dev-master"
+    },
+    "type": "magento2-test-module",
+    "version": "dev-master",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
+    "autoload": {
+        "psr-0": {
+            "Yandex": "vendor/allure-framework/allure-codeception/src/"
+        },
+        "psr-4": {
+            "Magento\\FunctionalTestingFramework\\": [
+                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
+            ],
+            "Magento\\FunctionalTest\\": [
+                "tests/functional/Magento/FunctionalTest",
+                "generated/Magento/FunctionalTest"
+            ]
+        }
+    },
+    "extra": {
+        "map": [
+            [
+                "*",
+                "tests/functional/Magento/FunctionalTest/CatalogWidget"
+            ]
+        ]
+    }
+}
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Cest/StorefrontCustomerCheckoutCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Cest/StorefrontCustomerCheckoutCest.xml
new file mode 100644
index 00000000000..1932ec0f6e1
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Cest/StorefrontCustomerCheckoutCest.xml
@@ -0,0 +1,86 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Test/etc/testSchema.xsd">
+    <cest name="StorefrontCustomerCheckoutCest">
+        <annotations>
+            <features value="Checkout"/>
+            <stories value="Checkout via the Admin"/>
+            <group value="checkout"/>
+            <env value="chrome"/>
+            <env value="firefox"/>
+            <env value="phantomjs"/>
+        </annotations>
+        <before>
+            <createData entity="SimpleSubCategory" mergeKey="simplecategory"/>
+            <entity name="categoryLink" type="custom_attribute" mergeKey="categoryLink">
+                <data key="attribute_code">category_ids</data>
+                <data key="value">$$simplecategory.id$$</data>
+            </entity>
+            <createData entity="SimpleProduct" mergeKey="simpleproduct1">
+                <required-entity name="categoryLink"/>
+            </createData>
+            <createData entity="Simple_US_Customer" mergeKey="simpleuscustomer"/>
+        </before>
+        <after>
+            <deleteData createDataKey="simpleproduct1" mergeKey="deleteProduct1"/>
+            <deleteData createDataKey="simplecategory" mergeKey="deleteCategory"/>
+            <deleteData createDataKey="simpleuscustomer" mergeKey="deleteCustomer"/>
+        </after>
+        <test name="CustomerCheckoutTest">
+            <annotations>
+                <title value="Customer Checkout"/>
+                <description value="Should be able to place an order as a customer."/>
+                <severity value="CRITICAL"/>
+                <testCaseId value="#"/>
+            </annotations>
+
+            <amOnPage mergeKey="s1"  url="customer/account/login/"/>
+            <fillField  mergeKey="s3" userInput="$$simpleuscustomer.email$$" selector="{{StorefrontCustomerSignInFormSection.emailField}}"/>
+            <fillField  mergeKey="s5" userInput="$$simpleuscustomer.password$$" selector="{{StorefrontCustomerSignInFormSection.passwordField}}"/>
+            <click mergeKey="s7" selector="{{StorefrontCustomerSignInFormSection.signInAccountButton}}"/>
+            <waitForPageLoad mergeKey="s9"/>
+
+            <amOnPage mergeKey="s11" url="/$$simplecategory.name$$.html" />
+            <moveMouseOver mergeKey="s15" selector="{{StorefrontCategoryMainSection.ProductItemInfo}}" />
+            <click mergeKey="s17" selector="{{StorefrontCategoryMainSection.AddToCartBtn}}" />
+            <waitForElementVisible mergeKey="s21" selector="{{StorefrontCategoryMainSection.SuccessMsg}}" time="30" />
+            <see mergeKey="s23" selector="{{StorefrontCategoryMainSection.SuccessMsg}}" userInput="You added $$simpleproduct1.name$$ to your shopping cart."/>
+            <see mergeKey="s25" selector="{{StorefrontMiniCartSection.quantity}}" userInput="1" />
+            <click mergeKey="s27" selector="{{StorefrontMiniCartSection.show}}" />
+            <click mergeKey="s31" selector="{{StorefrontMiniCartSection.goToCheckout}}" />
+            <waitForPageLoad mergeKey="s33"/>
+            <waitForLoadingMaskToDisappear mergeKey="s34"/>
+            <click mergeKey="s35" selector="{{CheckoutShippingMethodsSection.firstShippingMethod}}"/>
+            <waitForElement mergeKey="s36" selector="{{CheckoutShippingMethodsSection.next}}" time="30"/>
+            <click mergeKey="s37" selector="{{CheckoutShippingMethodsSection.next}}" />
+            <waitForPageLoad mergeKey="s39"/>
+            <waitForElement mergeKey="s41" selector="{{CheckoutPaymentSection.placeOrder}}" time="30" />
+            <see mergeKey="s47" selector="{{CheckoutPaymentSection.billingAddress}}" userInput="{{US_Address_TX.street[0]}}" />
+            <click mergeKey="s49" selector="{{CheckoutPaymentSection.placeOrder}}" />
+            <waitForPageLoad mergeKey="s51"/>
+            <grabTextFrom mergeKey="s53" selector="{{CheckoutSuccessMainSection.orderNumber22}}" returnVariable="orderNumber" />
+            <see mergeKey="s55" selector="{{CheckoutSuccessMainSection.success}}" userInput="Your order number is:" />
+
+            <amOnPage mergeKey="s59" url="{{AdminLoginPage}}" />
+            <fillField mergeKey="s61" selector="{{AdminLoginFormSection.username}}" userInput="{{_ENV.MAGENTO_ADMIN_USERNAME}}" />
+            <fillField mergeKey="s63" selector="{{AdminLoginFormSection.password}}" userInput="{{_ENV.MAGENTO_ADMIN_PASSWORD}}" />
+            <click mergeKey="s65" selector="{{AdminLoginFormSection.signIn}}" />
+
+            <amOnPage mergeKey="s67" url="{{OrdersPage}}"/>
+            <waitForPageLoad mergeKey="s75"/>
+            <fillField mergeKey="s77" selector="{{OrdersGridSection.search}}" variable="orderNumber" />
+            <waitForPageLoad mergeKey="s78"/>
+
+            <click mergeKey="s81" selector="{{OrdersGridSection.submitSearch22}}" />
+            <waitForPageLoad mergeKey="s831"/>
+            <click mergeKey="s84" selector="{{OrdersGridSection.firstRow}}" />
+            <see mergeKey="s85" selector="{{OrderDetailsInformationSection.orderStatus}}" userInput="Pending" />
+            <see mergeKey="s87" selector="{{OrderDetailsInformationSection.accountInformation}}" userInput="Customer" />
+            <see mergeKey="s89" selector="{{OrderDetailsInformationSection.accountInformation}}" userInput="$$simpleuscustomer.email$$" />
+            <see mergeKey="s91" selector="{{OrderDetailsInformationSection.billingAddress}}" userInput="{{US_Address_TX.street[0]}}" />
+            <see mergeKey="s93" selector="{{OrderDetailsInformationSection.shippingAddress}}" userInput="{{US_Address_TX.street[0]}}" />
+            <see mergeKey="s95" selector="{{OrderDetailsInformationSection.itemsOrdered}}" userInput="$$simpleproduct1.name$$" />
+        </test>
+    </cest>
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Cest/StorefrontGuestCheckoutCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Cest/StorefrontGuestCheckoutCest.xml
new file mode 100644
index 00000000000..5f58cf04e6a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Cest/StorefrontGuestCheckoutCest.xml
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Test/etc/testSchema.xsd">
+    <cest name="StorefrontGuestCheckoutCest">
+        <annotations>
+            <features value="Checkout"/>
+            <stories value="Checkout via Guest Checkout"/>
+            <group value="checkout"/>
+            <env value="chrome"/>
+            <env value="firefox"/>
+            <env value="phantomjs"/>
+        </annotations>
+        <before>
+            <createData entity="_defaultCategory" mergeKey="createCategory"/>
+            <entity name="categoryLink" type="custom_attribute" mergeKey="categoryLink">
+                <data key="attribute_code">category_ids</data>
+                <data key="value">$$createCategory.id$$</data>
+            </entity>
+            <createData entity="_defaultProduct" mergeKey="createProduct">
+                <required-entity name="categoryLink"/>
+            </createData>
+        </before>
+        <after>
+            <deleteData createDataKey="createCategory" mergeKey="deleteCategory"/>
+            <deleteData createDataKey="createProduct" mergeKey="deleteProduct"/>
+        </after>
+        <test name="GuestCheckoutTest">
+            <annotations>
+                <title value="Guest Checkout"/>
+                <description value="Should be able to place an order as a Guest."/>
+                <severity value="CRITICAL"/>
+                <testCaseId value="MAGETWO-72094"/>
+            </annotations>
+            <amOnPage url="{{StorefrontCategoryPage.url($$createCategory.name$$)}}" mergeKey="onCategoryPage"/>
+            <waitForPageLoad mergeKey="waitForPageLoad1"/>
+            <moveMouseOver selector="{{StorefrontCategoryMainSection.ProductItemInfo}}" mergeKey="hoverProduct"/>
+            <click selector="{{StorefrontCategoryMainSection.AddToCartBtn}}" mergeKey="addToCart"/>
+            <waitForElementVisible selector="{{StorefrontCategoryMainSection.SuccessMsg}}" time="30" mergeKey="waitForProductAdded"/>
+            <see selector="{{StorefrontCategoryMainSection.SuccessMsg}}" userInput="You added $$createProduct.name$$ to your shopping cart." mergeKey="seeAddedToCartMessage"/>
+            <see selector="{{StorefrontMiniCartSection.quantity}}" userInput="1" mergeKey="seeCartQuantity"/>
+            <click selector="{{StorefrontMiniCartSection.show}}" mergeKey="clickCart"/>
+            <click selector="{{StorefrontMiniCartSection.goToCheckout}}" mergeKey="goToCheckout"/>
+            <waitForPageLoad mergeKey="waitForPageLoad2"/>
+            <fillField selector="{{GuestCheckoutShippingSection.email}}" userInput="{{CustomerEntityOne.email}}" mergeKey="enterEmail"/>
+            <fillField selector="{{GuestCheckoutShippingSection.firstName}}" userInput="{{CustomerEntityOne.firstname}}" mergeKey="enterFirstName"/>
+            <fillField selector="{{GuestCheckoutShippingSection.lastName}}" userInput="{{CustomerEntityOne.lastname}}" mergeKey="enterLastName"/>
+            <fillField selector="{{GuestCheckoutShippingSection.street}}" userInput="{{CustomerAddressSimple.street[0]}}" mergeKey="enterStreet"/>
+            <fillField selector="{{GuestCheckoutShippingSection.city}}" userInput="{{CustomerAddressSimple.city}}" mergeKey="enterCity"/>
+            <selectOption selector="{{GuestCheckoutShippingSection.region}}" userInput="{{CustomerAddressSimple.state}}" mergeKey="selectRegion"/>
+            <fillField selector="{{GuestCheckoutShippingSection.postcode}}" userInput="{{CustomerAddressSimple.postcode}}" mergeKey="enterPostcode"/>
+            <fillField selector="{{GuestCheckoutShippingSection.telephone}}" userInput="{{CustomerAddressSimple.telephone}}" mergeKey="enterTelephone"/>
+            <waitForLoadingMaskToDisappear mergeKey="waitForLoadingMask"/>
+            <click selector="{{GuestCheckoutShippingSection.firstShippingMethod}}" mergeKey="selectFirstShippingMethod"/>
+            <waitForElement selector="{{GuestCheckoutShippingSection.next}}" time="30" mergeKey="waitForNextButton"/>
+            <click selector="{{GuestCheckoutShippingSection.next}}" mergeKey="clickNext"/>
+            <waitForElement selector="{{GuestCheckoutPaymentSection.placeOrder}}" time="30" mergeKey="waitForPlaceOrderButton"/>
+            <see selector="{{GuestCheckoutPaymentSection.cartItems}}" userInput="{{_defaultProduct.name}}" mergeKey="seeProductInCart"/>
+            <see selector="{{GuestCheckoutPaymentSection.billingAddress}}" userInput="{{CustomerAddressSimple.street[0]}}" mergeKey="seeAddress"/>
+            <click selector="{{GuestCheckoutPaymentSection.placeOrder}}" mergeKey="clickPlaceOrder"/>
+            <grabTextFrom selector="{{CheckoutSuccessMainSection.orderNumber}}" returnVariable="orderNumber" mergeKey="grabOrderNumber"/>
+            <see selector="{{CheckoutSuccessMainSection.success}}" userInput="Your order # is:" mergeKey="seeOrderNumber"/>
+            <see selector="{{CheckoutSuccessMainSection.success}}" userInput="We'll email you an order confirmation with details and tracking info." mergeKey="seeEmailYou"/>
+            <amOnPage url="{{AdminLoginPage}}" mergeKey="navigateToAdmin"/>
+            <fillField selector="{{AdminLoginFormSection.username}}" userInput="{{_ENV.MAGENTO_ADMIN_USERNAME}}" mergeKey="fillUsername"/>
+            <fillField selector="{{AdminLoginFormSection.password}}" userInput="{{_ENV.MAGENTO_ADMIN_PASSWORD}}" mergeKey="fillPassword"/>
+            <click selector="{{AdminLoginFormSection.signIn}}" mergeKey="clickLogin"/>
+            <amOnPage url="{{OrdersPage}}" mergeKey="onOrdersPage"/>
+            <waitForElementNotVisible selector="{{OrdersGridSection.spinner}}" time="30" mergeKey="waitForOrdersPage"/>
+            <fillField selector="{{OrdersGridSection.search}}" variable="orderNumber" mergeKey="fillOrderNum"/>
+            <click selector="{{OrdersGridSection.submitSearch}}" mergeKey="submitSearchOrderNum"/>
+            <waitForElementNotVisible selector="{{OrdersGridSection.spinner}}" time="30" mergeKey="waitForOrdersPage2"/>
+            <click selector="{{OrdersGridSection.firstRow}}" mergeKey="clickOrderRow"/>
+            <see selector="{{OrderDetailsInformationSection.orderStatus}}" userInput="Pending" mergeKey="seeAdminOrderStatus"/>
+            <see selector="{{OrderDetailsInformationSection.accountInformation}}" userInput="Guest" mergeKey="seeAdminOrderGuest"/>
+            <see selector="{{OrderDetailsInformationSection.accountInformation}}" userInput="{{CustomerEntityOne.email}}" mergeKey="seeAdminOrderEmail"/>
+            <see selector="{{OrderDetailsInformationSection.billingAddress}}" userInput="{{CustomerAddressSimple.street[0]}}" mergeKey="seeAdminOrderBillingAddress"/>
+            <see selector="{{OrderDetailsInformationSection.shippingAddress}}" userInput="{{CustomerAddressSimple.street[0]}}" mergeKey="seeAdminOrderShippingAddress"/>
+            <see selector="{{OrderDetailsInformationSection.itemsOrdered}}" userInput="{{_defaultProduct.name}}" mergeKey="seeAdminOrderProduct"/>
+        </test>
+    </cest>
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/LICENSE.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/LICENSE.txt
new file mode 100644
index 00000000000..49525fd99da
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/LICENSE.txt
@@ -0,0 +1,48 @@
+
+Open Software License ("OSL") v. 3.0
+
+This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Open Software License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Open Software License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly. 
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including 'fair use' or 'fair dealing'). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright (C) 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/LICENSE_AFL.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/LICENSE_AFL.txt
new file mode 100644
index 00000000000..f39d641b18a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/LICENSE_AFL.txt
@@ -0,0 +1,48 @@
+
+Academic Free License ("AFL") v. 3.0
+
+This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Academic Free License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, under any license of your choice that does not contradict the terms and conditions, including Licensor's reserved rights and remedies, in this Academic Free License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly.
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including "fair use" or "fair dealing"). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright © 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Academic Free License" or "AFL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Page/CheckoutPage.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Page/CheckoutPage.xml
new file mode 100644
index 00000000000..650589ae6ee
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Page/CheckoutPage.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/PageObject.xsd">
+    <page name="CheckoutPage" urlPath="/checkout" module="Checkout">
+        <section name="CheckoutShippingSection"/>
+        <section name="CheckoutShippingMethodsSection"/>
+        <section name="CheckoutOrderSummarySection"/>
+        <section name="CheckoutSuccessMainSection"/>
+        <section name="CheckoutPaymentSection"/>
+        <section name="CheckoutGuestShippingInfoSection"/>
+    </page>
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Page/CheckoutSuccessPage.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Page/CheckoutSuccessPage.xml
new file mode 100644
index 00000000000..98cfe538f52
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Page/CheckoutSuccessPage.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/PageObject.xsd">
+    <page name="CheckoutSuccessPage" urlPath="/checkout/onepage/success/" module="Checkout">
+        <section name="CheckoutSuccessMainSection"/>
+    </page>
+</config>
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Page/GuestCheckoutPage.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Page/GuestCheckoutPage.xml
new file mode 100644
index 00000000000..eaab3ece3bb
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Page/GuestCheckoutPage.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/PageObject.xsd">
+    <page name="GuestCheckoutPage" urlPath="/checkout" module="Checkout">
+        <section name="GuestCheckoutShippingSection"/>
+        <section name="GuestCheckoutPaymentSection"/>
+    </page>
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/README.md
new file mode 100644
index 00000000000..b36a7cf6d5d
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/README.md
@@ -0,0 +1,3 @@
+# Magento 2 Acceptance Tests
+
+The Acceptance Tests Module for **Magento_Checkout** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Section/CheckoutOrderSummarySection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Section/CheckoutOrderSummarySection.xml
new file mode 100644
index 00000000000..f9f4957e796
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Section/CheckoutOrderSummarySection.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
+    <section name="CheckoutOrderSummarySection">
+        <element name="miniCartTab" type="button" locator=".title[role='tab']"/>
+        <element name="productItemName" type="text" locator=".product-item-name"/>
+        <element name="productItemQty" type="text" locator=".value"/>
+        <element name="productItemPrice" type="text" locator=".price"/>
+    </section>
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Section/CheckoutPaymentSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Section/CheckoutPaymentSection.xml
new file mode 100644
index 00000000000..c5ed374d70b
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Section/CheckoutPaymentSection.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
+    <section name="CheckoutPaymentSection">
+        <element name="cartItems" type="text" locator=".minicart-items"/>
+        <element name="billingAddress" type="text" locator="div.billing-address-details"/>
+        <element name="placeOrder" type="button" locator="button.action.primary.checkout" timeout="30"/>
+    </section>
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Section/CheckoutShippingGuestInfoSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Section/CheckoutShippingGuestInfoSection.xml
new file mode 100644
index 00000000000..9af04542d85
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Section/CheckoutShippingGuestInfoSection.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
+    <section name="CheckoutShippingGuestInfoSection">
+        <element name="email" type="input" locator="#customer-email"/>
+        <element name="firstName" type="input" locator="input[name=firstname]"/>
+        <element name="lastName" type="input" locator="input[name=lastname]"/>
+        <element name="street" type="input" locator="input[name='street[0]']"/>
+        <element name="city" type="input" locator="input[name=city]"/>
+        <element name="region" type="select" locator="select[name=region_id]"/>
+        <element name="postcode" type="input" locator="input[name=postcode]"/>
+        <element name="telephone" type="input" locator="input[name=telephone]"/>
+    </section>
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Section/CheckoutShippingMethodsSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Section/CheckoutShippingMethodsSection.xml
new file mode 100644
index 00000000000..5065571381c
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Section/CheckoutShippingMethodsSection.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
+    <section name="CheckoutShippingMethodsSection">
+        <element name="next" type="button" locator="button.button.action.continue.primary"/>
+        <element name="firstShippingMethod" type="radio" locator=".row:nth-of-type(1) .col-method .radio"/>
+    </section>
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Section/CheckoutShippingSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Section/CheckoutShippingSection.xml
new file mode 100644
index 00000000000..c13967e9b12
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Section/CheckoutShippingSection.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
+    <section name="CheckoutShippingSection">
+        <element name="selectedShippingAddress" type="text" locator=".shipping-address-item.selected-item"/>
+        <element name="newAddressButton" type="button" locator="#checkout-step-shipping button"/>
+    </section>
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Section/CheckoutSuccessMainSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Section/CheckoutSuccessMainSection.xml
new file mode 100644
index 00000000000..28de9f94ae5
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Section/CheckoutSuccessMainSection.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
+    <section name="CheckoutSuccessMainSection">
+        <element name="success" type="text" locator="div.checkout-success"/>
+        <element name="orderNumber" type="text" locator="div.checkout-success > p:nth-child(1) > span"/>
+        <element name="orderNumber22" type="text" locator=".order-number>strong"/>
+    </section>
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Section/GuestCheckoutPaymentSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Section/GuestCheckoutPaymentSection.xml
new file mode 100644
index 00000000000..5b62584348b
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Section/GuestCheckoutPaymentSection.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
+    <section name="GuestCheckoutPaymentSection">
+        <element name="cartItems" type="text" locator=".minicart-items"/>
+        <element name="billingAddress" type="text" locator="div.billing-address-details"/>
+        <element name="placeOrder" type="button" locator="button.action.primary.checkout" timeout="30"/>
+    </section>
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Section/GuestCheckoutShippingSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Section/GuestCheckoutShippingSection.xml
new file mode 100644
index 00000000000..f7bc6e82e3f
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Section/GuestCheckoutShippingSection.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
+    <section name="GuestCheckoutShippingSection">
+        <element name="email" type="input" locator="#customer-email"/>
+        <element name="firstName" type="input" locator="input[name=firstname]"/>
+        <element name="lastName" type="input" locator="input[name=lastname]"/>
+        <element name="street" type="input" locator="input[name='street[0]']"/>
+        <element name="city" type="input" locator="input[name=city]"/>
+        <element name="region" type="select" locator="select[name=region_id]"/>
+        <element name="postcode" type="input" locator="input[name=postcode]"/>
+        <element name="telephone" type="input" locator="input[name=telephone]"/>
+        <element name="next" type="button" locator="button.button.action.continue.primary"/>
+        <element name="firstShippingMethod" type="radio" locator=".row:nth-of-type(1) .col-method .radio"/>
+    </section>
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/composer.json
new file mode 100644
index 00000000000..aec57da084f
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/composer.json
@@ -0,0 +1,67 @@
+{
+    "name": "magento/magento2-functional-test-module-checkout",
+    "description": "Magento 2 Acceptance Test Module Checkout",
+    "repositories": [
+        {
+            "type" : "composer",
+            "url" : "https://repo.magento.com/"
+        }
+    ],
+    "require": {
+        "php": "~7.0",
+        "codeception/codeception": "2.2|2.3",
+        "allure-framework/allure-codeception": "dev-master",
+        "consolidation/robo": "^1.0.0",
+        "henrikbjorn/lurker": "^1.2",
+        "vlucas/phpdotenv": "~2.4",
+        "magento/magento2-functional-testing-framework": "dev-develop",
+        "magento/magento2-functional-test-module-catalog": "dev-master",
+        "magento/magento2-functional-test-module-sales": "dev-master"
+    },
+    "suggest": {
+        "magento/magento2-functional-test-module-store": "dev-master",
+        "magento/magento2-functional-test-module-backend": "dev-master",
+        "magento/magento2-functional-test-module-catalog-inventory": "dev-master",
+        "magento/magento2-functional-test-module-config": "dev-master",
+        "magento/magento2-functional-test-module-customer": "dev-master",
+        "magento/magento2-functional-test-module-payment": "dev-master",
+        "magento/magento2-functional-test-module-shipping": "dev-master",
+        "magento/magento2-functional-test-module-tax": "dev-master",
+        "magento/magento2-functional-test-module-directory": "dev-master",
+        "magento/magento2-functional-test-module-eav": "dev-master",
+        "magento/magento2-functional-test-module-page-cache": "dev-master",
+        "magento/magento2-functional-test-module-sales-rule": "dev-master",
+        "magento/magento2-functional-test-module-theme": "dev-master",
+        "magento/magento2-functional-test-module-msrp": "dev-master",
+        "magento/magento2-functional-test-module-ui": "dev-master",
+        "magento/magento2-functional-test-module-quote": "dev-master"
+    },
+    "type": "magento2-test-module",
+    "version": "dev-master",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
+    "autoload": {
+        "psr-0": {
+            "Yandex": "vendor/allure-framework/allure-codeception/src/"
+        },
+        "psr-4": {
+            "Magento\\FunctionalTestingFramework\\": [
+                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
+            ],
+            "Magento\\FunctionalTest\\": [
+                "tests/functional/Magento/FunctionalTest",
+                "generated/Magento/FunctionalTest"
+            ]
+        }
+    },
+    "extra": {
+        "map": [
+            [
+                "*",
+                "tests/functional/Magento/FunctionalTest/Checkout"
+            ]
+        ]
+    }
+}
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CheckoutAgreements/LICENSE.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CheckoutAgreements/LICENSE.txt
new file mode 100644
index 00000000000..49525fd99da
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CheckoutAgreements/LICENSE.txt
@@ -0,0 +1,48 @@
+
+Open Software License ("OSL") v. 3.0
+
+This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Open Software License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Open Software License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly. 
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including 'fair use' or 'fair dealing'). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright (C) 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CheckoutAgreements/LICENSE_AFL.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CheckoutAgreements/LICENSE_AFL.txt
new file mode 100644
index 00000000000..f39d641b18a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CheckoutAgreements/LICENSE_AFL.txt
@@ -0,0 +1,48 @@
+
+Academic Free License ("AFL") v. 3.0
+
+This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Academic Free License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, under any license of your choice that does not contradict the terms and conditions, including Licensor's reserved rights and remedies, in this Academic Free License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly.
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including "fair use" or "fair dealing"). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright © 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Academic Free License" or "AFL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CheckoutAgreements/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CheckoutAgreements/README.md
new file mode 100644
index 00000000000..a985bc4dfe1
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CheckoutAgreements/README.md
@@ -0,0 +1,3 @@
+# Magento 2 Acceptance Tests
+
+The Acceptance Tests Module for **Magento_CheckoutAgreements** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CheckoutAgreements/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CheckoutAgreements/composer.json
new file mode 100644
index 00000000000..ab5629e117d
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CheckoutAgreements/composer.json
@@ -0,0 +1,53 @@
+{
+    "name": "magento/magento2-functional-test-module-checkout-agreements",
+    "description": "Magento 2 Acceptance Test Module Checkout Agreements",
+    "repositories": [
+        {
+            "type" : "composer",
+            "url" : "https://repo.magento.com/"
+        }
+    ],
+    "require": {
+        "php": "~7.0",
+        "codeception/codeception": "2.2|2.3",
+        "allure-framework/allure-codeception": "dev-master",
+        "consolidation/robo": "^1.0.0",
+        "henrikbjorn/lurker": "^1.2",
+        "vlucas/phpdotenv": "~2.4",
+        "magento/magento2-functional-testing-framework": "dev-develop"
+    },
+    "suggest": {
+        "magento/magento2-functional-test-module-checkout": "dev-master",
+        "magento/magento2-functional-test-module-quote": "dev-master",
+        "magento/magento2-functional-test-module-store": "dev-master",
+        "magento/magento2-functional-test-module-backend": "dev-master"
+    },
+    "type": "magento2-test-module",
+    "version": "dev-master",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
+    "autoload": {
+        "psr-0": {
+            "Yandex": "vendor/allure-framework/allure-codeception/src/"
+        },
+        "psr-4": {
+            "Magento\\FunctionalTestingFramework\\": [
+                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
+            ],
+            "Magento\\FunctionalTest\\": [
+                "tests/functional/Magento/FunctionalTest",
+                "generated/Magento/FunctionalTest"
+            ]
+        }
+    },
+    "extra": {
+        "map": [
+            [
+                "*",
+                "tests/functional/Magento/FunctionalTest/CheckoutAgreements"
+            ]
+        ]
+    }
+}
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Cest/AdminCreateCmsPageCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Cest/AdminCreateCmsPageCest.xml
new file mode 100644
index 00000000000..1a15cda8d7e
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Cest/AdminCreateCmsPageCest.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Test/etc/testSchema.xsd">
+    <cest name="AdminCreateCmsPageCest">
+        <annotations>
+            <features value="CMS Page Creation"/>
+            <stories value="Create a CMS Page via the Admin"/>
+            <group value="cms"/>
+            <env value="chrome"/>
+            <env value="firefox"/>
+            <env value="phantomjs"/>
+        </annotations>
+        <after>
+            <amOnPage url="admin/admin/auth/logout/" mergeKey="amOnLogoutPage"/>
+        </after>
+        <test name="CreateNewPage">
+            <annotations>
+                <title value="Create a CMS Page"/>
+                <description value="You should be able to create a CMS Page via the Admin."/>
+                <severity value="CRITICAL"/>
+                <testCaseId value="MAGETWO-25580"/>
+            </annotations>
+            <amOnPage url="{{AdminLoginPage}}" mergeKey="navigateToAdmin"/>
+            <fillField selector="{{AdminLoginFormSection.username}}" userInput="{{_ENV.MAGENTO_ADMIN_USERNAME}}" mergeKey="fillUsername"/>
+            <fillField selector="{{AdminLoginFormSection.password}}" userInput="{{_ENV.MAGENTO_ADMIN_PASSWORD}}" mergeKey="fillPassword"/>
+            <click selector="{{AdminLoginFormSection.signIn}}" mergeKey="clickLogin"/>
+            <amOnPage url="{{CmsPagesPage}}" mergeKey="amOnPagePagesGrid"/>
+            <waitForPageLoad mergeKey="waitForPageLoad1"/>
+            <click selector="{{CmsPagesPageActionsSection.addNewPage}}" mergeKey="clickAddNewPage"/>
+            <fillField selector="{{CmsNewPagePageBasicFieldsSection.pageTitle}}" userInput="{{_defaultCmsPage.title}}" mergeKey="fillFieldTitle"/>
+            <click selector="{{CmsNewPagePageContentSection.header}}" mergeKey="clickExpandContent"/>
+            <fillField selector="{{CmsNewPagePageContentSection.contentHeading}}" userInput="{{_defaultCmsPage.content_heading}}" mergeKey="fillFieldContentHeading"/>
+            <fillField selector="{{CmsNewPagePageContentSection.content}}" userInput="{{_defaultCmsPage.content}}" mergeKey="fillFieldContent"/>
+            <click selector="{{CmsNewPagePageSeoSection.header}}" mergeKey="clickExpandSearchEngineOptimisation"/>
+            <fillField selector="{{CmsNewPagePageSeoSection.urlKey}}" userInput="{{_defaultCmsPage.identifier}}" mergeKey="fillFieldUrlKey"/>
+            <click selector="{{CmsNewPagePageActionsSection.savePage}}" mergeKey="clickSavePage"/>
+            <see userInput="You saved the page." mergeKey="seeSuccessMessage"/>
+            <amOnPage url="{{_defaultCmsPage.identifier}}" mergeKey="amOnPageTestPage"/>
+            <waitForPageLoad mergeKey="waitForPageLoad2"/>
+            <see userInput="{{_defaultCmsPage.content_heading}}" mergeKey="seeContentHeading"/>
+            <see userInput="{{_defaultCmsPage.content}}" mergeKey="seeContent"/>
+        </test>
+    </cest>
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Data/CmsPageData.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Data/CmsPageData.xml
new file mode 100644
index 00000000000..ee3e483bba9
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Data/CmsPageData.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataProfileSchema.xsd">
+    <entity name="_defaultCmsPage" type="cms_page">
+        <data key="title">Test CMS Page</data>
+        <data key="content_heading">Test Content Heading</data>
+        <data key="content">Sample page content. Yada yada yada.</data>
+        <data key="identifier" unique="suffix">test-page-</data>
+    </entity>
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/LICENSE.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/LICENSE.txt
new file mode 100644
index 00000000000..49525fd99da
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/LICENSE.txt
@@ -0,0 +1,48 @@
+
+Open Software License ("OSL") v. 3.0
+
+This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Open Software License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Open Software License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly. 
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including 'fair use' or 'fair dealing'). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright (C) 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/LICENSE_AFL.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/LICENSE_AFL.txt
new file mode 100644
index 00000000000..f39d641b18a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/LICENSE_AFL.txt
@@ -0,0 +1,48 @@
+
+Academic Free License ("AFL") v. 3.0
+
+This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Academic Free License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, under any license of your choice that does not contradict the terms and conditions, including Licensor's reserved rights and remedies, in this Academic Free License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly.
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including "fair use" or "fair dealing"). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright © 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Academic Free License" or "AFL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Page/CmsNewPagePage.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Page/CmsNewPagePage.xml
new file mode 100644
index 00000000000..9dd1fb299d2
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Page/CmsNewPagePage.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/PageObject.xsd">
+    <page name="CmsNewPagePage" urlPath="admin/cms/page/new" module="Magento_Cms">
+        <section name="CmsNewPagePageActionsSection"/>
+        <section name="CmsNewPagePageBasicFieldsSection"/>
+        <section name="CmsNewPagePageContentSection"/>
+        <section name="CmsNewPagePageSeoSection"/>
+    </page>
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Page/CmsPagesPage.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Page/CmsPagesPage.xml
new file mode 100644
index 00000000000..4d52b0f0ba3
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Page/CmsPagesPage.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/PageObject.xsd">
+    <page name="CmsPagesPage" urlPath="admin/cms/page" module="Magento_Cms">
+        <section name="CmsPagesPageActionsSection"/>
+    </page>
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/README.md
new file mode 100644
index 00000000000..4de61c2fb27
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/README.md
@@ -0,0 +1,3 @@
+# Magento 2 Acceptance Tests
+
+The Acceptance Tests Module for **Magento_Cms** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Section/CmsNewPagePageActionsSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Section/CmsNewPagePageActionsSection.xml
new file mode 100644
index 00000000000..dc6cafa6551
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Section/CmsNewPagePageActionsSection.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
+    <section name="CmsNewPagePageActionsSection">
+        <element name="savePage" type="button" locator="#save" timeout="30"/>
+    </section>
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Section/CmsNewPagePageBasicFieldsSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Section/CmsNewPagePageBasicFieldsSection.xml
new file mode 100644
index 00000000000..e29cc868636
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Section/CmsNewPagePageBasicFieldsSection.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
+    <section name="CmsNewPagePageBasicFieldsSection">
+        <element name="pageTitle" type="input" locator="input[name=title]"/>
+    </section>
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Section/CmsNewPagePageContentSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Section/CmsNewPagePageContentSection.xml
new file mode 100644
index 00000000000..cc1a98e31db
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Section/CmsNewPagePageContentSection.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
+    <section name="CmsNewPagePageContentSection">
+        <element name="header" type="button" locator="div[data-index=content]"/>
+        <element name="contentHeading" type="input" locator="input[name=content_heading]"/>
+        <element name="content" type="input" locator="#cms_page_form_content"/>
+    </section>
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Section/CmsNewPagePageSeoSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Section/CmsNewPagePageSeoSection.xml
new file mode 100644
index 00000000000..69b0b0faf67
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Section/CmsNewPagePageSeoSection.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
+    <section name="CmsNewPagePageSeoSection">
+        <element name="header" type="button" locator="div[data-index=search_engine_optimisation]" timeout="30"/>
+        <element name="urlKey" type="input" locator="input[name=identifier]"/>
+    </section>
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Section/CmsPagesPageActionsSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Section/CmsPagesPageActionsSection.xml
new file mode 100644
index 00000000000..88746b3b5b7
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Section/CmsPagesPageActionsSection.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
+    <section name="CmsPagesPageActionsSection">
+        <element name="addNewPage" type="button" locator="#add" timeout="30"/>
+    </section>
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/composer.json
new file mode 100644
index 00000000000..ad21c6beeaf
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/composer.json
@@ -0,0 +1,58 @@
+{
+    "name": "magento/magento2-functional-test-module-cms",
+    "description": "Magento 2 Acceptance Test Module Cms",
+    "repositories": [
+        {
+            "type" : "composer",
+            "url" : "https://repo.magento.com/"
+        }
+    ],
+    "require": {
+        "php": "~7.0",
+        "codeception/codeception": "2.2|2.3",
+        "allure-framework/allure-codeception": "dev-master",
+        "consolidation/robo": "^1.0.0",
+        "henrikbjorn/lurker": "^1.2",
+        "vlucas/phpdotenv": "~2.4",
+        "magento/magento2-functional-testing-framework": "dev-develop"
+    },
+    "suggest": {
+        "magento/magento2-functional-test-module-store": "dev-master",
+        "magento/magento2-functional-test-module-theme": "dev-master",
+        "magento/magento2-functional-test-module-widget": "dev-master",
+        "magento/magento2-functional-test-module-backend": "dev-master",
+        "magento/magento2-functional-test-module-catalog": "dev-master",
+        "magento/magento2-functional-test-module-email": "dev-master",
+        "magento/magento2-functional-test-module-ui": "dev-master",
+        "magento/magento2-functional-test-module-variable": "dev-master",
+        "magento/magento2-functional-test-module-media-storage": "dev-master"
+    },
+    "type": "magento2-test-module",
+    "version": "dev-master",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
+    "autoload": {
+        "psr-0": {
+            "Yandex": "vendor/allure-framework/allure-codeception/src/"
+        },
+        "psr-4": {
+            "Magento\\FunctionalTestingFramework\\": [
+                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
+            ],
+            "Magento\\FunctionalTest\\": [
+                "tests/functional/Magento/FunctionalTest",
+                "generated/Magento/FunctionalTest"
+            ]
+        }
+    },
+    "extra": {
+        "map": [
+            [
+                "*",
+                "tests/functional/Magento/FunctionalTest/Cms"
+            ]
+        ]
+    }
+}
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CmsUrlRewrite/LICENSE.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CmsUrlRewrite/LICENSE.txt
new file mode 100644
index 00000000000..49525fd99da
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CmsUrlRewrite/LICENSE.txt
@@ -0,0 +1,48 @@
+
+Open Software License ("OSL") v. 3.0
+
+This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Open Software License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Open Software License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly. 
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including 'fair use' or 'fair dealing'). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright (C) 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CmsUrlRewrite/LICENSE_AFL.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CmsUrlRewrite/LICENSE_AFL.txt
new file mode 100644
index 00000000000..f39d641b18a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CmsUrlRewrite/LICENSE_AFL.txt
@@ -0,0 +1,48 @@
+
+Academic Free License ("AFL") v. 3.0
+
+This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Academic Free License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, under any license of your choice that does not contradict the terms and conditions, including Licensor's reserved rights and remedies, in this Academic Free License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly.
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including "fair use" or "fair dealing"). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright © 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Academic Free License" or "AFL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CmsUrlRewrite/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CmsUrlRewrite/README.md
new file mode 100644
index 00000000000..1f1b1ca7825
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CmsUrlRewrite/README.md
@@ -0,0 +1,6 @@
+## Overview
+ 
+The Magento_CmsUrlRewrite module adds support for URL rewrite rules for CMS pages. See also Magento_UrlRewrite module. 
+
+The module adds and removes URL rewrite rules as CMS pages are added or removed by a user.
+The rules can be edited by an admin user as any other URL rewrite rule. 
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CmsUrlRewrite/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CmsUrlRewrite/composer.json
new file mode 100644
index 00000000000..4c27ee9c61e
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CmsUrlRewrite/composer.json
@@ -0,0 +1,52 @@
+{
+    "name": "magento/magento2-functional-test-module-cms-url-rewrite",
+    "description": "Magento 2 Acceptance Test Module Cms Url Rewrite",
+    "repositories": [
+        {
+            "type" : "composer",
+            "url" : "https://repo.magento.com/"
+        }
+    ],
+    "require": {
+        "php": "~7.0",
+        "codeception/codeception": "2.2|2.3",
+        "allure-framework/allure-codeception": "dev-master",
+        "consolidation/robo": "^1.0.0",
+        "henrikbjorn/lurker": "^1.2",
+        "vlucas/phpdotenv": "~2.4",
+        "magento/magento2-functional-testing-framework": "dev-develop"
+    },
+    "suggest": {
+        "magento/magento2-functional-test-module-store": "dev-master",
+        "magento/magento2-functional-test-module-cms": "dev-master",
+        "magento/magento2-functional-test-module-url-rewrite": "dev-master"
+    },
+    "type": "magento2-test-module",
+    "version": "dev-master",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
+    "autoload": {
+        "psr-0": {
+            "Yandex": "vendor/allure-framework/allure-codeception/src/"
+        },
+        "psr-4": {
+            "Magento\\FunctionalTestingFramework\\": [
+                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
+            ],
+            "Magento\\FunctionalTest\\": [
+                "tests/functional/Magento/FunctionalTest",
+                "generated/Magento/FunctionalTest"
+            ]
+        }
+    },
+    "extra": {
+        "map": [
+            [
+                "*",
+                "tests/functional/Magento/FunctionalTest/CmsUrlRewrite"
+            ]
+        ]
+    }
+}
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Config/LICENSE.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Config/LICENSE.txt
new file mode 100644
index 00000000000..49525fd99da
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Config/LICENSE.txt
@@ -0,0 +1,48 @@
+
+Open Software License ("OSL") v. 3.0
+
+This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Open Software License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Open Software License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly. 
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including 'fair use' or 'fair dealing'). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright (C) 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Config/LICENSE_AFL.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Config/LICENSE_AFL.txt
new file mode 100644
index 00000000000..f39d641b18a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Config/LICENSE_AFL.txt
@@ -0,0 +1,48 @@
+
+Academic Free License ("AFL") v. 3.0
+
+This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Academic Free License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, under any license of your choice that does not contradict the terms and conditions, including Licensor's reserved rights and remedies, in this Academic Free License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly.
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including "fair use" or "fair dealing"). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright © 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Academic Free License" or "AFL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Config/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Config/README.md
new file mode 100644
index 00000000000..6214cc94b04
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Config/README.md
@@ -0,0 +1,8 @@
+#Config
+The Config module is designed to implement system configuration functionality.
+It provides mechanisms to add, edit, store and retrieve the configuration data
+for each scope (there can be a default scope as well as scopes for each website and store).
+
+Modules can add items to be configured on the system configuration page by creating 
+system.xml files in their etc/adminhtml directories. These system.xml files get merged 
+to populate the forms in the config page.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Config/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Config/composer.json
new file mode 100644
index 00000000000..b82ea131819
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Config/composer.json
@@ -0,0 +1,54 @@
+{
+    "name": "magento/magento2-functional-test-module-config",
+    "description": "Magento 2 Acceptance Test Module Config",
+    "repositories": [
+        {
+            "type" : "composer",
+            "url" : "https://repo.magento.com/"
+        }
+    ],
+    "require": {
+        "php": "~7.0",
+        "codeception/codeception": "2.2|2.3",
+        "allure-framework/allure-codeception": "dev-master",
+        "consolidation/robo": "^1.0.0",
+        "henrikbjorn/lurker": "^1.2",
+        "vlucas/phpdotenv": "~2.4",
+        "magento/magento2-functional-testing-framework": "dev-develop"
+    },
+    "suggest": {
+        "magento/magento2-functional-test-module-store": "dev-master",
+        "magento/magento2-functional-test-module-email": "dev-master",
+        "magento/magento2-functional-test-module-directory": "dev-master",
+        "magento/magento2-functional-test-module-backend": "dev-master",
+        "magento/magento2-functional-test-module-media-storage": "dev-master"
+    },
+    "type": "magento2-test-module",
+    "version": "dev-master",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
+    "autoload": {
+        "psr-0": {
+            "Yandex": "vendor/allure-framework/allure-codeception/src/"
+        },
+        "psr-4": {
+            "Magento\\FunctionalTestingFramework\\": [
+                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
+            ],
+            "Magento\\FunctionalTest\\": [
+                "tests/functional/Magento/FunctionalTest",
+                "generated/Magento/FunctionalTest"
+            ]
+        }
+    },
+    "extra": {
+        "map": [
+            [
+                "*",
+                "tests/functional/Magento/FunctionalTest/Config"
+            ]
+        ]
+    }
+}
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableImportExport/LICENSE.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableImportExport/LICENSE.txt
new file mode 100644
index 00000000000..49525fd99da
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableImportExport/LICENSE.txt
@@ -0,0 +1,48 @@
+
+Open Software License ("OSL") v. 3.0
+
+This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Open Software License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Open Software License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly. 
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including 'fair use' or 'fair dealing'). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright (C) 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableImportExport/LICENSE_AFL.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableImportExport/LICENSE_AFL.txt
new file mode 100644
index 00000000000..f39d641b18a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableImportExport/LICENSE_AFL.txt
@@ -0,0 +1,48 @@
+
+Academic Free License ("AFL") v. 3.0
+
+This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Academic Free License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, under any license of your choice that does not contradict the terms and conditions, including Licensor's reserved rights and remedies, in this Academic Free License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly.
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including "fair use" or "fair dealing"). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright © 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Academic Free License" or "AFL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableImportExport/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableImportExport/composer.json
new file mode 100644
index 00000000000..8af4f9591cf
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableImportExport/composer.json
@@ -0,0 +1,54 @@
+{
+    "name": "magento/magento2-functional-test-module-configurable-import-export",
+    "description": "Magento 2 Acceptance Test Module Configurable Import Export",
+    "repositories": [
+        {
+            "type" : "composer",
+            "url" : "https://repo.magento.com/"
+        }
+    ],
+    "require": {
+        "php": "~7.0",
+        "codeception/codeception": "2.2|2.3",
+        "allure-framework/allure-codeception": "dev-master",
+        "consolidation/robo": "^1.0.0",
+        "henrikbjorn/lurker": "^1.2",
+        "vlucas/phpdotenv": "~2.4",
+        "magento/magento2-functional-testing-framework": "dev-develop"
+    },
+    "suggest": {
+        "magento/magento2-functional-test-module-catalog": "dev-master",
+        "magento/magento2-functional-test-module-catalog-import-export": "dev-master",
+        "magento/magento2-functional-test-module-eav": "dev-master",
+        "magento/magento2-functional-test-module-import-export": "dev-master",
+        "magento/magento2-functional-test-module-configurable-product": "dev-master"
+    },
+    "type": "magento2-test-module",
+    "version": "dev-master",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
+    "autoload": {
+        "psr-0": {
+            "Yandex": "vendor/allure-framework/allure-codeception/src/"
+        },
+        "psr-4": {
+            "Magento\\FunctionalTestingFramework\\": [
+                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
+            ],
+            "Magento\\FunctionalTest\\": [
+                "tests/functional/Magento/FunctionalTest",
+                "generated/Magento/FunctionalTest"
+            ]
+        }
+    },
+    "extra": {
+        "map": [
+            [
+                "*",
+                "tests/functional/Magento/FunctionalTest/ConfigurableImportExport"
+            ]
+        ]
+    }
+}
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/Data/ConfigurableProductData.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/Data/ConfigurableProductData.xml
new file mode 100644
index 00000000000..0ae038de3e1
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/Data/ConfigurableProductData.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataProfileSchema.xsd">
+    <entity name="ConfigurableProductOne" type="configurableProduct">
+        <data key="configurableProductName">data</data>
+    </entity>
+</config>
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/LICENSE.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/LICENSE.txt
new file mode 100644
index 00000000000..49525fd99da
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/LICENSE.txt
@@ -0,0 +1,48 @@
+
+Open Software License ("OSL") v. 3.0
+
+This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Open Software License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Open Software License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly. 
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including 'fair use' or 'fair dealing'). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright (C) 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/LICENSE_AFL.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/LICENSE_AFL.txt
new file mode 100644
index 00000000000..f39d641b18a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/LICENSE_AFL.txt
@@ -0,0 +1,48 @@
+
+Academic Free License ("AFL") v. 3.0
+
+This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Academic Free License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, under any license of your choice that does not contradict the terms and conditions, including Licensor's reserved rights and remedies, in this Academic Free License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly.
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including "fair use" or "fair dealing"). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright © 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Academic Free License" or "AFL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/README.md
new file mode 100644
index 00000000000..aa4342bf3a4
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/README.md
@@ -0,0 +1,3 @@
+# Magento 2 Acceptance Tests
+
+The Acceptance Tests Module for **Magento_ConfigurableProduct** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/composer.json
new file mode 100644
index 00000000000..9bc6d9d574c
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/composer.json
@@ -0,0 +1,60 @@
+{
+    "name": "magento/magento2-functional-test-module-configurable-product",
+    "description": "Magento 2 Acceptance Test Module Configurable Product",
+    "repositories": [
+        {
+            "type" : "composer",
+            "url" : "https://repo.magento.com/"
+        }
+    ],
+    "require": {
+        "php": "~7.0",
+        "codeception/codeception": "2.2|2.3",
+        "allure-framework/allure-codeception": "dev-master",
+        "consolidation/robo": "^1.0.0",
+        "henrikbjorn/lurker": "^1.2",
+        "vlucas/phpdotenv": "~2.4",
+        "magento/magento2-functional-testing-framework": "dev-develop"
+    },
+    "suggest": {
+        "magento/magento2-functional-test-module-store": "dev-master",
+        "magento/magento2-functional-test-module-catalog": "dev-master",
+        "magento/magento2-functional-test-module-catalog-inventory": "dev-master",
+        "magento/magento2-functional-test-module-checkout": "dev-master",
+        "magento/magento2-functional-test-module-msrp": "dev-master",
+        "magento/magento2-functional-test-module-backend": "dev-master",
+        "magento/magento2-functional-test-module-eav": "dev-master",
+        "magento/magento2-functional-test-module-customer": "dev-master",
+        "magento/magento2-functional-test-module-media-storage": "dev-master",
+        "magento/magento2-functional-test-module-quote": "dev-master",
+        "magento/magento2-functional-test-module-ui": "dev-master"
+    },
+    "type": "magento2-test-module",
+    "version": "dev-master",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
+    "autoload": {
+        "psr-0": {
+            "Yandex": "vendor/allure-framework/allure-codeception/src/"
+        },
+        "psr-4": {
+            "Magento\\FunctionalTestingFramework\\": [
+                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
+            ],
+            "Magento\\FunctionalTest\\": [
+                "tests/functional/Magento/FunctionalTest",
+                "generated/Magento/FunctionalTest"
+            ]
+        }
+    },
+    "extra": {
+        "map": [
+            [
+                "*",
+                "tests/functional/Magento/FunctionalTest/ConfigurableProduct"
+            ]
+        ]
+    }
+}
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProductSales/LICENSE.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProductSales/LICENSE.txt
new file mode 100644
index 00000000000..49525fd99da
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProductSales/LICENSE.txt
@@ -0,0 +1,48 @@
+
+Open Software License ("OSL") v. 3.0
+
+This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Open Software License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Open Software License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly. 
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including 'fair use' or 'fair dealing'). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright (C) 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProductSales/LICENSE_AFL.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProductSales/LICENSE_AFL.txt
new file mode 100644
index 00000000000..f39d641b18a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProductSales/LICENSE_AFL.txt
@@ -0,0 +1,48 @@
+
+Academic Free License ("AFL") v. 3.0
+
+This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Academic Free License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, under any license of your choice that does not contradict the terms and conditions, including Licensor's reserved rights and remedies, in this Academic Free License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly.
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including "fair use" or "fair dealing"). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright © 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Academic Free License" or "AFL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProductSales/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProductSales/README.md
new file mode 100644
index 00000000000..f64eca364e9
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProductSales/README.md
@@ -0,0 +1,3 @@
+# Magento 2 Acceptance Tests
+
+The Acceptance Tests Module for **Magento_ConfigurableProductSales** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProductSales/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProductSales/composer.json
new file mode 100644
index 00000000000..f9cb9a3e404
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProductSales/composer.json
@@ -0,0 +1,52 @@
+{
+    "name": "magento/magento2-functional-test-module-configurable-product-sales",
+    "description": "Magento 2 Acceptance Test Module Configurable Product Sales",
+    "repositories": [
+        {
+            "type" : "composer",
+            "url" : "https://repo.magento.com/"
+        }
+    ],
+    "require": {
+        "php": "~7.0",
+        "codeception/codeception": "2.2|2.3",
+        "allure-framework/allure-codeception": "dev-master",
+        "consolidation/robo": "^1.0.0",
+        "henrikbjorn/lurker": "^1.2",
+        "vlucas/phpdotenv": "~2.4",
+        "magento/magento2-functional-testing-framework": "dev-develop"
+    },
+    "suggest": {
+        "magento/magento2-functional-test-module-store": "dev-master",
+        "magento/magento2-functional-test-module-catalog": "dev-master",
+        "magento/magento2-functional-test-module-sales": "dev-master"
+    },
+    "type": "magento2-test-module",
+    "version": "dev-master",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
+    "autoload": {
+        "psr-0": {
+            "Yandex": "vendor/allure-framework/allure-codeception/src/"
+        },
+        "psr-4": {
+            "Magento\\FunctionalTestingFramework\\": [
+                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
+            ],
+            "Magento\\FunctionalTest\\": [
+                "tests/functional/Magento/FunctionalTest",
+                "generated/Magento/FunctionalTest"
+            ]
+        }
+    },
+    "extra": {
+        "map": [
+            [
+                "*",
+                "tests/functional/Magento/FunctionalTest/ConfigurableProductSales"
+            ]
+        ]
+    }
+}
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Contact/LICENSE.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Contact/LICENSE.txt
new file mode 100644
index 00000000000..49525fd99da
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Contact/LICENSE.txt
@@ -0,0 +1,48 @@
+
+Open Software License ("OSL") v. 3.0
+
+This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Open Software License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Open Software License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly. 
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including 'fair use' or 'fair dealing'). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright (C) 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Contact/LICENSE_AFL.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Contact/LICENSE_AFL.txt
new file mode 100644
index 00000000000..f39d641b18a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Contact/LICENSE_AFL.txt
@@ -0,0 +1,48 @@
+
+Academic Free License ("AFL") v. 3.0
+
+This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Academic Free License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, under any license of your choice that does not contradict the terms and conditions, including Licensor's reserved rights and remedies, in this Academic Free License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly.
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including "fair use" or "fair dealing"). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright © 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Academic Free License" or "AFL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Contact/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Contact/README.md
new file mode 100644
index 00000000000..4b862fdfeea
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Contact/README.md
@@ -0,0 +1,3 @@
+# Magento 2 Acceptance Tests
+
+The Acceptance Tests Module for **Magento_Contact** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Contact/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Contact/composer.json
new file mode 100644
index 00000000000..11531b5e5f4
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Contact/composer.json
@@ -0,0 +1,53 @@
+{
+    "name": "magento/magento2-functional-test-module-contact",
+    "description": "Magento 2 Acceptance Test Module Contact",
+    "repositories": [
+        {
+            "type" : "composer",
+            "url" : "https://repo.magento.com/"
+        }
+    ],
+    "require": {
+        "php": "~7.0",
+        "codeception/codeception": "2.2|2.3",
+        "allure-framework/allure-codeception": "dev-master",
+        "consolidation/robo": "^1.0.0",
+        "henrikbjorn/lurker": "^1.2",
+        "vlucas/phpdotenv": "~2.4",
+        "magento/magento2-functional-testing-framework": "dev-develop"
+    },
+    "suggest": {
+        "magento/magento2-functional-test-module-store": "dev-master",
+        "magento/magento2-functional-test-module-config": "dev-master",
+        "magento/magento2-functional-test-module-customer": "dev-master",
+        "magento/magento2-functional-test-module-cms": "dev-master"
+    },
+    "type": "magento2-test-module",
+    "version": "dev-master",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
+    "autoload": {
+        "psr-0": {
+            "Yandex": "vendor/allure-framework/allure-codeception/src/"
+        },
+        "psr-4": {
+            "Magento\\FunctionalTestingFramework\\": [
+                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
+            ],
+            "Magento\\FunctionalTest\\": [
+                "tests/functional/Magento/FunctionalTest",
+                "generated/Magento/FunctionalTest"
+            ]
+        }
+    },
+    "extra": {
+        "map": [
+            [
+                "*",
+                "tests/functional/Magento/FunctionalTest/Contact"
+            ]
+        ]
+    }
+}
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cookie/LICENSE.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cookie/LICENSE.txt
new file mode 100644
index 00000000000..49525fd99da
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cookie/LICENSE.txt
@@ -0,0 +1,48 @@
+
+Open Software License ("OSL") v. 3.0
+
+This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Open Software License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Open Software License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly. 
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including 'fair use' or 'fair dealing'). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright (C) 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cookie/LICENSE_AFL.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cookie/LICENSE_AFL.txt
new file mode 100644
index 00000000000..f39d641b18a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cookie/LICENSE_AFL.txt
@@ -0,0 +1,48 @@
+
+Academic Free License ("AFL") v. 3.0
+
+This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Academic Free License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, under any license of your choice that does not contradict the terms and conditions, including Licensor's reserved rights and remedies, in this Academic Free License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly.
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including "fair use" or "fair dealing"). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright © 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Academic Free License" or "AFL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cookie/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cookie/README.md
new file mode 100644
index 00000000000..f218201d7c9
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cookie/README.md
@@ -0,0 +1,3 @@
+# Magento 2 Acceptance Tests
+
+The Acceptance Tests Module for **Magento_Cookie** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cookie/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cookie/composer.json
new file mode 100644
index 00000000000..cf0a7bc2cb4
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cookie/composer.json
@@ -0,0 +1,50 @@
+{
+    "name": "magento/magento2-functional-test-module-cookie",
+    "description": "Magento 2 Acceptance Test Module Cookie",
+    "repositories": [
+        {
+            "type" : "composer",
+            "url" : "https://repo.magento.com/"
+        }
+    ],
+    "require": {
+        "php": "~7.0",
+        "codeception/codeception": "2.2|2.3",
+        "allure-framework/allure-codeception": "dev-master",
+        "consolidation/robo": "^1.0.0",
+        "henrikbjorn/lurker": "^1.2",
+        "vlucas/phpdotenv": "~2.4",
+        "magento/magento2-functional-testing-framework": "dev-develop"
+    },
+    "suggest": {
+        "magento/magento2-functional-test-module-store": "dev-master"
+    },
+    "type": "magento2-test-module",
+    "version": "dev-master",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
+    "autoload": {
+        "psr-0": {
+            "Yandex": "vendor/allure-framework/allure-codeception/src/"
+        },
+        "psr-4": {
+            "Magento\\FunctionalTestingFramework\\": [
+                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
+            ],
+            "Magento\\FunctionalTest\\": [
+                "tests/functional/Magento/FunctionalTest",
+                "generated/Magento/FunctionalTest"
+            ]
+        }
+    },
+    "extra": {
+        "map": [
+            [
+                "*",
+                "tests/functional/Magento/FunctionalTest/Cookie"
+            ]
+        ]
+    }
+}
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CurrencySymbol/LICENSE.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CurrencySymbol/LICENSE.txt
new file mode 100644
index 00000000000..49525fd99da
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CurrencySymbol/LICENSE.txt
@@ -0,0 +1,48 @@
+
+Open Software License ("OSL") v. 3.0
+
+This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Open Software License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Open Software License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly. 
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including 'fair use' or 'fair dealing'). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright (C) 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CurrencySymbol/LICENSE_AFL.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CurrencySymbol/LICENSE_AFL.txt
new file mode 100644
index 00000000000..f39d641b18a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CurrencySymbol/LICENSE_AFL.txt
@@ -0,0 +1,48 @@
+
+Academic Free License ("AFL") v. 3.0
+
+This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Academic Free License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, under any license of your choice that does not contradict the terms and conditions, including Licensor's reserved rights and remedies, in this Academic Free License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly.
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including "fair use" or "fair dealing"). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright © 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Academic Free License" or "AFL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CurrencySymbol/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CurrencySymbol/README.md
new file mode 100644
index 00000000000..110a01dc96d
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CurrencySymbol/README.md
@@ -0,0 +1,3 @@
+# Magento 2 Acceptance Tests
+
+The Acceptance Tests Module for **Magento_CurrencySymbol** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CurrencySymbol/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CurrencySymbol/composer.json
new file mode 100644
index 00000000000..9568fdb29ca
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CurrencySymbol/composer.json
@@ -0,0 +1,54 @@
+{
+    "name": "magento/magento2-functional-test-module-currency-symbol",
+    "description": "Magento 2 Acceptance Test Module Currency Symbol",
+    "repositories": [
+        {
+            "type" : "composer",
+            "url" : "https://repo.magento.com/"
+        }
+    ],
+    "require": {
+        "php": "~7.0",
+        "codeception/codeception": "2.2|2.3",
+        "allure-framework/allure-codeception": "dev-master",
+        "consolidation/robo": "^1.0.0",
+        "henrikbjorn/lurker": "^1.2",
+        "vlucas/phpdotenv": "~2.4",
+        "magento/magento2-functional-testing-framework": "dev-develop"
+    },
+    "suggest": {
+        "magento/magento2-functional-test-module-store": "dev-master",
+        "magento/magento2-functional-test-module-config": "dev-master",
+        "magento/magento2-functional-test-module-page-cache": "dev-master",
+        "magento/magento2-functional-test-module-directory": "dev-master",
+        "magento/magento2-functional-test-module-backend": "dev-master"
+    },
+    "type": "magento2-test-module",
+    "version": "dev-master",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
+    "autoload": {
+        "psr-0": {
+            "Yandex": "vendor/allure-framework/allure-codeception/src/"
+        },
+        "psr-4": {
+            "Magento\\FunctionalTestingFramework\\": [
+                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
+            ],
+            "Magento\\FunctionalTest\\": [
+                "tests/functional/Magento/FunctionalTest",
+                "generated/Magento/FunctionalTest"
+            ]
+        }
+    },
+    "extra": {
+        "map": [
+            [
+                "*",
+                "tests/functional/Magento/FunctionalTest/CurrencySymbol"
+            ]
+        ]
+    }
+}
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Cest/AdminCreateCustomerCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Cest/AdminCreateCustomerCest.xml
new file mode 100644
index 00000000000..66a750304f3
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Cest/AdminCreateCustomerCest.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Test/etc/testSchema.xsd">
+    <cest name="AdminCreateCustomerCest">
+        <annotations>
+            <features value="Customer Creation"/>
+            <stories value="Create a Customer via the Admin"/>
+            <group value="customer"/>
+            <env value="chrome"/>
+            <env value="firefox"/>
+            <env value="phantomjs"/>
+        </annotations>
+        <test name="CreateCustomerViaAdminCest">
+            <annotations>
+                <title value="You should be able to create a customer in the Admin back-end."/>
+                <description value="You should be able to create a customer in the Admin back-end."/>
+                <severity value="CRITICAL"/>
+                <testCaseId value="MAGETWO-72095"/>
+            </annotations>
+            <amOnPage url="{{AdminLoginPage.url}}" mergeKey="navigateToAdmin"/>
+            <fillField userInput="{{_ENV.MAGENTO_ADMIN_USERNAME}}" selector="{{AdminLoginFormSection.username}}" mergeKey="fillUsername"/>
+            <fillField userInput="{{_ENV.MAGENTO_ADMIN_PASSWORD}}" selector="{{AdminLoginFormSection.password}}" mergeKey="fillPassword"/>
+            <click selector="{{AdminLoginFormSection.signIn}}" mergeKey="clickLogin"/>
+            <amOnPage url="{{AdminCustomerPage.url}}" mergeKey="navigateToCustomers"/>
+            <click selector="{{AdminCustomerMainActionsSection.addNewCustomer}}" mergeKey="clickCreateCustomer"/>
+            <fillField userInput="{{CustomerEntityOne.firstname}}" selector="{{AdminNewCustomerAccountInformationSection.firstName}}" mergeKey="fillFirstName"/>
+            <fillField userInput="{{CustomerEntityOne.lastname}}" selector="{{AdminNewCustomerAccountInformationSection.lastName}}" mergeKey="fillLastName"/>
+            <fillField userInput="{{CustomerEntityOne.email}}" selector="{{AdminNewCustomerAccountInformationSection.email}}" mergeKey="fillEmail"/>
+            <click selector="{{AdminNewCustomerMainActionsSection.saveButton}}" mergeKey="saveCustomer"/>
+            <waitForElementNotVisible selector="div [data-role='spinner']" time="10" mergeKey="waitForSpinner1"/>
+            <seeElement selector="{{AdminCustomerMessagesSection.successMessage}}" mergeKey="assertSuccessMessage"/>
+
+            <click selector="{{AdminCustomerFiltersSection.filtersButton}}" mergeKey="openFilter"/>
+            <fillField userInput="{{CustomerEntityOne.firstname}}" selector="{{AdminCustomerFiltersSection.nameInput}}" mergeKey="filterFirstName"/>
+            <click selector="{{AdminCustomerFiltersSection.apply}}" mergeKey="applyFilter"/>
+            <waitForElementNotVisible selector="div [data-role='spinner']" time="10" mergeKey="waitForSpinner2"/>
+            <see userInput="{{CustomerEntityOne.firstname}}" selector="{{AdminCustomerGridSection.customerGrid}}" mergeKey="assertFirstName"/>
+            <see userInput="{{CustomerEntityOne.lastname}}" selector="{{AdminCustomerGridSection.customerGrid}}" mergeKey="assertLastName"/>
+            <see userInput="{{CustomerEntityOne.email}}" selector="{{AdminCustomerGridSection.customerGrid}}" mergeKey="assertEmail"/>
+        </test>
+    </cest>
+</config>
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Cest/StorefrontCreateCustomerCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Cest/StorefrontCreateCustomerCest.xml
new file mode 100644
index 00000000000..cba18378530
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Cest/StorefrontCreateCustomerCest.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Test/etc/testSchema.xsd">
+    <cest name="StorefrontCreateCustomerCest">
+        <annotations>
+            <features value="Customer Creation"/>
+            <stories value="Create a Customer via the Storefront"/>
+            <env value="chrome"/>
+            <env value="firefox"/>
+            <env value="phantomjs"/>
+        </annotations>
+        <test name="CreateCustomerViaStorefront">
+            <annotations>
+                <title value="You should be able to create a customer via the storefront"/>
+                <description value="You should be able to create a customer via the storefront."/>
+                <severity value="CRITICAL"/>
+                <group value="create"/>
+                <testCaseId value="MAGETWO-23546"/>
+            </annotations>
+            <amOnPage mergeKey="amOnStorefrontPage"  url="/"/>
+            <click mergeKey="clickOnCreateAccountLink" selector="{{StorefrontPanelHeaderSection.createAnAccountLink}}"/>
+            <fillField  mergeKey="fillFirstName" userInput="{{CustomerEntityOne.firstname}}" selector="{{StorefrontCustomerCreateFormSection.firstnameField}}"/>
+            <fillField  mergeKey="fillLastName" userInput="{{CustomerEntityOne.lastname}}" selector="{{StorefrontCustomerCreateFormSection.lastnameField}}"/>
+            <fillField  mergeKey="fillEmail" userInput="{{CustomerEntityOne.email}}" selector="{{StorefrontCustomerCreateFormSection.emailField}}"/>
+            <fillField  mergeKey="fillPassword" userInput="{{CustomerEntityOne.password}}" selector="{{StorefrontCustomerCreateFormSection.passwordField}}"/>
+            <fillField  mergeKey="fillConfirmPassword" userInput="{{CustomerEntityOne.password}}" selector="{{StorefrontCustomerCreateFormSection.confirmPasswordField}}"/>
+            <click mergeKey="clickCreateAccountButton" selector="{{StorefrontCustomerCreateFormSection.createAccountButton}}"/>
+            <see mergeKey="seeThankYouMessage" userInput="Thank you for registering with Main Website Store."/>
+            <see mergeKey="seeFirstName" userInput="{{CustomerEntityOne.firstname}}" selector="{{StorefrontCustomerDashboardAccountInformationSection.ContactInformation}}" />
+            <see mergeKey="seeLastName" userInput="{{CustomerEntityOne.lastname}}" selector="{{StorefrontCustomerDashboardAccountInformationSection.ContactInformation}}" />
+            <see mergeKey="seeEmail" userInput="{{CustomerEntityOne.email}}" selector="{{StorefrontCustomerDashboardAccountInformationSection.ContactInformation}}" />
+        </test>
+    </cest>
+</config>
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Cest/StorefrontExistingCustomerLoginCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Cest/StorefrontExistingCustomerLoginCest.xml
new file mode 100644
index 00000000000..1c3722418cb
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Cest/StorefrontExistingCustomerLoginCest.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Test/etc/testSchema.xsd">
+    <cest name="StorefrontExistingCustomerLoginCest">
+        <annotations>
+            <features value="Customer Login"/>
+            <stories value="Existing Customer can Login on the Storefront"/>
+            <group value="customer"/>
+            <env value="chrome"/>
+            <env value="firefox"/>
+            <env value="phantomjs"/>
+        </annotations>
+        <before>
+            <createData entity="Simple_US_Customer" mergeKey="Simple_US_Customer"/>
+        </before>
+        <after>
+            <deleteData createDataKey="Simple_US_Customer" mergeKey="Simple_US_Customer"/>
+        </after>
+        <test name="ExistingCustomerLoginStorefrontTest">
+            <annotations>
+                <title value="You should be able to create a customer via the storefront"/>
+                <description value="You should be able to create a customer via the storefront."/>
+                <severity value="CRITICAL"/>
+                <testCaseId value="MAGETWO-72103"/>
+            </annotations>
+            <amOnPage mergeKey="amOnSignInPage"  url="customer/account/login/"/>
+            <fillField  mergeKey="fillEmail" userInput="$$Simple_US_Customer.email$$" selector="{{StorefrontCustomerSignInFormSection.emailField}}"/>
+            <fillField  mergeKey="fillPassword" userInput="{{Simple_US_Customer.password}}" selector="{{StorefrontCustomerSignInFormSection.passwordField}}"/>
+            <click mergeKey="clickSignInAccountButton" selector="{{StorefrontCustomerSignInFormSection.signInAccountButton}}"/>
+            <see mergeKey="seeFirstName" userInput="{{Simple_US_Customer.firstname}}" selector="{{StorefrontCustomerDashboardAccountInformationSection.ContactInformation}}" />
+            <see mergeKey="seeLastName" userInput="{{Simple_US_Customer.lastname}}" selector="{{StorefrontCustomerDashboardAccountInformationSection.ContactInformation}}" />
+            <see mergeKey="seeEmail" userInput="$$Simple_US_Customer.email$$" selector="{{StorefrontCustomerDashboardAccountInformationSection.ContactInformation}}" />
+        </test>
+    </cest>
+</config>
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Data/AddressData.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Data/AddressData.xml
new file mode 100644
index 00000000000..34a8b89b9a2
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Data/AddressData.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataProfileSchema.xsd">
+    <entity name="CustomerAddressSimple" type="address">
+        <data key="id">0</data>
+        <data key="customer_id">12</data>
+        <required-entity type="region">CustomerRegionOne</required-entity>
+        <data key="region_id">0</data>
+        <data key="country_id">USA</data>
+        <array key="street">
+            <item>7700 W Parmer Ln</item>
+            <item>Bld D</item>
+        </array>
+        <data key="company">Magento</data>
+        <data key="telephone">1234568910</data>
+        <data key="fax">1234568910</data>
+        <data key="postcode">78729</data>
+        <data key="city">Austin</data>
+        <data key="state">Texas</data>
+        <data key="firstname">John</data>
+        <data key="lastname">Doe</data>
+        <data key="middlename">string</data>
+        <data key="prefix">Mr</data>
+        <data key="suffix">Sr</data>
+        <data key="vat_id">vatData</data>
+        <data key="default_shipping">true</data>
+        <data key="default_billing">true</data>
+    </entity>
+    <entity name="US_Address_TX" type="address">
+        <data key="firstname">John</data>
+        <data key="lastname">Doe</data>
+        <data key="company">Magento</data>
+        <array key="street">
+            <item>7700 West Parmer Lane</item>
+        </array>
+        <data key="city">Austin</data>
+        <data key="country_id">US</data>
+        <data key="postcode">78729</data>
+        <data key="telephone">512-345-6789</data>
+        <data key="default_billing">Yes</data>
+        <data key="default_shipping">Yes</data>
+        <required-entity type="region">RegionTX</required-entity>
+    </entity>
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Data/CustomAttributeData.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Data/CustomAttributeData.xml
new file mode 100644
index 00000000000..01ce261bfa0
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Data/CustomAttributeData.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataProfileSchema.xsd">
+    <entity name="CustomAttributeSimple" type="custom_attribute">
+        <data key="attribute_code">100</data>
+        <data key="value">test</data>
+    </entity>
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Data/CustomerData.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Data/CustomerData.xml
new file mode 100644
index 00000000000..b21e1ef1303
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Data/CustomerData.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataProfileSchema.xsd">
+    <entity name="CustomerEntityOne" type="customer">
+        <data key="group_id">0</data>
+        <data key="default_billing">defaultBillingValue</data>
+        <data key="default_shipping">defaultShippingValue</data>
+        <data key="confirmation">confirmationData</data>
+        <data key="created_at">12:00</data>
+        <data key="updated_at">12:00</data>
+        <data key="created_in">createdInData</data>
+        <data key="dob">01-01-1970</data>
+        <data key="email" unique="prefix">test@email.com</data>
+        <data key="firstname">John</data>
+        <data key="lastname">Doe</data>
+        <data key="middlename">S</data>
+        <data key="password">pwdTest123!</data>
+        <data key="prefix">Mr</data>
+        <data key="suffix">Sr</data>
+        <data key="gender">0</data>
+        <data key="store_id">0</data>
+        <data key="taxvat">taxValue</data>
+        <data key="website_id">0</data>
+        <required-entity type="address">CustomerAddressSimple</required-entity>
+        <data key="disable_auto_group_change">0</data>
+        <!--required-entity type="extension_attribute">ExtensionAttributeSimple</required-entity-->
+    </entity>
+    <entity name="Simple_US_Customer" type="customer">
+        <data key="group_id">0</data>
+        <data key="default_billing">true</data>
+        <data key="default_shipping">true</data>
+        <data key="email" unique="prefix">John.Doe@example.com</data>
+        <data key="firstname">John</data>
+        <data key="lastname">Doe</data>
+        <data key="password">pwdTest123!</data>
+        <data key="store_id">0</data>
+        <data key="website_id">0</data>
+        <required-entity type="address">US_Address_TX</required-entity>
+    </entity>
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Data/ExtensionAttributeSimple.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Data/ExtensionAttributeSimple.xml
new file mode 100644
index 00000000000..2e5072176ed
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Data/ExtensionAttributeSimple.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataProfileSchema.xsd">
+    <entity name="ExtensionAttributeSimple" type="extension_attribute">
+        <data key="is_subscribed">true</data>
+    </entity>
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Data/RegionData.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Data/RegionData.xml
new file mode 100644
index 00000000000..a52c9134f92
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Data/RegionData.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataProfileSchema.xsd">
+    <entity name="CustomerRegionOne" type="region">
+        <data key="region_code">100</data>
+        <data key="region_id">12</data>
+    </entity>
+    <entity name="RegionTX" type="region">
+        <data key="region">Texas</data>
+        <data key="region_code">TX</data>
+        <data key="region_id">1</data>
+    </entity>
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/LICENSE.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/LICENSE.txt
new file mode 100644
index 00000000000..49525fd99da
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/LICENSE.txt
@@ -0,0 +1,48 @@
+
+Open Software License ("OSL") v. 3.0
+
+This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Open Software License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Open Software License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly. 
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including 'fair use' or 'fair dealing'). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright (C) 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/LICENSE_AFL.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/LICENSE_AFL.txt
new file mode 100644
index 00000000000..f39d641b18a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/LICENSE_AFL.txt
@@ -0,0 +1,48 @@
+
+Academic Free License ("AFL") v. 3.0
+
+This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Academic Free License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, under any license of your choice that does not contradict the terms and conditions, including Licensor's reserved rights and remedies, in this Academic Free License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly.
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including "fair use" or "fair dealing"). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright © 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Academic Free License" or "AFL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Metadata/address-meta.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Metadata/address-meta.xml
new file mode 100644
index 00000000000..0238f8fe9f9
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Metadata/address-meta.xml
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataOperation.xsd">
+    <operation name="CreateAddress" dataType="address" type="create">
+        <entry key="region">region</entry>
+        <entry key="country_id">string</entry>
+        <array key="street">
+            <value>string</value>
+        </array>
+        <entry key="company">string</entry>
+        <entry key="telephone">string</entry>
+        <entry key="fax">string</entry>
+        <entry key="postcode">string</entry>
+        <entry key="city">string</entry>
+        <entry key="firstname">string</entry>
+        <entry key="lastname">string</entry>
+        <entry key="middlename">string</entry>
+        <entry key="prefix">string</entry>
+        <entry key="suffix">string</entry>
+        <entry key="vat_id">string</entry>
+        <entry key="default_shipping">boolean</entry>
+        <entry key="default_billing">boolean</entry>
+        <entry key="extension_attributes">empty_extension_attribute</entry>
+        <array key="custom_attributes">
+            <value>custom_attribute</value>
+        </array>
+    </operation>
+    <operation name="UpdateAddress" dataType="address" type="update">
+        <entry key="id">integer</entry>
+        <entry key="customer_id">integer</entry>
+        <entry key="region">region</entry>
+        <entry key="region_id">integer</entry>
+        <entry key="country_id">string</entry>
+        <array key="street">
+            <value>string</value>
+        </array>
+        <entry key="company">string</entry>
+        <entry key="telephone">string</entry>
+        <entry key="fax">string</entry>
+        <entry key="postcode">string</entry>
+        <entry key="city">string</entry>
+        <entry key="firstname">string</entry>
+        <entry key="lastname">string</entry>
+        <entry key="middlename">string</entry>
+        <entry key="prefix">string</entry>
+        <entry key="suffix">string</entry>
+        <entry key="vat_id">string</entry>
+        <entry key="default_shipping">boolean</entry>
+        <entry key="default_billing">boolean</entry>
+        <entry key="extension_attributes">empty_extension_attribute</entry>
+        <array key="custom_attributes">
+            <value>custom_attribute</value>
+        </array>
+    </operation>
+</config>
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Metadata/custom_attribute-meta.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Metadata/custom_attribute-meta.xml
new file mode 100644
index 00000000000..7ad804465c7
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Metadata/custom_attribute-meta.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataOperation.xsd">
+    <operation name="CreateCustomAttribute" dataType="custom_attribute" type="create">
+        <entry key="attribute_code">string</entry>
+        <entry key="value">string</entry>
+    </operation>
+    <operation name="UpdateCustomAttribute" dataType="custom_attribute" type="update">
+        <entry key="attribute_code">string</entry>
+        <entry key="value">string</entry>
+    </operation>
+</config>
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Metadata/customer-meta.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Metadata/customer-meta.xml
new file mode 100644
index 00000000000..f2b6dbe682e
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Metadata/customer-meta.xml
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataOperation.xsd">
+    <operation name="CreateCustomer" dataType="customer" type="create" auth="/rest/V1/integration/admin/token" url="/rest/V1/customers" method="POST">
+        <header param="Content-Type">application/json</header>
+        <jsonObject dataType="customer" key="customer">
+            <entry key="group_id">integer</entry>
+            <entry key="default_billing">string</entry>
+            <entry key="default_shipping">string</entry>
+            <entry key="confirmation">string</entry>
+            <entry key="created_at">string</entry>
+            <entry key="updated_at">string</entry>
+            <entry key="created_in">string</entry>
+            <entry key="dob">string</entry>
+            <entry key="email">string</entry>
+            <entry key="firstname">string</entry>
+            <entry key="lastname">string</entry>
+            <entry key="middlename">string</entry>
+            <entry key="prefix">string</entry>
+            <entry key="suffix">string</entry>
+            <entry key="gender">integer</entry>
+            <entry key="store_id">integer</entry>
+            <entry key="taxvat">string</entry>
+            <entry key="website_id">integer</entry>
+            <array key="addresses">
+                <value>address</value>
+            </array>
+            <entry key="disable_auto_group_change">integer</entry>
+            <entry key="extension_attributes">customer_extension_attribute</entry>
+            <array key="custom_attributes">
+                <value>custom_attribute</value>
+            </array>
+        </jsonObject>
+        <entry key="password">string</entry>
+    </operation>
+    <operation name="UpdateCustomer" dataType="customer" type="update" auth="/rest/V1/integration/admin/token" url="/rest/V1/customers" method="PUT">
+        <header param="Content-Type">application/json</header>
+        <entry key="id">integer</entry>
+        <entry key="group_id">integer</entry>
+        <entry key="default_billing">string</entry>
+        <entry key="default_shipping">string</entry>
+        <entry key="confirmation">string</entry>
+        <entry key="created_at">string</entry>
+        <entry key="updated_at">string</entry>
+        <entry key="created_in">string</entry>
+        <entry key="dob">string</entry>
+        <entry key="email">string</entry>
+        <entry key="firstname">string</entry>
+        <entry key="lastname">string</entry>
+        <entry key="middlename">string</entry>
+        <entry key="prefix">string</entry>
+        <entry key="suffix">string</entry>
+        <entry key="gender">integer</entry>
+        <entry key="store_id">integer</entry>
+        <entry key="taxvat">string</entry>
+        <entry key="website_id">integer</entry>
+        <array key="addresses">
+            <value>address</value>
+        </array>
+        <entry key="disable_auto_group_change">integer</entry>
+        <entry key="extension_attributes">customer_extension_attribute</entry>
+        <array key="custom_attributes">
+            <value>custom_attribute</value>
+        </array>
+        <entry key="password">string</entry>
+        <entry key="redirectUrl">string</entry>
+    </operation>
+    <operation name="DeleteCustomer" dataType="customer" type="delete" auth="/rest/V1/integration/admin/token" url="/rest/V1/customers" method="DELETE">
+        <header param="Content-Type">application/json</header>
+        <param key="id" type="path">{id}</param>
+    </operation>
+</config>
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Metadata/customer_extension_attribute-meta.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Metadata/customer_extension_attribute-meta.xml
new file mode 100644
index 00000000000..fee39b01336
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Metadata/customer_extension_attribute-meta.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataOperation.xsd">
+    <operation name="CreateCustomerExtensionAttribute" dataType="customer_extension_attribute" type="create">
+        <entry key="is_subscribed">boolean</entry>
+        <entry key="extension_attribute">customer_nested_extension_attribute</entry>
+    </operation>
+    <operation name="UpdateCustomerExtensionAttribute" dataType="customer_extension_attribute" type="update">
+        <entry key="is_subscribed">boolean</entry>
+        <entry key="extension_attribute">customer_nested_extension_attribute</entry>
+    </operation>
+</config>
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Metadata/customer_nested_extension_attribute-meta.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Metadata/customer_nested_extension_attribute-meta.xml
new file mode 100644
index 00000000000..cf16e49fce6
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Metadata/customer_nested_extension_attribute-meta.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataOperation.xsd">
+    <operation name="CreateNestedExtensionAttribute" dataType="customer_nested_extension_attribute" type="create">
+        <entry key="id">integer</entry>
+        <entry key="customer_id">integer</entry>
+        <entry key="value">string</entry>
+    </operation>
+    <operation name="UpdateNestedExtensionAttribute" dataType="customer_nested_extension_attribute" type="update">
+        <entry key="id">integer</entry>
+        <entry key="customer_id">integer</entry>
+        <entry key="value">string</entry>
+    </operation>
+</config>
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Metadata/empty_extension_attribute-meta.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Metadata/empty_extension_attribute-meta.xml
new file mode 100644
index 00000000000..1a5377403e1
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Metadata/empty_extension_attribute-meta.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataOperation.xsd">
+    <operation name="CreateEmptyExtensionAttribute" dataType="empty_extension_attribute" type="create">
+    </operation>
+    <operation name="UpdateEmptyExtensionAttribute" dataType="empty_extension_attribute" type="update">
+    </operation>
+</config>
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Metadata/region-meta.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Metadata/region-meta.xml
new file mode 100644
index 00000000000..ed7d56e3d2a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Metadata/region-meta.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataOperation.xsd">
+    <operation name="CreateRegion" dataType="region" type="create">
+        <entry key="region_code">string</entry>
+        <entry key="region">string</entry>
+        <entry key="region_id">string</entry>
+        <entry key="extension_attributes">extension_attributes</entry>
+    </operation>
+    <operation name="UpdateRegion" dataType="region" type="update">
+        <entry key="region_code">string</entry>
+        <entry key="region">string</entry>
+        <entry key="region_id">string</entry>
+        <entry key="extension_attributes">empty_extension_attribute</entry>
+    </operation>
+</config>
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Page/AdminCustomerPage.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Page/AdminCustomerPage.xml
new file mode 100644
index 00000000000..c08116588f6
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Page/AdminCustomerPage.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/PageObject.xsd">
+    <page name="AdminCustomerPage" urlPath="/admin/customer/index/" module="Customer">
+        <section name="AdminCustomerMainActionsSection"/>
+        <section name="AdminCustomerMessagesSection"/>
+        <section name="AdminCustomerGridSection"/>
+        <section name="AdminCustomerFiltersSection"/>
+    </page>
+</config>
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Page/AdminNewCustomerPage.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Page/AdminNewCustomerPage.xml
new file mode 100644
index 00000000000..c488e2c7cc7
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Page/AdminNewCustomerPage.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/PageObject.xsd">
+    <page name="AdminNewCustomerPage" urlPath="/admin/customer/index/new" module="Customer">
+        <section name="AdminNewCustomerAccountInformationSection"/>
+        <section name="AdminNewCustomerMainActionsSection"/>
+    </page>
+</config>
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Page/StorefrontCustomerCreatePage.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Page/StorefrontCustomerCreatePage.xml
new file mode 100644
index 00000000000..a3e38d81549
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Page/StorefrontCustomerCreatePage.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/PageObject.xsd">
+    <page name="StorefrontCustomerCreatePage" urlPath="/customer/account/create/" module="Magento_Customer">
+        <section name="StorefrontCustomerCreateFormSection" />
+    </page>
+</config>
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Page/StorefrontCustomerDashboardPage.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Page/StorefrontCustomerDashboardPage.xml
new file mode 100644
index 00000000000..3699b1280d4
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Page/StorefrontCustomerDashboardPage.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/PageObject.xsd">
+    <page name="StorefrontCustomerDashboardPage" urlPath="/customer/account/" module="Magento_Customer">
+        <section name="StorefrontCustomerDashboardAccountInformationSection" />
+    </page>
+</config>
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Page/StorefrontCustomerSignInPage.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Page/StorefrontCustomerSignInPage.xml
new file mode 100644
index 00000000000..c170b257387
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Page/StorefrontCustomerSignInPage.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/PageObject.xsd">
+    <page name="StorefrontCustomerSignInPage" urlPath="/customer/account/login/" module="Magento_Customer">
+        <section name="StorefrontCustomerSignInFormSection" />
+    </page>
+</config>
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Page/StorefrontHomePage.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Page/StorefrontHomePage.xml
new file mode 100644
index 00000000000..ce103f5add6
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Page/StorefrontHomePage.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/PageObject.xsd">
+    <page name="StorefrontProductPage" urlPath="/" module="Magento_Customer">
+        <section name="StorefrontPanelHeader" />
+    </page>
+</config>
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/README.md
new file mode 100644
index 00000000000..a7c25afc9a3
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/README.md
@@ -0,0 +1,3 @@
+# Magento 2 Acceptance Tests
+
+The Acceptance Tests Module for **Magento_Customer** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/AdminCustomerFiltersSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/AdminCustomerFiltersSection.xml
new file mode 100644
index 00000000000..12284623e60
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/AdminCustomerFiltersSection.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
+    <section name="AdminCustomerFiltersSection">
+        <element name="filtersButton" type="button" locator="#container > div > div.admin__data-grid-header > div:nth-child(1) > div.data-grid-filters-actions-wrap > div > button" timeout="30"/>
+        <element name="nameInput" type="input" locator="input[name=name]"/>
+        <element name="apply" type="button" locator="button[data-action=grid-filter-apply]" timeout="30"/>
+    </section>
+</config>
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/AdminCustomerGridSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/AdminCustomerGridSection.xml
new file mode 100644
index 00000000000..ecc9e966802
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/AdminCustomerGridSection.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
+    <section name="AdminCustomerGridSection">
+        <element name="customerGrid" type="text" locator="table[data-role='grid']"/>
+    </section>
+</config>
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/AdminCustomerMainActionsSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/AdminCustomerMainActionsSection.xml
new file mode 100644
index 00000000000..95fcc7ab799
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/AdminCustomerMainActionsSection.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
+    <section name="AdminCustomerMainActionsSection">
+        <element name="addNewCustomer" type="button" locator="#add" timeout="30"/>
+    </section>
+</config>
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/AdminCustomerMessagesSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/AdminCustomerMessagesSection.xml
new file mode 100644
index 00000000000..d27381aa0bc
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/AdminCustomerMessagesSection.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
+    <section name="AdminCustomerMessagesSection">
+        <element name="successMessage" type="text" locator=".message-success"/>
+    </section>
+</config>
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/AdminNewCustomerAccountInformationSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/AdminNewCustomerAccountInformationSection.xml
new file mode 100644
index 00000000000..3b4b0730914
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/AdminNewCustomerAccountInformationSection.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
+    <section name="AdminNewCustomerAccountInformationSection">
+        <element name="firstName" type="input" locator="input[name='customer[firstname]']"/>
+        <element name="lastName" type="input" locator="input[name='customer[lastname]']"/>
+        <element name="email" type="input" locator="input[name='customer[email]']"/>
+    </section>
+</config>
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/AdminNewCustomerMainActionsSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/AdminNewCustomerMainActionsSection.xml
new file mode 100644
index 00000000000..a7e168ba9f2
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/AdminNewCustomerMainActionsSection.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
+    <section name="AdminNewCustomerMainActionsSection">
+        <element name="saveButton" type="button" locator="#save" timeout="30"/>
+    </section>
+</config>
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/StorefrontCustomerCreateFormSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/StorefrontCustomerCreateFormSection.xml
new file mode 100644
index 00000000000..ef88114d02e
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/StorefrontCustomerCreateFormSection.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
+    <section name="StorefrontCustomerCreateFormSection">
+        <element name="firstnameField" type="input" locator="#firstname"/>
+        <element name="lastnameField" type="input" locator="#lastname"/>
+        <element name="emailField" type="input" locator="#email_address"/>
+        <element name="passwordField" type="input" locator="#password"/>
+        <element name="confirmPasswordField" type="input" locator="#password-confirmation"/>
+        <element name="createAccountButton" type="button" locator="button.action.submit.primary" timeout="30"/>
+    </section>
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/StorefrontCustomerDashboardAccountInformationSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/StorefrontCustomerDashboardAccountInformationSection.xml
new file mode 100644
index 00000000000..8b1dbbed1d4
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/StorefrontCustomerDashboardAccountInformationSection.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
+    <section name="StorefrontCustomerDashboardAccountInformationSection">
+        <element name="ContactInformation" type="textarea" locator=".box.box-information .box-content"/>
+    </section>
+</config>
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/StorefrontCustomerSignInFormSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/StorefrontCustomerSignInFormSection.xml
new file mode 100644
index 00000000000..359a58ad7f0
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/StorefrontCustomerSignInFormSection.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
+    <section name="StorefrontCustomerSignInFormSection">
+        <element name="emailField" type="input" locator="#email"/>
+        <element name="passwordField" type="input" locator="#pass"/>
+        <element name="signInAccountButton" type="button" locator="#send2" timeout="30"/>
+    </section>
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/StorefrontPanelHeaderSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/StorefrontPanelHeaderSection.xml
new file mode 100644
index 00000000000..63b39955281
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/StorefrontPanelHeaderSection.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
+    <section name="StorefrontPanelHeaderSection">
+        <element name="createAnAccountLink" type="select" locator=".panel.header li:nth-child(3)"/>
+    </section>
+</config>
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/composer.json
new file mode 100644
index 00000000000..3a13bf562bb
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/composer.json
@@ -0,0 +1,68 @@
+{
+    "name": "magento/magento2-functional-test-module-customer",
+    "description": "Magento 2 Acceptance Test Module Customer",
+    "repositories": [
+        {
+            "type" : "composer",
+            "url" : "https://repo.magento.com/"
+        }
+    ],
+    "require": {
+        "php": "~7.0",
+        "codeception/codeception": "2.2|2.3",
+        "allure-framework/allure-codeception": "dev-master",
+        "consolidation/robo": "^1.0.0",
+        "henrikbjorn/lurker": "^1.2",
+        "vlucas/phpdotenv": "~2.4",
+        "magento/magento2-functional-testing-framework": "dev-develop"
+    },
+    "suggest": {
+        "magento/magento2-functional-test-module-store": "dev-master",
+        "magento/magento2-functional-test-module-eav": "dev-master",
+        "magento/magento2-functional-test-module-directory": "dev-master",
+        "magento/magento2-functional-test-module-catalog": "dev-master",
+        "magento/magento2-functional-test-module-newsletter": "dev-master",
+        "magento/magento2-functional-test-module-sales": "dev-master",
+        "magento/magento2-functional-test-module-checkout": "dev-master",
+        "magento/magento2-functional-test-module-wishlist": "dev-master",
+        "magento/magento2-functional-test-module-theme": "dev-master",
+        "magento/magento2-functional-test-module-backend": "dev-master",
+        "magento/magento2-functional-test-module-review": "dev-master",
+        "magento/magento2-functional-test-module-tax": "dev-master",
+        "magento/magento2-functional-test-module-authorization": "dev-master",
+        "magento/magento2-functional-test-module-integration": "dev-master",
+        "magento/magento2-functional-test-module-media-storage": "dev-master",
+        "magento/magento2-functional-test-module-ui": "dev-master",
+        "magento/magento2-functional-test-module-config": "dev-master",
+        "magento/magento2-functional-test-module-quote": "dev-master",
+        "magento/magento2-functional-test-module-page-cache": "dev-master"
+    },
+    "type": "magento2-test-module",
+    "version": "dev-master",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
+    "autoload": {
+        "psr-0": {
+            "Yandex": "vendor/allure-framework/allure-codeception/src/"
+        },
+        "psr-4": {
+            "Magento\\FunctionalTestingFramework\\": [
+                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
+            ],
+            "Magento\\FunctionalTest\\": [
+                "tests/functional/Magento/FunctionalTest",
+                "generated/Magento/FunctionalTest"
+            ]
+        }
+    },
+    "extra": {
+        "map": [
+            [
+                "*",
+                "tests/functional/Magento/FunctionalTest/Customer"
+            ]
+        ]
+    }
+}
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CustomerAnalytics/LICENSE.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CustomerAnalytics/LICENSE.txt
new file mode 100644
index 00000000000..49525fd99da
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CustomerAnalytics/LICENSE.txt
@@ -0,0 +1,48 @@
+
+Open Software License ("OSL") v. 3.0
+
+This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Open Software License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Open Software License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly. 
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including 'fair use' or 'fair dealing'). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright (C) 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CustomerAnalytics/LICENSE_AFL.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CustomerAnalytics/LICENSE_AFL.txt
new file mode 100644
index 00000000000..f39d641b18a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CustomerAnalytics/LICENSE_AFL.txt
@@ -0,0 +1,48 @@
+
+Academic Free License ("AFL") v. 3.0
+
+This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Academic Free License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, under any license of your choice that does not contradict the terms and conditions, including Licensor's reserved rights and remedies, in this Academic Free License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly.
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including "fair use" or "fair dealing"). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright © 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Academic Free License" or "AFL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CustomerAnalytics/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CustomerAnalytics/README.md
new file mode 100644
index 00000000000..ad6ab29c570
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CustomerAnalytics/README.md
@@ -0,0 +1,3 @@
+# Magento 2 Acceptance Tests
+
+The Acceptance Tests Module for **Magento_CustomerAnalytics** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CustomerAnalytics/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CustomerAnalytics/composer.json
new file mode 100644
index 00000000000..2f6c9d54e2b
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CustomerAnalytics/composer.json
@@ -0,0 +1,50 @@
+{
+    "name": "magento/magento2-functional-test-module-customer-analytics",
+    "description": "Magento 2 Acceptance Test Module Customer Analytics",
+    "repositories": [
+        {
+            "type" : "composer",
+            "url" : "https://repo.magento.com/"
+        }
+    ],
+    "require": {
+        "php": "~7.0",
+        "codeception/codeception": "2.2|2.3",
+        "allure-framework/allure-codeception": "dev-master",
+        "consolidation/robo": "^1.0.0",
+        "henrikbjorn/lurker": "^1.2",
+        "vlucas/phpdotenv": "~2.4",
+        "magento/magento2-functional-testing-framework": "dev-develop"
+    },
+    "suggest": {
+        "magento/magento2-functional-test-module-customer": "dev-master"
+    },
+    "type": "magento2-test-module",
+    "version": "dev-master",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
+    "autoload": {
+        "psr-0": {
+            "Yandex": "vendor/allure-framework/allure-codeception/src/"
+        },
+        "psr-4": {
+            "Magento\\FunctionalTestingFramework\\": [
+                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
+            ],
+            "Magento\\FunctionalTest\\": [
+                "tests/functional/Magento/FunctionalTest",
+                "generated/Magento/FunctionalTest"
+            ]
+        }
+    },
+    "extra": {
+        "map": [
+            [
+                "*",
+                "tests/functional/Magento/FunctionalTest/CustomerAnalytics"
+            ]
+        ]
+    }
+}
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CustomerImportExport/LICENSE.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CustomerImportExport/LICENSE.txt
new file mode 100644
index 00000000000..49525fd99da
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CustomerImportExport/LICENSE.txt
@@ -0,0 +1,48 @@
+
+Open Software License ("OSL") v. 3.0
+
+This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Open Software License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Open Software License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly. 
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including 'fair use' or 'fair dealing'). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright (C) 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CustomerImportExport/LICENSE_AFL.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CustomerImportExport/LICENSE_AFL.txt
new file mode 100644
index 00000000000..f39d641b18a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CustomerImportExport/LICENSE_AFL.txt
@@ -0,0 +1,48 @@
+
+Academic Free License ("AFL") v. 3.0
+
+This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Academic Free License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, under any license of your choice that does not contradict the terms and conditions, including Licensor's reserved rights and remedies, in this Academic Free License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly.
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including "fair use" or "fair dealing"). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright © 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Academic Free License" or "AFL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CustomerImportExport/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CustomerImportExport/README.md
new file mode 100644
index 00000000000..05e03b11a1b
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CustomerImportExport/README.md
@@ -0,0 +1,3 @@
+# Magento 2 Acceptance Tests
+
+The Acceptance Tests Module for **Magento_CustomerImportExport** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CustomerImportExport/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CustomerImportExport/composer.json
new file mode 100644
index 00000000000..df1b19f9e52
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CustomerImportExport/composer.json
@@ -0,0 +1,55 @@
+{
+    "name": "magento/magento2-functional-test-module-customer-import-export",
+    "description": "Magento 2 Acceptance Test Module Customer Import Export",
+    "repositories": [
+        {
+            "type" : "composer",
+            "url" : "https://repo.magento.com/"
+        }
+    ],
+    "require": {
+        "php": "~7.0",
+        "codeception/codeception": "2.2|2.3",
+        "allure-framework/allure-codeception": "dev-master",
+        "consolidation/robo": "^1.0.0",
+        "henrikbjorn/lurker": "^1.2",
+        "vlucas/phpdotenv": "~2.4",
+        "magento/magento2-functional-testing-framework": "dev-develop"
+    },
+    "suggest": {
+        "magento/magento2-functional-test-module-store": "dev-master",
+        "magento/magento2-functional-test-module-backend": "dev-master",
+        "magento/magento2-functional-test-module-customer": "dev-master",
+        "magento/magento2-functional-test-module-eav": "dev-master",
+        "magento/magento2-functional-test-module-import-export": "dev-master",
+        "magento/magento2-functional-test-module-directory": "dev-master"
+    },
+    "type": "magento2-test-module",
+    "version": "dev-master",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
+    "autoload": {
+        "psr-0": {
+            "Yandex": "vendor/allure-framework/allure-codeception/src/"
+        },
+        "psr-4": {
+            "Magento\\FunctionalTestingFramework\\": [
+                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
+            ],
+            "Magento\\FunctionalTest\\": [
+                "tests/functional/Magento/FunctionalTest",
+                "generated/Magento/FunctionalTest"
+            ]
+        }
+    },
+    "extra": {
+        "map": [
+            [
+                "*",
+                "tests/functional/Magento/FunctionalTest/CustomerImportExport"
+            ]
+        ]
+    }
+}
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Developer/LICENSE.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Developer/LICENSE.txt
new file mode 100644
index 00000000000..49525fd99da
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Developer/LICENSE.txt
@@ -0,0 +1,48 @@
+
+Open Software License ("OSL") v. 3.0
+
+This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Open Software License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Open Software License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly. 
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including 'fair use' or 'fair dealing'). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright (C) 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Developer/LICENSE_AFL.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Developer/LICENSE_AFL.txt
new file mode 100644
index 00000000000..f39d641b18a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Developer/LICENSE_AFL.txt
@@ -0,0 +1,48 @@
+
+Academic Free License ("AFL") v. 3.0
+
+This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Academic Free License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, under any license of your choice that does not contradict the terms and conditions, including Licensor's reserved rights and remedies, in this Academic Free License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly.
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including "fair use" or "fair dealing"). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright © 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Academic Free License" or "AFL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Developer/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Developer/README.md
new file mode 100644
index 00000000000..f22b6ee1bf8
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Developer/README.md
@@ -0,0 +1,3 @@
+# Magento 2 Acceptance Tests
+
+The Acceptance Tests Module for **Magento_Developer** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Developer/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Developer/composer.json
new file mode 100644
index 00000000000..dee920ee031
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Developer/composer.json
@@ -0,0 +1,51 @@
+{
+    "name": "magento/magento2-functional-test-module-developer",
+    "description": "Magento 2 Acceptance Test Module Developer",
+    "repositories": [
+        {
+            "type" : "composer",
+            "url" : "https://repo.magento.com/"
+        }
+    ],
+    "require": {
+        "php": "~7.0",
+        "codeception/codeception": "2.2|2.3",
+        "allure-framework/allure-codeception": "dev-master",
+        "consolidation/robo": "^1.0.0",
+        "henrikbjorn/lurker": "^1.2",
+        "vlucas/phpdotenv": "~2.4",
+        "magento/magento2-functional-testing-framework": "dev-develop"
+    },
+    "suggest": {
+        "magento/magento2-functional-test-module-store": "dev-master",
+        "magento/magento2-functional-test-module-config": "dev-master"
+    },
+    "type": "magento2-test-module",
+    "version": "dev-master",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
+    "autoload": {
+        "psr-0": {
+            "Yandex": "vendor/allure-framework/allure-codeception/src/"
+        },
+        "psr-4": {
+            "Magento\\FunctionalTestingFramework\\": [
+                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
+            ],
+            "Magento\\FunctionalTest\\": [
+                "tests/functional/Magento/FunctionalTest",
+                "generated/Magento/FunctionalTest"
+            ]
+        }
+    },
+    "extra": {
+        "map": [
+            [
+                "*",
+                "tests/functional/Magento/FunctionalTest/Developer"
+            ]
+        ]
+    }
+}
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Dhl/LICENSE.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Dhl/LICENSE.txt
new file mode 100644
index 00000000000..49525fd99da
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Dhl/LICENSE.txt
@@ -0,0 +1,48 @@
+
+Open Software License ("OSL") v. 3.0
+
+This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Open Software License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Open Software License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly. 
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including 'fair use' or 'fair dealing'). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright (C) 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Dhl/LICENSE_AFL.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Dhl/LICENSE_AFL.txt
new file mode 100644
index 00000000000..f39d641b18a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Dhl/LICENSE_AFL.txt
@@ -0,0 +1,48 @@
+
+Academic Free License ("AFL") v. 3.0
+
+This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Academic Free License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, under any license of your choice that does not contradict the terms and conditions, including Licensor's reserved rights and remedies, in this Academic Free License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly.
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including "fair use" or "fair dealing"). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright © 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Academic Free License" or "AFL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Dhl/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Dhl/README.md
new file mode 100644
index 00000000000..aca768d2510
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Dhl/README.md
@@ -0,0 +1,3 @@
+# Magento 2 Acceptance Tests
+
+The Acceptance Tests Module for **Magento_Dhl** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Dhl/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Dhl/composer.json
new file mode 100644
index 00000000000..0a9e884bde6
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Dhl/composer.json
@@ -0,0 +1,58 @@
+{
+    "name": "magento/magento2-functional-test-module-dhl",
+    "description": "Magento 2 Acceptance Test Module Dhl",
+    "repositories": [
+        {
+            "type" : "composer",
+            "url" : "https://repo.magento.com/"
+        }
+    ],
+    "require": {
+        "php": "~7.0",
+        "codeception/codeception": "2.2|2.3",
+        "allure-framework/allure-codeception": "dev-master",
+        "consolidation/robo": "^1.0.0",
+        "henrikbjorn/lurker": "^1.2",
+        "vlucas/phpdotenv": "~2.4",
+        "magento/magento2-functional-testing-framework": "dev-develop"
+    },
+    "suggest": {
+        "magento/magento2-functional-test-module-store": "dev-master",
+        "magento/magento2-functional-test-module-config": "dev-master",
+        "magento/magento2-functional-test-module-shipping": "dev-master",
+        "magento/magento2-functional-test-module-backend": "dev-master",
+        "magento/magento2-functional-test-module-directory": "dev-master",
+        "magento/magento2-functional-test-module-sales": "dev-master",
+        "magento/magento2-functional-test-module-catalog": "dev-master",
+        "magento/magento2-functional-test-module-catalog-inventory": "dev-master",
+        "magento/magento2-functional-test-module-quote": "dev-master"
+    },
+    "type": "magento2-test-module",
+    "version": "dev-master",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
+    "autoload": {
+        "psr-0": {
+            "Yandex": "vendor/allure-framework/allure-codeception/src/"
+        },
+        "psr-4": {
+            "Magento\\FunctionalTestingFramework\\": [
+                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
+            ],
+            "Magento\\FunctionalTest\\": [
+                "tests/functional/Magento/FunctionalTest",
+                "generated/Magento/FunctionalTest"
+            ]
+        }
+    },
+    "extra": {
+        "map": [
+            [
+                "*",
+                "tests/functional/Magento/FunctionalTest/Dhl"
+            ]
+        ]
+    }
+}
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Directory/LICENSE.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Directory/LICENSE.txt
new file mode 100644
index 00000000000..49525fd99da
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Directory/LICENSE.txt
@@ -0,0 +1,48 @@
+
+Open Software License ("OSL") v. 3.0
+
+This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Open Software License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Open Software License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly. 
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including 'fair use' or 'fair dealing'). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright (C) 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Directory/LICENSE_AFL.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Directory/LICENSE_AFL.txt
new file mode 100644
index 00000000000..f39d641b18a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Directory/LICENSE_AFL.txt
@@ -0,0 +1,48 @@
+
+Academic Free License ("AFL") v. 3.0
+
+This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Academic Free License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, under any license of your choice that does not contradict the terms and conditions, including Licensor's reserved rights and remedies, in this Academic Free License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly.
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including "fair use" or "fair dealing"). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright © 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Academic Free License" or "AFL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Directory/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Directory/README.md
new file mode 100644
index 00000000000..450176d5650
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Directory/README.md
@@ -0,0 +1,3 @@
+# Magento 2 Acceptance Tests
+
+The Acceptance Tests Module for **Magento_Directory** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Directory/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Directory/composer.json
new file mode 100644
index 00000000000..32891838350
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Directory/composer.json
@@ -0,0 +1,52 @@
+{
+    "name": "magento/magento2-functional-test-module-directory",
+    "description": "Magento 2 Acceptance Test Module Directory",
+    "repositories": [
+        {
+            "type" : "composer",
+            "url" : "https://repo.magento.com/"
+        }
+    ],
+    "require": {
+        "php": "~7.0",
+        "codeception/codeception": "2.2|2.3",
+        "allure-framework/allure-codeception": "dev-master",
+        "consolidation/robo": "^1.0.0",
+        "henrikbjorn/lurker": "^1.2",
+        "vlucas/phpdotenv": "~2.4",
+        "magento/magento2-functional-testing-framework": "dev-develop"
+    },
+    "suggest": {
+        "magento/magento2-functional-test-module-store": "dev-master",
+        "magento/magento2-functional-test-module-config": "dev-master",
+        "magento/magento2-functional-test-module-backend": "dev-master"
+    },
+    "type": "magento2-test-module",
+    "version": "dev-master",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
+    "autoload": {
+        "psr-0": {
+            "Yandex": "vendor/allure-framework/allure-codeception/src/"
+        },
+        "psr-4": {
+            "Magento\\FunctionalTestingFramework\\": [
+                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
+            ],
+            "Magento\\FunctionalTest\\": [
+                "tests/functional/Magento/FunctionalTest",
+                "generated/Magento/FunctionalTest"
+            ]
+        }
+    },
+    "extra": {
+        "map": [
+            [
+                "*",
+                "tests/functional/Magento/FunctionalTest/Directory"
+            ]
+        ]
+    }
+}
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Downloadable/LICENSE.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Downloadable/LICENSE.txt
new file mode 100644
index 00000000000..49525fd99da
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Downloadable/LICENSE.txt
@@ -0,0 +1,48 @@
+
+Open Software License ("OSL") v. 3.0
+
+This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Open Software License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Open Software License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly. 
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including 'fair use' or 'fair dealing'). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright (C) 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Downloadable/LICENSE_AFL.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Downloadable/LICENSE_AFL.txt
new file mode 100644
index 00000000000..f39d641b18a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Downloadable/LICENSE_AFL.txt
@@ -0,0 +1,48 @@
+
+Academic Free License ("AFL") v. 3.0
+
+This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Academic Free License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, under any license of your choice that does not contradict the terms and conditions, including Licensor's reserved rights and remedies, in this Academic Free License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly.
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including "fair use" or "fair dealing"). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright © 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Academic Free License" or "AFL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Downloadable/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Downloadable/README.md
new file mode 100644
index 00000000000..b32c7fd5a8d
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Downloadable/README.md
@@ -0,0 +1,3 @@
+# Magento 2 Acceptance Tests
+
+The Acceptance Tests Module for **Magento_Downloadable** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Downloadable/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Downloadable/composer.json
new file mode 100644
index 00000000000..7f3a10bdbca
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Downloadable/composer.json
@@ -0,0 +1,65 @@
+{
+    "name": "magento/magento2-functional-test-module-downloadable",
+    "description": "Magento 2 Acceptance Test Module Downloadable",
+    "repositories": [
+        {
+            "type" : "composer",
+            "url" : "https://repo.magento.com/"
+        }
+    ],
+    "require": {
+        "php": "~7.0",
+        "codeception/codeception": "2.2|2.3",
+        "allure-framework/allure-codeception": "dev-master",
+        "consolidation/robo": "^1.0.0",
+        "henrikbjorn/lurker": "^1.2",
+        "vlucas/phpdotenv": "~2.4",
+        "magento/magento2-functional-testing-framework": "dev-develop"
+    },
+    "suggest": {
+        "magento/magento2-functional-test-module-store": "dev-master",
+        "magento/magento2-functional-test-module-catalog": "dev-master",
+        "magento/magento2-functional-test-module-customer": "dev-master",
+        "magento/magento2-functional-test-module-tax": "dev-master",
+        "magento/magento2-functional-test-module-theme": "dev-master",
+        "magento/magento2-functional-test-module-eav": "dev-master",
+        "magento/magento2-functional-test-module-backend": "dev-master",
+        "magento/magento2-functional-test-module-sales": "dev-master",
+        "magento/magento2-functional-test-module-checkout": "dev-master",
+        "magento/magento2-functional-test-module-directory": "dev-master",
+        "magento/magento2-functional-test-module-gift-message": "dev-master",
+        "magento/magento2-functional-test-module-catalog-inventory": "dev-master",
+        "magento/magento2-functional-test-module-config": "dev-master",
+        "magento/magento2-functional-test-module-media-storage": "dev-master",
+        "magento/magento2-functional-test-module-quote": "dev-master",
+        "magento/magento2-functional-test-module-ui": "dev-master"
+    },
+    "type": "magento2-test-module",
+    "version": "dev-master",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
+    "autoload": {
+        "psr-0": {
+            "Yandex": "vendor/allure-framework/allure-codeception/src/"
+        },
+        "psr-4": {
+            "Magento\\FunctionalTestingFramework\\": [
+                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
+            ],
+            "Magento\\FunctionalTest\\": [
+                "tests/functional/Magento/FunctionalTest",
+                "generated/Magento/FunctionalTest"
+            ]
+        }
+    },
+    "extra": {
+        "map": [
+            [
+                "*",
+                "tests/functional/Magento/FunctionalTest/Downloadable"
+            ]
+        ]
+    }
+}
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/DownloadableImportExport/LICENSE.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/DownloadableImportExport/LICENSE.txt
new file mode 100644
index 00000000000..49525fd99da
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/DownloadableImportExport/LICENSE.txt
@@ -0,0 +1,48 @@
+
+Open Software License ("OSL") v. 3.0
+
+This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Open Software License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Open Software License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly. 
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including 'fair use' or 'fair dealing'). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright (C) 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/DownloadableImportExport/LICENSE_AFL.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/DownloadableImportExport/LICENSE_AFL.txt
new file mode 100644
index 00000000000..f39d641b18a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/DownloadableImportExport/LICENSE_AFL.txt
@@ -0,0 +1,48 @@
+
+Academic Free License ("AFL") v. 3.0
+
+This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Academic Free License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, under any license of your choice that does not contradict the terms and conditions, including Licensor's reserved rights and remedies, in this Academic Free License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly.
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including "fair use" or "fair dealing"). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright © 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Academic Free License" or "AFL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/DownloadableImportExport/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/DownloadableImportExport/README.md
new file mode 100644
index 00000000000..7d1d4ce5938
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/DownloadableImportExport/README.md
@@ -0,0 +1,3 @@
+# Magento 2 Acceptance Tests
+
+The Acceptance Tests Module for **Magento_DownloadableImportExport** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/DownloadableImportExport/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/DownloadableImportExport/composer.json
new file mode 100644
index 00000000000..a6290026e9c
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/DownloadableImportExport/composer.json
@@ -0,0 +1,55 @@
+{
+    "name": "magento/magento2-functional-test-module-downloadable-import-export",
+    "description": "Magento 2 Acceptance Test Module Downloadable Import Export",
+    "repositories": [
+        {
+            "type" : "composer",
+            "url" : "https://repo.magento.com/"
+        }
+    ],
+    "require": {
+        "php": "~7.0",
+        "codeception/codeception": "2.2|2.3",
+        "allure-framework/allure-codeception": "dev-master",
+        "consolidation/robo": "^1.0.0",
+        "henrikbjorn/lurker": "^1.2",
+        "vlucas/phpdotenv": "~2.4",
+        "magento/magento2-functional-testing-framework": "dev-develop"
+    },
+    "suggest": {
+        "magento/magento2-functional-test-module-catalog": "dev-master",
+        "magento/magento2-functional-test-module-import-export": "dev-master",
+        "magento/magento2-functional-test-module-catalog-import-export": "dev-master",
+        "magento/magento2-functional-test-module-downloadable": "dev-master",
+        "magento/magento2-functional-test-module-store": "dev-master",
+        "magento/magento2-functional-test-module-eav": "dev-master"
+    },
+    "type": "magento2-test-module",
+    "version": "dev-master",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
+    "autoload": {
+        "psr-0": {
+            "Yandex": "vendor/allure-framework/allure-codeception/src/"
+        },
+        "psr-4": {
+            "Magento\\FunctionalTestingFramework\\": [
+                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
+            ],
+            "Magento\\FunctionalTest\\": [
+                "tests/functional/Magento/FunctionalTest",
+                "generated/Magento/FunctionalTest"
+            ]
+        }
+    },
+    "extra": {
+        "map": [
+            [
+                "*",
+                "tests/functional/Magento/FunctionalTest/DownloadableImportExport"
+            ]
+        ]
+    }
+}
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Eav/LICENSE.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Eav/LICENSE.txt
new file mode 100644
index 00000000000..49525fd99da
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Eav/LICENSE.txt
@@ -0,0 +1,48 @@
+
+Open Software License ("OSL") v. 3.0
+
+This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Open Software License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Open Software License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly. 
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including 'fair use' or 'fair dealing'). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright (C) 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Eav/LICENSE_AFL.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Eav/LICENSE_AFL.txt
new file mode 100644
index 00000000000..f39d641b18a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Eav/LICENSE_AFL.txt
@@ -0,0 +1,48 @@
+
+Academic Free License ("AFL") v. 3.0
+
+This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Academic Free License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, under any license of your choice that does not contradict the terms and conditions, including Licensor's reserved rights and remedies, in this Academic Free License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly.
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including "fair use" or "fair dealing"). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright © 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Academic Free License" or "AFL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Eav/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Eav/README.md
new file mode 100644
index 00000000000..3ab73a4d5c7
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Eav/README.md
@@ -0,0 +1,3 @@
+# Magento 2 Acceptance Tests
+
+The Acceptance Tests Module for **Magento_EAV** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Eav/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Eav/composer.json
new file mode 100644
index 00000000000..8052d51dfb3
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Eav/composer.json
@@ -0,0 +1,54 @@
+{
+    "name": "magento/magento2-functional-test-module-eav",
+    "description": "Magento 2 Acceptance Test Module Eav",
+    "repositories": [
+        {
+            "type" : "composer",
+            "url" : "https://repo.magento.com/"
+        }
+    ],
+    "require": {
+        "php": "~7.0",
+        "codeception/codeception": "2.2|2.3",
+        "allure-framework/allure-codeception": "dev-master",
+        "consolidation/robo": "^1.0.0",
+        "henrikbjorn/lurker": "^1.2",
+        "vlucas/phpdotenv": "~2.4",
+        "magento/magento2-functional-testing-framework": "dev-develop"
+    },
+    "suggest": {
+        "magento/magento2-functional-test-module-store": "dev-master",
+        "magento/magento2-functional-test-module-backend": "dev-master",
+        "magento/magento2-functional-test-module-catalog": "dev-master",
+        "magento/magento2-functional-test-module-config": "dev-master",
+        "magento/magento2-functional-test-module-media-storage": "dev-master"
+    },
+    "type": "magento2-test-module",
+    "version": "dev-master",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
+    "autoload": {
+        "psr-0": {
+            "Yandex": "vendor/allure-framework/allure-codeception/src/"
+        },
+        "psr-4": {
+            "Magento\\FunctionalTestingFramework\\": [
+                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
+            ],
+            "Magento\\FunctionalTest\\": [
+                "tests/functional/Magento/FunctionalTest",
+                "generated/Magento/FunctionalTest"
+            ]
+        }
+    },
+    "extra": {
+        "map": [
+            [
+                "*",
+                "tests/functional/Magento/FunctionalTest/Eav"
+            ]
+        ]
+    }
+}
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Email/LICENSE.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Email/LICENSE.txt
new file mode 100644
index 00000000000..49525fd99da
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Email/LICENSE.txt
@@ -0,0 +1,48 @@
+
+Open Software License ("OSL") v. 3.0
+
+This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Open Software License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Open Software License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly. 
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including 'fair use' or 'fair dealing'). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright (C) 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Email/LICENSE_AFL.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Email/LICENSE_AFL.txt
new file mode 100644
index 00000000000..f39d641b18a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Email/LICENSE_AFL.txt
@@ -0,0 +1,48 @@
+
+Academic Free License ("AFL") v. 3.0
+
+This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Academic Free License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, under any license of your choice that does not contradict the terms and conditions, including Licensor's reserved rights and remedies, in this Academic Free License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly.
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including "fair use" or "fair dealing"). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright © 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Academic Free License" or "AFL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Email/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Email/README.md
new file mode 100644
index 00000000000..af55ead5c20
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Email/README.md
@@ -0,0 +1,3 @@
+# Magento 2 Acceptance Tests
+
+The Acceptance Tests Module for **Magento_Email** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Email/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Email/composer.json
new file mode 100644
index 00000000000..98f01cf7ec5
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Email/composer.json
@@ -0,0 +1,55 @@
+{
+    "name": "magento/magento2-functional-test-module-email",
+    "description": "Magento 2 Acceptance Test Module Email",
+    "repositories": [
+        {
+            "type" : "composer",
+            "url" : "https://repo.magento.com/"
+        }
+    ],
+    "require": {
+        "php": "~7.0",
+        "codeception/codeception": "2.2|2.3",
+        "allure-framework/allure-codeception": "dev-master",
+        "consolidation/robo": "^1.0.0",
+        "henrikbjorn/lurker": "^1.2",
+        "vlucas/phpdotenv": "~2.4",
+        "magento/magento2-functional-testing-framework": "dev-develop"
+    },
+    "suggest": {
+        "magento/magento2-functional-test-module-theme": "dev-master",
+        "magento/magento2-functional-test-module-config": "dev-master",
+        "magento/magento2-functional-test-module-store": "dev-master",
+        "magento/magento2-functional-test-module-cms": "dev-master",
+        "magento/magento2-functional-test-module-backend": "dev-master",
+        "magento/magento2-functional-test-module-variable": "dev-master"
+    },
+    "type": "magento2-test-module",
+    "version": "dev-master",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
+    "autoload": {
+        "psr-0": {
+            "Yandex": "vendor/allure-framework/allure-codeception/src/"
+        },
+        "psr-4": {
+            "Magento\\FunctionalTestingFramework\\": [
+                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
+            ],
+            "Magento\\FunctionalTest\\": [
+                "tests/functional/Magento/FunctionalTest",
+                "generated/Magento/FunctionalTest"
+            ]
+        }
+    },
+    "extra": {
+        "map": [
+            [
+                "*",
+                "tests/functional/Magento/FunctionalTest/Email"
+            ]
+        ]
+    }
+}
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/EncryptionKey/LICENSE.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/EncryptionKey/LICENSE.txt
new file mode 100644
index 00000000000..49525fd99da
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/EncryptionKey/LICENSE.txt
@@ -0,0 +1,48 @@
+
+Open Software License ("OSL") v. 3.0
+
+This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Open Software License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Open Software License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly. 
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including 'fair use' or 'fair dealing'). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright (C) 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/EncryptionKey/LICENSE_AFL.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/EncryptionKey/LICENSE_AFL.txt
new file mode 100644
index 00000000000..f39d641b18a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/EncryptionKey/LICENSE_AFL.txt
@@ -0,0 +1,48 @@
+
+Academic Free License ("AFL") v. 3.0
+
+This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Academic Free License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, under any license of your choice that does not contradict the terms and conditions, including Licensor's reserved rights and remedies, in this Academic Free License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly.
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including "fair use" or "fair dealing"). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright © 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Academic Free License" or "AFL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/EncryptionKey/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/EncryptionKey/README.md
new file mode 100644
index 00000000000..c37fc732b0b
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/EncryptionKey/README.md
@@ -0,0 +1,3 @@
+# Magento 2 Acceptance Tests
+
+The Acceptance Tests Module for **Magento_EncryptionKey** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/EncryptionKey/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/EncryptionKey/composer.json
new file mode 100644
index 00000000000..933fe884401
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/EncryptionKey/composer.json
@@ -0,0 +1,51 @@
+{
+    "name": "magento/magento2-functional-test-module-encryption-key",
+    "description": "Magento 2 Acceptance Test Module Encryption Key",
+    "repositories": [
+        {
+            "type" : "composer",
+            "url" : "https://repo.magento.com/"
+        }
+    ],
+    "require": {
+        "php": "~7.0",
+        "codeception/codeception": "2.2|2.3",
+        "allure-framework/allure-codeception": "dev-master",
+        "consolidation/robo": "^1.0.0",
+        "henrikbjorn/lurker": "^1.2",
+        "vlucas/phpdotenv": "~2.4",
+        "magento/magento2-functional-testing-framework": "dev-develop"
+    },
+    "suggest": {
+        "magento/magento2-functional-test-module-backend": "dev-master",
+        "magento/magento2-functional-test-module-config": "dev-master"
+    },
+    "type": "magento2-test-module",
+    "version": "dev-master",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
+    "autoload": {
+        "psr-0": {
+            "Yandex": "vendor/allure-framework/allure-codeception/src/"
+        },
+        "psr-4": {
+            "Magento\\FunctionalTestingFramework\\": [
+                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
+            ],
+            "Magento\\FunctionalTest\\": [
+                "tests/functional/Magento/FunctionalTest",
+                "generated/Magento/FunctionalTest"
+            ]
+        }
+    },
+    "extra": {
+        "map": [
+            [
+                "*",
+                "tests/functional/Magento/FunctionalTest/EncryptionKey"
+            ]
+        ]
+    }
+}
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Fedex/LICENSE.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Fedex/LICENSE.txt
new file mode 100644
index 00000000000..49525fd99da
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Fedex/LICENSE.txt
@@ -0,0 +1,48 @@
+
+Open Software License ("OSL") v. 3.0
+
+This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Open Software License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Open Software License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly. 
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including 'fair use' or 'fair dealing'). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright (C) 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Fedex/LICENSE_AFL.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Fedex/LICENSE_AFL.txt
new file mode 100644
index 00000000000..f39d641b18a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Fedex/LICENSE_AFL.txt
@@ -0,0 +1,48 @@
+
+Academic Free License ("AFL") v. 3.0
+
+This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Academic Free License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, under any license of your choice that does not contradict the terms and conditions, including Licensor's reserved rights and remedies, in this Academic Free License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly.
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including "fair use" or "fair dealing"). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright © 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Academic Free License" or "AFL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Fedex/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Fedex/README.md
new file mode 100644
index 00000000000..cd33bda917f
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Fedex/README.md
@@ -0,0 +1,3 @@
+# Magento 2 Acceptance Tests
+
+The Acceptance Tests Module for **Magento_Fedex** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Fedex/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Fedex/composer.json
new file mode 100644
index 00000000000..f5102092a43
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Fedex/composer.json
@@ -0,0 +1,57 @@
+{
+    "name": "magento/magento2-functional-test-module-fedex",
+    "description": "Magento 2 Acceptance Test Module Fedex",
+    "repositories": [
+        {
+            "type" : "composer",
+            "url" : "https://repo.magento.com/"
+        }
+    ],
+    "require": {
+        "php": "~7.0",
+        "codeception/codeception": "2.2|2.3",
+        "allure-framework/allure-codeception": "dev-master",
+        "consolidation/robo": "^1.0.0",
+        "henrikbjorn/lurker": "^1.2",
+        "vlucas/phpdotenv": "~2.4",
+        "magento/magento2-functional-testing-framework": "dev-develop"
+    },
+    "suggest": {
+        "magento/magento2-functional-test-module-store": "dev-master",
+        "magento/magento2-functional-test-module-shipping": "dev-master",
+        "magento/magento2-functional-test-module-directory": "dev-master",
+        "magento/magento2-functional-test-module-catalog": "dev-master",
+        "magento/magento2-functional-test-module-sales": "dev-master",
+        "magento/magento2-functional-test-module-catalog-inventory": "dev-master",
+        "magento/magento2-functional-test-module-quote": "dev-master",
+        "magento/magento2-functional-test-module-config": "dev-master"
+    },
+    "type": "magento2-test-module",
+    "version": "dev-master",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
+    "autoload": {
+        "psr-0": {
+            "Yandex": "vendor/allure-framework/allure-codeception/src/"
+        },
+        "psr-4": {
+            "Magento\\FunctionalTestingFramework\\": [
+                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
+            ],
+            "Magento\\FunctionalTest\\": [
+                "tests/functional/Magento/FunctionalTest",
+                "generated/Magento/FunctionalTest"
+            ]
+        }
+    },
+    "extra": {
+        "map": [
+            [
+                "*",
+                "tests/functional/Magento/FunctionalTest/Fedex"
+            ]
+        ]
+    }
+}
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GiftMessage/LICENSE.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GiftMessage/LICENSE.txt
new file mode 100644
index 00000000000..49525fd99da
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GiftMessage/LICENSE.txt
@@ -0,0 +1,48 @@
+
+Open Software License ("OSL") v. 3.0
+
+This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Open Software License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Open Software License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly. 
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including 'fair use' or 'fair dealing'). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright (C) 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GiftMessage/LICENSE_AFL.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GiftMessage/LICENSE_AFL.txt
new file mode 100644
index 00000000000..f39d641b18a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GiftMessage/LICENSE_AFL.txt
@@ -0,0 +1,48 @@
+
+Academic Free License ("AFL") v. 3.0
+
+This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Academic Free License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, under any license of your choice that does not contradict the terms and conditions, including Licensor's reserved rights and remedies, in this Academic Free License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly.
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including "fair use" or "fair dealing"). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright © 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Academic Free License" or "AFL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GiftMessage/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GiftMessage/README.md
new file mode 100644
index 00000000000..bc57464b7ed
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GiftMessage/README.md
@@ -0,0 +1,3 @@
+# Magento 2 Acceptance Tests
+
+The Acceptance Tests Module for **Magento_GiftMessage** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GiftMessage/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GiftMessage/composer.json
new file mode 100644
index 00000000000..cf76a42eddc
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GiftMessage/composer.json
@@ -0,0 +1,57 @@
+{
+    "name": "magento/magento2-functional-test-module-gift-message",
+    "description": "Magento 2 Acceptance Test Module Gift Message",
+    "repositories": [
+        {
+            "type" : "composer",
+            "url" : "https://repo.magento.com/"
+        }
+    ],
+    "require": {
+        "php": "~7.0",
+        "codeception/codeception": "2.2|2.3",
+        "allure-framework/allure-codeception": "dev-master",
+        "consolidation/robo": "^1.0.0",
+        "henrikbjorn/lurker": "^1.2",
+        "vlucas/phpdotenv": "~2.4",
+        "magento/magento2-functional-testing-framework": "dev-develop"
+    },
+    "suggest": {
+        "magento/magento2-functional-test-module-store": "dev-master",
+        "magento/magento2-functional-test-module-catalog": "dev-master",
+        "magento/magento2-functional-test-module-checkout": "dev-master",
+        "magento/magento2-functional-test-module-sales": "dev-master",
+        "magento/magento2-functional-test-module-backend": "dev-master",
+        "magento/magento2-functional-test-module-customer": "dev-master",
+        "magento/magento2-functional-test-module-quote": "dev-master",
+        "magento/magento2-functional-test-module-ui": "dev-master"
+    },
+    "type": "magento2-test-module",
+    "version": "dev-master",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
+    "autoload": {
+        "psr-0": {
+            "Yandex": "vendor/allure-framework/allure-codeception/src/"
+        },
+        "psr-4": {
+            "Magento\\FunctionalTestingFramework\\": [
+                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
+            ],
+            "Magento\\FunctionalTest\\": [
+                "tests/functional/Magento/FunctionalTest",
+                "generated/Magento/FunctionalTest"
+            ]
+        }
+    },
+    "extra": {
+        "map": [
+            [
+                "*",
+                "tests/functional/Magento/FunctionalTest/GiftMessage"
+            ]
+        ]
+    }
+}
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GoogleAdwords/LICENSE.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GoogleAdwords/LICENSE.txt
new file mode 100644
index 00000000000..49525fd99da
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GoogleAdwords/LICENSE.txt
@@ -0,0 +1,48 @@
+
+Open Software License ("OSL") v. 3.0
+
+This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Open Software License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Open Software License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly. 
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including 'fair use' or 'fair dealing'). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright (C) 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GoogleAdwords/LICENSE_AFL.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GoogleAdwords/LICENSE_AFL.txt
new file mode 100644
index 00000000000..f39d641b18a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GoogleAdwords/LICENSE_AFL.txt
@@ -0,0 +1,48 @@
+
+Academic Free License ("AFL") v. 3.0
+
+This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Academic Free License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, under any license of your choice that does not contradict the terms and conditions, including Licensor's reserved rights and remedies, in this Academic Free License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly.
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including "fair use" or "fair dealing"). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright © 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Academic Free License" or "AFL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GoogleAdwords/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GoogleAdwords/README.md
new file mode 100644
index 00000000000..14b40663eff
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GoogleAdwords/README.md
@@ -0,0 +1,3 @@
+# Magento 2 Acceptance Tests
+
+The Acceptance Tests Module for **Magento_GoogleAdwords** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GoogleAdwords/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GoogleAdwords/composer.json
new file mode 100644
index 00000000000..ca0a31fa031
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GoogleAdwords/composer.json
@@ -0,0 +1,51 @@
+{
+    "name": "magento/magento2-functional-test-module-google-adwords",
+    "description": "Magento 2 Acceptance Test Module Google Adwords",
+    "repositories": [
+        {
+            "type" : "composer",
+            "url" : "https://repo.magento.com/"
+        }
+    ],
+    "require": {
+        "php": "~7.0",
+        "codeception/codeception": "2.2|2.3",
+        "allure-framework/allure-codeception": "dev-master",
+        "consolidation/robo": "^1.0.0",
+        "henrikbjorn/lurker": "^1.2",
+        "vlucas/phpdotenv": "~2.4",
+        "magento/magento2-functional-testing-framework": "dev-develop"
+    },
+    "suggest": {
+        "magento/magento2-functional-test-module-store": "dev-master",
+        "magento/magento2-functional-test-module-sales": "dev-master"
+    },
+    "type": "magento2-test-module",
+    "version": "dev-master",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
+    "autoload": {
+        "psr-0": {
+            "Yandex": "vendor/allure-framework/allure-codeception/src/"
+        },
+        "psr-4": {
+            "Magento\\FunctionalTestingFramework\\": [
+                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
+            ],
+            "Magento\\FunctionalTest\\": [
+                "tests/functional/Magento/FunctionalTest",
+                "generated/Magento/FunctionalTest"
+            ]
+        }
+    },
+    "extra": {
+        "map": [
+            [
+                "*",
+                "tests/functional/Magento/FunctionalTest/GoogleAdwords"
+            ]
+        ]
+    }
+}
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GoogleAnalytics/LICENSE.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GoogleAnalytics/LICENSE.txt
new file mode 100644
index 00000000000..49525fd99da
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GoogleAnalytics/LICENSE.txt
@@ -0,0 +1,48 @@
+
+Open Software License ("OSL") v. 3.0
+
+This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Open Software License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Open Software License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly. 
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including 'fair use' or 'fair dealing'). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright (C) 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GoogleAnalytics/LICENSE_AFL.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GoogleAnalytics/LICENSE_AFL.txt
new file mode 100644
index 00000000000..f39d641b18a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GoogleAnalytics/LICENSE_AFL.txt
@@ -0,0 +1,48 @@
+
+Academic Free License ("AFL") v. 3.0
+
+This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Academic Free License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, under any license of your choice that does not contradict the terms and conditions, including Licensor's reserved rights and remedies, in this Academic Free License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly.
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including "fair use" or "fair dealing"). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright © 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Academic Free License" or "AFL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GoogleAnalytics/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GoogleAnalytics/README.md
new file mode 100644
index 00000000000..28c1ed435ea
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GoogleAnalytics/README.md
@@ -0,0 +1,3 @@
+# Magento 2 Acceptance Tests
+
+The Acceptance Tests Module for **Magento_GoogleAnalytics** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GoogleAnalytics/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GoogleAnalytics/composer.json
new file mode 100644
index 00000000000..5bbef3c149b
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GoogleAnalytics/composer.json
@@ -0,0 +1,52 @@
+{
+    "name": "magento/magento2-functional-test-module-google-analytics",
+    "description": "Magento 2 Acceptance Test Module Google Analytics",
+    "repositories": [
+        {
+            "type" : "composer",
+            "url" : "https://repo.magento.com/"
+        }
+    ],
+    "require": {
+        "php": "~7.0",
+        "codeception/codeception": "2.2|2.3",
+        "allure-framework/allure-codeception": "dev-master",
+        "consolidation/robo": "^1.0.0",
+        "henrikbjorn/lurker": "^1.2",
+        "vlucas/phpdotenv": "~2.4",
+        "magento/magento2-functional-testing-framework": "dev-develop"
+    },
+    "suggest": {
+        "magento/magento2-functional-test-module-store": "dev-master",
+        "magento/magento2-functional-test-module-sales": "dev-master",
+        "magento/magento2-functional-test-module-cookie": "dev-master"
+    },
+    "type": "magento2-test-module",
+    "version": "dev-master",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
+    "autoload": {
+        "psr-0": {
+            "Yandex": "vendor/allure-framework/allure-codeception/src/"
+        },
+        "psr-4": {
+            "Magento\\FunctionalTestingFramework\\": [
+                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
+            ],
+            "Magento\\FunctionalTest\\": [
+                "tests/functional/Magento/FunctionalTest",
+                "generated/Magento/FunctionalTest"
+            ]
+        }
+    },
+    "extra": {
+        "map": [
+            [
+                "*",
+                "tests/functional/Magento/FunctionalTest/GoogleAnalytics"
+            ]
+        ]
+    }
+}
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GoogleOptimizer/LICENSE.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GoogleOptimizer/LICENSE.txt
new file mode 100644
index 00000000000..49525fd99da
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GoogleOptimizer/LICENSE.txt
@@ -0,0 +1,48 @@
+
+Open Software License ("OSL") v. 3.0
+
+This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Open Software License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Open Software License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly. 
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including 'fair use' or 'fair dealing'). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright (C) 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GoogleOptimizer/LICENSE_AFL.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GoogleOptimizer/LICENSE_AFL.txt
new file mode 100644
index 00000000000..f39d641b18a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GoogleOptimizer/LICENSE_AFL.txt
@@ -0,0 +1,48 @@
+
+Academic Free License ("AFL") v. 3.0
+
+This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Academic Free License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, under any license of your choice that does not contradict the terms and conditions, including Licensor's reserved rights and remedies, in this Academic Free License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly.
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including "fair use" or "fair dealing"). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright © 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Academic Free License" or "AFL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GoogleOptimizer/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GoogleOptimizer/README.md
new file mode 100644
index 00000000000..cf934ee7882
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GoogleOptimizer/README.md
@@ -0,0 +1,3 @@
+# Magento 2 Acceptance Tests
+
+The Acceptance Tests Module for **Magento_GoogleOptimizer** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GoogleOptimizer/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GoogleOptimizer/composer.json
new file mode 100644
index 00000000000..1454630bd0a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GoogleOptimizer/composer.json
@@ -0,0 +1,55 @@
+{
+    "name": "magento/magento2-functional-test-module-google-optimizer",
+    "description": "Magento 2 Acceptance Test Module Google Optimizer",
+    "repositories": [
+        {
+            "type" : "composer",
+            "url" : "https://repo.magento.com/"
+        }
+    ],
+    "require": {
+        "php": "~7.0",
+        "codeception/codeception": "2.2|2.3",
+        "allure-framework/allure-codeception": "dev-master",
+        "consolidation/robo": "^1.0.0",
+        "henrikbjorn/lurker": "^1.2",
+        "vlucas/phpdotenv": "~2.4",
+        "magento/magento2-functional-testing-framework": "dev-develop"
+    },
+    "suggest": {
+        "magento/magento2-functional-test-module-store": "dev-master",
+        "magento/magento2-functional-test-module-google-analytics": "dev-master",
+        "magento/magento2-functional-test-module-catalog": "dev-master",
+        "magento/magento2-functional-test-module-cms": "dev-master",
+        "magento/magento2-functional-test-module-backend": "dev-master",
+        "magento/magento2-functional-test-module-ui": "dev-master"
+    },
+    "type": "magento2-test-module",
+    "version": "dev-master",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
+    "autoload": {
+        "psr-0": {
+            "Yandex": "vendor/allure-framework/allure-codeception/src/"
+        },
+        "psr-4": {
+            "Magento\\FunctionalTestingFramework\\": [
+                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
+            ],
+            "Magento\\FunctionalTest\\": [
+                "tests/functional/Magento/FunctionalTest",
+                "generated/Magento/FunctionalTest"
+            ]
+        }
+    },
+    "extra": {
+        "map": [
+            [
+                "*",
+                "tests/functional/Magento/FunctionalTest/GoogleOptimizer"
+            ]
+        ]
+    }
+}
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GroupedImportExport/LICENSE.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GroupedImportExport/LICENSE.txt
new file mode 100644
index 00000000000..49525fd99da
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GroupedImportExport/LICENSE.txt
@@ -0,0 +1,48 @@
+
+Open Software License ("OSL") v. 3.0
+
+This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Open Software License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Open Software License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly. 
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including 'fair use' or 'fair dealing'). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright (C) 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GroupedImportExport/LICENSE_AFL.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GroupedImportExport/LICENSE_AFL.txt
new file mode 100644
index 00000000000..f39d641b18a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GroupedImportExport/LICENSE_AFL.txt
@@ -0,0 +1,48 @@
+
+Academic Free License ("AFL") v. 3.0
+
+This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Academic Free License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, under any license of your choice that does not contradict the terms and conditions, including Licensor's reserved rights and remedies, in this Academic Free License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly.
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including "fair use" or "fair dealing"). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright © 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Academic Free License" or "AFL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GroupedImportExport/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GroupedImportExport/README.md
new file mode 100644
index 00000000000..36fb828bbdf
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GroupedImportExport/README.md
@@ -0,0 +1,3 @@
+# Magento 2 Acceptance Tests
+
+The Acceptance Tests Module for **Magento_GroupedImportExport** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GroupedImportExport/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GroupedImportExport/composer.json
new file mode 100644
index 00000000000..faafa32659f
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GroupedImportExport/composer.json
@@ -0,0 +1,54 @@
+{
+    "name": "magento/magento2-functional-test-module-grouped-import-export",
+    "description": "Magento 2 Acceptance Test Module Grouped Import Export",
+    "repositories": [
+        {
+            "type" : "composer",
+            "url" : "https://repo.magento.com/"
+        }
+    ],
+    "require": {
+        "php": "~7.0",
+        "codeception/codeception": "2.2|2.3",
+        "allure-framework/allure-codeception": "dev-master",
+        "consolidation/robo": "^1.0.0",
+        "henrikbjorn/lurker": "^1.2",
+        "vlucas/phpdotenv": "~2.4",
+        "magento/magento2-functional-testing-framework": "dev-develop"
+    },
+    "suggest": {
+        "magento/magento2-functional-test-module-catalog": "dev-master",
+        "magento/magento2-functional-test-module-import-export": "dev-master",
+        "magento/magento2-functional-test-module-catalog-import-export": "dev-master",
+        "magento/magento2-functional-test-module-grouped-product": "dev-master",
+        "magento/magento2-functional-test-module-eav": "dev-master"
+    },
+    "type": "magento2-test-module",
+    "version": "dev-master",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
+    "autoload": {
+        "psr-0": {
+            "Yandex": "vendor/allure-framework/allure-codeception/src/"
+        },
+        "psr-4": {
+            "Magento\\FunctionalTestingFramework\\": [
+                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
+            ],
+            "Magento\\FunctionalTest\\": [
+                "tests/functional/Magento/FunctionalTest",
+                "generated/Magento/FunctionalTest"
+            ]
+        }
+    },
+    "extra": {
+        "map": [
+            [
+                "*",
+                "tests/functional/Magento/FunctionalTest/GroupedImportExport"
+            ]
+        ]
+    }
+}
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GroupedProduct/LICENSE.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GroupedProduct/LICENSE.txt
new file mode 100644
index 00000000000..49525fd99da
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GroupedProduct/LICENSE.txt
@@ -0,0 +1,48 @@
+
+Open Software License ("OSL") v. 3.0
+
+This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Open Software License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Open Software License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly. 
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including 'fair use' or 'fair dealing'). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright (C) 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GroupedProduct/LICENSE_AFL.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GroupedProduct/LICENSE_AFL.txt
new file mode 100644
index 00000000000..f39d641b18a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GroupedProduct/LICENSE_AFL.txt
@@ -0,0 +1,48 @@
+
+Academic Free License ("AFL") v. 3.0
+
+This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Academic Free License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, under any license of your choice that does not contradict the terms and conditions, including Licensor's reserved rights and remedies, in this Academic Free License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly.
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including "fair use" or "fair dealing"). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright © 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Academic Free License" or "AFL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GroupedProduct/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GroupedProduct/README.md
new file mode 100644
index 00000000000..ed07eaabba7
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GroupedProduct/README.md
@@ -0,0 +1,3 @@
+# Magento 2 Acceptance Tests
+
+The Acceptance Tests Module for **Magento_GroupedProduct** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GroupedProduct/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GroupedProduct/composer.json
new file mode 100644
index 00000000000..7b76ef1ad97
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GroupedProduct/composer.json
@@ -0,0 +1,61 @@
+{
+    "name": "magento/magento2-functional-test-module-grouped-product",
+    "description": "Magento 2 Acceptance Test Module Grouped Product",
+    "repositories": [
+        {
+            "type" : "composer",
+            "url" : "https://repo.magento.com/"
+        }
+    ],
+    "require": {
+        "php": "~7.0",
+        "codeception/codeception": "2.2|2.3",
+        "allure-framework/allure-codeception": "dev-master",
+        "consolidation/robo": "^1.0.0",
+        "henrikbjorn/lurker": "^1.2",
+        "vlucas/phpdotenv": "~2.4",
+        "magento/magento2-functional-testing-framework": "dev-develop"
+    },
+    "suggest": {
+        "magento/magento2-functional-test-module-store": "dev-master",
+        "magento/magento2-functional-test-module-catalog": "dev-master",
+        "magento/magento2-functional-test-module-catalog-inventory": "dev-master",
+        "magento/magento2-functional-test-module-sales": "dev-master",
+        "magento/magento2-functional-test-module-checkout": "dev-master",
+        "magento/magento2-functional-test-module-backend": "dev-master",
+        "magento/magento2-functional-test-module-eav": "dev-master",
+        "magento/magento2-functional-test-module-customer": "dev-master",
+        "magento/magento2-functional-test-module-media-storage": "dev-master",
+        "magento/magento2-functional-test-module-msrp": "dev-master",
+        "magento/magento2-functional-test-module-quote": "dev-master",
+        "magento/magento2-functional-test-module-ui": "dev-master"
+    },
+    "type": "magento2-test-module",
+    "version": "dev-master",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
+    "autoload": {
+        "psr-0": {
+            "Yandex": "vendor/allure-framework/allure-codeception/src/"
+        },
+        "psr-4": {
+            "Magento\\FunctionalTestingFramework\\": [
+                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
+            ],
+            "Magento\\FunctionalTest\\": [
+                "tests/functional/Magento/FunctionalTest",
+                "generated/Magento/FunctionalTest"
+            ]
+        }
+    },
+    "extra": {
+        "map": [
+            [
+                "*",
+                "tests/functional/Magento/FunctionalTest/GroupedProduct"
+            ]
+        ]
+    }
+}
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ImportExport/LICENSE.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ImportExport/LICENSE.txt
new file mode 100644
index 00000000000..49525fd99da
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ImportExport/LICENSE.txt
@@ -0,0 +1,48 @@
+
+Open Software License ("OSL") v. 3.0
+
+This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Open Software License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Open Software License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly. 
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including 'fair use' or 'fair dealing'). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright (C) 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ImportExport/LICENSE_AFL.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ImportExport/LICENSE_AFL.txt
new file mode 100644
index 00000000000..f39d641b18a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ImportExport/LICENSE_AFL.txt
@@ -0,0 +1,48 @@
+
+Academic Free License ("AFL") v. 3.0
+
+This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Academic Free License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, under any license of your choice that does not contradict the terms and conditions, including Licensor's reserved rights and remedies, in this Academic Free License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly.
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including "fair use" or "fair dealing"). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright © 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Academic Free License" or "AFL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ImportExport/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ImportExport/README.md
new file mode 100644
index 00000000000..5723866dc44
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ImportExport/README.md
@@ -0,0 +1,3 @@
+# Magento 2 Acceptance Tests
+
+The Acceptance Tests Module for **Magento_ImportExport** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ImportExport/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ImportExport/composer.json
new file mode 100644
index 00000000000..1e254c70045
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ImportExport/composer.json
@@ -0,0 +1,54 @@
+{
+    "name": "magento/magento2-functional-test-module-import-export",
+    "description": "Magento 2 Acceptance Test Module Import Export",
+    "repositories": [
+        {
+            "type" : "composer",
+            "url" : "https://repo.magento.com/"
+        }
+    ],
+    "require": {
+        "php": "~7.0",
+        "codeception/codeception": "2.2|2.3",
+        "allure-framework/allure-codeception": "dev-master",
+        "consolidation/robo": "^1.0.0",
+        "henrikbjorn/lurker": "^1.2",
+        "vlucas/phpdotenv": "~2.4",
+        "magento/magento2-functional-testing-framework": "dev-develop"
+    },
+    "suggest": {
+        "magento/magento2-functional-test-module-catalog": "dev-master",
+        "magento/magento2-functional-test-module-store": "dev-master",
+        "magento/magento2-functional-test-module-backend": "dev-master",
+        "magento/magento2-functional-test-module-eav": "dev-master",
+        "magento/magento2-functional-test-module-media-storage": "dev-master"
+    },
+    "type": "magento2-test-module",
+    "version": "dev-master",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
+    "autoload": {
+        "psr-0": {
+            "Yandex": "vendor/allure-framework/allure-codeception/src/"
+        },
+        "psr-4": {
+            "Magento\\FunctionalTestingFramework\\": [
+                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
+            ],
+            "Magento\\FunctionalTest\\": [
+                "tests/functional/Magento/FunctionalTest",
+                "generated/Magento/FunctionalTest"
+            ]
+        }
+    },
+    "extra": {
+        "map": [
+            [
+                "*",
+                "tests/functional/Magento/FunctionalTest/ImportExport"
+            ]
+        ]
+    }
+}
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Indexer/LICENSE.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Indexer/LICENSE.txt
new file mode 100644
index 00000000000..49525fd99da
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Indexer/LICENSE.txt
@@ -0,0 +1,48 @@
+
+Open Software License ("OSL") v. 3.0
+
+This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Open Software License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Open Software License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly. 
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including 'fair use' or 'fair dealing'). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright (C) 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Indexer/LICENSE_AFL.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Indexer/LICENSE_AFL.txt
new file mode 100644
index 00000000000..f39d641b18a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Indexer/LICENSE_AFL.txt
@@ -0,0 +1,48 @@
+
+Academic Free License ("AFL") v. 3.0
+
+This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Academic Free License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, under any license of your choice that does not contradict the terms and conditions, including Licensor's reserved rights and remedies, in this Academic Free License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly.
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including "fair use" or "fair dealing"). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright © 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Academic Free License" or "AFL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Indexer/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Indexer/README.md
new file mode 100644
index 00000000000..f59821dc099
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Indexer/README.md
@@ -0,0 +1,3 @@
+# Magento 2 Acceptance Tests
+
+The Acceptance Tests Module for **Magento_Indexer** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Indexer/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Indexer/composer.json
new file mode 100644
index 00000000000..a56ee31fae1
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Indexer/composer.json
@@ -0,0 +1,50 @@
+{
+    "name": "magento/magento2-functional-test-module-indexer",
+    "description": "Magento 2 Acceptance Test Module Indexer",
+    "repositories": [
+        {
+            "type" : "composer",
+            "url" : "https://repo.magento.com/"
+        }
+    ],
+    "require": {
+        "php": "~7.0",
+        "codeception/codeception": "2.2|2.3",
+        "allure-framework/allure-codeception": "dev-master",
+        "consolidation/robo": "^1.0.0",
+        "henrikbjorn/lurker": "^1.2",
+        "vlucas/phpdotenv": "~2.4",
+        "magento/magento2-functional-testing-framework": "dev-develop"
+    },
+    "suggest": {
+        "magento/magento2-functional-test-module-backend": "dev-master"
+    },
+    "type": "magento2-test-module",
+    "version": "dev-master",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
+    "autoload": {
+        "psr-0": {
+            "Yandex": "vendor/allure-framework/allure-codeception/src/"
+        },
+        "psr-4": {
+            "Magento\\FunctionalTestingFramework\\": [
+                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
+            ],
+            "Magento\\FunctionalTest\\": [
+                "tests/functional/Magento/FunctionalTest",
+                "generated/Magento/FunctionalTest"
+            ]
+        }
+    },
+    "extra": {
+        "map": [
+            [
+                "*",
+                "tests/functional/Magento/FunctionalTest/Indexer"
+            ]
+        ]
+    }
+}
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Integration/LICENSE.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Integration/LICENSE.txt
new file mode 100644
index 00000000000..49525fd99da
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Integration/LICENSE.txt
@@ -0,0 +1,48 @@
+
+Open Software License ("OSL") v. 3.0
+
+This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Open Software License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Open Software License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly. 
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including 'fair use' or 'fair dealing'). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright (C) 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Integration/LICENSE_AFL.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Integration/LICENSE_AFL.txt
new file mode 100644
index 00000000000..f39d641b18a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Integration/LICENSE_AFL.txt
@@ -0,0 +1,48 @@
+
+Academic Free License ("AFL") v. 3.0
+
+This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Academic Free License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, under any license of your choice that does not contradict the terms and conditions, including Licensor's reserved rights and remedies, in this Academic Free License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly.
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including "fair use" or "fair dealing"). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright © 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Academic Free License" or "AFL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Integration/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Integration/README.md
new file mode 100644
index 00000000000..08c9cd5f24f
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Integration/README.md
@@ -0,0 +1,3 @@
+# Magento 2 Acceptance Tests
+
+The Acceptance Tests Module for **Magento_Integration** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Integration/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Integration/composer.json
new file mode 100644
index 00000000000..2c776a48ae4
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Integration/composer.json
@@ -0,0 +1,55 @@
+{
+    "name": "magento/magento2-functional-test-module-integration",
+    "description": "Magento 2 Acceptance Test Module Integration",
+    "repositories": [
+        {
+            "type" : "composer",
+            "url" : "https://repo.magento.com/"
+        }
+    ],
+    "require": {
+        "php": "~7.0",
+        "codeception/codeception": "2.2|2.3",
+        "allure-framework/allure-codeception": "dev-master",
+        "consolidation/robo": "^1.0.0",
+        "henrikbjorn/lurker": "^1.2",
+        "vlucas/phpdotenv": "~2.4",
+        "magento/magento2-functional-testing-framework": "dev-develop"
+    },
+    "suggest": {
+        "magento/magento2-functional-test-module-store": "dev-master",
+        "magento/magento2-functional-test-module-backend": "dev-master",
+        "magento/magento2-functional-test-module-customer": "dev-master",
+        "magento/magento2-functional-test-module-user": "dev-master",
+        "magento/magento2-functional-test-module-security": "dev-master",
+        "magento/magento2-functional-test-module-authorization": "dev-master"
+    },
+    "type": "magento2-test-module",
+    "version": "dev-master",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
+    "autoload": {
+        "psr-0": {
+            "Yandex": "vendor/allure-framework/allure-codeception/src/"
+        },
+        "psr-4": {
+            "Magento\\FunctionalTestingFramework\\": [
+                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
+            ],
+            "Magento\\FunctionalTest\\": [
+                "tests/functional/Magento/FunctionalTest",
+                "generated/Magento/FunctionalTest"
+            ]
+        }
+    },
+    "extra": {
+        "map": [
+            [
+                "*",
+                "tests/functional/Magento/FunctionalTest/Integration"
+            ]
+        ]
+    }
+}
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/LayeredNavigation/LICENSE.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/LayeredNavigation/LICENSE.txt
new file mode 100644
index 00000000000..49525fd99da
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/LayeredNavigation/LICENSE.txt
@@ -0,0 +1,48 @@
+
+Open Software License ("OSL") v. 3.0
+
+This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Open Software License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Open Software License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly. 
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including 'fair use' or 'fair dealing'). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright (C) 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/LayeredNavigation/LICENSE_AFL.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/LayeredNavigation/LICENSE_AFL.txt
new file mode 100644
index 00000000000..f39d641b18a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/LayeredNavigation/LICENSE_AFL.txt
@@ -0,0 +1,48 @@
+
+Academic Free License ("AFL") v. 3.0
+
+This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Academic Free License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, under any license of your choice that does not contradict the terms and conditions, including Licensor's reserved rights and remedies, in this Academic Free License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly.
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including "fair use" or "fair dealing"). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright © 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Academic Free License" or "AFL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/LayeredNavigation/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/LayeredNavigation/README.md
new file mode 100644
index 00000000000..89ac42d6134
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/LayeredNavigation/README.md
@@ -0,0 +1,3 @@
+# Magento 2 Acceptance Tests
+
+The Acceptance Tests Module for **Magento_LayeredNavigation** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/LayeredNavigation/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/LayeredNavigation/composer.json
new file mode 100644
index 00000000000..5b74e905bee
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/LayeredNavigation/composer.json
@@ -0,0 +1,51 @@
+{
+    "name": "magento/magento2-functional-test-module-layered-navigation",
+    "description": "Magento 2 Acceptance Test Module Layered Navigation",
+    "repositories": [
+        {
+            "type" : "composer",
+            "url" : "https://repo.magento.com/"
+        }
+    ],
+    "require": {
+        "php": "~7.0",
+        "codeception/codeception": "2.2|2.3",
+        "allure-framework/allure-codeception": "dev-master",
+        "consolidation/robo": "^1.0.0",
+        "henrikbjorn/lurker": "^1.2",
+        "vlucas/phpdotenv": "~2.4",
+        "magento/magento2-functional-testing-framework": "dev-develop"
+    },
+    "suggest": {
+        "magento/magento2-functional-test-module-config": "dev-master",
+        "magento/magento2-functional-test-module-catalog": "dev-master"
+    },
+    "type": "magento2-test-module",
+    "version": "dev-master",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
+    "autoload": {
+        "psr-0": {
+            "Yandex": "vendor/allure-framework/allure-codeception/src/"
+        },
+        "psr-4": {
+            "Magento\\FunctionalTestingFramework\\": [
+                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
+            ],
+            "Magento\\FunctionalTest\\": [
+                "tests/functional/Magento/FunctionalTest",
+                "generated/Magento/FunctionalTest"
+            ]
+        }
+    },
+    "extra": {
+        "map": [
+            [
+                "*",
+                "tests/functional/Magento/FunctionalTest/LayeredNavigation"
+            ]
+        ]
+    }
+}
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Marketplace/LICENSE.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Marketplace/LICENSE.txt
new file mode 100644
index 00000000000..49525fd99da
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Marketplace/LICENSE.txt
@@ -0,0 +1,48 @@
+
+Open Software License ("OSL") v. 3.0
+
+This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Open Software License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Open Software License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly. 
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including 'fair use' or 'fair dealing'). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright (C) 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Marketplace/LICENSE_AFL.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Marketplace/LICENSE_AFL.txt
new file mode 100644
index 00000000000..f39d641b18a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Marketplace/LICENSE_AFL.txt
@@ -0,0 +1,48 @@
+
+Academic Free License ("AFL") v. 3.0
+
+This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Academic Free License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, under any license of your choice that does not contradict the terms and conditions, including Licensor's reserved rights and remedies, in this Academic Free License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly.
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including "fair use" or "fair dealing"). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright © 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Academic Free License" or "AFL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Marketplace/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Marketplace/README.md
new file mode 100644
index 00000000000..cfd23dfcbac
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Marketplace/README.md
@@ -0,0 +1,3 @@
+# Magento 2 Acceptance Tests
+
+The Acceptance Tests Module for **Magento_Marketplace** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Marketplace/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Marketplace/composer.json
new file mode 100644
index 00000000000..d3f589a31a0
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Marketplace/composer.json
@@ -0,0 +1,50 @@
+{
+    "name": "magento/magento2-functional-test-module-marketplace",
+    "description": "Magento 2 Acceptance Test Module Marketplace",
+    "repositories": [
+        {
+            "type" : "composer",
+            "url" : "https://repo.magento.com/"
+        }
+    ],
+    "require": {
+        "php": "~7.0",
+        "codeception/codeception": "2.2|2.3",
+        "allure-framework/allure-codeception": "dev-master",
+        "consolidation/robo": "^1.0.0",
+        "henrikbjorn/lurker": "^1.2",
+        "vlucas/phpdotenv": "~2.4",
+        "magento/magento2-functional-testing-framework": "dev-develop"
+    },
+    "suggest": {
+        "magento/magento2-functional-test-module-backend": "dev-master"
+    },
+    "type": "magento2-test-module",
+    "version": "dev-master",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
+    "autoload": {
+        "psr-0": {
+            "Yandex": "vendor/allure-framework/allure-codeception/src/"
+        },
+        "psr-4": {
+            "Magento\\FunctionalTestingFramework\\": [
+                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
+            ],
+            "Magento\\FunctionalTest\\": [
+                "tests/functional/Magento/FunctionalTest",
+                "generated/Magento/FunctionalTest"
+            ]
+        }
+    },
+    "extra": {
+        "map": [
+            [
+                "*",
+                "tests/functional/Magento/FunctionalTest/Marketplace"
+            ]
+        ]
+    }
+}
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/MediaStorage/LICENSE.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/MediaStorage/LICENSE.txt
new file mode 100644
index 00000000000..49525fd99da
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/MediaStorage/LICENSE.txt
@@ -0,0 +1,48 @@
+
+Open Software License ("OSL") v. 3.0
+
+This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Open Software License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Open Software License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly. 
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including 'fair use' or 'fair dealing'). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright (C) 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/MediaStorage/LICENSE_AFL.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/MediaStorage/LICENSE_AFL.txt
new file mode 100644
index 00000000000..f39d641b18a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/MediaStorage/LICENSE_AFL.txt
@@ -0,0 +1,48 @@
+
+Academic Free License ("AFL") v. 3.0
+
+This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Academic Free License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, under any license of your choice that does not contradict the terms and conditions, including Licensor's reserved rights and remedies, in this Academic Free License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly.
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including "fair use" or "fair dealing"). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright © 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Academic Free License" or "AFL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/MediaStorage/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/MediaStorage/README.md
new file mode 100644
index 00000000000..bd023f6f926
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/MediaStorage/README.md
@@ -0,0 +1,3 @@
+# Magento 2 Acceptance Tests
+
+The Acceptance Tests Module for **Magento_MediaStorage** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/MediaStorage/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/MediaStorage/composer.json
new file mode 100644
index 00000000000..cc893b603f4
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/MediaStorage/composer.json
@@ -0,0 +1,52 @@
+{
+    "name": "magento/magento2-functional-test-module-media-storage",
+    "description": "Magento 2 Acceptance Test Module Media Storage",
+    "repositories": [
+        {
+            "type" : "composer",
+            "url" : "https://repo.magento.com/"
+        }
+    ],
+    "require": {
+        "php": "~7.0",
+        "codeception/codeception": "2.2|2.3",
+        "allure-framework/allure-codeception": "dev-master",
+        "consolidation/robo": "^1.0.0",
+        "henrikbjorn/lurker": "^1.2",
+        "vlucas/phpdotenv": "~2.4",
+        "magento/magento2-functional-testing-framework": "dev-develop"
+    },
+    "suggest": {
+        "magento/magento2-functional-test-module-store": "dev-master",
+        "magento/magento2-functional-test-module-config": "dev-master",
+        "magento/magento2-functional-test-module-backend": "dev-master"
+    },
+    "type": "magento2-test-module",
+    "version": "dev-master",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
+    "autoload": {
+        "psr-0": {
+            "Yandex": "vendor/allure-framework/allure-codeception/src/"
+        },
+        "psr-4": {
+            "Magento\\FunctionalTestingFramework\\": [
+                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
+            ],
+            "Magento\\FunctionalTest\\": [
+                "tests/functional/Magento/FunctionalTest",
+                "generated/Magento/FunctionalTest"
+            ]
+        }
+    },
+    "extra": {
+        "map": [
+            [
+                "*",
+                "tests/functional/Magento/FunctionalTest/MediaStorage"
+            ]
+        ]
+    }
+}
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Msrp/LICENSE.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Msrp/LICENSE.txt
new file mode 100644
index 00000000000..49525fd99da
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Msrp/LICENSE.txt
@@ -0,0 +1,48 @@
+
+Open Software License ("OSL") v. 3.0
+
+This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Open Software License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Open Software License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly. 
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including 'fair use' or 'fair dealing'). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright (C) 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Msrp/LICENSE_AFL.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Msrp/LICENSE_AFL.txt
new file mode 100644
index 00000000000..f39d641b18a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Msrp/LICENSE_AFL.txt
@@ -0,0 +1,48 @@
+
+Academic Free License ("AFL") v. 3.0
+
+This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Academic Free License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, under any license of your choice that does not contradict the terms and conditions, including Licensor's reserved rights and remedies, in this Academic Free License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly.
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including "fair use" or "fair dealing"). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright © 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Academic Free License" or "AFL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Msrp/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Msrp/README.md
new file mode 100644
index 00000000000..1a97c33f497
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Msrp/README.md
@@ -0,0 +1,3 @@
+# Magento 2 Acceptance Tests
+
+The Acceptance Tests Module for **Magento_Msrp** Module.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Msrp/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Msrp/composer.json
new file mode 100644
index 00000000000..8b3fcba7e67
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Msrp/composer.json
@@ -0,0 +1,55 @@
+{
+    "name": "magento/magento2-functional-test-module-msrp",
+    "description": "Magento 2 Acceptance Test Module Msrp",
+    "repositories": [
+        {
+            "type" : "composer",
+            "url" : "https://repo.magento.com/"
+        }
+    ],
+    "require": {
+        "php": "~7.0",
+        "codeception/codeception": "2.2|2.3",
+        "allure-framework/allure-codeception": "dev-master",
+        "consolidation/robo": "^1.0.0",
+        "henrikbjorn/lurker": "^1.2",
+        "vlucas/phpdotenv": "~2.4",
+        "magento/magento2-functional-testing-framework": "dev-develop"
+    },
+    "suggest": {
+        "magento/magento2-functional-test-module-store": "dev-master",
+        "magento/magento2-functional-test-module-catalog": "dev-master",
+        "magento/magento2-functional-test-module-downloadable": "dev-master",
+        "magento/magento2-functional-test-module-eav": "dev-master",
+        "magento/magento2-functional-test-module-grouped-product": "dev-master",
+        "magento/magento2-functional-test-module-tax": "dev-master"
+    },
+    "type": "magento2-test-module",
+    "version": "dev-master",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
+    "autoload": {
+        "psr-0": {
+            "Yandex": "vendor/allure-framework/allure-codeception/src/"
+        },
+        "psr-4": {
+            "Magento\\FunctionalTestingFramework\\": [
+                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
+            ],
+            "Magento\\FunctionalTest\\": [
+                "tests/functional/Magento/FunctionalTest",
+                "generated/Magento/FunctionalTest"
+            ]
+        }
+    },
+    "extra": {
+        "map": [
+            [
+                "*",
+                "tests/functional/Magento/FunctionalTest/Msrp"
+            ]
+        ]
+    }
+}
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Multishipping/LICENSE.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Multishipping/LICENSE.txt
new file mode 100644
index 00000000000..49525fd99da
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Multishipping/LICENSE.txt
@@ -0,0 +1,48 @@
+
+Open Software License ("OSL") v. 3.0
+
+This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Open Software License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Open Software License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly. 
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including 'fair use' or 'fair dealing'). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright (C) 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Multishipping/LICENSE_AFL.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Multishipping/LICENSE_AFL.txt
new file mode 100644
index 00000000000..f39d641b18a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Multishipping/LICENSE_AFL.txt
@@ -0,0 +1,48 @@
+
+Academic Free License ("AFL") v. 3.0
+
+This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Academic Free License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, under any license of your choice that does not contradict the terms and conditions, including Licensor's reserved rights and remedies, in this Academic Free License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly.
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including "fair use" or "fair dealing"). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright © 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Academic Free License" or "AFL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Multishipping/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Multishipping/README.md
new file mode 100644
index 00000000000..5eac4359473
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Multishipping/README.md
@@ -0,0 +1,3 @@
+# Magento 2 Acceptance Tests
+
+The Acceptance Tests Module for **Magento_Multishipping** Module.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Multishipping/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Multishipping/composer.json
new file mode 100644
index 00000000000..809353b1eaa
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Multishipping/composer.json
@@ -0,0 +1,57 @@
+{
+    "name": "magento/magento2-functional-test-module-multishipping",
+    "description": "Magento 2 Acceptance Test Module Multishipping",
+    "repositories": [
+        {
+            "type" : "composer",
+            "url" : "https://repo.magento.com/"
+        }
+    ],
+    "require": {
+        "php": "~7.0",
+        "codeception/codeception": "2.2|2.3",
+        "allure-framework/allure-codeception": "dev-master",
+        "consolidation/robo": "^1.0.0",
+        "henrikbjorn/lurker": "^1.2",
+        "vlucas/phpdotenv": "~2.4",
+        "magento/magento2-functional-testing-framework": "dev-develop"
+    },
+    "suggest": {
+        "magento/magento2-functional-test-module-store": "dev-master",
+        "magento/magento2-functional-test-module-checkout": "dev-master",
+        "magento/magento2-functional-test-module-sales": "dev-master",
+        "magento/magento2-functional-test-module-payment": "dev-master",
+        "magento/magento2-functional-test-module-tax": "dev-master",
+        "magento/magento2-functional-test-module-customer": "dev-master",
+        "magento/magento2-functional-test-module-quote": "dev-master",
+        "magento/magento2-functional-test-module-directory": "dev-master"
+    },
+    "type": "magento2-test-module",
+    "version": "dev-master",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
+    "autoload": {
+        "psr-0": {
+            "Yandex": "vendor/allure-framework/allure-codeception/src/"
+        },
+        "psr-4": {
+            "Magento\\FunctionalTestingFramework\\": [
+                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
+            ],
+            "Magento\\FunctionalTest\\": [
+                "tests/functional/Magento/FunctionalTest",
+                "generated/Magento/FunctionalTest"
+            ]
+        }
+    },
+    "extra": {
+        "map": [
+            [
+                "*",
+                "tests/functional/Magento/FunctionalTest/Multishipping"
+            ]
+        ]
+    }
+}
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/NewRelicReporting/LICENSE.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/NewRelicReporting/LICENSE.txt
new file mode 100644
index 00000000000..49525fd99da
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/NewRelicReporting/LICENSE.txt
@@ -0,0 +1,48 @@
+
+Open Software License ("OSL") v. 3.0
+
+This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Open Software License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Open Software License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly. 
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including 'fair use' or 'fair dealing'). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright (C) 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/NewRelicReporting/LICENSE_AFL.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/NewRelicReporting/LICENSE_AFL.txt
new file mode 100644
index 00000000000..f39d641b18a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/NewRelicReporting/LICENSE_AFL.txt
@@ -0,0 +1,48 @@
+
+Academic Free License ("AFL") v. 3.0
+
+This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Academic Free License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, under any license of your choice that does not contradict the terms and conditions, including Licensor's reserved rights and remedies, in this Academic Free License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly.
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including "fair use" or "fair dealing"). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright © 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Academic Free License" or "AFL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/NewRelicReporting/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/NewRelicReporting/README.md
new file mode 100644
index 00000000000..68dd1d5267a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/NewRelicReporting/README.md
@@ -0,0 +1,3 @@
+# Magento 2 Acceptance Tests
+
+The Acceptance Tests Module for **Magento_NewRelicReporting** Module.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/NewRelicReporting/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/NewRelicReporting/composer.json
new file mode 100644
index 00000000000..e2ce994efa1
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/NewRelicReporting/composer.json
@@ -0,0 +1,55 @@
+{
+    "name": "magento/magento2-functional-test-module-new-relic-reporting",
+    "description": "Magento 2 Acceptance Test Module New Relic Reporting",
+    "repositories": [
+        {
+            "type" : "composer",
+            "url" : "https://repo.magento.com/"
+        }
+    ],
+    "require": {
+        "php": "~7.0",
+        "codeception/codeception": "2.2|2.3",
+        "allure-framework/allure-codeception": "dev-master",
+        "consolidation/robo": "^1.0.0",
+        "henrikbjorn/lurker": "^1.2",
+        "vlucas/phpdotenv": "~2.4",
+        "magento/magento2-functional-testing-framework": "dev-develop"
+    },
+    "suggest": {
+        "magento/magento2-functional-test-module-store": "dev-master",
+        "magento/magento2-functional-test-module-backend": "dev-master",
+        "magento/magento2-functional-test-module-customer": "dev-master",
+        "magento/magento2-functional-test-module-configurable-product": "dev-master",
+        "magento/magento2-functional-test-module-catalog": "dev-master",
+        "magento/magento2-functional-test-module-config": "dev-master"
+    },
+    "type": "magento2-test-module",
+    "version": "dev-master",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
+    "autoload": {
+        "psr-0": {
+            "Yandex": "vendor/allure-framework/allure-codeception/src/"
+        },
+        "psr-4": {
+            "Magento\\FunctionalTestingFramework\\": [
+                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
+            ],
+            "Magento\\FunctionalTest\\": [
+                "tests/functional/Magento/FunctionalTest",
+                "generated/Magento/FunctionalTest"
+            ]
+        }
+    },
+    "extra": {
+        "map": [
+            [
+                "*",
+                "tests/functional/Magento/FunctionalTest/NewRelicReporting"
+            ]
+        ]
+    }
+}
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Newsletter/LICENSE.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Newsletter/LICENSE.txt
new file mode 100644
index 00000000000..49525fd99da
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Newsletter/LICENSE.txt
@@ -0,0 +1,48 @@
+
+Open Software License ("OSL") v. 3.0
+
+This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Open Software License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Open Software License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly. 
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including 'fair use' or 'fair dealing'). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright (C) 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Newsletter/LICENSE_AFL.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Newsletter/LICENSE_AFL.txt
new file mode 100644
index 00000000000..f39d641b18a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Newsletter/LICENSE_AFL.txt
@@ -0,0 +1,48 @@
+
+Academic Free License ("AFL") v. 3.0
+
+This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Academic Free License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, under any license of your choice that does not contradict the terms and conditions, including Licensor's reserved rights and remedies, in this Academic Free License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly.
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including "fair use" or "fair dealing"). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright © 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Academic Free License" or "AFL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Newsletter/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Newsletter/README.md
new file mode 100644
index 00000000000..b38526eec86
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Newsletter/README.md
@@ -0,0 +1,3 @@
+# Magento 2 Acceptance Tests
+
+The Acceptance Tests Module for **Magento_Newsletter** Module.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Newsletter/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Newsletter/composer.json
new file mode 100644
index 00000000000..34046ce9e83
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Newsletter/composer.json
@@ -0,0 +1,56 @@
+{
+    "name": "magento/magento2-functional-test-module-newsletter",
+    "description": "Magento 2 Acceptance Test Module Newsletter",
+    "repositories": [
+        {
+            "type" : "composer",
+            "url" : "https://repo.magento.com/"
+        }
+    ],
+    "require": {
+        "php": "~7.0",
+        "codeception/codeception": "2.2|2.3",
+        "allure-framework/allure-codeception": "dev-master",
+        "consolidation/robo": "^1.0.0",
+        "henrikbjorn/lurker": "^1.2",
+        "vlucas/phpdotenv": "~2.4",
+        "magento/magento2-functional-testing-framework": "dev-develop"
+    },
+    "suggest": {
+        "magento/magento2-functional-test-module-store": "dev-master",
+        "magento/magento2-functional-test-module-customer": "dev-master",
+        "magento/magento2-functional-test-module-widget": "dev-master",
+        "magento/magento2-functional-test-module-backend": "dev-master",
+        "magento/magento2-functional-test-module-cms": "dev-master",
+        "magento/magento2-functional-test-module-email": "dev-master",
+        "magento/magento2-functional-test-module-eav": "dev-master"
+    },
+    "type": "magento2-test-module",
+    "version": "dev-master",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
+    "autoload": {
+        "psr-0": {
+            "Yandex": "vendor/allure-framework/allure-codeception/src/"
+        },
+        "psr-4": {
+            "Magento\\FunctionalTestingFramework\\": [
+                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
+            ],
+            "Magento\\FunctionalTest\\": [
+                "tests/functional/Magento/FunctionalTest",
+                "generated/Magento/FunctionalTest"
+            ]
+        }
+    },
+    "extra": {
+        "map": [
+            [
+                "*",
+                "tests/functional/Magento/FunctionalTest/Newsletter"
+            ]
+        ]
+    }
+}
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/OfflinePayments/LICENSE.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/OfflinePayments/LICENSE.txt
new file mode 100644
index 00000000000..49525fd99da
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/OfflinePayments/LICENSE.txt
@@ -0,0 +1,48 @@
+
+Open Software License ("OSL") v. 3.0
+
+This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Open Software License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Open Software License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly. 
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including 'fair use' or 'fair dealing'). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright (C) 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/OfflinePayments/LICENSE_AFL.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/OfflinePayments/LICENSE_AFL.txt
new file mode 100644
index 00000000000..f39d641b18a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/OfflinePayments/LICENSE_AFL.txt
@@ -0,0 +1,48 @@
+
+Academic Free License ("AFL") v. 3.0
+
+This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Academic Free License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, under any license of your choice that does not contradict the terms and conditions, including Licensor's reserved rights and remedies, in this Academic Free License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly.
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including "fair use" or "fair dealing"). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright © 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Academic Free License" or "AFL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/OfflinePayments/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/OfflinePayments/README.md
new file mode 100644
index 00000000000..46fc09f181a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/OfflinePayments/README.md
@@ -0,0 +1,3 @@
+# Magento 2 Acceptance Tests
+
+The Acceptance Tests Module for **Magento_OfflinePayments** Module.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/OfflinePayments/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/OfflinePayments/composer.json
new file mode 100644
index 00000000000..aeed68809ac
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/OfflinePayments/composer.json
@@ -0,0 +1,51 @@
+{
+    "name": "magento/magento2-functional-test-module-offline-payments",
+    "description": "Magento 2 Acceptance Test Module Offline Payments",
+    "repositories": [
+        {
+            "type" : "composer",
+            "url" : "https://repo.magento.com/"
+        }
+    ],
+    "require": {
+        "php": "~7.0",
+        "codeception/codeception": "2.2|2.3",
+        "allure-framework/allure-codeception": "dev-master",
+        "consolidation/robo": "^1.0.0",
+        "henrikbjorn/lurker": "^1.2",
+        "vlucas/phpdotenv": "~2.4",
+        "magento/magento2-functional-testing-framework": "dev-develop"
+    },
+    "suggest": {
+        "magento/magento2-functional-test-module-checkout": "dev-master",
+        "magento/magento2-functional-test-module-payment": "dev-master"
+    },
+    "type": "magento2-test-module",
+    "version": "dev-master",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
+    "autoload": {
+        "psr-0": {
+            "Yandex": "vendor/allure-framework/allure-codeception/src/"
+        },
+        "psr-4": {
+            "Magento\\FunctionalTestingFramework\\": [
+                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
+            ],
+            "Magento\\FunctionalTest\\": [
+                "tests/functional/Magento/FunctionalTest",
+                "generated/Magento/FunctionalTest"
+            ]
+        }
+    },
+    "extra": {
+        "map": [
+            [
+                "*",
+                "tests/functional/Magento/FunctionalTest/OfflinePayments"
+            ]
+        ]
+    }
+}
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/OfflineShipping/LICENSE.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/OfflineShipping/LICENSE.txt
new file mode 100644
index 00000000000..49525fd99da
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/OfflineShipping/LICENSE.txt
@@ -0,0 +1,48 @@
+
+Open Software License ("OSL") v. 3.0
+
+This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Open Software License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Open Software License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly. 
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including 'fair use' or 'fair dealing'). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright (C) 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/OfflineShipping/LICENSE_AFL.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/OfflineShipping/LICENSE_AFL.txt
new file mode 100644
index 00000000000..f39d641b18a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/OfflineShipping/LICENSE_AFL.txt
@@ -0,0 +1,48 @@
+
+Academic Free License ("AFL") v. 3.0
+
+This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Academic Free License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, under any license of your choice that does not contradict the terms and conditions, including Licensor's reserved rights and remedies, in this Academic Free License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly.
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including "fair use" or "fair dealing"). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright © 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Academic Free License" or "AFL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/OfflineShipping/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/OfflineShipping/README.md
new file mode 100644
index 00000000000..f430b9b2a1f
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/OfflineShipping/README.md
@@ -0,0 +1,3 @@
+# Magento 2 Acceptance Tests
+
+The Acceptance Tests Module for **Magento_OfflineShipping** Module.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/OfflineShipping/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/OfflineShipping/composer.json
new file mode 100644
index 00000000000..babeb8ad2ec
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/OfflineShipping/composer.json
@@ -0,0 +1,57 @@
+{
+    "name": "magento/magento2-functional-test-module-offline-shipping",
+    "description": "Magento 2 Acceptance Test Module Offline Shipping",
+    "repositories": [
+        {
+            "type" : "composer",
+            "url" : "https://repo.magento.com/"
+        }
+    ],
+    "require": {
+        "php": "~7.0",
+        "codeception/codeception": "2.2|2.3",
+        "allure-framework/allure-codeception": "dev-master",
+        "consolidation/robo": "^1.0.0",
+        "henrikbjorn/lurker": "^1.2",
+        "vlucas/phpdotenv": "~2.4",
+        "magento/magento2-functional-testing-framework": "dev-develop"
+    },
+    "suggest": {
+        "magento/magento2-functional-test-module-config": "dev-master",
+        "magento/magento2-functional-test-module-store": "dev-master",
+        "magento/magento2-functional-test-module-backend": "dev-master",
+        "magento/magento2-functional-test-module-shipping": "dev-master",
+        "magento/magento2-functional-test-module-catalog": "dev-master",
+        "magento/magento2-functional-test-module-sales-rule": "dev-master",
+        "magento/magento2-functional-test-module-directory": "dev-master",
+        "magento/magento2-functional-test-module-quote": "dev-master"
+    },
+    "type": "magento2-test-module",
+    "version": "dev-master",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
+    "autoload": {
+        "psr-0": {
+            "Yandex": "vendor/allure-framework/allure-codeception/src/"
+        },
+        "psr-4": {
+            "Magento\\FunctionalTestingFramework\\": [
+                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
+            ],
+            "Magento\\FunctionalTest\\": [
+                "tests/functional/Magento/FunctionalTest",
+                "generated/Magento/FunctionalTest"
+            ]
+        }
+    },
+    "extra": {
+        "map": [
+            [
+                "*",
+                "tests/functional/Magento/FunctionalTest/OfflineShipping"
+            ]
+        ]
+    }
+}
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/PageCache/LICENSE.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/PageCache/LICENSE.txt
new file mode 100644
index 00000000000..49525fd99da
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/PageCache/LICENSE.txt
@@ -0,0 +1,48 @@
+
+Open Software License ("OSL") v. 3.0
+
+This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Open Software License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Open Software License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly. 
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including 'fair use' or 'fair dealing'). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright (C) 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/PageCache/LICENSE_AFL.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/PageCache/LICENSE_AFL.txt
new file mode 100644
index 00000000000..f39d641b18a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/PageCache/LICENSE_AFL.txt
@@ -0,0 +1,48 @@
+
+Academic Free License ("AFL") v. 3.0
+
+This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Academic Free License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, under any license of your choice that does not contradict the terms and conditions, including Licensor's reserved rights and remedies, in this Academic Free License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly.
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including "fair use" or "fair dealing"). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright © 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Academic Free License" or "AFL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/PageCache/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/PageCache/README.md
new file mode 100644
index 00000000000..b35a9877c8b
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/PageCache/README.md
@@ -0,0 +1,3 @@
+# Magento 2 Acceptance Tests
+
+The Acceptance Tests Module for **Magento_PageCache** Module.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/PageCache/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/PageCache/composer.json
new file mode 100644
index 00000000000..59205152e0d
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/PageCache/composer.json
@@ -0,0 +1,52 @@
+{
+    "name": "magento/magento2-functional-test-module-page-cache",
+    "description": "Magento 2 Acceptance Test Module Page Cache",
+    "repositories": [
+        {
+            "type" : "composer",
+            "url" : "https://repo.magento.com/"
+        }
+    ],
+    "require": {
+        "php": "~7.0",
+        "codeception/codeception": "2.2|2.3",
+        "allure-framework/allure-codeception": "dev-master",
+        "consolidation/robo": "^1.0.0",
+        "henrikbjorn/lurker": "^1.2",
+        "vlucas/phpdotenv": "~2.4",
+        "magento/magento2-functional-testing-framework": "dev-develop"
+    },
+    "suggest": {
+        "magento/magento2-functional-test-module-store": "dev-master",
+        "magento/magento2-functional-test-module-config": "dev-master",
+        "magento/magento2-functional-test-module-backend": "dev-master"
+    },
+    "type": "magento2-test-module",
+    "version": "dev-master",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
+    "autoload": {
+        "psr-0": {
+            "Yandex": "vendor/allure-framework/allure-codeception/src/"
+        },
+        "psr-4": {
+            "Magento\\FunctionalTestingFramework\\": [
+                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
+            ],
+            "Magento\\FunctionalTest\\": [
+                "tests/functional/Magento/FunctionalTest",
+                "generated/Magento/FunctionalTest"
+            ]
+        }
+    },
+    "extra": {
+        "map": [
+            [
+                "*",
+                "tests/functional/Magento/FunctionalTest/PageCache"
+            ]
+        ]
+    }
+}
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Payment/LICENSE.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Payment/LICENSE.txt
new file mode 100644
index 00000000000..49525fd99da
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Payment/LICENSE.txt
@@ -0,0 +1,48 @@
+
+Open Software License ("OSL") v. 3.0
+
+This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Open Software License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Open Software License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly. 
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including 'fair use' or 'fair dealing'). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright (C) 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Payment/LICENSE_AFL.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Payment/LICENSE_AFL.txt
new file mode 100644
index 00000000000..f39d641b18a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Payment/LICENSE_AFL.txt
@@ -0,0 +1,48 @@
+
+Academic Free License ("AFL") v. 3.0
+
+This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Academic Free License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, under any license of your choice that does not contradict the terms and conditions, including Licensor's reserved rights and remedies, in this Academic Free License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly.
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including "fair use" or "fair dealing"). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright © 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Academic Free License" or "AFL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Payment/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Payment/README.md
new file mode 100644
index 00000000000..a87d9a4f12b
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Payment/README.md
@@ -0,0 +1,3 @@
+# Magento 2 Acceptance Tests
+
+The Acceptance Tests Module for **Magento_Payment** Module.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Payment/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Payment/composer.json
new file mode 100644
index 00000000000..ed77d470823
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Payment/composer.json
@@ -0,0 +1,55 @@
+{
+    "name": "magento/magento2-functional-test-module-payment",
+    "description": "Magento 2 Acceptance Test Module Payment",
+    "repositories": [
+        {
+            "type" : "composer",
+            "url" : "https://repo.magento.com/"
+        }
+    ],
+    "require": {
+        "php": "~7.0",
+        "codeception/codeception": "2.2|2.3",
+        "allure-framework/allure-codeception": "dev-master",
+        "consolidation/robo": "^1.0.0",
+        "henrikbjorn/lurker": "^1.2",
+        "vlucas/phpdotenv": "~2.4",
+        "magento/magento2-functional-testing-framework": "dev-develop"
+    },
+    "suggest": {
+        "magento/magento2-functional-test-module-store": "dev-master",
+        "magento/magento2-functional-test-module-config": "dev-master",
+        "magento/magento2-functional-test-module-sales": "dev-master",
+        "magento/magento2-functional-test-module-checkout": "dev-master",
+        "magento/magento2-functional-test-module-quote": "dev-master",
+        "magento/magento2-functional-test-module-directory": "dev-master"
+    },
+    "type": "magento2-test-module",
+    "version": "dev-master",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
+    "autoload": {
+        "psr-0": {
+            "Yandex": "vendor/allure-framework/allure-codeception/src/"
+        },
+        "psr-4": {
+            "Magento\\FunctionalTestingFramework\\": [
+                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
+            ],
+            "Magento\\FunctionalTest\\": [
+                "tests/functional/Magento/FunctionalTest",
+                "generated/Magento/FunctionalTest"
+            ]
+        }
+    },
+    "extra": {
+        "map": [
+            [
+                "*",
+                "tests/functional/Magento/FunctionalTest/Payment"
+            ]
+        ]
+    }
+}
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Paypal/LICENSE.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Paypal/LICENSE.txt
new file mode 100644
index 00000000000..49525fd99da
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Paypal/LICENSE.txt
@@ -0,0 +1,48 @@
+
+Open Software License ("OSL") v. 3.0
+
+This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Open Software License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Open Software License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly. 
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including 'fair use' or 'fair dealing'). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright (C) 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Paypal/LICENSE_AFL.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Paypal/LICENSE_AFL.txt
new file mode 100644
index 00000000000..f39d641b18a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Paypal/LICENSE_AFL.txt
@@ -0,0 +1,48 @@
+
+Academic Free License ("AFL") v. 3.0
+
+This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Academic Free License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, under any license of your choice that does not contradict the terms and conditions, including Licensor's reserved rights and remedies, in this Academic Free License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly.
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including "fair use" or "fair dealing"). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright © 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Academic Free License" or "AFL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Paypal/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Paypal/README.md
new file mode 100644
index 00000000000..e6c828ce072
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Paypal/README.md
@@ -0,0 +1,3 @@
+# Magento 2 Acceptance Tests
+
+The Acceptance Tests Module for **Magento_PayPal** Module.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Paypal/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Paypal/composer.json
new file mode 100644
index 00000000000..d82c9ccb34a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Paypal/composer.json
@@ -0,0 +1,64 @@
+{
+    "name": "magento/magento2-functional-test-module-paypal",
+    "description": "Magento 2 Acceptance Test Module Paypal",
+    "repositories": [
+        {
+            "type" : "composer",
+            "url" : "https://repo.magento.com/"
+        }
+    ],
+    "require": {
+        "php": "~7.0",
+        "codeception/codeception": "2.2|2.3",
+        "allure-framework/allure-codeception": "dev-master",
+        "consolidation/robo": "^1.0.0",
+        "henrikbjorn/lurker": "^1.2",
+        "vlucas/phpdotenv": "~2.4",
+        "magento/magento2-functional-testing-framework": "dev-develop"
+    },
+    "suggest": {
+        "magento/magento2-functional-test-module-store": "dev-master",
+        "magento/magento2-functional-test-module-config": "dev-master",
+        "magento/magento2-functional-test-module-checkout": "dev-master",
+        "magento/magento2-functional-test-module-sales": "dev-master",
+        "magento/magento2-functional-test-module-quote": "dev-master",
+        "magento/magento2-functional-test-module-customer": "dev-master",
+        "magento/magento2-functional-test-module-payment": "dev-master",
+        "magento/magento2-functional-test-module-backend": "dev-master",
+        "magento/magento2-functional-test-module-tax": "dev-master",
+        "magento/magento2-functional-test-module-directory": "dev-master",
+        "magento/magento2-functional-test-module-theme": "dev-master",
+        "magento/magento2-functional-test-module-catalog": "dev-master",
+        "magento/magento2-functional-test-module-eav": "dev-master",
+        "magento/magento2-functional-test-module-ui": "dev-master",
+        "magento/magento2-functional-test-module-vault": "dev-master"
+    },
+    "type": "magento2-test-module",
+    "version": "dev-master",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
+    "autoload": {
+        "psr-0": {
+            "Yandex": "vendor/allure-framework/allure-codeception/src/"
+        },
+        "psr-4": {
+            "Magento\\FunctionalTestingFramework\\": [
+                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
+            ],
+            "Magento\\FunctionalTest\\": [
+                "tests/functional/Magento/FunctionalTest",
+                "generated/Magento/FunctionalTest"
+            ]
+        }
+    },
+    "extra": {
+        "map": [
+            [
+                "*",
+                "tests/functional/Magento/FunctionalTest/Paypal"
+            ]
+        ]
+    }
+}
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Persistent/LICENSE.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Persistent/LICENSE.txt
new file mode 100644
index 00000000000..49525fd99da
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Persistent/LICENSE.txt
@@ -0,0 +1,48 @@
+
+Open Software License ("OSL") v. 3.0
+
+This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Open Software License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Open Software License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly. 
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including 'fair use' or 'fair dealing'). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright (C) 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Persistent/LICENSE_AFL.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Persistent/LICENSE_AFL.txt
new file mode 100644
index 00000000000..f39d641b18a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Persistent/LICENSE_AFL.txt
@@ -0,0 +1,48 @@
+
+Academic Free License ("AFL") v. 3.0
+
+This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Academic Free License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, under any license of your choice that does not contradict the terms and conditions, including Licensor's reserved rights and remedies, in this Academic Free License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly.
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including "fair use" or "fair dealing"). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright © 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Academic Free License" or "AFL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Persistent/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Persistent/README.md
new file mode 100644
index 00000000000..f0678daf757
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Persistent/README.md
@@ -0,0 +1,3 @@
+# Magento 2 Acceptance Tests
+
+The Acceptance Tests Module for **Magento_Persistent** Module.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Persistent/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Persistent/composer.json
new file mode 100644
index 00000000000..0ee20653fbb
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Persistent/composer.json
@@ -0,0 +1,54 @@
+{
+    "name": "magento/magento2-functional-test-module-persistent",
+    "description": "Magento 2 Acceptance Test Module Persistent",
+    "repositories": [
+        {
+            "type" : "composer",
+            "url" : "https://repo.magento.com/"
+        }
+    ],
+    "require": {
+        "php": "~7.0",
+        "codeception/codeception": "2.2|2.3",
+        "allure-framework/allure-codeception": "dev-master",
+        "consolidation/robo": "^1.0.0",
+        "henrikbjorn/lurker": "^1.2",
+        "vlucas/phpdotenv": "~2.4",
+        "magento/magento2-functional-testing-framework": "dev-develop"
+    },
+    "suggest": {
+        "magento/magento2-functional-test-module-store": "dev-master",
+        "magento/magento2-functional-test-module-checkout": "dev-master",
+        "magento/magento2-functional-test-module-customer": "dev-master",
+        "magento/magento2-functional-test-module-page-cache": "dev-master",
+        "magento/magento2-functional-test-module-quote": "dev-master"
+    },
+    "type": "magento2-test-module",
+    "version": "dev-master",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
+    "autoload": {
+        "psr-0": {
+            "Yandex": "vendor/allure-framework/allure-codeception/src/"
+        },
+        "psr-4": {
+            "Magento\\FunctionalTestingFramework\\": [
+                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
+            ],
+            "Magento\\FunctionalTest\\": [
+                "tests/functional/Magento/FunctionalTest",
+                "generated/Magento/FunctionalTest"
+            ]
+        }
+    },
+    "extra": {
+        "map": [
+            [
+                "*",
+                "tests/functional/Magento/FunctionalTest/Persistent"
+            ]
+        ]
+    }
+}
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ProductAlert/LICENSE.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ProductAlert/LICENSE.txt
new file mode 100644
index 00000000000..49525fd99da
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ProductAlert/LICENSE.txt
@@ -0,0 +1,48 @@
+
+Open Software License ("OSL") v. 3.0
+
+This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Open Software License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Open Software License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly. 
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including 'fair use' or 'fair dealing'). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright (C) 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ProductAlert/LICENSE_AFL.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ProductAlert/LICENSE_AFL.txt
new file mode 100644
index 00000000000..f39d641b18a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ProductAlert/LICENSE_AFL.txt
@@ -0,0 +1,48 @@
+
+Academic Free License ("AFL") v. 3.0
+
+This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Academic Free License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, under any license of your choice that does not contradict the terms and conditions, including Licensor's reserved rights and remedies, in this Academic Free License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly.
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including "fair use" or "fair dealing"). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright © 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Academic Free License" or "AFL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ProductAlert/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ProductAlert/README.md
new file mode 100644
index 00000000000..00b577465e5
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ProductAlert/README.md
@@ -0,0 +1,3 @@
+# Magento 2 Acceptance Tests
+
+The Acceptance Tests Module for **Magento_ProductAlert** Module.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ProductAlert/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ProductAlert/composer.json
new file mode 100644
index 00000000000..15988266a20
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ProductAlert/composer.json
@@ -0,0 +1,53 @@
+{
+    "name": "magento/magento2-functional-test-module-product-alert",
+    "description": "Magento 2 Acceptance Test Module Product Alert",
+    "repositories": [
+        {
+            "type" : "composer",
+            "url" : "https://repo.magento.com/"
+        }
+    ],
+    "require": {
+        "php": "~7.0",
+        "codeception/codeception": "2.2|2.3",
+        "allure-framework/allure-codeception": "dev-master",
+        "consolidation/robo": "^1.0.0",
+        "henrikbjorn/lurker": "^1.2",
+        "vlucas/phpdotenv": "~2.4",
+        "magento/magento2-functional-testing-framework": "dev-develop"
+    },
+    "suggest": {
+        "magento/magento2-functional-test-module-store": "dev-master",
+        "magento/magento2-functional-test-module-backend": "dev-master",
+        "magento/magento2-functional-test-module-catalog": "dev-master",
+        "magento/magento2-functional-test-module-customer": "dev-master"
+    },
+    "type": "magento2-test-module",
+    "version": "dev-master",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
+    "autoload": {
+        "psr-0": {
+            "Yandex": "vendor/allure-framework/allure-codeception/src/"
+        },
+        "psr-4": {
+            "Magento\\FunctionalTestingFramework\\": [
+                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
+            ],
+            "Magento\\FunctionalTest\\": [
+                "tests/functional/Magento/FunctionalTest",
+                "generated/Magento/FunctionalTest"
+            ]
+        }
+    },
+    "extra": {
+        "map": [
+            [
+                "*",
+                "tests/functional/Magento/FunctionalTest/ProductAlert"
+            ]
+        ]
+    }
+}
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ProductVideo/LICENSE.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ProductVideo/LICENSE.txt
new file mode 100644
index 00000000000..36b2459f6aa
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ProductVideo/LICENSE.txt
@@ -0,0 +1,48 @@
+
+Open Software License ("OSL") v. 3.0
+
+This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Open Software License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Open Software License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly.
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including 'fair use' or 'fair dealing'). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright (C) 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ProductVideo/LICENSE_AFL.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ProductVideo/LICENSE_AFL.txt
new file mode 100644
index 00000000000..496bf10ad44
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ProductVideo/LICENSE_AFL.txt
@@ -0,0 +1,48 @@
+
+Academic Free License ("AFL") v. 3.0
+
+This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Academic Free License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, under any license of your choice that does not contradict the terms and conditions, including Licensor's reserved rights and remedies, in this Academic Free License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly.
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including "fair use" or "fair dealing"). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright © 2016 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Academic Free License" or "AFL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ProductVideo/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ProductVideo/README.md
new file mode 100644
index 00000000000..73ee15ca28f
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ProductVideo/README.md
@@ -0,0 +1,3 @@
+# Magento 2 Acceptance Tests
+
+The Acceptance Tests Module for **Magento_ProductVideo** Module.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ProductVideo/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ProductVideo/composer.json
new file mode 100644
index 00000000000..bc08abd34a1
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ProductVideo/composer.json
@@ -0,0 +1,54 @@
+{
+    "name": "magento/magento2-functional-test-module-product-video",
+    "description": "Magento 2 Acceptance Test Module Product Video",
+    "repositories": [
+        {
+            "type" : "composer",
+            "url" : "https://repo.magento.com/"
+        }
+    ],
+    "require": {
+        "php": "~7.0",
+        "codeception/codeception": "2.2|2.3",
+        "allure-framework/allure-codeception": "dev-master",
+        "consolidation/robo": "^1.0.0",
+        "henrikbjorn/lurker": "^1.2",
+        "vlucas/phpdotenv": "~2.4",
+        "magento/magento2-functional-testing-framework": "dev-develop"
+    },
+    "suggest": {
+        "magento/magento2-functional-test-module-store": "dev-master",
+        "magento/magento2-functional-test-module-catalog": "dev-master",
+        "magento/magento2-functional-test-module-backend": "dev-master",
+        "magento/magento2-functional-test-module-eav": "dev-master",
+        "magento/magento2-functional-test-module-media-storage": "dev-master"
+    },
+    "type": "magento2-test-module",
+    "version": "dev-master",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
+    "autoload": {
+        "psr-0": {
+            "Yandex": "vendor/allure-framework/allure-codeception/src/"
+        },
+        "psr-4": {
+            "Magento\\FunctionalTestingFramework\\": [
+                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
+            ],
+            "Magento\\FunctionalTest\\": [
+                "tests/functional/Magento/FunctionalTest",
+                "generated/Magento/FunctionalTest"
+            ]
+        }
+    },
+    "extra": {
+        "map": [
+            [
+                "*",
+                "tests/functional/Magento/FunctionalTest/ProductVideo"
+            ]
+        ]
+    }
+}
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Quote/LICENSE.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Quote/LICENSE.txt
new file mode 100644
index 00000000000..49525fd99da
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Quote/LICENSE.txt
@@ -0,0 +1,48 @@
+
+Open Software License ("OSL") v. 3.0
+
+This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Open Software License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Open Software License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly. 
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including 'fair use' or 'fair dealing'). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright (C) 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Quote/LICENSE_AFL.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Quote/LICENSE_AFL.txt
new file mode 100644
index 00000000000..f39d641b18a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Quote/LICENSE_AFL.txt
@@ -0,0 +1,48 @@
+
+Academic Free License ("AFL") v. 3.0
+
+This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Academic Free License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, under any license of your choice that does not contradict the terms and conditions, including Licensor's reserved rights and remedies, in this Academic Free License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly.
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including "fair use" or "fair dealing"). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright © 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Academic Free License" or "AFL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Quote/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Quote/README.md
new file mode 100644
index 00000000000..510a9d5f16d
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Quote/README.md
@@ -0,0 +1,3 @@
+# Magento 2 Acceptance Tests
+
+The Acceptance Tests Module for **Magento_Quote** Module.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Quote/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Quote/composer.json
new file mode 100644
index 00000000000..2dba18c3fa4
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Quote/composer.json
@@ -0,0 +1,63 @@
+{
+    "name": "magento/magento2-functional-test-module-quote",
+    "description": "Magento 2 Acceptance Test Module Quote",
+    "repositories": [
+        {
+            "type" : "composer",
+            "url" : "https://repo.magento.com/"
+        }
+    ],
+    "require": {
+        "php": "~7.0",
+        "codeception/codeception": "2.2|2.3",
+        "allure-framework/allure-codeception": "dev-master",
+        "consolidation/robo": "^1.0.0",
+        "henrikbjorn/lurker": "^1.2",
+        "vlucas/phpdotenv": "~2.4",
+        "magento/magento2-functional-testing-framework": "dev-develop"
+    },
+    "suggest": {
+        "magento/magento2-functional-test-module-store": "dev-master",
+        "magento/magento2-functional-test-module-catalog": "dev-master",
+        "magento/magento2-functional-test-module-customer": "dev-master",
+        "magento/magento2-functional-test-module-checkout": "dev-master",
+        "magento/magento2-functional-test-module-authorization": "dev-master",
+        "magento/magento2-functional-test-module-payment": "dev-master",
+        "magento/magento2-functional-test-module-sales": "dev-master",
+        "magento/magento2-functional-test-module-shipping": "dev-master",
+        "magento/magento2-functional-test-module-sales-sequence": "dev-master",
+        "magento/magento2-functional-test-module-backend": "dev-master",
+        "magento/magento2-functional-test-module-directory": "dev-master",
+        "magento/magento2-functional-test-module-eav": "dev-master",
+        "magento/magento2-functional-test-module-tax": "dev-master",
+        "magento/magento2-functional-test-module-catalog-inventory": "dev-master"
+    },
+    "type": "magento2-test-module",
+    "version": "dev-master",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
+    "autoload": {
+        "psr-0": {
+            "Yandex": "vendor/allure-framework/allure-codeception/src/"
+        },
+        "psr-4": {
+            "Magento\\FunctionalTestingFramework\\": [
+                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
+            ],
+            "Magento\\FunctionalTest\\": [
+                "tests/functional/Magento/FunctionalTest",
+                "generated/Magento/FunctionalTest"
+            ]
+        }
+    },
+    "extra": {
+        "map": [
+            [
+                "*",
+                "tests/functional/Magento/FunctionalTest/Quote"
+            ]
+        ]
+    }
+}
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/QuoteAnalytics/LICENSE.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/QuoteAnalytics/LICENSE.txt
new file mode 100644
index 00000000000..49525fd99da
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/QuoteAnalytics/LICENSE.txt
@@ -0,0 +1,48 @@
+
+Open Software License ("OSL") v. 3.0
+
+This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Open Software License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Open Software License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly. 
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including 'fair use' or 'fair dealing'). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright (C) 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/QuoteAnalytics/LICENSE_AFL.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/QuoteAnalytics/LICENSE_AFL.txt
new file mode 100644
index 00000000000..f39d641b18a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/QuoteAnalytics/LICENSE_AFL.txt
@@ -0,0 +1,48 @@
+
+Academic Free License ("AFL") v. 3.0
+
+This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Academic Free License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, under any license of your choice that does not contradict the terms and conditions, including Licensor's reserved rights and remedies, in this Academic Free License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly.
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including "fair use" or "fair dealing"). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright © 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Academic Free License" or "AFL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/QuoteAnalytics/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/QuoteAnalytics/README.md
new file mode 100644
index 00000000000..7460ca6a7df
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/QuoteAnalytics/README.md
@@ -0,0 +1,3 @@
+# Magento 2 Acceptance Tests
+
+The Acceptance Tests Module for **Magento_QuoteAnalytics** Module.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/QuoteAnalytics/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/QuoteAnalytics/composer.json
new file mode 100644
index 00000000000..b86c40e02fe
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/QuoteAnalytics/composer.json
@@ -0,0 +1,50 @@
+{
+    "name": "magento/magento2-functional-test-module-quote-analytics",
+    "description": "Magento 2 Acceptance Test Module Quote Analytics",
+    "repositories": [
+        {
+            "type" : "composer",
+            "url" : "https://repo.magento.com/"
+        }
+    ],
+    "require": {
+        "php": "~7.0",
+        "codeception/codeception": "2.2|2.3",
+        "allure-framework/allure-codeception": "dev-master",
+        "consolidation/robo": "^1.0.0",
+        "henrikbjorn/lurker": "^1.2",
+        "vlucas/phpdotenv": "~2.4",
+        "magento/magento2-functional-testing-framework": "dev-develop"
+    },
+    "suggest": {
+        "magento/magento2-functional-test-module-quote": "dev-master"
+    },
+    "type": "magento2-test-module",
+    "version": "dev-master",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
+    "autoload": {
+        "psr-0": {
+            "Yandex": "vendor/allure-framework/allure-codeception/src/"
+        },
+        "psr-4": {
+            "Magento\\FunctionalTestingFramework\\": [
+                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
+            ],
+            "Magento\\FunctionalTest\\": [
+                "tests/functional/Magento/FunctionalTest",
+                "generated/Magento/FunctionalTest"
+            ]
+        }
+    },
+    "extra": {
+        "map": [
+            [
+                "*",
+                "tests/functional/Magento/FunctionalTest/QuoteAnalytics"
+            ]
+        ]
+    }
+}
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Reports/LICENSE.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Reports/LICENSE.txt
new file mode 100644
index 00000000000..49525fd99da
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Reports/LICENSE.txt
@@ -0,0 +1,48 @@
+
+Open Software License ("OSL") v. 3.0
+
+This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Open Software License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Open Software License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly. 
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including 'fair use' or 'fair dealing'). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright (C) 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Reports/LICENSE_AFL.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Reports/LICENSE_AFL.txt
new file mode 100644
index 00000000000..f39d641b18a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Reports/LICENSE_AFL.txt
@@ -0,0 +1,48 @@
+
+Academic Free License ("AFL") v. 3.0
+
+This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Academic Free License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, under any license of your choice that does not contradict the terms and conditions, including Licensor's reserved rights and remedies, in this Academic Free License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly.
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including "fair use" or "fair dealing"). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright © 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Academic Free License" or "AFL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Reports/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Reports/README.md
new file mode 100644
index 00000000000..ad49607139a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Reports/README.md
@@ -0,0 +1,3 @@
+# Magento 2 Acceptance Tests
+
+The Acceptance Tests Module for **Magento_Reports** Module.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Reports/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Reports/composer.json
new file mode 100644
index 00000000000..f73c4da907f
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Reports/composer.json
@@ -0,0 +1,65 @@
+{
+    "name": "magento/magento2-functional-test-module-reports",
+    "description": "Magento 2 Acceptance Test Module Reports",
+    "repositories": [
+        {
+            "type" : "composer",
+            "url" : "https://repo.magento.com/"
+        }
+    ],
+    "require": {
+        "php": "~7.0",
+        "codeception/codeception": "2.2|2.3",
+        "allure-framework/allure-codeception": "dev-master",
+        "consolidation/robo": "^1.0.0",
+        "henrikbjorn/lurker": "^1.2",
+        "vlucas/phpdotenv": "~2.4",
+        "magento/magento2-functional-testing-framework": "dev-develop"
+    },
+    "suggest": {
+        "magento/magento2-functional-test-module-store": "dev-master",
+        "magento/magento2-functional-test-module-config": "dev-master",
+        "magento/magento2-functional-test-module-eav": "dev-master",
+        "magento/magento2-functional-test-module-customer": "dev-master",
+        "magento/magento2-functional-test-module-catalog": "dev-master",
+        "magento/magento2-functional-test-module-sales": "dev-master",
+        "magento/magento2-functional-test-module-cms": "dev-master",
+        "magento/magento2-functional-test-module-backend": "dev-master",
+        "magento/magento2-functional-test-module-widget": "dev-master",
+        "magento/magento2-functional-test-module-wishlist": "dev-master",
+        "magento/magento2-functional-test-module-review": "dev-master",
+        "magento/magento2-functional-test-module-catalog-inventory": "dev-master",
+        "magento/magento2-functional-test-module-tax": "dev-master",
+        "magento/magento2-functional-test-module-downloadable": "dev-master",
+        "magento/magento2-functional-test-module-sales-rule": "dev-master",
+        "magento/magento2-functional-test-module-quote": "dev-master"
+    },
+    "type": "magento2-test-module",
+    "version": "dev-master",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
+    "autoload": {
+        "psr-0": {
+            "Yandex": "vendor/allure-framework/allure-codeception/src/"
+        },
+        "psr-4": {
+            "Magento\\FunctionalTestingFramework\\": [
+                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
+            ],
+            "Magento\\FunctionalTest\\": [
+                "tests/functional/Magento/FunctionalTest",
+                "generated/Magento/FunctionalTest"
+            ]
+        }
+    },
+    "extra": {
+        "map": [
+            [
+                "*",
+                "tests/functional/Magento/FunctionalTest/Reports"
+            ]
+        ]
+    }
+}
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Review/LICENSE.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Review/LICENSE.txt
new file mode 100644
index 00000000000..49525fd99da
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Review/LICENSE.txt
@@ -0,0 +1,48 @@
+
+Open Software License ("OSL") v. 3.0
+
+This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Open Software License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Open Software License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly. 
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including 'fair use' or 'fair dealing'). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright (C) 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Review/LICENSE_AFL.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Review/LICENSE_AFL.txt
new file mode 100644
index 00000000000..f39d641b18a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Review/LICENSE_AFL.txt
@@ -0,0 +1,48 @@
+
+Academic Free License ("AFL") v. 3.0
+
+This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Academic Free License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, under any license of your choice that does not contradict the terms and conditions, including Licensor's reserved rights and remedies, in this Academic Free License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly.
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including "fair use" or "fair dealing"). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright © 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Academic Free License" or "AFL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Review/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Review/README.md
new file mode 100644
index 00000000000..b34f3c949e0
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Review/README.md
@@ -0,0 +1,3 @@
+# Magento 2 Acceptance Tests
+
+The Acceptance Tests Module for **Magento_Review** Module.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Review/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Review/composer.json
new file mode 100644
index 00000000000..70f0e295838
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Review/composer.json
@@ -0,0 +1,57 @@
+{
+    "name": "magento/magento2-functional-test-module-review",
+    "description": "Magento 2 Acceptance Test Module Review",
+    "repositories": [
+        {
+            "type" : "composer",
+            "url" : "https://repo.magento.com/"
+        }
+    ],
+    "require": {
+        "php": "~7.0",
+        "codeception/codeception": "2.2|2.3",
+        "allure-framework/allure-codeception": "dev-master",
+        "consolidation/robo": "^1.0.0",
+        "henrikbjorn/lurker": "^1.2",
+        "vlucas/phpdotenv": "~2.4",
+        "magento/magento2-functional-testing-framework": "dev-develop"
+    },
+    "suggest": {
+        "magento/magento2-functional-test-module-store": "dev-master",
+        "magento/magento2-functional-test-module-catalog": "dev-master",
+        "magento/magento2-functional-test-module-customer": "dev-master",
+        "magento/magento2-functional-test-module-eav": "dev-master",
+        "magento/magento2-functional-test-module-theme": "dev-master",
+        "magento/magento2-functional-test-module-backend": "dev-master",
+        "magento/magento2-functional-test-module-newsletter": "dev-master",
+        "magento/magento2-functional-test-module-ui": "dev-master"
+    },
+    "type": "magento2-test-module",
+    "version": "dev-master",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
+    "autoload": {
+        "psr-0": {
+            "Yandex": "vendor/allure-framework/allure-codeception/src/"
+        },
+        "psr-4": {
+            "Magento\\FunctionalTestingFramework\\": [
+                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
+            ],
+            "Magento\\FunctionalTest\\": [
+                "tests/functional/Magento/FunctionalTest",
+                "generated/Magento/FunctionalTest"
+            ]
+        }
+    },
+    "extra": {
+        "map": [
+            [
+                "*",
+                "tests/functional/Magento/FunctionalTest/Review"
+            ]
+        ]
+    }
+}
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ReviewAnalytics/LICENSE.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ReviewAnalytics/LICENSE.txt
new file mode 100644
index 00000000000..49525fd99da
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ReviewAnalytics/LICENSE.txt
@@ -0,0 +1,48 @@
+
+Open Software License ("OSL") v. 3.0
+
+This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Open Software License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Open Software License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly. 
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including 'fair use' or 'fair dealing'). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright (C) 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ReviewAnalytics/LICENSE_AFL.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ReviewAnalytics/LICENSE_AFL.txt
new file mode 100644
index 00000000000..f39d641b18a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ReviewAnalytics/LICENSE_AFL.txt
@@ -0,0 +1,48 @@
+
+Academic Free License ("AFL") v. 3.0
+
+This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Academic Free License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, under any license of your choice that does not contradict the terms and conditions, including Licensor's reserved rights and remedies, in this Academic Free License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly.
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including "fair use" or "fair dealing"). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright © 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Academic Free License" or "AFL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ReviewAnalytics/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ReviewAnalytics/README.md
new file mode 100644
index 00000000000..3f50f5341cf
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ReviewAnalytics/README.md
@@ -0,0 +1,3 @@
+# Magento 2 Acceptance Tests
+
+The Acceptance Tests Module for **Magento_ReviewAnalytics** Module.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ReviewAnalytics/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ReviewAnalytics/composer.json
new file mode 100644
index 00000000000..01772112b17
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ReviewAnalytics/composer.json
@@ -0,0 +1,50 @@
+{
+    "name": "magento/magento2-functional-test-module-review-analytics",
+    "description": "Magento 2 Acceptance Test Module Review Analytics",
+    "repositories": [
+        {
+            "type" : "composer",
+            "url" : "https://repo.magento.com/"
+        }
+    ],
+    "require": {
+        "php": "~7.0",
+        "codeception/codeception": "2.2|2.3",
+        "allure-framework/allure-codeception": "dev-master",
+        "consolidation/robo": "^1.0.0",
+        "henrikbjorn/lurker": "^1.2",
+        "vlucas/phpdotenv": "~2.4",
+        "magento/magento2-functional-testing-framework": "dev-develop"
+    },
+    "suggest": {
+        "magento/magento2-functional-test-module-review": "dev-master"
+    },
+    "type": "magento2-test-module",
+    "version": "dev-master",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
+    "autoload": {
+        "psr-0": {
+            "Yandex": "vendor/allure-framework/allure-codeception/src/"
+        },
+        "psr-4": {
+            "Magento\\FunctionalTestingFramework\\": [
+                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
+            ],
+            "Magento\\FunctionalTest\\": [
+                "tests/functional/Magento/FunctionalTest",
+                "generated/Magento/FunctionalTest"
+            ]
+        }
+    },
+    "extra": {
+        "map": [
+            [
+                "*",
+                "tests/functional/Magento/FunctionalTest/ReviewAnalytics"
+            ]
+        ]
+    }
+}
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Robots/LICENSE.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Robots/LICENSE.txt
new file mode 100644
index 00000000000..49525fd99da
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Robots/LICENSE.txt
@@ -0,0 +1,48 @@
+
+Open Software License ("OSL") v. 3.0
+
+This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Open Software License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Open Software License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly. 
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including 'fair use' or 'fair dealing'). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright (C) 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Robots/LICENSE_AFL.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Robots/LICENSE_AFL.txt
new file mode 100644
index 00000000000..f39d641b18a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Robots/LICENSE_AFL.txt
@@ -0,0 +1,48 @@
+
+Academic Free License ("AFL") v. 3.0
+
+This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Academic Free License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, under any license of your choice that does not contradict the terms and conditions, including Licensor's reserved rights and remedies, in this Academic Free License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly.
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including "fair use" or "fair dealing"). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright © 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Academic Free License" or "AFL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Robots/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Robots/README.md
new file mode 100644
index 00000000000..864304d41ee
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Robots/README.md
@@ -0,0 +1,3 @@
+# Magento 2 Acceptance Tests
+
+The Acceptance Tests Module for **Magento_Robots** Module.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Robots/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Robots/composer.json
new file mode 100644
index 00000000000..082211c40a6
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Robots/composer.json
@@ -0,0 +1,50 @@
+{
+    "name": "magento/magento2-functional-test-module-robots",
+    "description": "Magento 2 Acceptance Test Module Robots",
+    "repositories": [
+        {
+            "type" : "composer",
+            "url" : "https://repo.magento.com/"
+        }
+    ],
+    "require": {
+        "php": "~7.0",
+        "codeception/codeception": "2.2|2.3",
+        "allure-framework/allure-codeception": "dev-master",
+        "consolidation/robo": "^1.0.0",
+        "henrikbjorn/lurker": "^1.2",
+        "vlucas/phpdotenv": "~2.4",
+        "magento/magento2-functional-testing-framework": "dev-develop"
+    },
+    "suggest": {
+        "magento/magento2-functional-test-module-store": "dev-master"
+    },
+    "type": "magento2-test-module",
+    "version": "dev-master",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
+    "autoload": {
+        "psr-0": {
+            "Yandex": "vendor/allure-framework/allure-codeception/src/"
+        },
+        "psr-4": {
+            "Magento\\FunctionalTestingFramework\\": [
+                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
+            ],
+            "Magento\\FunctionalTest\\": [
+                "tests/functional/Magento/FunctionalTest",
+                "generated/Magento/FunctionalTest"
+            ]
+        }
+    },
+    "extra": {
+        "map": [
+            [
+                "*",
+                "tests/functional/Magento/FunctionalTest/Robots"
+            ]
+        ]
+    }
+}
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Rss/LICENSE.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Rss/LICENSE.txt
new file mode 100644
index 00000000000..49525fd99da
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Rss/LICENSE.txt
@@ -0,0 +1,48 @@
+
+Open Software License ("OSL") v. 3.0
+
+This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Open Software License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Open Software License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly. 
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including 'fair use' or 'fair dealing'). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright (C) 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Rss/LICENSE_AFL.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Rss/LICENSE_AFL.txt
new file mode 100644
index 00000000000..f39d641b18a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Rss/LICENSE_AFL.txt
@@ -0,0 +1,48 @@
+
+Academic Free License ("AFL") v. 3.0
+
+This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Academic Free License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, under any license of your choice that does not contradict the terms and conditions, including Licensor's reserved rights and remedies, in this Academic Free License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly.
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including "fair use" or "fair dealing"). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright © 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Academic Free License" or "AFL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Rss/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Rss/README.md
new file mode 100644
index 00000000000..04fc8e1c0d0
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Rss/README.md
@@ -0,0 +1,3 @@
+# Magento 2 Acceptance Tests
+
+The Acceptance Tests Module for **Magento_Rss** Module.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Rss/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Rss/composer.json
new file mode 100644
index 00000000000..d950390b0e1
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Rss/composer.json
@@ -0,0 +1,52 @@
+{
+    "name": "magento/magento2-functional-test-module-rss",
+    "description": "Magento 2 Acceptance Test Module Rss",
+    "repositories": [
+        {
+            "type" : "composer",
+            "url" : "https://repo.magento.com/"
+        }
+    ],
+    "require": {
+        "php": "~7.0",
+        "codeception/codeception": "2.2|2.3",
+        "allure-framework/allure-codeception": "dev-master",
+        "consolidation/robo": "^1.0.0",
+        "henrikbjorn/lurker": "^1.2",
+        "vlucas/phpdotenv": "~2.4",
+        "magento/magento2-functional-testing-framework": "dev-develop"
+    },
+    "suggest": {
+        "magento/magento2-functional-test-module-store": "dev-master",
+        "magento/magento2-functional-test-module-backend": "dev-master",
+        "magento/magento2-functional-test-module-customer": "dev-master"
+    },
+    "type": "magento2-test-module",
+    "version": "dev-master",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
+    "autoload": {
+        "psr-0": {
+            "Yandex": "vendor/allure-framework/allure-codeception/src/"
+        },
+        "psr-4": {
+            "Magento\\FunctionalTestingFramework\\": [
+                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
+            ],
+            "Magento\\FunctionalTest\\": [
+                "tests/functional/Magento/FunctionalTest",
+                "generated/Magento/FunctionalTest"
+            ]
+        }
+    },
+    "extra": {
+        "map": [
+            [
+                "*",
+                "tests/functional/Magento/FunctionalTest/Rss"
+            ]
+        ]
+    }
+}
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Rule/LICENSE.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Rule/LICENSE.txt
new file mode 100644
index 00000000000..49525fd99da
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Rule/LICENSE.txt
@@ -0,0 +1,48 @@
+
+Open Software License ("OSL") v. 3.0
+
+This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Open Software License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Open Software License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly. 
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including 'fair use' or 'fair dealing'). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright (C) 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Rule/LICENSE_AFL.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Rule/LICENSE_AFL.txt
new file mode 100644
index 00000000000..f39d641b18a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Rule/LICENSE_AFL.txt
@@ -0,0 +1,48 @@
+
+Academic Free License ("AFL") v. 3.0
+
+This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Academic Free License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, under any license of your choice that does not contradict the terms and conditions, including Licensor's reserved rights and remedies, in this Academic Free License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly.
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including "fair use" or "fair dealing"). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright © 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Academic Free License" or "AFL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Rule/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Rule/README.md
new file mode 100644
index 00000000000..02eb487f33c
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Rule/README.md
@@ -0,0 +1,3 @@
+# Magento 2 Acceptance Tests
+
+The Acceptance Tests Module for **Magento_Rule** Module.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Rule/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Rule/composer.json
new file mode 100644
index 00000000000..11cefb3a7df
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Rule/composer.json
@@ -0,0 +1,53 @@
+{
+    "name": "magento/magento2-functional-test-module-rule",
+    "description": "Magento 2 Acceptance Test Module Rule",
+    "repositories": [
+        {
+            "type" : "composer",
+            "url" : "https://repo.magento.com/"
+        }
+    ],
+    "require": {
+        "php": "~7.0",
+        "codeception/codeception": "2.2|2.3",
+        "allure-framework/allure-codeception": "dev-master",
+        "consolidation/robo": "^1.0.0",
+        "henrikbjorn/lurker": "^1.2",
+        "vlucas/phpdotenv": "~2.4",
+        "magento/magento2-functional-testing-framework": "dev-develop"
+    },
+    "suggest": {
+        "magento/magento2-functional-test-module-store": "dev-master",
+        "magento/magento2-functional-test-module-eav": "dev-master",
+        "magento/magento2-functional-test-module-catalog": "dev-master",
+        "magento/magento2-functional-test-module-backend": "dev-master"
+    },
+    "type": "magento2-test-module",
+    "version": "dev-master",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
+    "autoload": {
+        "psr-0": {
+            "Yandex": "vendor/allure-framework/allure-codeception/src/"
+        },
+        "psr-4": {
+            "Magento\\FunctionalTestingFramework\\": [
+                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
+            ],
+            "Magento\\FunctionalTest\\": [
+                "tests/functional/Magento/FunctionalTest",
+                "generated/Magento/FunctionalTest"
+            ]
+        }
+    },
+    "extra": {
+        "map": [
+            [
+                "*",
+                "tests/functional/Magento/FunctionalTest/Rule"
+            ]
+        ]
+    }
+}
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Cest/AdminCreateInvoiceCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Cest/AdminCreateInvoiceCest.xml
new file mode 100644
index 00000000000..832ede6b3df
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Cest/AdminCreateInvoiceCest.xml
@@ -0,0 +1,89 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Test/etc/testSchema.xsd">
+    <cest name="AdminCreateInvoiceCest">
+        <annotations>
+            <features value="Invoice Creation"/>
+            <stories value="Create an Invoice via the Admin"/>
+            <group value="sales"/>
+            <env value="chrome"/>
+            <env value="firefox"/>
+            <env value="phantomjs"/>
+        </annotations>
+        <before>
+            <createData entity="_defaultCategory" mergeKey="createCategory"/>
+            <entity name="categoryLink" type="custom_attribute" mergeKey="categoryLink">
+                <data key="attribute_code">category_ids</data>
+                <data key="value">$$createCategory.id$$</data>
+            </entity>
+            <createData entity="_defaultProduct" mergeKey="createProduct">
+                <required-entity name="categoryLink"/>
+            </createData>
+        </before>
+
+        <test name="CreateInvoiceTest">
+            <annotations>
+                <title value="Create Invoice"/>
+                <description value="Should be able to create an invoice via the admin."/>
+                <severity value="NORMAL"/>
+                <testCaseId value="MAGETWO-72096"/>
+            </annotations>
+
+            <!-- todo: Create an order via the api instead of driving the browser  -->
+            <amOnPage url="{{StorefrontCategoryPage.url($$createCategory.name$$)}}" mergeKey="onCategoryPage"/>
+            <waitForPageLoad mergeKey="waitForPageLoad1"/>
+            <moveMouseOver selector="{{StorefrontCategoryMainSection.ProductItemInfo}}" mergeKey="hoverProduct"/>
+            <click selector="{{StorefrontCategoryMainSection.AddToCartBtn}}" mergeKey="addToCart"/>
+            <waitForElementVisible selector="{{StorefrontCategoryMainSection.SuccessMsg}}" time="30" mergeKey="waitForProductAdded"/>
+            <click selector="{{StorefrontMiniCartSection.show}}" mergeKey="clickCart"/>
+            <click selector="{{StorefrontMiniCartSection.goToCheckout}}" mergeKey="goToCheckout"/>
+            <waitForPageLoad mergeKey="waitForPageLoad2"/>
+            <fillField selector="{{CheckoutShippingGuestInfoSection.email}}" userInput="{{CustomerEntityOne.email}}" mergeKey="enterEmail"/>
+            <fillField selector="{{CheckoutShippingGuestInfoSection.firstName}}" userInput="{{CustomerEntityOne.firstname}}" mergeKey="enterFirstName"/>
+            <fillField selector="{{CheckoutShippingGuestInfoSection.lastName}}" userInput="{{CustomerEntityOne.lastname}}" mergeKey="enterLastName"/>
+            <fillField selector="{{CheckoutShippingGuestInfoSection.street}}" userInput="{{CustomerAddressSimple.street[0]}}" mergeKey="enterStreet"/>
+            <fillField selector="{{CheckoutShippingGuestInfoSection.city}}" userInput="{{CustomerAddressSimple.city}}" mergeKey="enterCity"/>
+            <selectOption selector="{{CheckoutShippingGuestInfoSection.region}}" userInput="{{CustomerAddressSimple.state}}" mergeKey="selectRegion"/>
+            <fillField selector="{{CheckoutShippingGuestInfoSection.postcode}}" userInput="{{CustomerAddressSimple.postcode}}" mergeKey="enterPostcode"/>
+            <fillField selector="{{CheckoutShippingGuestInfoSection.telephone}}" userInput="{{CustomerAddressSimple.telephone}}" mergeKey="enterTelephone"/>
+            <waitForLoadingMaskToDisappear mergeKey="waitForLoadingMask"/>
+            <click selector="{{CheckoutShippingMethodsSection.firstShippingMethod}}" mergeKey="selectFirstShippingMethod"/>
+            <waitForElement selector="{{CheckoutShippingMethodsSection.next}}" time="30" mergeKey="waitForNextButton"/>
+            <click selector="{{CheckoutShippingMethodsSection.next}}" mergeKey="clickNext"/>
+            <waitForElement selector="{{CheckoutPaymentSection.placeOrder}}" time="30" mergeKey="waitForPlaceOrderButton"/>
+            <click selector="{{CheckoutPaymentSection.placeOrder}}" mergeKey="clickPlaceOrder"/>
+            <grabTextFrom selector="{{CheckoutSuccessMainSection.orderNumber}}" returnVariable="orderNumber" mergeKey="grabOrderNumber"/>
+            <!-- end todo -->
+
+            <amOnPage url="{{AdminLoginPage}}" mergeKey="goToAdmin"/>
+            <waitForPageLoad mergeKey="waitForPageLoad1"/>
+            <fillField selector="{{AdminLoginFormSection.username}}" userInput="{{_ENV.MAGENTO_ADMIN_USERNAME}}" mergeKey="fillUsername"/>
+            <fillField selector="{{AdminLoginFormSection.password}}" userInput="{{_ENV.MAGENTO_ADMIN_PASSWORD}}" mergeKey="fillPassword"/>
+            <click selector="{{AdminLoginFormSection.signIn}}" mergeKey="clickLogin"/>
+
+            <amOnPage url="{{OrdersPage}}" mergeKey="onOrdersPage"/>
+            <waitForElementNotVisible selector="{{OrdersGridSection.spinner}}" time="10" mergeKey="waitSpinner1"/>
+            <fillField selector="{{OrdersGridSection.search}}" variable="orderNumber" mergeKey="searchOrderNum"/>
+            <click selector="{{OrdersGridSection.submitSearch}}" mergeKey="submitSearch"/>
+            <waitForElementNotVisible selector="{{OrdersGridSection.spinner}}" time="10" mergeKey="waitSpinner2"/>
+
+            <click selector="{{OrdersGridSection.firstRow}}" mergeKey="clickOrderRow"/>
+            <click selector="{{OrderDetailsMainActionsSection.invoice}}" mergeKey="clickInvoice"/>
+            <click selector="{{InvoiceNewSection.submitInvoice}}" mergeKey="clickSubmitInvoice"/>
+            <see selector="{{OrderDetailsMessagesSection.successMessage}}" userInput="The invoice has been created." mergeKey="seeSuccessMessage"/>
+            <click selector="{{OrderDetailsOrderViewSection.invoices}}" mergeKey="clickInvoices"/>
+            <waitForElementNotVisible selector="{{OrderDetailsInvoicesSection.spinner}}" time="10" mergeKey="waitSpinner3"/>
+            <see selector="{{OrderDetailsInvoicesSection.content}}" variable="orderNumber" mergeKey="seeInvoice1"/>
+            <see selector="{{OrderDetailsInvoicesSection.content}}" userInput="John Doe" mergeKey="seeInvoice2"/>
+            <click selector="{{OrderDetailsOrderViewSection.information}}" mergeKey="clickInformation"/>
+            <see selector="{{OrderDetailsInformationSection.orderStatus}}" userInput="Processing" mergeKey="seeOrderStatus"/>
+            <amOnPage url="{{InvoicesPage}}" mergeKey="goToInvoices"/>
+            <waitForElementNotVisible selector="{{InvoicesGridSection.spinner}}" time="10" mergeKey="waitSpinner4"/>
+            <click selector="{{InvoicesGridSection.filter}}" mergeKey="clickFilters"/>
+            <fillField selector="{{InvoicesFiltersSection.orderNum}}" variable="orderNumber" mergeKey="searchOrderNum2"/>
+            <click selector="{{InvoicesGridSection.firstRow}}" mergeKey="clickInvoice2"/>
+            <see selector="{{InvoiceDetailsInformationSection.orderStatus}}" userInput="Processing" mergeKey="seeOrderStatus2"/>
+        </test>
+    </cest>
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Data/SalesData.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Data/SalesData.xml
new file mode 100644
index 00000000000..637e7ef01ba
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Data/SalesData.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataProfileSchema.xsd">
+    <entity name="salesRecordOne" type="sales">
+        <data key="salesId">data</data>
+    </entity>
+</config>
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/LICENSE.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/LICENSE.txt
new file mode 100644
index 00000000000..49525fd99da
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/LICENSE.txt
@@ -0,0 +1,48 @@
+
+Open Software License ("OSL") v. 3.0
+
+This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Open Software License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Open Software License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly. 
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including 'fair use' or 'fair dealing'). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright (C) 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/LICENSE_AFL.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/LICENSE_AFL.txt
new file mode 100644
index 00000000000..f39d641b18a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/LICENSE_AFL.txt
@@ -0,0 +1,48 @@
+
+Academic Free License ("AFL") v. 3.0
+
+This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Academic Free License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, under any license of your choice that does not contradict the terms and conditions, including Licensor's reserved rights and remedies, in this Academic Free License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly.
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including "fair use" or "fair dealing"). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright © 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Academic Free License" or "AFL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Page/InvoiceDetailsPage.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Page/InvoiceDetailsPage.xml
new file mode 100644
index 00000000000..4fde61b64d2
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Page/InvoiceDetailsPage.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/PageObject.xsd">
+    <page name="InvoiceDetailsPage" urlPath="/admin/sales/invoice/view/invoice_id/" module="Sales">
+        <section name="InvoiceDetailsInformationSection"/>
+    </page>
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Page/InvoiceNewPage.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Page/InvoiceNewPage.xml
new file mode 100644
index 00000000000..760a50d31ad
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Page/InvoiceNewPage.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/PageObject.xsd">
+    <page name="InvoiceNewPage" urlPath="/admin/sales/order_invoice/new/order_id/" module="Sales">
+        <section name="InvoiceNewSection"/>
+    </page>
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Page/InvoicesPage.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Page/InvoicesPage.xml
new file mode 100644
index 00000000000..93e997fee7b
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Page/InvoicesPage.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/PageObject.xsd">
+    <page name="InvoicesPage" urlPath="/admin/sales/invoice/" module="Sales">
+        <section name="InvoicesGridSection"/>
+        <section name="InvoicesFiltersSection"/>
+    </page>
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Page/OrderDetailsPage.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Page/OrderDetailsPage.xml
new file mode 100644
index 00000000000..20470e31c8f
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Page/OrderDetailsPage.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/PageObject.xsd">
+    <page name="OrderDetailsPage" urlPath="/admin/sales/order/view/order_id/" module="Sales">
+        <section name="OrderDetailsMainActionsSection"/>
+        <section name="OrderDetailsInformationSection"/>
+        <section name="OrderDetailsMessagesSection"/>
+    </page>
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Page/OrdersPage.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Page/OrdersPage.xml
new file mode 100644
index 00000000000..f215af9c21d
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Page/OrdersPage.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/PageObject.xsd">
+    <page name="OrdersPage" urlPath="/admin/sales/order/" module="Sales">
+        <section name="OrdersGridSection"/>
+    </page>
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/README.md
new file mode 100644
index 00000000000..8f897de5484
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/README.md
@@ -0,0 +1,3 @@
+# Magento 2 Acceptance Tests
+
+The Acceptance Tests Module for **Magento_Sales** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Section/InvoiceDetailsInformationSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Section/InvoiceDetailsInformationSection.xml
new file mode 100644
index 00000000000..b1794d6d00f
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Section/InvoiceDetailsInformationSection.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
+    <section name="InvoiceDetailsInformationSection">
+        <element name="orderStatus" type="text" locator="#order_status"/>
+    </section>
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Section/InvoiceNewSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Section/InvoiceNewSection.xml
new file mode 100644
index 00000000000..6cbb05d4989
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Section/InvoiceNewSection.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
+    <section name="InvoiceNewSection">
+        <element name="submitInvoice" type="button" locator=".action-default.scalable.save.submit-button.primary"/>
+    </section>
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Section/InvoicesFiltersSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Section/InvoicesFiltersSection.xml
new file mode 100644
index 00000000000..1d3328fb1ed
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Section/InvoicesFiltersSection.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
+    <section name="InvoicesFiltersSection">
+        <element name="orderNum" type="input" locator="input[name='order_increment_id']"/>
+    </section>
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Section/InvoicesGridSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Section/InvoicesGridSection.xml
new file mode 100644
index 00000000000..275a4d3506d
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Section/InvoicesGridSection.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
+    <section name="InvoicesGridSection">
+        <element name="spinner" type="button" locator=".spinner"/>
+        <element name="filter" type="button" locator="#container > div > div.admin__data-grid-header > div:nth-child(1) > div.data-grid-filters-actions-wrap > div > button"/>
+        <element name="firstRow" type="button" locator="tr.data-row:nth-of-type(1)"/>
+    </section>
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Section/OrderDetailsInformationSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Section/OrderDetailsInformationSection.xml
new file mode 100644
index 00000000000..b080c4b2e2c
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Section/OrderDetailsInformationSection.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
+    <section name="OrderDetailsInformationSection">
+        <element name="orderStatus" type="text" locator="#order_status"/>
+        <element name="accountInformation" type="text" locator=".order-account-information-table"/>
+        <element name="billingAddress" type="text" locator=".order-billing-address"/>
+        <element name="shippingAddress" type="text" locator=".order-shipping-address"/>
+        <element name="itemsOrdered" type="text" locator=".edit-order-table"/>
+    </section>
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Section/OrderDetailsInvoicesSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Section/OrderDetailsInvoicesSection.xml
new file mode 100644
index 00000000000..a05231646ea
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Section/OrderDetailsInvoicesSection.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
+    <section name="OrderDetailsInvoicesSection">
+        <element name="spinner" type="button" locator=".spinner"/>
+        <element name="content" type="text" locator="#sales_order_view_tabs_order_invoices_content"/>
+    </section>
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Section/OrderDetailsMainActionsSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Section/OrderDetailsMainActionsSection.xml
new file mode 100644
index 00000000000..b9fb1751f03
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Section/OrderDetailsMainActionsSection.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
+    <section name="OrderDetailsMainActionsSection">
+        <element name="back" type="button" locator="#back"/>
+        <element name="cancel" type="button" locator="#order-view-cancel-button"/>
+        <element name="sendEmail" type="button" locator="#send_notification"/>
+        <element name="hold" type="button" locator="#order-view-hold-button"/>
+        <element name="invoice" type="button" locator="#order_invoice"/>
+        <element name="ship" type="button" locator="#order_ship"/>
+        <element name="reorder" type="button" locator="#order_reorder"/>
+        <element name="edit" type="button" locator="#order_edit"/>
+    </section>
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Section/OrderDetailsMessagesSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Section/OrderDetailsMessagesSection.xml
new file mode 100644
index 00000000000..2c1b25dd2c0
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Section/OrderDetailsMessagesSection.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
+    <section name="OrderDetailsMessagesSection">
+        <element name="successMessage" type="text" locator="div.message-success"/>
+    </section>
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Section/OrderDetailsOrderViewSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Section/OrderDetailsOrderViewSection.xml
new file mode 100644
index 00000000000..f17286060d8
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Section/OrderDetailsOrderViewSection.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
+    <section name="OrderDetailsOrderViewSection">
+        <element name="information" type="button" locator="#sales_order_view_tabs_order_info"/>
+        <element name="invoices" type="button" locator="#sales_order_view_tabs_order_invoices"/>
+    </section>
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Section/OrdersGridSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Section/OrdersGridSection.xml
new file mode 100644
index 00000000000..c5e5efe0d15
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Section/OrdersGridSection.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
+    <section name="OrdersGridSection">
+        <element name="spinner" type="button" locator=".spinner"/>
+        <element name="gridLoadingMask" type="button" locator=".admin__data-grid-loading-mask"/>
+        <element name="search" type="input" locator="#fulltext"/>
+        <element name="submitSearch" type="button" locator=".//*[@id='container']/div/div[2]/div[1]/div[2]/button"/>
+        <element name="submitSearch22" type="button" locator=".//*[@class=&quot;admin__data-grid-filters-wrap&quot;]/parent::*/div[@class=&quot;data-grid-search-control-wrap&quot;]/button"/>
+        <element name="firstRow" type="button" locator="tr.data-row:nth-of-type(1)"/>
+        <element name="createNewOrder" type="button" locator="button[title='Create New Order'"/>
+    </section>
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/composer.json
new file mode 100644
index 00000000000..5805b9a34c9
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/composer.json
@@ -0,0 +1,72 @@
+{
+    "name": "magento/magento2-functional-test-module-sales",
+    "description": "Magento 2 Acceptance Test Module Sales",
+    "repositories": [
+        {
+            "type" : "composer",
+            "url" : "https://repo.magento.com/"
+        }
+    ],
+    "require": {
+        "php": "~7.0",
+        "codeception/codeception": "2.2|2.3",
+        "allure-framework/allure-codeception": "dev-master",
+        "consolidation/robo": "^1.0.0",
+        "henrikbjorn/lurker": "^1.2",
+        "vlucas/phpdotenv": "~2.4",
+        "magento/magento2-functional-testing-framework": "dev-develop"
+    },
+    "suggest": {
+        "magento/magento2-functional-test-module-store": "dev-master",
+        "magento/magento2-functional-test-module-catalog": "dev-master",
+        "magento/magento2-functional-test-module-customer": "dev-master",
+        "magento/magento2-functional-test-module-authorization": "dev-master",
+        "magento/magento2-functional-test-module-payment": "dev-master",
+        "magento/magento2-functional-test-module-checkout": "dev-master",
+        "magento/magento2-functional-test-module-theme": "dev-master",
+        "magento/magento2-functional-test-module-sales-rule": "dev-master",
+        "magento/magento2-functional-test-module-sales-sequence": "dev-master",
+        "magento/magento2-functional-test-module-backend": "dev-master",
+        "magento/magento2-functional-test-module-widget": "dev-master",
+        "magento/magento2-functional-test-module-directory": "dev-master",
+        "magento/magento2-functional-test-module-eav": "dev-master",
+        "magento/magento2-functional-test-module-tax": "dev-master",
+        "magento/magento2-functional-test-module-gift-message": "dev-master",
+        "magento/magento2-functional-test-module-reports": "dev-master",
+        "magento/magento2-functional-test-module-catalog-inventory": "dev-master",
+        "magento/magento2-functional-test-module-wishlist": "dev-master",
+        "magento/magento2-functional-test-module-shipping": "dev-master",
+        "magento/magento2-functional-test-module-config": "dev-master",
+        "magento/magento2-functional-test-module-media-storage": "dev-master",
+        "magento/magento2-functional-test-module-ui": "dev-master",
+        "magento/magento2-functional-test-module-quote": "dev-master"
+    },
+    "type": "magento2-test-module",
+    "version": "dev-master",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
+    "autoload": {
+        "psr-0": {
+            "Yandex": "vendor/allure-framework/allure-codeception/src/"
+        },
+        "psr-4": {
+            "Magento\\FunctionalTestingFramework\\": [
+                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
+            ],
+            "Magento\\FunctionalTest\\": [
+                "tests/functional/Magento/FunctionalTest",
+                "generated/Magento/FunctionalTest"
+            ]
+        }
+    },
+    "extra": {
+        "map": [
+            [
+                "*",
+                "tests/functional/Magento/FunctionalTest/Sales"
+            ]
+        ]
+    }
+}
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesAnalytics/LICENSE.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesAnalytics/LICENSE.txt
new file mode 100644
index 00000000000..49525fd99da
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesAnalytics/LICENSE.txt
@@ -0,0 +1,48 @@
+
+Open Software License ("OSL") v. 3.0
+
+This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Open Software License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Open Software License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly. 
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including 'fair use' or 'fair dealing'). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright (C) 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesAnalytics/LICENSE_AFL.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesAnalytics/LICENSE_AFL.txt
new file mode 100644
index 00000000000..f39d641b18a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesAnalytics/LICENSE_AFL.txt
@@ -0,0 +1,48 @@
+
+Academic Free License ("AFL") v. 3.0
+
+This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Academic Free License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, under any license of your choice that does not contradict the terms and conditions, including Licensor's reserved rights and remedies, in this Academic Free License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly.
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including "fair use" or "fair dealing"). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright © 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Academic Free License" or "AFL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesAnalytics/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesAnalytics/README.md
new file mode 100644
index 00000000000..856eb7057f0
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesAnalytics/README.md
@@ -0,0 +1,3 @@
+# Magento 2 Acceptance Tests
+
+The Acceptance Tests Module for **Magento_SalesAnalytics** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesAnalytics/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesAnalytics/composer.json
new file mode 100644
index 00000000000..afba02c119a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesAnalytics/composer.json
@@ -0,0 +1,50 @@
+{
+    "name": "magento/magento2-functional-test-module-sales-analytics",
+    "description": "Magento 2 Acceptance Test Module Sales Analytics",
+    "repositories": [
+        {
+            "type" : "composer",
+            "url" : "https://repo.magento.com/"
+        }
+    ],
+    "require": {
+        "php": "~7.0",
+        "codeception/codeception": "2.2|2.3",
+        "allure-framework/allure-codeception": "dev-master",
+        "consolidation/robo": "^1.0.0",
+        "henrikbjorn/lurker": "^1.2",
+        "vlucas/phpdotenv": "~2.4",
+        "magento/magento2-functional-testing-framework": "dev-develop"
+    },
+    "suggest": {
+        "magento/magento2-functional-test-module-sales": "dev-master"
+    },
+    "type": "magento2-test-module",
+    "version": "dev-master",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
+    "autoload": {
+        "psr-0": {
+            "Yandex": "vendor/allure-framework/allure-codeception/src/"
+        },
+        "psr-4": {
+            "Magento\\FunctionalTestingFramework\\": [
+                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
+            ],
+            "Magento\\FunctionalTest\\": [
+                "tests/functional/Magento/FunctionalTest",
+                "generated/Magento/FunctionalTest"
+            ]
+        }
+    },
+    "extra": {
+        "map": [
+            [
+                "*",
+                "tests/functional/Magento/FunctionalTest/SalesAnalytics"
+            ]
+        ]
+    }
+}
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesInventory/LICENSE.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesInventory/LICENSE.txt
new file mode 100644
index 00000000000..49525fd99da
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesInventory/LICENSE.txt
@@ -0,0 +1,48 @@
+
+Open Software License ("OSL") v. 3.0
+
+This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Open Software License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Open Software License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly. 
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including 'fair use' or 'fair dealing'). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright (C) 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesInventory/LICENSE_AFL.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesInventory/LICENSE_AFL.txt
new file mode 100644
index 00000000000..f39d641b18a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesInventory/LICENSE_AFL.txt
@@ -0,0 +1,48 @@
+
+Academic Free License ("AFL") v. 3.0
+
+This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Academic Free License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, under any license of your choice that does not contradict the terms and conditions, including Licensor's reserved rights and remedies, in this Academic Free License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly.
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including "fair use" or "fair dealing"). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright © 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Academic Free License" or "AFL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesInventory/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesInventory/README.md
new file mode 100644
index 00000000000..a0d48d3c628
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesInventory/README.md
@@ -0,0 +1,3 @@
+# Magento 2 Acceptance Tests
+
+The Acceptance Tests Module for **Magento_SalesInventory** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesInventory/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesInventory/composer.json
new file mode 100644
index 00000000000..aec10499a86
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesInventory/composer.json
@@ -0,0 +1,53 @@
+{
+    "name": "magento/magento2-functional-test-module-sales-inventory",
+    "description": "Magento 2 Acceptance Test Module Sales Inventory",
+    "repositories": [
+        {
+            "type" : "composer",
+            "url" : "https://repo.magento.com/"
+        }
+    ],
+    "require": {
+        "php": "~7.0",
+        "codeception/codeception": "2.2|2.3",
+        "allure-framework/allure-codeception": "dev-master",
+        "consolidation/robo": "^1.0.0",
+        "henrikbjorn/lurker": "^1.2",
+        "vlucas/phpdotenv": "~2.4",
+        "magento/magento2-functional-testing-framework": "dev-develop"
+    },
+    "suggest": {
+        "magento/magento2-functional-test-module-catalog-inventory": "dev-master",
+        "magento/magento2-functional-test-module-sales": "dev-master",
+        "magento/magento2-functional-test-module-store": "dev-master",
+        "magento/magento2-functional-test-module-catalog": "dev-master"
+    },
+    "type": "magento2-test-module",
+    "version": "dev-master",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
+    "autoload": {
+        "psr-0": {
+            "Yandex": "vendor/allure-framework/allure-codeception/src/"
+        },
+        "psr-4": {
+            "Magento\\FunctionalTestingFramework\\": [
+                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
+            ],
+            "Magento\\FunctionalTest\\": [
+                "tests/functional/Magento/FunctionalTest",
+                "generated/Magento/FunctionalTest"
+            ]
+        }
+    },
+    "extra": {
+        "map": [
+            [
+                "*",
+                "tests/functional/Magento/FunctionalTest/SalesInventory"
+            ]
+        ]
+    }
+}
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesRule/LICENSE.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesRule/LICENSE.txt
new file mode 100644
index 00000000000..49525fd99da
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesRule/LICENSE.txt
@@ -0,0 +1,48 @@
+
+Open Software License ("OSL") v. 3.0
+
+This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Open Software License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Open Software License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly. 
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including 'fair use' or 'fair dealing'). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright (C) 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesRule/LICENSE_AFL.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesRule/LICENSE_AFL.txt
new file mode 100644
index 00000000000..f39d641b18a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesRule/LICENSE_AFL.txt
@@ -0,0 +1,48 @@
+
+Academic Free License ("AFL") v. 3.0
+
+This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Academic Free License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, under any license of your choice that does not contradict the terms and conditions, including Licensor's reserved rights and remedies, in this Academic Free License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly.
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including "fair use" or "fair dealing"). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright © 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Academic Free License" or "AFL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesRule/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesRule/README.md
new file mode 100644
index 00000000000..09f32aad688
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesRule/README.md
@@ -0,0 +1,3 @@
+# Magento 2 Acceptance Tests
+
+The Acceptance Tests Module for **Magento_SalesRule** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesRule/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesRule/composer.json
new file mode 100644
index 00000000000..dca57e5c344
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesRule/composer.json
@@ -0,0 +1,67 @@
+{
+    "name": "magento/magento2-functional-test-module-sales-rule",
+    "description": "Magento 2 Acceptance Test Module Sales Rule",
+    "repositories": [
+        {
+            "type" : "composer",
+            "url" : "https://repo.magento.com/"
+        }
+    ],
+    "require": {
+        "php": "~7.0",
+        "codeception/codeception": "2.2|2.3",
+        "allure-framework/allure-codeception": "dev-master",
+        "consolidation/robo": "^1.0.0",
+        "henrikbjorn/lurker": "^1.2",
+        "vlucas/phpdotenv": "~2.4",
+        "magento/magento2-functional-testing-framework": "dev-develop"
+    },
+    "suggest": {
+        "magento/magento2-functional-test-module-store": "dev-master",
+        "magento/magento2-functional-test-module-theme": "dev-master",
+        "magento/magento2-functional-test-module-backend": "dev-master",
+        "magento/magento2-functional-test-module-catalog": "dev-master",
+        "magento/magento2-functional-test-module-customer": "dev-master",
+        "magento/magento2-functional-test-module-checkout": "dev-master",
+        "magento/magento2-functional-test-module-shipping": "dev-master",
+        "magento/magento2-functional-test-module-sales": "dev-master",
+        "magento/magento2-functional-test-module-config": "dev-master",
+        "magento/magento2-functional-test-module-rule": "dev-master",
+        "magento/magento2-functional-test-module-eav": "dev-master",
+        "magento/magento2-functional-test-module-directory": "dev-master",
+        "magento/magento2-functional-test-module-payment": "dev-master",
+        "magento/magento2-functional-test-module-reports": "dev-master",
+        "magento/magento2-functional-test-module-catalog-rule": "dev-master",
+        "magento/magento2-functional-test-module-widget": "dev-master",
+        "magento/magento2-functional-test-module-quote": "dev-master",
+        "magento/magento2-functional-test-module-ui": "dev-master"
+    },
+    "type": "magento2-test-module",
+    "version": "dev-master",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
+    "autoload": {
+        "psr-0": {
+            "Yandex": "vendor/allure-framework/allure-codeception/src/"
+        },
+        "psr-4": {
+            "Magento\\FunctionalTestingFramework\\": [
+                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
+            ],
+            "Magento\\FunctionalTest\\": [
+                "tests/functional/Magento/FunctionalTest",
+                "generated/Magento/FunctionalTest"
+            ]
+        }
+    },
+    "extra": {
+        "map": [
+            [
+                "*",
+                "tests/functional/Magento/FunctionalTest/SalesRule"
+            ]
+        ]
+    }
+}
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesSequence/LICENSE.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesSequence/LICENSE.txt
new file mode 100644
index 00000000000..49525fd99da
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesSequence/LICENSE.txt
@@ -0,0 +1,48 @@
+
+Open Software License ("OSL") v. 3.0
+
+This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Open Software License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Open Software License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly. 
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including 'fair use' or 'fair dealing'). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright (C) 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesSequence/LICENSE_AFL.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesSequence/LICENSE_AFL.txt
new file mode 100644
index 00000000000..f39d641b18a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesSequence/LICENSE_AFL.txt
@@ -0,0 +1,48 @@
+
+Academic Free License ("AFL") v. 3.0
+
+This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Academic Free License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, under any license of your choice that does not contradict the terms and conditions, including Licensor's reserved rights and remedies, in this Academic Free License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly.
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including "fair use" or "fair dealing"). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright © 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Academic Free License" or "AFL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesSequence/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesSequence/README.md
new file mode 100644
index 00000000000..8dc5c1445cc
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesSequence/README.md
@@ -0,0 +1,3 @@
+# Magento 2 Acceptance Tests
+
+The Acceptance Tests Module for **Magento_SalesSequence** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesSequence/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesSequence/composer.json
new file mode 100644
index 00000000000..c395bbb71c5
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesSequence/composer.json
@@ -0,0 +1,47 @@
+{
+    "name": "magento/magento2-functional-test-module-sales-sequence",
+    "description": "Magento 2 Acceptance Test Module Sales Sequence",
+    "repositories": [
+        {
+            "type" : "composer",
+            "url" : "https://repo.magento.com/"
+        }
+    ],
+    "require": {
+        "php": "~7.0",
+        "codeception/codeception": "2.2|2.3",
+        "allure-framework/allure-codeception": "dev-master",
+        "consolidation/robo": "^1.0.0",
+        "henrikbjorn/lurker": "^1.2",
+        "vlucas/phpdotenv": "~2.4",
+        "magento/magento2-functional-testing-framework": "dev-develop"
+    },
+    "type": "magento2-test-module",
+    "version": "dev-master",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
+    "autoload": {
+        "psr-0": {
+            "Yandex": "vendor/allure-framework/allure-codeception/src/"
+        },
+        "psr-4": {
+            "Magento\\FunctionalTestingFramework\\": [
+                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
+            ],
+            "Magento\\FunctionalTest\\": [
+                "tests/functional/Magento/FunctionalTest",
+                "generated/Magento/FunctionalTest"
+            ]
+        }
+    },
+    "extra": {
+        "map": [
+            [
+                "*",
+                "tests/functional/Magento/FunctionalTest/SalesSequence"
+            ]
+        ]
+    }
+}
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleData/LICENSE.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleData/LICENSE.txt
new file mode 100644
index 00000000000..49525fd99da
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleData/LICENSE.txt
@@ -0,0 +1,48 @@
+
+Open Software License ("OSL") v. 3.0
+
+This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Open Software License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Open Software License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly. 
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including 'fair use' or 'fair dealing'). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright (C) 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleData/LICENSE_AFL.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleData/LICENSE_AFL.txt
new file mode 100644
index 00000000000..f39d641b18a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleData/LICENSE_AFL.txt
@@ -0,0 +1,48 @@
+
+Academic Free License ("AFL") v. 3.0
+
+This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Academic Free License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, under any license of your choice that does not contradict the terms and conditions, including Licensor's reserved rights and remedies, in this Academic Free License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly.
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including "fair use" or "fair dealing"). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright © 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Academic Free License" or "AFL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleData/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleData/README.md
new file mode 100644
index 00000000000..edcd1629bd5
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleData/README.md
@@ -0,0 +1,3 @@
+# Magento 2 Acceptance Tests
+
+The Acceptance Tests Module for **Magento_SampleData** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleData/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleData/composer.json
new file mode 100644
index 00000000000..ef30780208b
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleData/composer.json
@@ -0,0 +1,47 @@
+{
+    "name": "magento/magento2-functional-test-module-sample-data",
+    "description": "Magento 2 Acceptance Test Module Sample Data",
+    "repositories": [
+        {
+            "type" : "composer",
+            "url" : "https://repo.magento.com/"
+        }
+    ],
+    "require": {
+        "php": "~7.0",
+        "codeception/codeception": "2.2|2.3",
+        "allure-framework/allure-codeception": "dev-master",
+        "consolidation/robo": "^1.0.0",
+        "henrikbjorn/lurker": "^1.2",
+        "vlucas/phpdotenv": "~2.4",
+        "magento/magento2-functional-testing-framework": "dev-develop"
+    },
+    "type": "magento2-test-module",
+    "version": "dev-master",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
+    "autoload": {
+        "psr-0": {
+            "Yandex": "vendor/allure-framework/allure-codeception/src/"
+        },
+        "psr-4": {
+            "Magento\\FunctionalTestingFramework\\": [
+                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
+            ],
+            "Magento\\FunctionalTest\\": [
+                "tests/functional/Magento/FunctionalTest",
+                "generated/Magento/FunctionalTest"
+            ]
+        }
+    },
+    "extra": {
+        "map": [
+            [
+                "*",
+                "tests/functional/Magento/FunctionalTest/SampleData"
+            ]
+        ]
+    }
+}
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/MinimumTestCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/MinimumTestCest.xml
new file mode 100644
index 00000000000..4a5603e643c
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/MinimumTestCest.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Test XML Example -->
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Test/etc/testSchema.xsd">
+    <cest name="MinimumFieldsCest">
+        <annotations>
+            <features value="Minimum Test"/>
+            <stories value="Minimum Test"/>
+            <group value="example"/>
+            <env value="chrome"/>
+            <env value="firefox"/>
+            <env value="phantomjs"/>
+        </annotations>
+        <after>
+            <seeInCurrentUrl url="/admin/admin/" mergeKey="seeInCurrentUrl"/>
+        </after>
+        <test name="MinimumFieldsTest">
+            <annotations>
+                <title value="Minimum Test"/>
+                <description value="Minimum Test"/>
+            </annotations>
+            <amOnPage url="{{AdminLoginPage}}" mergeKey="navigateToAdmin"/>
+            <fillField selector="{{AdminLoginFormSection.username}}" userInput="{{_ENV.MAGENTO_ADMIN_USERNAME}}" mergeKey="fillUsername"/>
+            <fillField selector="{{AdminLoginFormSection.password}}" userInput="{{_ENV.MAGENTO_ADMIN_PASSWORD}}" mergeKey="fillPassword"/>
+            <click selector="{{AdminLoginFormSection.signIn}}" mergeKey="clickLogin"/>
+        </test>
+    </cest>
+</config>
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/PersistMultipleEntitiesCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/PersistMultipleEntitiesCest.xml
new file mode 100644
index 00000000000..59c47371b86
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/PersistMultipleEntitiesCest.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Test/etc/testSchema.xsd">
+    <cest name="PersistMultipleEntitiesCest">
+        <annotations>
+            <group value="ff"/>
+            <group value="skip"/>
+        </annotations>
+        <before>
+            <createData entity="simplesubcategory" mergeKey="simplecategory"/>
+            <entity name="categoryLink" type="custom_attribute" mergeKey="categoryLink">
+                <data key="attribute_code">category_ids</data>
+                <data key="value">$$simplecategory.id$$</data>
+            </entity>
+
+            <createData entity="simpleproduct" mergeKey="simpleproduct1">
+                <required-entity name="categoryLink"/>
+            </createData>
+            <createData entity="simpleproduct" mergeKey="simpleproduct2">
+                <required-entity name="categoryLink"/>
+            </createData>
+        </before>
+        <after>
+            <deleteData createDataKey="simpleproduct1" mergeKey="deleteProduct1"/>
+            <deleteData createDataKey="simpleproduct2" mergeKey="deleteProduct2"/>
+            <deleteData createDataKey="simplecategory" mergeKey="deleteCategory"/>
+        </after>
+        <test name="PersistMultipleEntitiesTest">
+            <amOnPage mergeKey="s11" url="/$$simplecategory.name$$.html" />
+            <waitForPageLoad mergeKey="s33"/>
+            <see mergeKey="s35" selector="{{StorefrontCategoryMainSection.productCount}}" userInput="2"/>
+        </test>
+    </cest>
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/SampleCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/SampleCest.xml
new file mode 100644
index 00000000000..92dd201812d
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/SampleCest.xml
@@ -0,0 +1,245 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Test XML Example -->
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Test/etc/testSchema.xsd">
+    <cest name="SampleGeneratorCest">
+        <annotations>
+            <features value="Test Generator"/>
+            <stories value="Verify each Codeception command is generated correctly."/>
+            <stories value="Verify each Custom command is generated correctly."/>
+            <group value="skip"/>
+        </annotations>
+        <before>
+            <amOnUrl url="http://127.0.0.1:32772/admin/" mergeKey="amOnPage"/>
+            <createData entity="CustomerEntity1" mergeKey="createData1"/>
+        </before>
+        <after>
+            <amOnUrl url="http://127.0.0.1:32772/admin/admin/auth/logout" mergeKey="amOnPage"/>
+            <deleteData createDataKey="createData1" mergeKey="deleteData1"/>
+        </after>
+        <test name="AllCodeceptionMethodsTest">
+            <annotations>
+                <title value="Create all Codeception methods"/>
+                <description value="Exercises the Generator to make sure it creates every Codeception method correctly."/>
+                <severity value="CRITICAL"/>
+                <testCaseId value="#"/>
+            </annotations>
+            <acceptPopup mergeKey="acceptPopup"/>
+            <amOnPage url="/admin" mergeKey="amOnPage"/>
+            <amOnSubdomain url="admin" mergeKey="amOnSubdomain"/>
+            <amOnUrl url="http://www.google.com/" mergeKey="amOnUrl"/>
+            <appendField userInput="More Words" selector=".stuff" mergeKey="appendField"/>
+            <attachFile userInput="filename.php" selector="#stuff" mergeKey="attachFile"/>
+            <cancelPopup mergeKey="cancelPopup"/>
+            <checkOption selector="#checkbox" mergeKey="checkOption"/>
+            <click selector="#button" userInput="Context" mergeKey="click1"/>
+            <click selectorArray="['link' => 'Login']" mergeKey="click2"/>
+            <click selectorArray="['link' => 'Login']" userInput="stuff" mergeKey="click3"/>
+            <click userInput="Click" mergeKey="click4"/>
+            <clickWithLeftButton selector="#clickHere" mergeKey="clickWithLeftButton1" x="23" y="324"/>
+            <clickWithLeftButton selectorArray="['css' => '.checkout']" mergeKey="clickWithLeftButton2" x="23" y="324"/>
+            <clickWithLeftButton mergeKey="clickWithLeftButton3" x="23" y="324"/>
+            <clickWithRightButton selector="#clickHere" mergeKey="clickWithRightButton1" x="23" y="324"/>
+            <clickWithRightButton selectorArray="['css' => '.checkout']" mergeKey="clickWithRightButton2" x="23" y="324"/>
+            <clickWithRightButton mergeKey="clickWithRightButton3" x="23" y="324"/>
+            <closeTab mergeKey="closeTab"/>
+            <createData entity="CustomerEntity1" mergeKey="createData1"/>
+            <deleteData createDataKey="createData1" mergeKey="deleteData1"/>
+            <dontSee userInput="Text" mergeKey="dontSee1"/>
+            <dontSee userInput="Text" selector=".title" mergeKey="dontSee2"/>
+            <dontSee userInput="Text" selectorArray="['css' => 'body h1']" mergeKey="dontSee3"/>
+            <dontSeeCheckboxIsChecked selector="#checkbox" mergeKey="dontSeeCheckboxIsChecked"/>
+            <dontSeeCookie userInput="cookieName" mergeKey="dontSeeCookie1"/>
+            <dontSeeCookie userInput="cookieName" parameterArray="['domainName' => 'stuff']" mergeKey="dontSeeCookie2"/>
+            <dontSeeCurrentUrlEquals url="/stuff" mergeKey="dontSeeCurrentUrlEquals"/>
+            <dontSeeCurrentUrlMatches url="~$/users/(\d+)~" mergeKey="dontSeeCurrentUrlMatches"/>
+            <dontSeeElement selector=".error" mergeKey="dontSeeElement1"/>
+            <dontSeeElement selector="input" parameterArray="['name' => 'login']" mergeKey="dontSeeElement2"/>
+            <dontSeeElementInDOM selector="#stuff" mergeKey="dontSeeElementInDOM1"/>
+            <dontSeeElementInDOM selector="#stuff" parameterArray="['name' => 'login']" mergeKey="dontSeeElementInDOM2"/>
+            <dontSeeInCurrentUrl url="/users/" mergeKey="dontSeeInCurrentUrl"/>
+            <dontSeeInField selector=".field" userInput="stuff" mergeKey="dontSeeInField1"/>
+            <dontSeeInField selectorArray="['name' => 'search']" userInput="Comment Here" mergeKey="dontSeeInField2"/>
+            <dontSeeInFormFields selector="form[name=myform]" parameterArray="['input1' => 'non-existent value', 'input2' => 'other non-existent value']" mergeKey="dontSeeInFormFields"/>
+            <dontSeeInPageSource userInput="Stuff in Page Source" mergeKey="dontSeeInPageSource"/>
+            <!--<dontSeeInSource html="<h1></h1>" mergeKey="dontSeeInSource"/>-->
+            <dontSeeInTitle userInput="Title" mergeKey="dontSeeInTitle"/>
+            <dontSeeLink userInput="Logout" mergeKey="dontSeeLink1"/>
+            <dontSeeLink userInput="Checkout" url="/store/cart.php" mergeKey="dontSeeLink2"/>
+            <dontSeeOptionIsSelected selector="#form .stuff" userInput="Option Name" mergeKey="dontSeeOptionIsSelected"/>
+            <doubleClick selector="#click .here" mergeKey="doubleClick"/>
+            <dragAndDrop selector1="#number1" selector2="#number2" mergeKey="dragAndDrop"/>
+            <executeInSelenium function="function(\Facebook\WebDriver\Remote\RemoteWebDriver $webdriver) {$webdriver->get('http://google.com');}" mergeKey="executeInSelenium"/>
+            <executeJS function="return $('#myField').val()" mergeKey="executeJS"/>
+            <fillField selector="#field" userInput="stuff" mergeKey="fillField1"/>
+            <fillField selectorArray="['name' => 'email']" userInput="stuff" mergeKey="fillField2"/>
+            <grabAttributeFrom returnVariable="title" selector="#target" userInput="title" mergeKey="grabAttributeFrom"/>
+            <grabCookie returnVariable="cookie" userInput="cookie" parameterArray="['domain' => 'www.google.com']" mergeKey="grabCookie"/>
+            <grabFromCurrentUrl returnVariable="uri" url="~$/user/(\d+)/~" mergeKey="grabFromCurrentUrl"/>
+            <grabMultiple returnVariable="multiple" selector="a" userInput="href" mergeKey="grabMultiple"/>
+            <grabPageSource returnVariable="pageSource" mergeKey="grabPageSource1"/>
+            <grabTextFrom returnVariable="text" selector="h1" mergeKey="grabTextFrom1"/>
+            <grabValueFrom returnVariable="value1" selector=".form" mergeKey="grabValueFrom1"/>
+            <grabValueFrom returnVariable="value2" selectorArray="['name' => 'username']" mergeKey="grabValueFrom2"/>
+            <loadSessionSnapshot userInput="stuff" mergeKey="loadSessionSnapshot1"/>
+            <loadSessionSnapshot returnVariable="snapshot" userInput="stuff" mergeKey="loadSessionSnapshot2"/>
+            <makeScreenshot userInput="ScreenshotName" mergeKey="makeScreenshot"/>
+            <maximizeWindow mergeKey="maximizeWindow"/>
+            <moveBack mergeKey="moveBack"/>
+            <moveForward mergeKey="moveForward"/>
+            <moveMouseOver selector="#stuff" mergeKey="moveMouseOver1"/>
+            <moveMouseOver selectorArray="['css' => '.checkout']" mergeKey="moveMouseOver2"/>
+            <moveMouseOver x="5" y="5" mergeKey="moveMouseOver3"/>
+            <moveMouseOver selector="#stuff" x="5" y="5" mergeKey="moveMouseOver4"/>
+            <moveMouseOver selectorArray="['css' => '.checkout']" x="5" y="5" mergeKey="moveMouseOver5"/>
+            <openNewTab mergeKey="openNewTab"/>
+            <pauseExecution mergeKey="pauseExecution"/>
+            <performOn selector=".rememberMe" function="function (WebDriver $I) { $I->see('Remember me next time'); $I->seeElement('#LoginForm_rememberMe'); $I->dontSee('Login'); }" mergeKey="performOn1"/>
+            <performOn selector=".rememberMe" function="ActionSequence::build()->see('Warning')->see('Are you sure you want to delete this?')->click('Yes')" mergeKey="performOn2"/>
+            <pressKey selector="#page" userInput="a" mergeKey="pressKey1"/>
+            <pressKey selector="#page" parameterArray="array('ctrl','a'),'new'" mergeKey="pressKey2"/>
+            <pressKey selector="#page" parameterArray="array('shift','111'),'1','x'" mergeKey="pressKey3"/>
+            <pressKey selector="#page" parameterArray="array('ctrl', 'a'), \Facebook\WebDriver\WebDriverKeys::DELETE" mergeKey="pressKey4"/>
+            <!--pressKey selector="descendant-or-self::*[@id='page']" userInput="u" mergeKey="pressKey5"/-->
+            <reloadPage mergeKey="reloadPage"/>
+            <resetCookie userInput="cookie" mergeKey="resetCookie1"/>
+            <resetCookie userInput="cookie" parameterArray="['domainName' => 'www.google.com']" mergeKey="resetCookie2"/>
+            <resizeWindow width="800" height="600" mergeKey="resizeWindow"/>
+            <saveSessionSnapshot userInput="stuff" mergeKey="saveSessionSnapshot"/>
+            <scrollTo selector="#place" x="20" y="50" mergeKey="scrollTo1"/>
+            <scrollTo selectorArray="['css' => '.checkout']" x="20" y="50" mergeKey="scrollTo2"/>
+            <see userInput="Stuff" mergeKey="see1"/>
+            <see userInput="More Stuff" selector=".stuff" mergeKey="see2"/>
+            <see userInput="More More Stuff" selectorArray="['css' => 'body h1']" mergeKey="see3"/>
+            <seeCheckboxIsChecked selector="#checkbox" mergeKey="seeCheckboxIsChecked"/>
+            <seeCookie userInput="PHPSESSID" mergeKey="seeCookie1"/>
+            <seeCookie userInput="PHPSESSID" parameterArray="['domainName' => 'www.google.com']" mergeKey="seeCookie2"/>
+            <seeCurrentUrlEquals url="/" mergeKey="seeCurrentUrlEquals"/>
+            <seeCurrentUrlMatches url="~$/users/(\d+)~" mergeKey="seeCurrentUrlMatches"/>
+            <seeElement selector=".error" mergeKey="seeElement1"/>
+            <seeElement selectorArray="['css' => 'form input']" mergeKey="seeElement2"/>
+            <seeElement selector=".error" parameterArray="['name' => 'login']" mergeKey="seeElement3"/>
+            <seeElement selectorArray="['css' => 'form input']" parameterArray="['name' => 'login']" mergeKey="seeElement4"/>
+            <seeElementInDOM selector="//form/input[type=hidden]" mergeKey="seeElementInDOM1"/>
+            <seeElementInDOM selector="//form/input[type=hidden]" parameterArray="['name' => 'form']" mergeKey="seeElementInDOM2"/>
+            <seeInCurrentUrl url="home" mergeKey="seeInCurrentUrl1"/>
+            <seeInCurrentUrl url="/home/" mergeKey="seeInCurrentUrl2"/>
+            <seeInField userInput="Stuff" selector="#field" mergeKey="seeInField1"/>
+            <seeInField userInput="Stuff" selectorArray="['name' => 'search']" mergeKey="seeInField2"/>
+            <seeInFormFields selector="form[name=myform]" parameterArray="['input1' => 'value','input2' => 'other value']" mergeKey="seeInFormFields1"/>
+            <seeInFormFields selector=".form-class" parameterArray="['multiselect' => ['value1','value2'],'checkbox[]' => ['a checked value','another checked value',]]" mergeKey="seeInFormFields2"/>
+            <!--<seeInPageSource html="<h1></h1>" mergeKey="seeInPageSource"/>-->
+            <seeInPopup userInput="Yes in Popup" mergeKey="seeInPopup"/>
+            <!--<seeInSource html="<h1></h1>" mergeKey="seeInSource"/>-->
+            <seeInTitle userInput="In Title" mergeKey="seeInTitle"/>
+            <seeLink userInput="Logout" mergeKey="seeLink1"/>
+            <seeLink userInput="Logout" url="/logout" mergeKey="seeLink2"/>
+            <seeNumberOfElements selector="tr" userInput="10" mergeKey="seeNumberOfElements1"/>
+            <seeNumberOfElements selector="tr" userInput="[0, 10]" mergeKey="seeNumberOfElements2"/>
+            <seeOptionIsSelected selector=".option" userInput="Visa" mergeKey="seeOptionIsSelected"/>
+            <selectOption selector=".dropDown" userInput="Option Name" mergeKey="selectOption1"/>
+            <selectOption selector="//form/select[@name=account]" parameterArray="array('Windows','Linux')" mergeKey="selectOption2"/>
+            <selectOption selector="Which OS do you use?" parameterArray="array('text' => 'Windows')" mergeKey="selectOption3"/>
+            <setCookie userInput="PHPSESSID" value="stuff" mergeKey="setCookie1"/>
+            <setCookie userInput="PHPSESSID" value="stuff" parameterArray="['domainName' => 'www.google.com']" mergeKey="setCookie2"/>
+            <submitForm selector="#my-form" parameterArray="['field' => ['value','another value',]]" button="#submit" mergeKey="submitForm2"/>
+            <switchToIFrame mergeKey="switchToIFrame1"/>
+            <switchToIFrame userInput="another_frame" mergeKey="switchToIFrame2"/>
+            <switchToNextTab mergeKey="switchToNextTab1"/>
+            <switchToNextTab userInput="2" mergeKey="switchToNextTab2"/>
+            <switchToPreviousTab mergeKey="switchToPreviewTab1"/>
+            <switchToPreviousTab userInput="1" mergeKey="switchToPreviewTab2"/>
+            <switchToWindow mergeKey="switchToWindow1"/>
+            <switchToWindow userInput="another_window" mergeKey="switchToWindow2"/>
+            <typeInPopup userInput="Stuff for popup" mergeKey="typeInPopup"/>
+            <uncheckOption selector="#option" mergeKey="uncheckOption"/>
+            <unselectOption selector="#dropDown" userInput="Option" mergeKey="unselectOption"/>
+            <wait time="15" mergeKey="wait"/>
+            <waitForElement selector="#button" time="10" mergeKey="waitForElement"/>
+            <waitForElementChange selector="#menu" function="function(\WebDriverElement $el) {return $el->isDisplayed();}" time="100" mergeKey="waitForElementChange"/>
+            <waitForElementNotVisible selector="#a_thing .className" time="30" mergeKey="waitForElementNotVisible"/>
+            <waitForElementVisible selector="#a_thing .className" time="15" mergeKey="waitForElementVisible"/>
+            <waitForJS function="return $.active == 0;" time="30" mergeKey="waitForJS"/>
+            <waitForText userInput="foo" time="30" mergeKey="waitForText1"/>
+            <waitForText userInput="foo" selector=".title" time="30" mergeKey="waitForText2"/>
+        </test>
+        <test name="AllCustomMethodsTest">
+            <annotations>
+                <title value="Create all Custom methods"/>
+                <description value="Exercises the Generator to make sure it creates every Custom method correctly."/>
+                <severity value="CRITICAL"/>
+                <testCaseId value="#"/>
+            </annotations>
+            <loginAsAdmin mergeKey="loginAsAdmin1"/>
+            <loginAsAdmin username="admin" password="123123q" mergeKey="loginAsAdmin2"/>
+            <closeAdminNotification mergeKey="closeAdminNotification1"/>
+            <searchAndMultiSelectOption selector="#stuff" parameterArray="['Item 1', 'Item 2']" mergeKey="searchAndMultiSelect1"/>
+            <searchAndMultiSelectOption selector="#stuff" parameterArray="['Item 1', 'Item 2']" requiredAction="true" mergeKey="searchAndMultiSelect2"/>
+            <waitForPageLoad mergeKey="waitForPageLoad1"/>
+            <waitForPageLoad time="15" mergeKey="waitForPageLoad2"/>
+            <waitForAjaxLoad mergeKey="waitForAjax1"/>
+            <waitForAjaxLoad time="15" mergeKey="waitForAjax2"/>
+            <dontSeeJsError mergeKey="dontSeeJsError"/>
+            <formatMoney userInput="$300,000" mergeKey="formatMoney1"/>
+            <formatMoney userInput="$300,000" locale="en_US.UTF-8" mergeKey="formatMoney2"/>
+            <mSetLocale userInput="300" locale="en_US.UTF-8" mergeKey="mSetLocale1"/>
+            <mResetLocale mergeKey="mResetLocale1"/>
+            <waitForLoadingMaskToDisappear mergeKey="waitForLoadingMaskToDisappear1"/>
+            <scrollToTopOfPage mergeKey="scrollToTopOfPage"/>
+            <parseFloat userInput="300,000.2325" mergeKey="parseFloat1"/>
+        </test>
+        <test name="AllVariableMethodsTest">
+            <annotations>
+                <title value="Create all Methods that support Variables."/>
+                <description value="Exercises the Generator to make sure it creates every Method that supports a Variable."/>
+                <severity value="CRITICAL"/>
+                <testCaseId value="#"/>
+            </annotations>
+            <grabFromCurrentUrl returnVariable="randomStuff" mergeKey="grabFromCurrentUrl1"/>
+            <amOnPage variable="randomStuff" mergeKey="amOnPage1"/>
+            <amOnSubdomain variable="randomStuff" mergeKey="amOnSubdomain1"/>
+            <amOnUrl variable="randomStuff" mergeKey="amOnUrl1"/>
+            <appendField variable="randomStuff" selector="#randomField" mergeKey="appendField1"/>
+            <attachFile variable="randomStuff" selector="#filePathField" mergeKey="attachFile1"/>
+            <click variable="randomStuff" mergeKey="click1"/>
+            <dontSee variable="randomStuff" mergeKey="dontSee1"/>
+            <dontSeeCookie variable="randomStuff" mergeKey="dontSeeCookie1"/>
+            <dontSeeCurrentUrlEquals variable="randomStuff" mergeKey="dontSeeCurrentUrlEquals1"/>
+            <dontSeeCurrentUrlMatches variable="randomStuff" mergeKey="dontSeeCurrentUrlMatches1"/>
+            <dontSeeInCurrentUrl variable="randomStuff" mergeKey="dontSeeInCurrentUrl1"/>
+            <dontSeeInField selector="#stuff" variable="randomStuff" mergeKey="dontSeeInField1"/>
+            <dontSeeInPageSource variable="randomStuff" mergeKey="dontSeeInPageSource1"/>
+            <dontSeeInTitle variable="randomStuff" mergeKey="dontSeeInTitle1"/>
+            <dontSeeLink variable="randomStuff" mergeKey="dontSeeLink1"/>
+            <dontSeeOptionIsSelected selector="#dropdown" variable="randomStuff" mergeKey="dontSeeOptionIsSelected1"/>
+            <fillField variable="randomStuff" selector="#field" mergeKey="fillField1"/>
+            <grabAttributeFrom selector="#stuff" returnVariable="moreRandomStuff" variable="randomStuff" mergeKey="grabAttributeFrom1"/>
+            <grabCookie returnVariable="cookies" variable="randomStuff" mergeKey="grabValueFrom1"/>
+            <grabFromCurrentUrl returnVariable="url" variable="randomStuff" mergeKey="grabFromCurrentUrl"/>
+            <grabMultiple returnVariable="multipleThings" selector="a" variable="randomStuff" mergeKey="grabMultiple1"/>
+            <loadSessionSnapshot variable="randomStuff" mergeKey="loadSessionSnapshot"/>
+            <pressKey selector="a" variable="randomStuff" mergeKey="pressKey1"/>
+            <saveSessionSnapshot variable="randomStuff" mergeKey="saveSessionSnapshot1"/>
+            <see variable="randomStuff" mergeKey="see1"/>
+            <seeCookie variable="randomStuff" mergeKey="seeCookie1"/>
+            <seeCurrentUrlEquals variable="randomStuff" mergeKey="seeCurrentUrlEquals1"/>
+            <seeCurrentUrlMatches variable="randomStuff" mergeKey="seeCurrentUrlMatches1"/>
+            <seeInCurrentUrl variable="randomStuff" mergeKey="seeInCurrentUrl1"/>
+            <seeInField selector="a" variable="randomStuff" mergeKey="seeInField1"/>
+            <seeInPopup variable="randomStuff" mergeKey="seeInPopup"/>
+            <seeInTitle variable="randomStuff" mergeKey="seeInTitle1"/>
+            <seeLink variable="randomStuff" mergeKey="seeLink1"/>
+            <seeNumberOfElements selector="#stuff" variable="randomStuff" mergeKey="seeNumberOfElements1"/>
+            <seeOptionIsSelected selector="#stuff" variable="randomStuff" mergeKey="seeOptionIsSelected1"/>
+            <selectOption selector="#stuff" variable="randomStuff" mergeKey="selectOption1"/>
+            <switchToIFrame variable="randomStuff" mergeKey="switchToIFrame1"/>
+            <switchToNextTab variable="randomStuff" mergeKey="switchToNextTab1"/>
+            <switchToPreviousTab variable="randomStuff" mergeKey="switchToPreviousTab1"/>
+            <switchToNextTab variable="randomStuff" mergeKey="switchToNextTab1"/>
+            <switchToWindow variable="randomStuff" mergeKey="switchToWindow1"/>
+            <typeInPopup variable="randomStuff" mergeKey="typeInPopup"/>
+            <unselectOption selector="#option" variable="randomStuff" mergeKey="unselectOption1"/>
+            <waitForText variable="randomStuff" time="5" mergeKey="waitForText1"/>
+        </test>
+    </cest>
+</config>
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Templates/TemplateCestFile.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Templates/TemplateCestFile.xml
new file mode 100644
index 00000000000..7ee5e2dfbc6
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Templates/TemplateCestFile.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Test/etc/testSchema.xsd">
+    <cest name="">
+        <annotations>
+            <features value=""/>
+            <stories value=""/>
+            <group value=""/>
+            <env value=""/>
+        </annotations>
+        <before>
+
+        </before>
+        <after>
+
+        </after>
+        <test name="">
+            <annotations>
+                <title value=""/>
+                <description value=""/>
+                <severity value=""/>
+                <testCaseId value=""/>
+            </annotations>
+        </test>
+    </cest>
+</config>
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Templates/TemplateDataFile.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Templates/TemplateDataFile.xml
new file mode 100644
index 00000000000..3682b7569fc
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Templates/TemplateDataFile.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataProfileSchema.xsd">
+    <entity name="" type="">
+        <data key=""></data>
+    </entity>
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Templates/TemplateMetaDataFile.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Templates/TemplateMetaDataFile.xml
new file mode 100644
index 00000000000..952665b0323
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Templates/TemplateMetaDataFile.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataOperation.xsd">
+    <operation name="" dataType="" type="" auth="" url="" method="">
+        <header param="">application/json</header>
+        <param key="" type="">{}</param>
+        <jsonObject dataType="" key="">
+            <entry key=""></entry>
+            <array key="">
+                <value></value>
+            </array>
+        </jsonObject>
+        <entry key=""></entry>
+    </operation>
+</config>
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Templates/TemplatePageFile.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Templates/TemplatePageFile.xml
new file mode 100644
index 00000000000..b165e990203
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Templates/TemplatePageFile.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/PageObject.xsd">
+    <page name="" urlPath="" module="">
+        <section name=""/>
+    </page>
+</config>
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Templates/TemplateSectionFile.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Templates/TemplateSectionFile.xml
new file mode 100644
index 00000000000..c6e284f7607
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Templates/TemplateSectionFile.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
+    <section name="">
+        <element name="" type="" locator=""/>
+    </section>
+</config>
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Search/LICENSE.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Search/LICENSE.txt
new file mode 100644
index 00000000000..49525fd99da
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Search/LICENSE.txt
@@ -0,0 +1,48 @@
+
+Open Software License ("OSL") v. 3.0
+
+This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Open Software License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Open Software License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly. 
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including 'fair use' or 'fair dealing'). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright (C) 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Search/LICENSE_AFL.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Search/LICENSE_AFL.txt
new file mode 100644
index 00000000000..f39d641b18a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Search/LICENSE_AFL.txt
@@ -0,0 +1,48 @@
+
+Academic Free License ("AFL") v. 3.0
+
+This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Academic Free License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, under any license of your choice that does not contradict the terms and conditions, including Licensor's reserved rights and remedies, in this Academic Free License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly.
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including "fair use" or "fair dealing"). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright © 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Academic Free License" or "AFL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Search/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Search/README.md
new file mode 100644
index 00000000000..17d37794fb0
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Search/README.md
@@ -0,0 +1,3 @@
+# Magento 2 Acceptance Tests
+
+The Acceptance Tests Module for **Magento_Search** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Search/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Search/composer.json
new file mode 100644
index 00000000000..ef78fc2a19c
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Search/composer.json
@@ -0,0 +1,54 @@
+{
+    "name": "magento/magento2-functional-test-module-search",
+    "description": "Magento 2 Acceptance Test Module Search",
+    "repositories": [
+        {
+            "type" : "composer",
+            "url" : "https://repo.magento.com/"
+        }
+    ],
+    "require": {
+        "php": "~7.0",
+        "codeception/codeception": "2.2|2.3",
+        "allure-framework/allure-codeception": "dev-master",
+        "consolidation/robo": "^1.0.0",
+        "henrikbjorn/lurker": "^1.2",
+        "vlucas/phpdotenv": "~2.4",
+        "magento/magento2-functional-testing-framework": "dev-develop"
+    },
+    "suggest": {
+        "magento/magento2-functional-test-module-store": "dev-master",
+        "magento/magento2-functional-test-module-backend": "dev-master",
+        "magento/magento2-functional-test-module-catalog-search": "dev-master",
+        "magento/magento2-functional-test-module-reports": "dev-master",
+        "magento/magento2-functional-test-module-ui": "dev-master"
+    },
+    "type": "magento2-test-module",
+    "version": "dev-master",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
+    "autoload": {
+        "psr-0": {
+            "Yandex": "vendor/allure-framework/allure-codeception/src/"
+        },
+        "psr-4": {
+            "Magento\\FunctionalTestingFramework\\": [
+                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
+            ],
+            "Magento\\FunctionalTest\\": [
+                "tests/functional/Magento/FunctionalTest",
+                "generated/Magento/FunctionalTest"
+            ]
+        }
+    },
+    "extra": {
+        "map": [
+            [
+                "*",
+                "tests/functional/Magento/FunctionalTest/Search"
+            ]
+        ]
+    }
+}
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Security/LICENSE.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Security/LICENSE.txt
new file mode 100644
index 00000000000..49525fd99da
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Security/LICENSE.txt
@@ -0,0 +1,48 @@
+
+Open Software License ("OSL") v. 3.0
+
+This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Open Software License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Open Software License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly. 
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including 'fair use' or 'fair dealing'). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright (C) 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Security/LICENSE_AFL.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Security/LICENSE_AFL.txt
new file mode 100644
index 00000000000..f39d641b18a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Security/LICENSE_AFL.txt
@@ -0,0 +1,48 @@
+
+Academic Free License ("AFL") v. 3.0
+
+This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Academic Free License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, under any license of your choice that does not contradict the terms and conditions, including Licensor's reserved rights and remedies, in this Academic Free License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly.
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including "fair use" or "fair dealing"). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright © 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Academic Free License" or "AFL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Security/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Security/README.md
new file mode 100644
index 00000000000..2507ca55e06
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Security/README.md
@@ -0,0 +1,3 @@
+# Magento 2 Acceptance Tests
+
+The Acceptance Tests Module for **Magento_Security** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Security/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Security/composer.json
new file mode 100644
index 00000000000..0490f148385
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Security/composer.json
@@ -0,0 +1,51 @@
+{
+    "name": "magento/magento2-functional-test-module-security",
+    "description": "Magento 2 Acceptance Test Module Security",
+    "repositories": [
+        {
+            "type" : "composer",
+            "url" : "https://repo.magento.com/"
+        }
+    ],
+    "require": {
+        "php": "~7.0",
+        "codeception/codeception": "2.2|2.3",
+        "allure-framework/allure-codeception": "dev-master",
+        "consolidation/robo": "^1.0.0",
+        "henrikbjorn/lurker": "^1.2",
+        "vlucas/phpdotenv": "~2.4",
+        "magento/magento2-functional-testing-framework": "dev-develop"
+    },
+    "suggest": {
+        "magento/magento2-functional-test-module-store": "dev-master",
+        "magento/magento2-functional-test-module-backend": "dev-master"
+    },
+    "type": "magento2-test-module",
+    "version": "dev-master",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
+    "autoload": {
+        "psr-0": {
+            "Yandex": "vendor/allure-framework/allure-codeception/src/"
+        },
+        "psr-4": {
+            "Magento\\FunctionalTestingFramework\\": [
+                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
+            ],
+            "Magento\\FunctionalTest\\": [
+                "tests/functional/Magento/FunctionalTest",
+                "generated/Magento/FunctionalTest"
+            ]
+        }
+    },
+    "extra": {
+        "map": [
+            [
+                "*",
+                "tests/functional/Magento/FunctionalTest/Security"
+            ]
+        ]
+    }
+}
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SendFriend/LICENSE.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SendFriend/LICENSE.txt
new file mode 100644
index 00000000000..49525fd99da
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SendFriend/LICENSE.txt
@@ -0,0 +1,48 @@
+
+Open Software License ("OSL") v. 3.0
+
+This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Open Software License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Open Software License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly. 
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including 'fair use' or 'fair dealing'). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright (C) 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SendFriend/LICENSE_AFL.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SendFriend/LICENSE_AFL.txt
new file mode 100644
index 00000000000..f39d641b18a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SendFriend/LICENSE_AFL.txt
@@ -0,0 +1,48 @@
+
+Academic Free License ("AFL") v. 3.0
+
+This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Academic Free License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, under any license of your choice that does not contradict the terms and conditions, including Licensor's reserved rights and remedies, in this Academic Free License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly.
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including "fair use" or "fair dealing"). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright © 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Academic Free License" or "AFL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SendFriend/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SendFriend/README.md
new file mode 100644
index 00000000000..00d818d2406
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SendFriend/README.md
@@ -0,0 +1,3 @@
+# Magento 2 Acceptance Tests
+
+The Acceptance Tests Module for **Magento_SendFriend** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SendFriend/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SendFriend/composer.json
new file mode 100644
index 00000000000..4dbd07d2aef
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SendFriend/composer.json
@@ -0,0 +1,52 @@
+{
+    "name": "magento/magento2-functional-test-module-send-friend",
+    "description": "Magento 2 Acceptance Test Module Send Friend",
+    "repositories": [
+        {
+            "type" : "composer",
+            "url" : "https://repo.magento.com/"
+        }
+    ],
+    "require": {
+        "php": "~7.0",
+        "codeception/codeception": "2.2|2.3",
+        "allure-framework/allure-codeception": "dev-master",
+        "consolidation/robo": "^1.0.0",
+        "henrikbjorn/lurker": "^1.2",
+        "vlucas/phpdotenv": "~2.4",
+        "magento/magento2-functional-testing-framework": "dev-develop"
+    },
+    "suggest": {
+        "magento/magento2-functional-test-module-store": "dev-master",
+        "magento/magento2-functional-test-module-catalog": "dev-master",
+        "magento/magento2-functional-test-module-customer": "dev-master"
+    },
+    "type": "magento2-test-module",
+    "version": "dev-master",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
+    "autoload": {
+        "psr-0": {
+            "Yandex": "vendor/allure-framework/allure-codeception/src/"
+        },
+        "psr-4": {
+            "Magento\\FunctionalTestingFramework\\": [
+                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
+            ],
+            "Magento\\FunctionalTest\\": [
+                "tests/functional/Magento/FunctionalTest",
+                "generated/Magento/FunctionalTest"
+            ]
+        }
+    },
+    "extra": {
+        "map": [
+            [
+                "*",
+                "tests/functional/Magento/FunctionalTest/SendFriend"
+            ]
+        ]
+    }
+}
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Shipping/LICENSE.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Shipping/LICENSE.txt
new file mode 100644
index 00000000000..49525fd99da
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Shipping/LICENSE.txt
@@ -0,0 +1,48 @@
+
+Open Software License ("OSL") v. 3.0
+
+This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Open Software License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Open Software License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly. 
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including 'fair use' or 'fair dealing'). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright (C) 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Shipping/LICENSE_AFL.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Shipping/LICENSE_AFL.txt
new file mode 100644
index 00000000000..f39d641b18a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Shipping/LICENSE_AFL.txt
@@ -0,0 +1,48 @@
+
+Academic Free License ("AFL") v. 3.0
+
+This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Academic Free License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, under any license of your choice that does not contradict the terms and conditions, including Licensor's reserved rights and remedies, in this Academic Free License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly.
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including "fair use" or "fair dealing"). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright © 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Academic Free License" or "AFL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Shipping/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Shipping/README.md
new file mode 100644
index 00000000000..fbca31f68ed
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Shipping/README.md
@@ -0,0 +1,3 @@
+# Magento 2 Acceptance Tests
+
+The Acceptance Tests Module for **Magento_Shipping** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Shipping/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Shipping/composer.json
new file mode 100644
index 00000000000..e4ad63928ad
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Shipping/composer.json
@@ -0,0 +1,62 @@
+{
+    "name": "magento/magento2-functional-test-module-shipping",
+    "description": "Magento 2 Acceptance Test Module Shipping",
+    "repositories": [
+        {
+            "type" : "composer",
+            "url" : "https://repo.magento.com/"
+        }
+    ],
+    "require": {
+        "php": "~7.0",
+        "codeception/codeception": "2.2|2.3",
+        "allure-framework/allure-codeception": "dev-master",
+        "consolidation/robo": "^1.0.0",
+        "henrikbjorn/lurker": "^1.2",
+        "vlucas/phpdotenv": "~2.4",
+        "magento/magento2-functional-testing-framework": "dev-develop"
+    },
+    "suggest": {
+        "magento/magento2-functional-test-module-store": "dev-master",
+        "magento/magento2-functional-test-module-catalog": "dev-master",
+        "magento/magento2-functional-test-module-sales": "dev-master",
+        "magento/magento2-functional-test-module-backend": "dev-master",
+        "magento/magento2-functional-test-module-directory": "dev-master",
+        "magento/magento2-functional-test-module-contact": "dev-master",
+        "magento/magento2-functional-test-module-customer": "dev-master",
+        "magento/magento2-functional-test-module-payment": "dev-master",
+        "magento/magento2-functional-test-module-tax": "dev-master",
+        "magento/magento2-functional-test-module-catalog-inventory": "dev-master",
+        "magento/magento2-functional-test-module-quote": "dev-master",
+        "magento/magento2-functional-test-module-ui": "dev-master",
+        "magento/magento2-functional-test-module-user": "dev-master"
+    },
+    "type": "magento2-test-module",
+    "version": "dev-master",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
+    "autoload": {
+        "psr-0": {
+            "Yandex": "vendor/allure-framework/allure-codeception/src/"
+        },
+        "psr-4": {
+            "Magento\\FunctionalTestingFramework\\": [
+                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
+            ],
+            "Magento\\FunctionalTest\\": [
+                "tests/functional/Magento/FunctionalTest",
+                "generated/Magento/FunctionalTest"
+            ]
+        }
+    },
+    "extra": {
+        "map": [
+            [
+                "*",
+                "tests/functional/Magento/FunctionalTest/Shipping"
+            ]
+        ]
+    }
+}
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sitemap/LICENSE.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sitemap/LICENSE.txt
new file mode 100644
index 00000000000..49525fd99da
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sitemap/LICENSE.txt
@@ -0,0 +1,48 @@
+
+Open Software License ("OSL") v. 3.0
+
+This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Open Software License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Open Software License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly. 
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including 'fair use' or 'fair dealing'). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright (C) 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sitemap/LICENSE_AFL.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sitemap/LICENSE_AFL.txt
new file mode 100644
index 00000000000..f39d641b18a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sitemap/LICENSE_AFL.txt
@@ -0,0 +1,48 @@
+
+Academic Free License ("AFL") v. 3.0
+
+This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Academic Free License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, under any license of your choice that does not contradict the terms and conditions, including Licensor's reserved rights and remedies, in this Academic Free License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly.
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including "fair use" or "fair dealing"). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright © 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Academic Free License" or "AFL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sitemap/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sitemap/README.md
new file mode 100644
index 00000000000..cc89e5a0bce
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sitemap/README.md
@@ -0,0 +1,3 @@
+# Magento 2 Acceptance Tests
+
+The Acceptance Tests Module for **Magento_Sitemap** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sitemap/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sitemap/composer.json
new file mode 100644
index 00000000000..9b7f0c3e184
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sitemap/composer.json
@@ -0,0 +1,58 @@
+{
+    "name": "magento/magento2-functional-test-module-sitemap",
+    "description": "Magento 2 Acceptance Test Module Sitemap",
+    "repositories": [
+        {
+            "type" : "composer",
+            "url" : "https://repo.magento.com/"
+        }
+    ],
+    "require": {
+        "php": "~7.0",
+        "codeception/codeception": "2.2|2.3",
+        "allure-framework/allure-codeception": "dev-master",
+        "consolidation/robo": "^1.0.0",
+        "henrikbjorn/lurker": "^1.2",
+        "vlucas/phpdotenv": "~2.4",
+        "magento/magento2-functional-testing-framework": "dev-develop"
+    },
+    "suggest": {
+        "magento/magento2-functional-test-module-store": "dev-master",
+        "magento/magento2-functional-test-module-catalog": "dev-master",
+        "magento/magento2-functional-test-module-eav": "dev-master",
+        "magento/magento2-functional-test-module-cms": "dev-master",
+        "magento/magento2-functional-test-module-backend": "dev-master",
+        "magento/magento2-functional-test-module-catalog-url-rewrite": "dev-master",
+        "magento/magento2-functional-test-module-media-storage": "dev-master",
+        "magento/magento2-functional-test-module-config": "dev-master",
+        "magento/magento2-functional-test-module-robots": "dev-master"
+    },
+    "type": "magento2-test-module",
+    "version": "dev-master",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
+    "autoload": {
+        "psr-0": {
+            "Yandex": "vendor/allure-framework/allure-codeception/src/"
+        },
+        "psr-4": {
+            "Magento\\FunctionalTestingFramework\\": [
+                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
+            ],
+            "Magento\\FunctionalTest\\": [
+                "tests/functional/Magento/FunctionalTest",
+                "generated/Magento/FunctionalTest"
+            ]
+        }
+    },
+    "extra": {
+        "map": [
+            [
+                "*",
+                "tests/functional/Magento/FunctionalTest/Sitemap"
+            ]
+        ]
+    }
+}
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/LICENSE.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/LICENSE.txt
new file mode 100644
index 00000000000..49525fd99da
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/LICENSE.txt
@@ -0,0 +1,48 @@
+
+Open Software License ("OSL") v. 3.0
+
+This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Open Software License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Open Software License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly. 
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including 'fair use' or 'fair dealing'). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright (C) 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/LICENSE_AFL.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/LICENSE_AFL.txt
new file mode 100644
index 00000000000..f39d641b18a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/LICENSE_AFL.txt
@@ -0,0 +1,48 @@
+
+Academic Free License ("AFL") v. 3.0
+
+This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Academic Free License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, under any license of your choice that does not contradict the terms and conditions, including Licensor's reserved rights and remedies, in this Academic Free License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly.
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including "fair use" or "fair dealing"). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright © 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Academic Free License" or "AFL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/README.md
new file mode 100644
index 00000000000..108f407dd44
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/README.md
@@ -0,0 +1,3 @@
+# Magento 2 Acceptance Tests
+
+The Acceptance Tests Module for **Magento_Store** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/composer.json
new file mode 100644
index 00000000000..084ebb97b11
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/composer.json
@@ -0,0 +1,54 @@
+{
+    "name": "magento/magento2-functional-test-module-store",
+    "description": "Magento 2 Acceptance Test Module Store",
+    "repositories": [
+        {
+            "type" : "composer",
+            "url" : "https://repo.magento.com/"
+        }
+    ],
+    "require": {
+        "php": "~7.0",
+        "codeception/codeception": "2.2|2.3",
+        "allure-framework/allure-codeception": "dev-master",
+        "consolidation/robo": "^1.0.0",
+        "henrikbjorn/lurker": "^1.2",
+        "vlucas/phpdotenv": "~2.4",
+        "magento/magento2-functional-testing-framework": "dev-develop"
+    },
+    "suggest": {
+        "magento/magento2-functional-test-module-directory": "dev-master",
+        "magento/magento2-functional-test-module-catalog": "dev-master",
+        "magento/magento2-functional-test-module-ui": "dev-master",
+        "magento/magento2-functional-test-module-config": "dev-master",
+        "magento/magento2-functional-test-module-media-storage": "dev-master"
+    },
+    "type": "magento2-test-module",
+    "version": "dev-master",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
+    "autoload": {
+        "psr-0": {
+            "Yandex": "vendor/allure-framework/allure-codeception/src/"
+        },
+        "psr-4": {
+            "Magento\\FunctionalTestingFramework\\": [
+                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
+            ],
+            "Magento\\FunctionalTest\\": [
+                "tests/functional/Magento/FunctionalTest",
+                "generated/Magento/FunctionalTest"
+            ]
+        }
+    },
+    "extra": {
+        "map": [
+            [
+                "*",
+                "tests/functional/Magento/FunctionalTest/Store"
+            ]
+        ]
+    }
+}
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Swagger/LICENSE.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Swagger/LICENSE.txt
new file mode 100644
index 00000000000..49525fd99da
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Swagger/LICENSE.txt
@@ -0,0 +1,48 @@
+
+Open Software License ("OSL") v. 3.0
+
+This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Open Software License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Open Software License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly. 
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including 'fair use' or 'fair dealing'). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright (C) 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Swagger/LICENSE_AFL.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Swagger/LICENSE_AFL.txt
new file mode 100644
index 00000000000..f39d641b18a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Swagger/LICENSE_AFL.txt
@@ -0,0 +1,48 @@
+
+Academic Free License ("AFL") v. 3.0
+
+This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Academic Free License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, under any license of your choice that does not contradict the terms and conditions, including Licensor's reserved rights and remedies, in this Academic Free License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly.
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including "fair use" or "fair dealing"). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright © 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Academic Free License" or "AFL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Swagger/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Swagger/README.md
new file mode 100644
index 00000000000..767c5b0b729
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Swagger/README.md
@@ -0,0 +1,3 @@
+# Magento 2 Acceptance Tests
+
+The Acceptance Tests Module for **Magento_Swagger** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Swagger/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Swagger/composer.json
new file mode 100644
index 00000000000..5b62252b3df
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Swagger/composer.json
@@ -0,0 +1,47 @@
+{
+    "name": "magento/magento2-functional-test-module-swagger",
+    "description": "Magento 2 Acceptance Test Module Swagger",
+    "repositories": [
+        {
+            "type" : "composer",
+            "url" : "https://repo.magento.com/"
+        }
+    ],
+    "require": {
+        "php": "~7.0",
+        "codeception/codeception": "2.2|2.3",
+        "allure-framework/allure-codeception": "dev-master",
+        "consolidation/robo": "^1.0.0",
+        "henrikbjorn/lurker": "^1.2",
+        "vlucas/phpdotenv": "~2.4",
+        "magento/magento2-functional-testing-framework": "dev-develop"
+    },
+    "type": "magento2-test-module",
+    "version": "dev-master",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
+    "autoload": {
+        "psr-0": {
+            "Yandex": "vendor/allure-framework/allure-codeception/src/"
+        },
+        "psr-4": {
+            "Magento\\FunctionalTestingFramework\\": [
+                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
+            ],
+            "Magento\\FunctionalTest\\": [
+                "tests/functional/Magento/FunctionalTest",
+                "generated/Magento/FunctionalTest"
+            ]
+        }
+    },
+    "extra": {
+        "map": [
+            [
+                "*",
+                "tests/functional/Magento/FunctionalTest/Swagger"
+            ]
+        ]
+    }
+}
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Swatches/LICENSE.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Swatches/LICENSE.txt
new file mode 100644
index 00000000000..49525fd99da
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Swatches/LICENSE.txt
@@ -0,0 +1,48 @@
+
+Open Software License ("OSL") v. 3.0
+
+This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Open Software License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Open Software License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly. 
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including 'fair use' or 'fair dealing'). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright (C) 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Swatches/LICENSE_AFL.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Swatches/LICENSE_AFL.txt
new file mode 100644
index 00000000000..f39d641b18a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Swatches/LICENSE_AFL.txt
@@ -0,0 +1,48 @@
+
+Academic Free License ("AFL") v. 3.0
+
+This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Academic Free License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, under any license of your choice that does not contradict the terms and conditions, including Licensor's reserved rights and remedies, in this Academic Free License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly.
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including "fair use" or "fair dealing"). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright © 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Academic Free License" or "AFL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Swatches/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Swatches/README.md
new file mode 100644
index 00000000000..cc3852f1ed0
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Swatches/README.md
@@ -0,0 +1,3 @@
+# Magento 2 Acceptance Tests
+
+The Acceptance Tests Module for **Magento_Swatches** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Swatches/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Swatches/composer.json
new file mode 100644
index 00000000000..aa541ddd3a4
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Swatches/composer.json
@@ -0,0 +1,58 @@
+{
+    "name": "magento/magento2-functional-test-module-swatches",
+    "description": "Magento 2 Acceptance Test Module Swatches",
+    "repositories": [
+        {
+            "type" : "composer",
+            "url" : "https://repo.magento.com/"
+        }
+    ],
+    "require": {
+        "php": "~7.0",
+        "codeception/codeception": "2.2|2.3",
+        "allure-framework/allure-codeception": "dev-master",
+        "consolidation/robo": "^1.0.0",
+        "henrikbjorn/lurker": "^1.2",
+        "vlucas/phpdotenv": "~2.4",
+        "magento/magento2-functional-testing-framework": "dev-develop"
+    },
+    "suggest": {
+        "magento/magento2-functional-test-module-catalog": "dev-master",
+        "magento/magento2-functional-test-module-configurable-product": "dev-master",
+        "magento/magento2-functional-test-module-eav": "dev-master",
+        "magento/magento2-functional-test-module-customer": "dev-master",
+        "magento/magento2-functional-test-module-store": "dev-master",
+        "magento/magento2-functional-test-module-backend": "dev-master",
+        "magento/magento2-functional-test-module-media-storage": "dev-master",
+        "magento/magento2-functional-test-module-config": "dev-master",
+        "magento/magento2-functional-test-module-theme": "dev-master"
+    },
+    "type": "magento2-test-module",
+    "version": "dev-master",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
+    "autoload": {
+        "psr-0": {
+            "Yandex": "vendor/allure-framework/allure-codeception/src/"
+        },
+        "psr-4": {
+            "Magento\\FunctionalTestingFramework\\": [
+                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
+            ],
+            "Magento\\FunctionalTest\\": [
+                "tests/functional/Magento/FunctionalTest",
+                "generated/Magento/FunctionalTest"
+            ]
+        }
+    },
+    "extra": {
+        "map": [
+            [
+                "*",
+                "tests/functional/Magento/FunctionalTest/Swatches"
+            ]
+        ]
+    }
+}
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SwatchesLayeredNavigation/LICENSE.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SwatchesLayeredNavigation/LICENSE.txt
new file mode 100644
index 00000000000..49525fd99da
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SwatchesLayeredNavigation/LICENSE.txt
@@ -0,0 +1,48 @@
+
+Open Software License ("OSL") v. 3.0
+
+This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Open Software License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Open Software License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly. 
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including 'fair use' or 'fair dealing'). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright (C) 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SwatchesLayeredNavigation/LICENSE_AFL.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SwatchesLayeredNavigation/LICENSE_AFL.txt
new file mode 100644
index 00000000000..f39d641b18a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SwatchesLayeredNavigation/LICENSE_AFL.txt
@@ -0,0 +1,48 @@
+
+Academic Free License ("AFL") v. 3.0
+
+This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Academic Free License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, under any license of your choice that does not contradict the terms and conditions, including Licensor's reserved rights and remedies, in this Academic Free License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly.
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including "fair use" or "fair dealing"). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright © 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Academic Free License" or "AFL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SwatchesLayeredNavigation/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SwatchesLayeredNavigation/README.md
new file mode 100644
index 00000000000..b4b81246d1f
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SwatchesLayeredNavigation/README.md
@@ -0,0 +1,3 @@
+# Magento 2 Acceptance Tests
+
+The Acceptance Tests Module for **Magento_SwatchesLayeredNavigation** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SwatchesLayeredNavigation/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SwatchesLayeredNavigation/composer.json
new file mode 100644
index 00000000000..f195f6b7aad
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SwatchesLayeredNavigation/composer.json
@@ -0,0 +1,47 @@
+{
+    "name": "magento/magento2-functional-test-module-swatches-layered-navigation",
+    "description": "Magento 2 Acceptance Test Module Swatches Layered Navigation",
+    "repositories": [
+        {
+            "type" : "composer",
+            "url" : "https://repo.magento.com/"
+        }
+    ],
+    "require": {
+        "php": "~7.0",
+        "codeception/codeception": "2.2|2.3",
+        "allure-framework/allure-codeception": "dev-master",
+        "consolidation/robo": "^1.0.0",
+        "henrikbjorn/lurker": "^1.2",
+        "vlucas/phpdotenv": "~2.4",
+        "magento/magento2-functional-testing-framework": "dev-develop"
+    },
+    "type": "magento2-test-module",
+    "version": "dev-master",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
+    "autoload": {
+        "psr-0": {
+            "Yandex": "vendor/allure-framework/allure-codeception/src/"
+        },
+        "psr-4": {
+            "Magento\\FunctionalTestingFramework\\": [
+                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
+            ],
+            "Magento\\FunctionalTest\\": [
+                "tests/functional/Magento/FunctionalTest",
+                "generated/Magento/FunctionalTest"
+            ]
+        }
+    },
+    "extra": {
+        "map": [
+            [
+                "*",
+                "tests/functional/Magento/FunctionalTest/SwatchesLayeredNavigation"
+            ]
+        ]
+    }
+}
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Tax/LICENSE.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Tax/LICENSE.txt
new file mode 100644
index 00000000000..49525fd99da
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Tax/LICENSE.txt
@@ -0,0 +1,48 @@
+
+Open Software License ("OSL") v. 3.0
+
+This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Open Software License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Open Software License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly. 
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including 'fair use' or 'fair dealing'). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright (C) 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Tax/LICENSE_AFL.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Tax/LICENSE_AFL.txt
new file mode 100644
index 00000000000..f39d641b18a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Tax/LICENSE_AFL.txt
@@ -0,0 +1,48 @@
+
+Academic Free License ("AFL") v. 3.0
+
+This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Academic Free License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, under any license of your choice that does not contradict the terms and conditions, including Licensor's reserved rights and remedies, in this Academic Free License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly.
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including "fair use" or "fair dealing"). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright © 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Academic Free License" or "AFL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Tax/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Tax/README.md
new file mode 100644
index 00000000000..0a3794479ec
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Tax/README.md
@@ -0,0 +1,3 @@
+# Magento 2 Acceptance Tests
+
+The Acceptance Tests Module for **Magento_Tax** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Tax/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Tax/composer.json
new file mode 100644
index 00000000000..ca12ade2338
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Tax/composer.json
@@ -0,0 +1,62 @@
+{
+    "name": "magento/magento2-functional-test-module-tax",
+    "description": "Magento 2 Acceptance Test Module Tax",
+    "repositories": [
+        {
+            "type" : "composer",
+            "url" : "https://repo.magento.com/"
+        }
+    ],
+    "require": {
+        "php": "~7.0",
+        "codeception/codeception": "2.2|2.3",
+        "allure-framework/allure-codeception": "dev-master",
+        "consolidation/robo": "^1.0.0",
+        "henrikbjorn/lurker": "^1.2",
+        "vlucas/phpdotenv": "~2.4",
+        "magento/magento2-functional-testing-framework": "dev-develop"
+    },
+    "suggest": {
+        "magento/magento2-functional-test-module-config": "dev-master",
+        "magento/magento2-functional-test-module-store": "dev-master",
+        "magento/magento2-functional-test-module-catalog": "dev-master",
+        "magento/magento2-functional-test-module-customer": "dev-master",
+        "magento/magento2-functional-test-module-backend": "dev-master",
+        "magento/magento2-functional-test-module-directory": "dev-master",
+        "magento/magento2-functional-test-module-checkout": "dev-master",
+        "magento/magento2-functional-test-module-shipping": "dev-master",
+        "magento/magento2-functional-test-module-eav": "dev-master",
+        "magento/magento2-functional-test-module-sales": "dev-master",
+        "magento/magento2-functional-test-module-reports": "dev-master",
+        "magento/magento2-functional-test-module-page-cache": "dev-master",
+        "magento/magento2-functional-test-module-quote": "dev-master"
+    },
+    "type": "magento2-test-module",
+    "version": "dev-master",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
+    "autoload": {
+        "psr-0": {
+            "Yandex": "vendor/allure-framework/allure-codeception/src/"
+        },
+        "psr-4": {
+            "Magento\\FunctionalTestingFramework\\": [
+                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
+            ],
+            "Magento\\FunctionalTest\\": [
+                "tests/functional/Magento/FunctionalTest",
+                "generated/Magento/FunctionalTest"
+            ]
+        }
+    },
+    "extra": {
+        "map": [
+            [
+                "*",
+                "tests/functional/Magento/FunctionalTest/Tax"
+            ]
+        ]
+    }
+}
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/TaxImportExport/LICENSE.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/TaxImportExport/LICENSE.txt
new file mode 100644
index 00000000000..49525fd99da
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/TaxImportExport/LICENSE.txt
@@ -0,0 +1,48 @@
+
+Open Software License ("OSL") v. 3.0
+
+This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Open Software License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Open Software License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly. 
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including 'fair use' or 'fair dealing'). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright (C) 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/TaxImportExport/LICENSE_AFL.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/TaxImportExport/LICENSE_AFL.txt
new file mode 100644
index 00000000000..f39d641b18a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/TaxImportExport/LICENSE_AFL.txt
@@ -0,0 +1,48 @@
+
+Academic Free License ("AFL") v. 3.0
+
+This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Academic Free License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, under any license of your choice that does not contradict the terms and conditions, including Licensor's reserved rights and remedies, in this Academic Free License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly.
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including "fair use" or "fair dealing"). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright © 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Academic Free License" or "AFL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/TaxImportExport/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/TaxImportExport/README.md
new file mode 100644
index 00000000000..dbbed298fe6
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/TaxImportExport/README.md
@@ -0,0 +1,3 @@
+# Magento 2 Acceptance Tests
+
+The Acceptance Tests Module for **Magento_TaxImportExport** Module.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/TaxImportExport/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/TaxImportExport/composer.json
new file mode 100644
index 00000000000..563df720db8
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/TaxImportExport/composer.json
@@ -0,0 +1,53 @@
+{
+    "name": "magento/magento2-functional-test-module-tax-import-export",
+    "description": "Magento 2 Acceptance Test Module Tax Import Export",
+    "repositories": [
+        {
+            "type" : "composer",
+            "url" : "https://repo.magento.com/"
+        }
+    ],
+    "require": {
+        "php": "~7.0",
+        "codeception/codeception": "2.2|2.3",
+        "allure-framework/allure-codeception": "dev-master",
+        "consolidation/robo": "^1.0.0",
+        "henrikbjorn/lurker": "^1.2",
+        "vlucas/phpdotenv": "~2.4",
+        "magento/magento2-functional-testing-framework": "dev-develop"
+    },
+    "suggest": {
+        "magento/magento2-functional-test-module-tax": "dev-master",
+        "magento/magento2-functional-test-module-backend": "dev-master",
+        "magento/magento2-functional-test-module-directory": "dev-master",
+        "magento/magento2-functional-test-module-store": "dev-master"
+    },
+    "type": "magento2-test-module",
+    "version": "dev-master",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
+    "autoload": {
+        "psr-0": {
+            "Yandex": "vendor/allure-framework/allure-codeception/src/"
+        },
+        "psr-4": {
+            "Magento\\FunctionalTestingFramework\\": [
+                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
+            ],
+            "Magento\\FunctionalTest\\": [
+                "tests/functional/Magento/FunctionalTest",
+                "generated/Magento/FunctionalTest"
+            ]
+        }
+    },
+    "extra": {
+        "map": [
+            [
+                "*",
+                "tests/functional/Magento/FunctionalTest/TaxImportExport"
+            ]
+        ]
+    }
+}
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Theme/LICENSE.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Theme/LICENSE.txt
new file mode 100644
index 00000000000..49525fd99da
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Theme/LICENSE.txt
@@ -0,0 +1,48 @@
+
+Open Software License ("OSL") v. 3.0
+
+This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Open Software License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Open Software License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly. 
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including 'fair use' or 'fair dealing'). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright (C) 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Theme/LICENSE_AFL.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Theme/LICENSE_AFL.txt
new file mode 100644
index 00000000000..f39d641b18a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Theme/LICENSE_AFL.txt
@@ -0,0 +1,48 @@
+
+Academic Free License ("AFL") v. 3.0
+
+This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Academic Free License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, under any license of your choice that does not contradict the terms and conditions, including Licensor's reserved rights and remedies, in this Academic Free License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly.
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including "fair use" or "fair dealing"). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright © 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Academic Free License" or "AFL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Theme/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Theme/README.md
new file mode 100644
index 00000000000..187985eb187
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Theme/README.md
@@ -0,0 +1,3 @@
+# Magento 2 Acceptance Tests
+
+The Acceptance Tests Module for **Magento_Theme** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Theme/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Theme/composer.json
new file mode 100644
index 00000000000..e54095e5ed0
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Theme/composer.json
@@ -0,0 +1,58 @@
+{
+    "name": "magento/magento2-functional-test-module-theme",
+    "description": "Magento 2 Acceptance Test Module Theme",
+    "repositories": [
+        {
+            "type" : "composer",
+            "url" : "https://repo.magento.com/"
+        }
+    ],
+    "require": {
+        "php": "~7.0",
+        "codeception/codeception": "2.2|2.3",
+        "allure-framework/allure-codeception": "dev-master",
+        "consolidation/robo": "^1.0.0",
+        "henrikbjorn/lurker": "^1.2",
+        "vlucas/phpdotenv": "~2.4",
+        "magento/magento2-functional-testing-framework": "dev-develop"
+    },
+    "suggest": {
+        "magento/magento2-functional-test-module-store": "dev-master",
+        "magento/magento2-functional-test-module-customer": "dev-master",
+        "magento/magento2-functional-test-module-backend": "dev-master",
+        "magento/magento2-functional-test-module-cms": "dev-master",
+        "magento/magento2-functional-test-module-eav": "dev-master",
+        "magento/magento2-functional-test-module-widget": "dev-master",
+        "magento/magento2-functional-test-module-config": "dev-master",
+        "magento/magento2-functional-test-module-media-storage": "dev-master",
+        "magento/magento2-functional-test-module-ui": "dev-master"
+    },
+    "type": "magento2-test-module",
+    "version": "dev-master",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
+    "autoload": {
+        "psr-0": {
+            "Yandex": "vendor/allure-framework/allure-codeception/src/"
+        },
+        "psr-4": {
+            "Magento\\FunctionalTestingFramework\\": [
+                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
+            ],
+            "Magento\\FunctionalTest\\": [
+                "tests/functional/Magento/FunctionalTest",
+                "generated/Magento/FunctionalTest"
+            ]
+        }
+    },
+    "extra": {
+        "map": [
+            [
+                "*",
+                "tests/functional/Magento/FunctionalTest/Theme"
+            ]
+        ]
+    }
+}
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Translation/LICENSE.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Translation/LICENSE.txt
new file mode 100644
index 00000000000..49525fd99da
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Translation/LICENSE.txt
@@ -0,0 +1,48 @@
+
+Open Software License ("OSL") v. 3.0
+
+This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Open Software License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Open Software License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly. 
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including 'fair use' or 'fair dealing'). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright (C) 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Translation/LICENSE_AFL.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Translation/LICENSE_AFL.txt
new file mode 100644
index 00000000000..f39d641b18a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Translation/LICENSE_AFL.txt
@@ -0,0 +1,48 @@
+
+Academic Free License ("AFL") v. 3.0
+
+This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Academic Free License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, under any license of your choice that does not contradict the terms and conditions, including Licensor's reserved rights and remedies, in this Academic Free License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly.
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including "fair use" or "fair dealing"). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright © 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Academic Free License" or "AFL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Translation/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Translation/README.md
new file mode 100644
index 00000000000..477d0cca791
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Translation/README.md
@@ -0,0 +1,3 @@
+# Magento 2 Acceptance Tests
+
+The Acceptance Tests Module for **Magento_Translation** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Translation/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Translation/composer.json
new file mode 100644
index 00000000000..7825f0b22d6
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Translation/composer.json
@@ -0,0 +1,52 @@
+{
+    "name": "magento/magento2-functional-test-module-translation",
+    "description": "Magento 2 Acceptance Test Module Translation",
+    "repositories": [
+        {
+            "type" : "composer",
+            "url" : "https://repo.magento.com/"
+        }
+    ],
+    "require": {
+        "php": "~7.0",
+        "codeception/codeception": "2.2|2.3",
+        "allure-framework/allure-codeception": "dev-master",
+        "consolidation/robo": "^1.0.0",
+        "henrikbjorn/lurker": "^1.2",
+        "vlucas/phpdotenv": "~2.4",
+        "magento/magento2-functional-testing-framework": "dev-develop"
+    },
+    "suggest": {
+        "magento/magento2-functional-test-module-store": "dev-master",
+        "magento/magento2-functional-test-module-backend": "dev-master",
+        "magento/magento2-functional-test-module-developer": "dev-master"
+    },
+    "type": "magento2-test-module",
+    "version": "dev-master",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
+    "autoload": {
+        "psr-0": {
+            "Yandex": "vendor/allure-framework/allure-codeception/src/"
+        },
+        "psr-4": {
+            "Magento\\FunctionalTestingFramework\\": [
+                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
+            ],
+            "Magento\\FunctionalTest\\": [
+                "tests/functional/Magento/FunctionalTest",
+                "generated/Magento/FunctionalTest"
+            ]
+        }
+    },
+    "extra": {
+        "map": [
+            [
+                "*",
+                "tests/functional/Magento/FunctionalTest/Translation"
+            ]
+        ]
+    }
+}
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Ui/LICENSE.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Ui/LICENSE.txt
new file mode 100644
index 00000000000..49525fd99da
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Ui/LICENSE.txt
@@ -0,0 +1,48 @@
+
+Open Software License ("OSL") v. 3.0
+
+This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Open Software License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Open Software License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly. 
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including 'fair use' or 'fair dealing'). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright (C) 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Ui/LICENSE_AFL.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Ui/LICENSE_AFL.txt
new file mode 100644
index 00000000000..f39d641b18a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Ui/LICENSE_AFL.txt
@@ -0,0 +1,48 @@
+
+Academic Free License ("AFL") v. 3.0
+
+This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Academic Free License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, under any license of your choice that does not contradict the terms and conditions, including Licensor's reserved rights and remedies, in this Academic Free License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly.
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including "fair use" or "fair dealing"). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright © 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Academic Free License" or "AFL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Ui/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Ui/README.md
new file mode 100644
index 00000000000..ca2fc107409
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Ui/README.md
@@ -0,0 +1,3 @@
+# Magento 2 Acceptance Tests
+
+The Acceptance Tests Module for **Magento_Ui** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Ui/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Ui/composer.json
new file mode 100644
index 00000000000..652a4ebed3a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Ui/composer.json
@@ -0,0 +1,53 @@
+{
+    "name": "magento/magento2-functional-test-module-ui",
+    "description": "Magento 2 Acceptance Test Module Ui",
+    "repositories": [
+        {
+            "type" : "composer",
+            "url" : "https://repo.magento.com/"
+        }
+    ],
+    "require": {
+        "php": "~7.0",
+        "codeception/codeception": "2.2|2.3",
+        "allure-framework/allure-codeception": "dev-master",
+        "consolidation/robo": "^1.0.0",
+        "henrikbjorn/lurker": "^1.2",
+        "vlucas/phpdotenv": "~2.4",
+        "magento/magento2-functional-testing-framework": "dev-develop"
+    },
+    "suggest": {
+        "magento/magento2-functional-test-module-backend": "dev-master",
+        "magento/magento2-functional-test-module-eav": "dev-master",
+        "magento/magento2-functional-test-module-authorization": "dev-master",
+        "magento/magento2-functional-test-module-user": "dev-master"
+    },
+    "type": "magento2-test-module",
+    "version": "dev-master",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
+    "autoload": {
+        "psr-0": {
+            "Yandex": "vendor/allure-framework/allure-codeception/src/"
+        },
+        "psr-4": {
+            "Magento\\FunctionalTestingFramework\\": [
+                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
+            ],
+            "Magento\\FunctionalTest\\": [
+                "tests/functional/Magento/FunctionalTest",
+                "generated/Magento/FunctionalTest"
+            ]
+        }
+    },
+    "extra": {
+        "map": [
+            [
+                "*",
+                "tests/functional/Magento/FunctionalTest/Ui"
+            ]
+        ]
+    }
+}
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Ups/LICENSE.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Ups/LICENSE.txt
new file mode 100644
index 00000000000..49525fd99da
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Ups/LICENSE.txt
@@ -0,0 +1,48 @@
+
+Open Software License ("OSL") v. 3.0
+
+This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Open Software License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Open Software License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly. 
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including 'fair use' or 'fair dealing'). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright (C) 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Ups/LICENSE_AFL.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Ups/LICENSE_AFL.txt
new file mode 100644
index 00000000000..f39d641b18a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Ups/LICENSE_AFL.txt
@@ -0,0 +1,48 @@
+
+Academic Free License ("AFL") v. 3.0
+
+This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Academic Free License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, under any license of your choice that does not contradict the terms and conditions, including Licensor's reserved rights and remedies, in this Academic Free License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly.
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including "fair use" or "fair dealing"). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright © 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Academic Free License" or "AFL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Ups/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Ups/README.md
new file mode 100644
index 00000000000..95189beffd4
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Ups/README.md
@@ -0,0 +1,3 @@
+# Magento 2 Acceptance Tests
+
+The Acceptance Tests Module for **Magento_Ups** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Ups/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Ups/composer.json
new file mode 100644
index 00000000000..6cb246e0d55
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Ups/composer.json
@@ -0,0 +1,56 @@
+{
+    "name": "magento/magento2-functional-test-module-ups",
+    "description": "Magento 2 Acceptance Test Module Ups",
+    "repositories": [
+        {
+            "type" : "composer",
+            "url" : "https://repo.magento.com/"
+        }
+    ],
+    "require": {
+        "php": "~7.0",
+        "codeception/codeception": "2.2|2.3",
+        "allure-framework/allure-codeception": "dev-master",
+        "consolidation/robo": "^1.0.0",
+        "henrikbjorn/lurker": "^1.2",
+        "vlucas/phpdotenv": "~2.4",
+        "magento/magento2-functional-testing-framework": "dev-develop"
+    },
+    "suggest": {
+        "magento/magento2-functional-test-module-store": "dev-master",
+        "magento/magento2-functional-test-module-backend": "dev-master",
+        "magento/magento2-functional-test-module-sales": "dev-master",
+        "magento/magento2-functional-test-module-shipping": "dev-master",
+        "magento/magento2-functional-test-module-directory": "dev-master",
+        "magento/magento2-functional-test-module-catalog-inventory": "dev-master",
+        "magento/magento2-functional-test-module-quote": "dev-master"
+    },
+    "type": "magento2-test-module",
+    "version": "dev-master",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
+    "autoload": {
+        "psr-0": {
+            "Yandex": "vendor/allure-framework/allure-codeception/src/"
+        },
+        "psr-4": {
+            "Magento\\FunctionalTestingFramework\\": [
+                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
+            ],
+            "Magento\\FunctionalTest\\": [
+                "tests/functional/Magento/FunctionalTest",
+                "generated/Magento/FunctionalTest"
+            ]
+        }
+    },
+    "extra": {
+        "map": [
+            [
+                "*",
+                "tests/functional/Magento/FunctionalTest/Ups"
+            ]
+        ]
+    }
+}
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/UrlRewrite/LICENSE.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/UrlRewrite/LICENSE.txt
new file mode 100644
index 00000000000..49525fd99da
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/UrlRewrite/LICENSE.txt
@@ -0,0 +1,48 @@
+
+Open Software License ("OSL") v. 3.0
+
+This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Open Software License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Open Software License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly. 
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including 'fair use' or 'fair dealing'). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright (C) 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/UrlRewrite/LICENSE_AFL.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/UrlRewrite/LICENSE_AFL.txt
new file mode 100644
index 00000000000..f39d641b18a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/UrlRewrite/LICENSE_AFL.txt
@@ -0,0 +1,48 @@
+
+Academic Free License ("AFL") v. 3.0
+
+This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Academic Free License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, under any license of your choice that does not contradict the terms and conditions, including Licensor's reserved rights and remedies, in this Academic Free License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly.
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including "fair use" or "fair dealing"). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright © 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Academic Free License" or "AFL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/UrlRewrite/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/UrlRewrite/README.md
new file mode 100644
index 00000000000..a0c3a234569
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/UrlRewrite/README.md
@@ -0,0 +1,3 @@
+# Magento 2 Acceptance Tests
+
+The Acceptance Tests Module for **Magento_UrlRewrite** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/UrlRewrite/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/UrlRewrite/composer.json
new file mode 100644
index 00000000000..a8b351fc45b
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/UrlRewrite/composer.json
@@ -0,0 +1,55 @@
+{
+    "name": "magento/magento2-functional-test-module-url-rewrite",
+    "description": "Magento 2 Acceptance Test Module Url Rewrite",
+    "repositories": [
+        {
+            "type" : "composer",
+            "url" : "https://repo.magento.com/"
+        }
+    ],
+    "require": {
+        "php": "~7.0",
+        "codeception/codeception": "2.2|2.3",
+        "allure-framework/allure-codeception": "dev-master",
+        "consolidation/robo": "^1.0.0",
+        "henrikbjorn/lurker": "^1.2",
+        "vlucas/phpdotenv": "~2.4",
+        "magento/magento2-functional-testing-framework": "dev-develop"
+    },
+    "suggest": {
+        "magento/magento2-functional-test-module-store": "dev-master",
+        "magento/magento2-functional-test-module-catalog": "dev-master",
+        "magento/magento2-functional-test-module-backend": "dev-master",
+        "magento/magento2-functional-test-module-catalog-url-rewrite": "dev-master",
+        "magento/magento2-functional-test-module-cms": "dev-master",
+        "magento/magento2-functional-test-module-cms-url-rewrite": "dev-master"
+    },
+    "type": "magento2-test-module",
+    "version": "dev-master",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
+    "autoload": {
+        "psr-0": {
+            "Yandex": "vendor/allure-framework/allure-codeception/src/"
+        },
+        "psr-4": {
+            "Magento\\FunctionalTestingFramework\\": [
+                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
+            ],
+            "Magento\\FunctionalTest\\": [
+                "tests/functional/Magento/FunctionalTest",
+                "generated/Magento/FunctionalTest"
+            ]
+        }
+    },
+    "extra": {
+        "map": [
+            [
+                "*",
+                "tests/functional/Magento/FunctionalTest/UrlRewrite"
+            ]
+        ]
+    }
+}
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/User/Data/UserData.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/User/Data/UserData.xml
new file mode 100644
index 00000000000..55c934b1717
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/User/Data/UserData.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataProfileSchema.xsd">
+    <entity name="admin" type="user">
+        <data key="email">admin@magento.com</data>
+        <data key="password">admin123</data>
+    </entity>
+</config>
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/User/LICENSE.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/User/LICENSE.txt
new file mode 100644
index 00000000000..49525fd99da
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/User/LICENSE.txt
@@ -0,0 +1,48 @@
+
+Open Software License ("OSL") v. 3.0
+
+This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Open Software License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Open Software License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly. 
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including 'fair use' or 'fair dealing'). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright (C) 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/User/LICENSE_AFL.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/User/LICENSE_AFL.txt
new file mode 100644
index 00000000000..f39d641b18a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/User/LICENSE_AFL.txt
@@ -0,0 +1,48 @@
+
+Academic Free License ("AFL") v. 3.0
+
+This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Academic Free License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, under any license of your choice that does not contradict the terms and conditions, including Licensor's reserved rights and remedies, in this Academic Free License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly.
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including "fair use" or "fair dealing"). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright © 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Academic Free License" or "AFL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/User/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/User/README.md
new file mode 100644
index 00000000000..617eb0c0abe
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/User/README.md
@@ -0,0 +1,3 @@
+# Magento 2 Acceptance Tests
+
+The Acceptance Tests Module for **Magento_User** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/User/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/User/composer.json
new file mode 100644
index 00000000000..c40a4c122ed
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/User/composer.json
@@ -0,0 +1,55 @@
+{
+    "name": "magento/magento2-functional-test-module-user",
+    "description": "Magento 2 Acceptance Test Module User",
+    "repositories": [
+        {
+            "type" : "composer",
+            "url" : "https://repo.magento.com/"
+        }
+    ],
+    "require": {
+        "php": "~7.0",
+        "codeception/codeception": "2.2|2.3",
+        "allure-framework/allure-codeception": "dev-master",
+        "consolidation/robo": "^1.0.0",
+        "henrikbjorn/lurker": "^1.2",
+        "vlucas/phpdotenv": "~2.4",
+        "magento/magento2-functional-testing-framework": "dev-develop"
+    },
+    "suggest": {
+        "magento/magento2-functional-test-module-store": "dev-master",
+        "magento/magento2-functional-test-module-authorization": "dev-master",
+        "magento/magento2-functional-test-module-backend": "dev-master",
+        "magento/magento2-functional-test-module-security": "dev-master",
+        "magento/magento2-functional-test-module-integration": "dev-master",
+        "magento/magento2-functional-test-module-email": "dev-master"
+    },
+    "type": "magento2-test-module",
+    "version": "dev-master",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
+    "autoload": {
+        "psr-0": {
+            "Yandex": "vendor/allure-framework/allure-codeception/src/"
+        },
+        "psr-4": {
+            "Magento\\FunctionalTestingFramework\\": [
+                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
+            ],
+            "Magento\\FunctionalTest\\": [
+                "tests/functional/Magento/FunctionalTest",
+                "generated/Magento/FunctionalTest"
+            ]
+        }
+    },
+    "extra": {
+        "map": [
+            [
+                "*",
+                "tests/functional/Magento/FunctionalTest/User"
+            ]
+        ]
+    }
+}
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Variable/LICENSE.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Variable/LICENSE.txt
new file mode 100644
index 00000000000..49525fd99da
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Variable/LICENSE.txt
@@ -0,0 +1,48 @@
+
+Open Software License ("OSL") v. 3.0
+
+This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Open Software License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Open Software License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly. 
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including 'fair use' or 'fair dealing'). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright (C) 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Variable/LICENSE_AFL.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Variable/LICENSE_AFL.txt
new file mode 100644
index 00000000000..f39d641b18a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Variable/LICENSE_AFL.txt
@@ -0,0 +1,48 @@
+
+Academic Free License ("AFL") v. 3.0
+
+This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Academic Free License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, under any license of your choice that does not contradict the terms and conditions, including Licensor's reserved rights and remedies, in this Academic Free License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly.
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including "fair use" or "fair dealing"). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright © 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Academic Free License" or "AFL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Variable/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Variable/README.md
new file mode 100644
index 00000000000..454eb1e9164
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Variable/README.md
@@ -0,0 +1,3 @@
+# Magento 2 Acceptance Tests
+
+The Acceptance Tests Module for **Magento_Variable** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Variable/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Variable/composer.json
new file mode 100644
index 00000000000..178f0401b9b
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Variable/composer.json
@@ -0,0 +1,52 @@
+{
+    "name": "magento/magento2-functional-test-module-variable",
+    "description": "Magento 2 Acceptance Test Module Variable",
+    "repositories": [
+        {
+            "type" : "composer",
+            "url" : "https://repo.magento.com/"
+        }
+    ],
+    "require": {
+        "php": "~7.0",
+        "codeception/codeception": "2.2|2.3",
+        "allure-framework/allure-codeception": "dev-master",
+        "consolidation/robo": "^1.0.0",
+        "henrikbjorn/lurker": "^1.2",
+        "vlucas/phpdotenv": "~2.4",
+        "magento/magento2-functional-testing-framework": "dev-develop"
+    },
+    "suggest": {
+        "magento/magento2-functional-test-module-backend": "dev-master",
+        "magento/magento2-functional-test-module-email": "dev-master",
+        "magento/magento2-functional-test-module-store": "dev-master"
+    },
+    "type": "magento2-test-module",
+    "version": "dev-master",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
+    "autoload": {
+        "psr-0": {
+            "Yandex": "vendor/allure-framework/allure-codeception/src/"
+        },
+        "psr-4": {
+            "Magento\\FunctionalTestingFramework\\": [
+                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
+            ],
+            "Magento\\FunctionalTest\\": [
+                "tests/functional/Magento/FunctionalTest",
+                "generated/Magento/FunctionalTest"
+            ]
+        }
+    },
+    "extra": {
+        "map": [
+            [
+                "*",
+                "tests/functional/Magento/FunctionalTest/Variable"
+            ]
+        ]
+    }
+}
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Vault/LICENSE.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Vault/LICENSE.txt
new file mode 100644
index 00000000000..49525fd99da
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Vault/LICENSE.txt
@@ -0,0 +1,48 @@
+
+Open Software License ("OSL") v. 3.0
+
+This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Open Software License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Open Software License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly. 
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including 'fair use' or 'fair dealing'). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright (C) 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Vault/LICENSE_AFL.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Vault/LICENSE_AFL.txt
new file mode 100644
index 00000000000..f39d641b18a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Vault/LICENSE_AFL.txt
@@ -0,0 +1,48 @@
+
+Academic Free License ("AFL") v. 3.0
+
+This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Academic Free License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, under any license of your choice that does not contradict the terms and conditions, including Licensor's reserved rights and remedies, in this Academic Free License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly.
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including "fair use" or "fair dealing"). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright © 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Academic Free License" or "AFL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Vault/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Vault/README.md
new file mode 100644
index 00000000000..c993e275c54
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Vault/README.md
@@ -0,0 +1,3 @@
+# Magento 2 Acceptance Tests
+
+The Acceptance Tests Module for **Magento_Vault** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Vault/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Vault/composer.json
new file mode 100644
index 00000000000..e1af1518555
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Vault/composer.json
@@ -0,0 +1,55 @@
+{
+    "name": "magento/magento2-functional-test-module-vault",
+    "description": "Magento 2 Acceptance Test Module Vault",
+    "repositories": [
+        {
+            "type" : "composer",
+            "url" : "https://repo.magento.com/"
+        }
+    ],
+    "require": {
+        "php": "~7.0",
+        "codeception/codeception": "2.2|2.3",
+        "allure-framework/allure-codeception": "dev-master",
+        "consolidation/robo": "^1.0.0",
+        "henrikbjorn/lurker": "^1.2",
+        "vlucas/phpdotenv": "~2.4",
+        "magento/magento2-functional-testing-framework": "dev-develop"
+    },
+    "suggest": {
+        "magento/magento2-functional-test-module-store": "dev-master",
+        "magento/magento2-functional-test-module-sales": "dev-master",
+        "magento/magento2-functional-test-module-checkout": "dev-master",
+        "magento/magento2-functional-test-module-payment": "dev-master",
+        "magento/magento2-functional-test-module-customer": "dev-master",
+        "magento/magento2-functional-test-module-quote": "dev-master"
+    },
+    "type": "magento2-test-module",
+    "version": "dev-master",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
+    "autoload": {
+        "psr-0": {
+            "Yandex": "vendor/allure-framework/allure-codeception/src/"
+        },
+        "psr-4": {
+            "Magento\\FunctionalTestingFramework\\": [
+                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
+            ],
+            "Magento\\FunctionalTest\\": [
+                "tests/functional/Magento/FunctionalTest",
+                "generated/Magento/FunctionalTest"
+            ]
+        }
+    },
+    "extra": {
+        "map": [
+            [
+                "*",
+                "tests/functional/Magento/FunctionalTest/Vault"
+            ]
+        ]
+    }
+}
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Version/LICENSE.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Version/LICENSE.txt
new file mode 100644
index 00000000000..49525fd99da
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Version/LICENSE.txt
@@ -0,0 +1,48 @@
+
+Open Software License ("OSL") v. 3.0
+
+This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Open Software License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Open Software License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly. 
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including 'fair use' or 'fair dealing'). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright (C) 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Version/LICENSE_AFL.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Version/LICENSE_AFL.txt
new file mode 100644
index 00000000000..f39d641b18a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Version/LICENSE_AFL.txt
@@ -0,0 +1,48 @@
+
+Academic Free License ("AFL") v. 3.0
+
+This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Academic Free License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, under any license of your choice that does not contradict the terms and conditions, including Licensor's reserved rights and remedies, in this Academic Free License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly.
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including "fair use" or "fair dealing"). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright © 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Academic Free License" or "AFL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Version/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Version/README.md
new file mode 100644
index 00000000000..c48f288e729
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Version/README.md
@@ -0,0 +1,3 @@
+# Magento 2 Acceptance Tests
+
+The Acceptance Tests Module for **Magento_Version** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Version/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Version/composer.json
new file mode 100644
index 00000000000..82387c516ac
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Version/composer.json
@@ -0,0 +1,48 @@
+{
+    "name": "magento/magento2-functional-test-module-version",
+    "description": "Magento 2 Acceptance Test Module Version",
+    "repositories": [
+        {
+            "type" : "composer",
+            "url" : "https://repo.magento.com/"
+        }
+    ],
+    "require": {
+        "php": "~7.0",
+        "codeception/codeception": "2.2|2.3",
+        "allure-framework/allure-codeception": "dev-master",
+        "consolidation/robo": "^1.0.0",
+        "henrikbjorn/lurker": "^1.2",
+        "vlucas/phpdotenv": "~2.4",
+        "magento/magento2-functional-testing-framework": "dev-develop"
+    },
+    "type": "magento2-test-module",
+    "version": "dev-master",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
+    "autoload": {
+        "psr-0": {
+            "Yandex": "vendor/allure-framework/allure-codeception/src/"
+        },
+        "psr-4": {
+            "Magento\\FunctionalTestingFramework\\": [
+                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
+            ],
+            "Magento\\FunctionalTest\\": [
+                "tests/functional/Magento/FunctionalTest",
+                "generated/Magento/FunctionalTest"
+            ]
+        }
+    },
+    "extra": {
+        "map": [
+            [
+                "*",
+                "tests/functional/Magento/FunctionalTest/Version"
+            ]
+        ]
+    }
+}
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Webapi/LICENSE.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Webapi/LICENSE.txt
new file mode 100644
index 00000000000..49525fd99da
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Webapi/LICENSE.txt
@@ -0,0 +1,48 @@
+
+Open Software License ("OSL") v. 3.0
+
+This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Open Software License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Open Software License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly. 
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including 'fair use' or 'fair dealing'). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright (C) 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Webapi/LICENSE_AFL.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Webapi/LICENSE_AFL.txt
new file mode 100644
index 00000000000..f39d641b18a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Webapi/LICENSE_AFL.txt
@@ -0,0 +1,48 @@
+
+Academic Free License ("AFL") v. 3.0
+
+This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Academic Free License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, under any license of your choice that does not contradict the terms and conditions, including Licensor's reserved rights and remedies, in this Academic Free License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly.
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including "fair use" or "fair dealing"). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright © 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Academic Free License" or "AFL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Webapi/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Webapi/README.md
new file mode 100644
index 00000000000..3c8cf910c01
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Webapi/README.md
@@ -0,0 +1,3 @@
+# Magento 2 Acceptance Tests
+
+The Acceptance Tests Module for **Magento_Webapi** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Webapi/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Webapi/composer.json
new file mode 100644
index 00000000000..af20f4956e2
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Webapi/composer.json
@@ -0,0 +1,53 @@
+{
+    "name": "magento/magento2-functional-test-module-webapi",
+    "description": "Magento 2 Acceptance Test Module Webapi",
+    "repositories": [
+        {
+            "type" : "composer",
+            "url" : "https://repo.magento.com/"
+        }
+    ],
+    "require": {
+        "php": "~7.0",
+        "codeception/codeception": "2.2|2.3",
+        "allure-framework/allure-codeception": "dev-master",
+        "consolidation/robo": "^1.0.0",
+        "henrikbjorn/lurker": "^1.2",
+        "vlucas/phpdotenv": "~2.4",
+        "magento/magento2-functional-testing-framework": "dev-develop"
+    },
+    "suggest": {
+        "magento/magento2-functional-test-module-store": "dev-master",
+        "magento/magento2-functional-test-module-authorization": "dev-master",
+        "magento/magento2-functional-test-module-integration": "dev-master",
+        "magento/magento2-functional-test-module-backend": "dev-master"
+    },
+    "type": "magento2-test-module",
+    "version": "dev-master",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
+    "autoload": {
+        "psr-0": {
+            "Yandex": "vendor/allure-framework/allure-codeception/src/"
+        },
+        "psr-4": {
+            "Magento\\FunctionalTestingFramework\\": [
+                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
+            ],
+            "Magento\\FunctionalTest\\": [
+                "tests/functional/Magento/FunctionalTest",
+                "generated/Magento/FunctionalTest"
+            ]
+        }
+    },
+    "extra": {
+        "map": [
+            [
+                "*",
+                "tests/functional/Magento/FunctionalTest/Webapi"
+            ]
+        ]
+    }
+}
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/WebapiSecurity/LICENSE.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/WebapiSecurity/LICENSE.txt
new file mode 100644
index 00000000000..49525fd99da
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/WebapiSecurity/LICENSE.txt
@@ -0,0 +1,48 @@
+
+Open Software License ("OSL") v. 3.0
+
+This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Open Software License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Open Software License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly. 
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including 'fair use' or 'fair dealing'). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright (C) 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/WebapiSecurity/LICENSE_AFL.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/WebapiSecurity/LICENSE_AFL.txt
new file mode 100644
index 00000000000..f39d641b18a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/WebapiSecurity/LICENSE_AFL.txt
@@ -0,0 +1,48 @@
+
+Academic Free License ("AFL") v. 3.0
+
+This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Academic Free License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, under any license of your choice that does not contradict the terms and conditions, including Licensor's reserved rights and remedies, in this Academic Free License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly.
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including "fair use" or "fair dealing"). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright © 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Academic Free License" or "AFL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/WebapiSecurity/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/WebapiSecurity/README.md
new file mode 100644
index 00000000000..24a79533930
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/WebapiSecurity/README.md
@@ -0,0 +1,3 @@
+# Magento 2 Acceptance Tests
+
+The Acceptance Tests Module for **Magento_WebapiSecurity** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/WebapiSecurity/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/WebapiSecurity/composer.json
new file mode 100644
index 00000000000..80cfc405e37
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/WebapiSecurity/composer.json
@@ -0,0 +1,50 @@
+{
+    "name": "magento/magento2-functional-test-module-webapi-security",
+    "description": "Magento 2 Acceptance Test Module Webapi Security",
+    "repositories": [
+        {
+            "type" : "composer",
+            "url" : "https://repo.magento.com/"
+        }
+    ],
+    "require": {
+        "php": "~7.0",
+        "codeception/codeception": "2.2|2.3",
+        "allure-framework/allure-codeception": "dev-master",
+        "consolidation/robo": "^1.0.0",
+        "henrikbjorn/lurker": "^1.2",
+        "vlucas/phpdotenv": "~2.4",
+        "magento/magento2-functional-testing-framework": "dev-develop"
+    },
+    "suggest": {
+        "magento/magento2-functional-test-module-webapi": "dev-master"
+    },
+    "type": "magento2-test-module",
+    "version": "dev-master",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
+    "autoload": {
+        "psr-0": {
+            "Yandex": "vendor/allure-framework/allure-codeception/src/"
+        },
+        "psr-4": {
+            "Magento\\FunctionalTestingFramework\\": [
+                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
+            ],
+            "Magento\\FunctionalTest\\": [
+                "tests/functional/Magento/FunctionalTest",
+                "generated/Magento/FunctionalTest"
+            ]
+        }
+    },
+    "extra": {
+        "map": [
+            [
+                "*",
+                "tests/functional/Magento/FunctionalTest/WebapiSecurity"
+            ]
+        ]
+    }
+}
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Weee/LICENSE.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Weee/LICENSE.txt
new file mode 100644
index 00000000000..49525fd99da
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Weee/LICENSE.txt
@@ -0,0 +1,48 @@
+
+Open Software License ("OSL") v. 3.0
+
+This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Open Software License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Open Software License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly. 
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including 'fair use' or 'fair dealing'). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright (C) 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Weee/LICENSE_AFL.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Weee/LICENSE_AFL.txt
new file mode 100644
index 00000000000..f39d641b18a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Weee/LICENSE_AFL.txt
@@ -0,0 +1,48 @@
+
+Academic Free License ("AFL") v. 3.0
+
+This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Academic Free License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, under any license of your choice that does not contradict the terms and conditions, including Licensor's reserved rights and remedies, in this Academic Free License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly.
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including "fair use" or "fair dealing"). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright © 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Academic Free License" or "AFL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Weee/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Weee/README.md
new file mode 100644
index 00000000000..5166cfc5d4b
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Weee/README.md
@@ -0,0 +1,3 @@
+# Magento 2 Acceptance Tests
+
+The Acceptance Tests Module for **Magento_Weee** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Weee/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Weee/composer.json
new file mode 100644
index 00000000000..7e3f3eac424
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Weee/composer.json
@@ -0,0 +1,61 @@
+{
+    "name": "magento/magento2-functional-test-module-weee",
+    "description": "Magento 2 Acceptance Test Module Weee",
+    "repositories": [
+        {
+            "type" : "composer",
+            "url" : "https://repo.magento.com/"
+        }
+    ],
+    "require": {
+        "php": "~7.0",
+        "codeception/codeception": "2.2|2.3",
+        "allure-framework/allure-codeception": "dev-master",
+        "consolidation/robo": "^1.0.0",
+        "henrikbjorn/lurker": "^1.2",
+        "vlucas/phpdotenv": "~2.4",
+        "magento/magento2-functional-testing-framework": "dev-develop"
+    },
+    "suggest": {
+        "magento/magento2-functional-test-module-store": "dev-master",
+        "magento/magento2-functional-test-module-catalog": "dev-master",
+        "magento/magento2-functional-test-module-tax": "dev-master",
+        "magento/magento2-functional-test-module-sales": "dev-master",
+        "magento/magento2-functional-test-module-backend": "dev-master",
+        "magento/magento2-functional-test-module-directory": "dev-master",
+        "magento/magento2-functional-test-module-eav": "dev-master",
+        "magento/magento2-functional-test-module-customer": "dev-master",
+        "magento/magento2-functional-test-module-page-cache": "dev-master",
+        "magento/magento2-functional-test-module-quote": "dev-master",
+        "magento/magento2-functional-test-module-checkout": "dev-master",
+        "magento/magento2-functional-test-module-ui": "dev-master"
+    },
+    "type": "magento2-test-module",
+    "version": "dev-master",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
+    "autoload": {
+        "psr-0": {
+            "Yandex": "vendor/allure-framework/allure-codeception/src/"
+        },
+        "psr-4": {
+            "Magento\\FunctionalTestingFramework\\": [
+                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
+            ],
+            "Magento\\FunctionalTest\\": [
+                "tests/functional/Magento/FunctionalTest",
+                "generated/Magento/FunctionalTest"
+            ]
+        }
+    },
+    "extra": {
+        "map": [
+            [
+                "*",
+                "tests/functional/Magento/FunctionalTest/Weee"
+            ]
+        ]
+    }
+}
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Widget/LICENSE.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Widget/LICENSE.txt
new file mode 100644
index 00000000000..49525fd99da
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Widget/LICENSE.txt
@@ -0,0 +1,48 @@
+
+Open Software License ("OSL") v. 3.0
+
+This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Open Software License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Open Software License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly. 
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including 'fair use' or 'fair dealing'). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright (C) 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Widget/LICENSE_AFL.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Widget/LICENSE_AFL.txt
new file mode 100644
index 00000000000..f39d641b18a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Widget/LICENSE_AFL.txt
@@ -0,0 +1,48 @@
+
+Academic Free License ("AFL") v. 3.0
+
+This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Academic Free License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, under any license of your choice that does not contradict the terms and conditions, including Licensor's reserved rights and remedies, in this Academic Free License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly.
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including "fair use" or "fair dealing"). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright © 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Academic Free License" or "AFL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Widget/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Widget/README.md
new file mode 100644
index 00000000000..b6fd0b4513b
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Widget/README.md
@@ -0,0 +1,3 @@
+# Magento 2 Acceptance Tests
+
+The Acceptance Tests Module for **Magento_Widget** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Widget/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Widget/composer.json
new file mode 100644
index 00000000000..7d546965c3a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Widget/composer.json
@@ -0,0 +1,56 @@
+{
+    "name": "magento/magento2-functional-test-module-widget",
+    "description": "Magento 2 Acceptance Test Module Widget",
+    "repositories": [
+        {
+            "type" : "composer",
+            "url" : "https://repo.magento.com/"
+        }
+    ],
+    "require": {
+        "php": "~7.0",
+        "codeception/codeception": "2.2|2.3",
+        "allure-framework/allure-codeception": "dev-master",
+        "consolidation/robo": "^1.0.0",
+        "henrikbjorn/lurker": "^1.2",
+        "vlucas/phpdotenv": "~2.4",
+        "magento/magento2-functional-testing-framework": "dev-develop"
+    },
+    "suggest": {
+        "magento/magento2-functional-test-module-store": "dev-master",
+        "magento/magento2-functional-test-module-cms": "dev-master",
+        "magento/magento2-functional-test-module-backend": "dev-master",
+        "magento/magento2-functional-test-module-catalog": "dev-master",
+        "magento/magento2-functional-test-module-email": "dev-master",
+        "magento/magento2-functional-test-module-theme": "dev-master",
+        "magento/magento2-functional-test-module-variable": "dev-master"
+    },
+    "type": "magento2-test-module",
+    "version": "dev-master",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
+    "autoload": {
+        "psr-0": {
+            "Yandex": "vendor/allure-framework/allure-codeception/src/"
+        },
+        "psr-4": {
+            "Magento\\FunctionalTestingFramework\\": [
+                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
+            ],
+            "Magento\\FunctionalTest\\": [
+                "tests/functional/Magento/FunctionalTest",
+                "generated/Magento/FunctionalTest"
+            ]
+        }
+    },
+    "extra": {
+        "map": [
+            [
+                "*",
+                "tests/functional/Magento/FunctionalTest/Widget"
+            ]
+        ]
+    }
+}
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Wishlist/LICENSE.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Wishlist/LICENSE.txt
new file mode 100644
index 00000000000..49525fd99da
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Wishlist/LICENSE.txt
@@ -0,0 +1,48 @@
+
+Open Software License ("OSL") v. 3.0
+
+This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Open Software License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Open Software License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly. 
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including 'fair use' or 'fair dealing'). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright (C) 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Wishlist/LICENSE_AFL.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Wishlist/LICENSE_AFL.txt
new file mode 100644
index 00000000000..f39d641b18a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Wishlist/LICENSE_AFL.txt
@@ -0,0 +1,48 @@
+
+Academic Free License ("AFL") v. 3.0
+
+This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Academic Free License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, under any license of your choice that does not contradict the terms and conditions, including Licensor's reserved rights and remedies, in this Academic Free License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly.
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including "fair use" or "fair dealing"). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright © 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Academic Free License" or "AFL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Wishlist/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Wishlist/README.md
new file mode 100644
index 00000000000..53615d4273f
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Wishlist/README.md
@@ -0,0 +1,3 @@
+# Magento 2 Acceptance Tests
+
+The Acceptance Tests Module for **Magento_Wishlist** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Wishlist/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Wishlist/composer.json
new file mode 100644
index 00000000000..cfb79284ec5
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Wishlist/composer.json
@@ -0,0 +1,58 @@
+{
+    "name": "magento/magento2-functional-test-module-wishlist",
+    "description": "Magento 2 Acceptance Test Module Wishlist",
+    "repositories": [
+        {
+            "type" : "composer",
+            "url" : "https://repo.magento.com/"
+        }
+    ],
+    "require": {
+        "php": "~7.0",
+        "codeception/codeception": "2.2|2.3",
+        "allure-framework/allure-codeception": "dev-master",
+        "consolidation/robo": "^1.0.0",
+        "henrikbjorn/lurker": "^1.2",
+        "vlucas/phpdotenv": "~2.4",
+        "magento/magento2-functional-testing-framework": "dev-develop"
+    },
+    "suggest": {
+        "magento/magento2-functional-test-module-store": "dev-master",
+        "magento/magento2-functional-test-module-customer": "dev-master",
+        "magento/magento2-functional-test-module-catalog": "dev-master",
+        "magento/magento2-functional-test-module-checkout": "dev-master",
+        "magento/magento2-functional-test-module-catalog-inventory": "dev-master",
+        "magento/magento2-functional-test-module-rss": "dev-master",
+        "magento/magento2-functional-test-module-backend": "dev-master",
+        "magento/magento2-functional-test-module-sales": "dev-master",
+        "magento/magento2-functional-test-module-ui": "dev-master"
+    },
+    "type": "magento2-test-module",
+    "version": "dev-master",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
+    "autoload": {
+        "psr-0": {
+            "Yandex": "vendor/allure-framework/allure-codeception/src/"
+        },
+        "psr-4": {
+            "Magento\\FunctionalTestingFramework\\": [
+                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
+            ],
+            "Magento\\FunctionalTest\\": [
+                "tests/functional/Magento/FunctionalTest",
+                "generated/Magento/FunctionalTest"
+            ]
+        }
+    },
+    "extra": {
+        "map": [
+            [
+                "*",
+                "tests/functional/Magento/FunctionalTest/Wishlist"
+            ]
+        ]
+    }
+}
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/WishlistAnalytics/LICENSE.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/WishlistAnalytics/LICENSE.txt
new file mode 100644
index 00000000000..49525fd99da
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/WishlistAnalytics/LICENSE.txt
@@ -0,0 +1,48 @@
+
+Open Software License ("OSL") v. 3.0
+
+This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Open Software License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Open Software License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly. 
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including 'fair use' or 'fair dealing'). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright (C) 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/WishlistAnalytics/LICENSE_AFL.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/WishlistAnalytics/LICENSE_AFL.txt
new file mode 100644
index 00000000000..f39d641b18a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/WishlistAnalytics/LICENSE_AFL.txt
@@ -0,0 +1,48 @@
+
+Academic Free License ("AFL") v. 3.0
+
+This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Academic Free License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, under any license of your choice that does not contradict the terms and conditions, including Licensor's reserved rights and remedies, in this Academic Free License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly.
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including "fair use" or "fair dealing"). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright © 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Academic Free License" or "AFL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/WishlistAnalytics/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/WishlistAnalytics/README.md
new file mode 100644
index 00000000000..a9826ff12fb
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/WishlistAnalytics/README.md
@@ -0,0 +1,3 @@
+# Magento 2 Acceptance Tests
+
+The Acceptance Tests Module for **Magento_WishlistAnalytics** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/WishlistAnalytics/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/WishlistAnalytics/composer.json
new file mode 100644
index 00000000000..19dba845461
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/WishlistAnalytics/composer.json
@@ -0,0 +1,50 @@
+{
+    "name": "magento/magento2-functional-test-module-wishlist-analytics",
+    "description": "Magento 2 Acceptance Test Module WishlistAnalytics",
+    "repositories": [
+        {
+            "type" : "composer",
+            "url" : "https://repo.magento.com/"
+        }
+    ],
+    "require": {
+        "php": "~7.0",
+        "codeception/codeception": "2.2|2.3",
+        "allure-framework/allure-codeception": "dev-master",
+        "consolidation/robo": "^1.0.0",
+        "henrikbjorn/lurker": "^1.2",
+        "vlucas/phpdotenv": "~2.4",
+        "magento/magento2-functional-testing-framework": "dev-develop"
+    },
+    "suggest": {
+        "magento/magento2-functional-test-module-wishlist": "dev-master"
+    },
+    "type": "magento2-test-module",
+    "version": "dev-master",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
+    "autoload": {
+        "psr-0": {
+            "Yandex": "vendor/allure-framework/allure-codeception/src/"
+        },
+        "psr-4": {
+            "Magento\\FunctionalTestingFramework\\": [
+                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
+            ],
+            "Magento\\FunctionalTest\\": [
+                "tests/functional/Magento/FunctionalTest",
+                "generated/Magento/FunctionalTest"
+            ]
+        }
+    },
+    "extra": {
+        "map": [
+            [
+                "*",
+                "tests/functional/Magento/FunctionalTest/WishlistAnalytics"
+            ]
+        ]
+    }
+}
diff --git a/dev/tests/acceptance/tests/functional/_bootstrap.php b/dev/tests/acceptance/tests/functional/_bootstrap.php
new file mode 100644
index 00000000000..b142e36191e
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/_bootstrap.php
@@ -0,0 +1,13 @@
+<?php
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+// Here you can initialize variables that will be available to your tests
+require_once dirname(__DIR__) . '/_bootstrap.php';
+
+$RELATIVE_TESTS_MODULE_PATH = '/Magento/FunctionalTest';
+
+defined('TESTS_BP') || define('TESTS_BP', __DIR__);
+defined('TESTS_MODULE_PATH') || define('TESTS_MODULE_PATH', TESTS_BP . $RELATIVE_TESTS_MODULE_PATH);
-- 
GitLab


From 11b1d094497ea7acd12d015a9859cf979cb088a6 Mon Sep 17 00:00:00 2001
From: Alex Kolesnyk <okolesnyk@magento.com>
Date: Wed, 20 Sep 2017 16:59:12 +0300
Subject: [PATCH 034/380] MQE-279: Create repositories in magento organization

---
 .../Magento/FunctionalTest/Backend/Cest/AdminLoginCest.xml    | 2 +-
 .../Magento/FunctionalTest/Backend/Data/BackenedData.xml      | 4 ++--
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/Cest/AdminLoginCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/Cest/AdminLoginCest.xml
index c46766e6acf..ad97cbaa825 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/Cest/AdminLoginCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/Cest/AdminLoginCest.xml
@@ -26,4 +26,4 @@
             <seeInCurrentUrl url="{{AdminLoginPage}}" mergeKey="seeAdminLoginUrl"/>
         </test>
     </cest>
-</config>
\ No newline at end of file
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/Data/BackenedData.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/Data/BackenedData.xml
index 039472445b4..5cf22e022a3 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/Data/BackenedData.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/Data/BackenedData.xml
@@ -2,7 +2,7 @@
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataProfileSchema.xsd">
-    <entity name="backendDatadOne" type="backend">
+    <entity name="backendDataOne" type="backend">
         <data key="backendConfigName">data</data>
     </entity>
-</config>
\ No newline at end of file
+</config>
-- 
GitLab


From 2ebc272c4f53b28911459ed7d0fa8838481fccad Mon Sep 17 00:00:00 2001
From: Alex Kolesnyk <okolesnyk@magento.com>
Date: Wed, 20 Sep 2017 17:58:47 +0300
Subject: [PATCH 035/380] MQE-279: Create repositories in magento organization

---
 .../FunctionalTest/Backend/Cest/AdminLoginCest.xml        | 6 ++++++
 .../Magento/FunctionalTest/Backend/Data/BackenedData.xml  | 6 ++++++
 .../FunctionalTest/Backend/Page/AdminLoginPage.xml        | 6 ++++++
 .../Backend/Section/AdminLoginFormSection.xml             | 6 ++++++
 .../Backend/Section/AdminMessagesSection.xml              | 6 ++++++
 .../Catalog/Cest/AdminCreateCategoryCest.xml              | 6 ++++++
 .../Catalog/Cest/AdminCreateConfigurableProductCest.xml   | 6 ++++++
 .../Catalog/Cest/AdminCreateSimpleProductCest.xml         | 6 ++++++
 .../Magento/FunctionalTest/Catalog/Data/CategoryData.xml  | 6 ++++++
 .../Catalog/Data/CustomAttributeCategoryUrlKeyData.xml    | 6 ++++++
 .../Catalog/Data/CustomAttributeProductUrlKeyData.xml     | 6 ++++++
 .../Catalog/Data/ProductConfigurableAttributeData.xml     | 6 ++++++
 .../Magento/FunctionalTest/Catalog/Data/ProductData.xml   | 6 ++++++
 .../Catalog/Data/ProductExtensionAttributeData.xml        | 6 ++++++
 .../Magento/FunctionalTest/Catalog/Data/StockItemData.xml | 6 ++++++
 .../FunctionalTest/Catalog/Metadata/category-meta.xml     | 6 ++++++
 .../Catalog/Metadata/custom_attribute-meta.xml            | 6 ++++++
 .../FunctionalTest/Catalog/Metadata/product-meta.xml      | 6 ++++++
 .../Catalog/Metadata/product_extension_attribute-meta.xml | 6 ++++++
 .../FunctionalTest/Catalog/Metadata/product_link-meta.xml | 6 ++++++
 .../Metadata/product_link_extension_attribute-meta.xml    | 6 ++++++
 .../Catalog/Metadata/product_option-meta.xml              | 6 ++++++
 .../Catalog/Metadata/product_option_value-meta.xml        | 6 ++++++
 .../FunctionalTest/Catalog/Metadata/stock_item-meta.xml   | 6 ++++++
 .../FunctionalTest/Catalog/Page/AdminCategoryPage.xml     | 6 ++++++
 .../FunctionalTest/Catalog/Page/AdminProductEditPage.xml  | 6 ++++++
 .../FunctionalTest/Catalog/Page/AdminProductIndexPage.xml | 6 ++++++
 .../Catalog/Page/StorefrontCategoryPage.xml               | 6 ++++++
 .../FunctionalTest/Catalog/Page/StorefrontProductPage.xml | 6 ++++++
 .../Catalog/Section/AdminCategoryBasicFieldSection.xml    | 6 ++++++
 .../Catalog/Section/AdminCategoryMainActionsSection.xml   | 6 ++++++
 .../Catalog/Section/AdminCategoryMessagesSection.xml      | 6 ++++++
 .../Catalog/Section/AdminCategorySEOSection.xml           | 6 ++++++
 .../Catalog/Section/AdminCategorySidebarActionSection.xml | 6 ++++++
 .../Catalog/Section/AdminCategorySidebarTreeSection.xml   | 6 ++++++
 .../Catalog/Section/AdminProductFormActionSection.xml     | 6 ++++++
 .../Catalog/Section/AdminProductFormSection.xml           | 6 ++++++
 .../Catalog/Section/AdminProductGridActionSection.xml     | 6 ++++++
 .../Catalog/Section/AdminProductGridSection.xml           | 6 ++++++
 .../Catalog/Section/AdminProductMessagesSection.xml       | 6 ++++++
 .../Catalog/Section/AdminProductSEOSection.xml            | 6 ++++++
 .../Catalog/Section/StorefrontCategoryMainSection.xml     | 6 ++++++
 .../Catalog/Section/StorefrontMessagesSection.xml         | 6 ++++++
 .../Catalog/Section/StorefrontMiniCartSection.xml         | 6 ++++++
 .../Section/StorefrontProductInfoDetailsSection.xml       | 6 ++++++
 .../Catalog/Section/StorefrontProductInfoMainSection.xml  | 6 ++++++
 .../Checkout/Cest/StorefrontCustomerCheckoutCest.xml      | 6 ++++++
 .../Checkout/Cest/StorefrontGuestCheckoutCest.xml         | 6 ++++++
 .../Magento/FunctionalTest/Checkout/Page/CheckoutPage.xml | 6 ++++++
 .../FunctionalTest/Checkout/Page/CheckoutSuccessPage.xml  | 6 ++++++
 .../FunctionalTest/Checkout/Page/GuestCheckoutPage.xml    | 6 ++++++
 .../Checkout/Section/CheckoutOrderSummarySection.xml      | 6 ++++++
 .../Checkout/Section/CheckoutPaymentSection.xml           | 6 ++++++
 .../Checkout/Section/CheckoutShippingGuestInfoSection.xml | 6 ++++++
 .../Checkout/Section/CheckoutShippingMethodsSection.xml   | 6 ++++++
 .../Checkout/Section/CheckoutShippingSection.xml          | 6 ++++++
 .../Checkout/Section/CheckoutSuccessMainSection.xml       | 6 ++++++
 .../Checkout/Section/GuestCheckoutPaymentSection.xml      | 6 ++++++
 .../Checkout/Section/GuestCheckoutShippingSection.xml     | 6 ++++++
 .../FunctionalTest/Cms/Cest/AdminCreateCmsPageCest.xml    | 6 ++++++
 .../Magento/FunctionalTest/Cms/Data/CmsPageData.xml       | 6 ++++++
 .../Magento/FunctionalTest/Cms/Page/CmsNewPagePage.xml    | 6 ++++++
 .../Magento/FunctionalTest/Cms/Page/CmsPagesPage.xml      | 8 +++++++-
 .../Cms/Section/CmsNewPagePageActionsSection.xml          | 6 ++++++
 .../Cms/Section/CmsNewPagePageBasicFieldsSection.xml      | 6 ++++++
 .../Cms/Section/CmsNewPagePageContentSection.xml          | 6 ++++++
 .../Cms/Section/CmsNewPagePageSeoSection.xml              | 6 ++++++
 .../Cms/Section/CmsPagesPageActionsSection.xml            | 6 ++++++
 .../ConfigurableProduct/Data/ConfigurableProductData.xml  | 6 ++++++
 .../Customer/Cest/AdminCreateCustomerCest.xml             | 6 ++++++
 .../Customer/Cest/StorefrontCreateCustomerCest.xml        | 6 ++++++
 .../Customer/Cest/StorefrontExistingCustomerLoginCest.xml | 6 ++++++
 .../Magento/FunctionalTest/Customer/Data/AddressData.xml  | 6 ++++++
 .../FunctionalTest/Customer/Data/CustomAttributeData.xml  | 6 ++++++
 .../Magento/FunctionalTest/Customer/Data/CustomerData.xml | 6 ++++++
 .../Customer/Data/ExtensionAttributeSimple.xml            | 6 ++++++
 .../Magento/FunctionalTest/Customer/Data/RegionData.xml   | 6 ++++++
 .../FunctionalTest/Customer/Metadata/address-meta.xml     | 6 ++++++
 .../Customer/Metadata/custom_attribute-meta.xml           | 6 ++++++
 .../FunctionalTest/Customer/Metadata/customer-meta.xml    | 6 ++++++
 .../Metadata/customer_extension_attribute-meta.xml        | 6 ++++++
 .../Metadata/customer_nested_extension_attribute-meta.xml | 6 ++++++
 .../Customer/Metadata/empty_extension_attribute-meta.xml  | 6 ++++++
 .../FunctionalTest/Customer/Metadata/region-meta.xml      | 6 ++++++
 .../FunctionalTest/Customer/Page/AdminCustomerPage.xml    | 6 ++++++
 .../FunctionalTest/Customer/Page/AdminNewCustomerPage.xml | 6 ++++++
 .../Customer/Page/StorefrontCustomerCreatePage.xml        | 6 ++++++
 .../Customer/Page/StorefrontCustomerDashboardPage.xml     | 6 ++++++
 .../Customer/Page/StorefrontCustomerSignInPage.xml        | 6 ++++++
 .../FunctionalTest/Customer/Page/StorefrontHomePage.xml   | 6 ++++++
 .../Customer/Section/AdminCustomerFiltersSection.xml      | 6 ++++++
 .../Customer/Section/AdminCustomerGridSection.xml         | 6 ++++++
 .../Customer/Section/AdminCustomerMainActionsSection.xml  | 6 ++++++
 .../Customer/Section/AdminCustomerMessagesSection.xml     | 6 ++++++
 .../Section/AdminNewCustomerAccountInformationSection.xml | 6 ++++++
 .../Section/AdminNewCustomerMainActionsSection.xml        | 6 ++++++
 .../Section/StorefrontCustomerCreateFormSection.xml       | 6 ++++++
 ...orefrontCustomerDashboardAccountInformationSection.xml | 6 ++++++
 .../Section/StorefrontCustomerSignInFormSection.xml       | 6 ++++++
 .../Customer/Section/StorefrontPanelHeaderSection.xml     | 6 ++++++
 .../FunctionalTest/Sales/Cest/AdminCreateInvoiceCest.xml  | 6 ++++++
 .../Magento/FunctionalTest/Sales/Data/SalesData.xml       | 6 ++++++
 .../FunctionalTest/Sales/Page/InvoiceDetailsPage.xml      | 6 ++++++
 .../Magento/FunctionalTest/Sales/Page/InvoiceNewPage.xml  | 6 ++++++
 .../Magento/FunctionalTest/Sales/Page/InvoicesPage.xml    | 6 ++++++
 .../FunctionalTest/Sales/Page/OrderDetailsPage.xml        | 6 ++++++
 .../Magento/FunctionalTest/Sales/Page/OrdersPage.xml      | 6 ++++++
 .../Sales/Section/InvoiceDetailsInformationSection.xml    | 6 ++++++
 .../FunctionalTest/Sales/Section/InvoiceNewSection.xml    | 6 ++++++
 .../Sales/Section/InvoicesFiltersSection.xml              | 6 ++++++
 .../FunctionalTest/Sales/Section/InvoicesGridSection.xml  | 6 ++++++
 .../Sales/Section/OrderDetailsInformationSection.xml      | 6 ++++++
 .../Sales/Section/OrderDetailsInvoicesSection.xml         | 6 ++++++
 .../Sales/Section/OrderDetailsMainActionsSection.xml      | 6 ++++++
 .../Sales/Section/OrderDetailsMessagesSection.xml         | 6 ++++++
 .../Sales/Section/OrderDetailsOrderViewSection.xml        | 6 ++++++
 .../FunctionalTest/Sales/Section/OrdersGridSection.xml    | 6 ++++++
 .../FunctionalTest/SampleTests/Cest/MinimumTestCest.xml   | 6 ++++++
 .../SampleTests/Cest/PersistMultipleEntitiesCest.xml      | 6 ++++++
 .../FunctionalTest/SampleTests/Cest/SampleCest.xml        | 6 ++++++
 .../SampleTests/Templates/TemplateCestFile.xml            | 6 ++++++
 .../SampleTests/Templates/TemplateDataFile.xml            | 6 ++++++
 .../SampleTests/Templates/TemplateMetaDataFile.xml        | 6 ++++++
 .../SampleTests/Templates/TemplatePageFile.xml            | 6 ++++++
 .../SampleTests/Templates/TemplateSectionFile.xml         | 6 ++++++
 .../Magento/FunctionalTest/User/Data/UserData.xml         | 6 ++++++
 126 files changed, 757 insertions(+), 1 deletion(-)

diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/Cest/AdminLoginCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/Cest/AdminLoginCest.xml
index ad97cbaa825..bb36605b3cd 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/Cest/AdminLoginCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/Cest/AdminLoginCest.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Test/etc/testSchema.xsd">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/Data/BackenedData.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/Data/BackenedData.xml
index 5cf22e022a3..43bd1ad96f1 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/Data/BackenedData.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/Data/BackenedData.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataProfileSchema.xsd">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/Page/AdminLoginPage.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/Page/AdminLoginPage.xml
index 910450187ad..582c0733ff5 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/Page/AdminLoginPage.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/Page/AdminLoginPage.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/PageObject.xsd">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/Section/AdminLoginFormSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/Section/AdminLoginFormSection.xml
index 11768b4c83d..532a354da12 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/Section/AdminLoginFormSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/Section/AdminLoginFormSection.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/Section/AdminMessagesSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/Section/AdminMessagesSection.xml
index ebc99031eac..b77233ab260 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/Section/AdminMessagesSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/Section/AdminMessagesSection.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Cest/AdminCreateCategoryCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Cest/AdminCreateCategoryCest.xml
index f731830f291..bb22cb72910 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Cest/AdminCreateCategoryCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Cest/AdminCreateCategoryCest.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Test/etc/testSchema.xsd">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Cest/AdminCreateConfigurableProductCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Cest/AdminCreateConfigurableProductCest.xml
index fa5cbd2d2f0..b8fbb0a93e7 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Cest/AdminCreateConfigurableProductCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Cest/AdminCreateConfigurableProductCest.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Test/etc/testSchema.xsd">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Cest/AdminCreateSimpleProductCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Cest/AdminCreateSimpleProductCest.xml
index a32a80a6d91..7508d00f134 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Cest/AdminCreateSimpleProductCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Cest/AdminCreateSimpleProductCest.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Test/etc/testSchema.xsd">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Data/CategoryData.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Data/CategoryData.xml
index 5c6a03c46b3..b2877aebe72 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Data/CategoryData.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Data/CategoryData.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataProfileSchema.xsd">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Data/CustomAttributeCategoryUrlKeyData.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Data/CustomAttributeCategoryUrlKeyData.xml
index 43348890b94..911fd3d73a2 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Data/CustomAttributeCategoryUrlKeyData.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Data/CustomAttributeCategoryUrlKeyData.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataProfileSchema.xsd">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Data/CustomAttributeProductUrlKeyData.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Data/CustomAttributeProductUrlKeyData.xml
index ccaed86c1e7..acc9517d229 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Data/CustomAttributeProductUrlKeyData.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Data/CustomAttributeProductUrlKeyData.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataProfileSchema.xsd">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Data/ProductConfigurableAttributeData.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Data/ProductConfigurableAttributeData.xml
index 3cdb6c30c4f..ba472fc91b8 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Data/ProductConfigurableAttributeData.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Data/ProductConfigurableAttributeData.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataProfileSchema.xsd">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Data/ProductData.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Data/ProductData.xml
index 6ac89d0c2a7..cdbcd2d130d 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Data/ProductData.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Data/ProductData.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataProfileSchema.xsd">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Data/ProductExtensionAttributeData.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Data/ProductExtensionAttributeData.xml
index d884bebf36d..199c945cd87 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Data/ProductExtensionAttributeData.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Data/ProductExtensionAttributeData.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataProfileSchema.xsd">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Data/StockItemData.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Data/StockItemData.xml
index 7711f5dce8e..6caf6ec9fd3 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Data/StockItemData.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Data/StockItemData.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataProfileSchema.xsd">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/category-meta.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/category-meta.xml
index 453fe74bfa3..7299e47ae1d 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/category-meta.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/category-meta.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataOperation.xsd">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/custom_attribute-meta.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/custom_attribute-meta.xml
index 7ad804465c7..b019ab3ff42 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/custom_attribute-meta.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/custom_attribute-meta.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataOperation.xsd">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product-meta.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product-meta.xml
index a2b77297796..4f313af3f7f 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product-meta.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product-meta.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataOperation.xsd">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product_extension_attribute-meta.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product_extension_attribute-meta.xml
index 86d3629f48a..f68459121f3 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product_extension_attribute-meta.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product_extension_attribute-meta.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataOperation.xsd">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product_link-meta.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product_link-meta.xml
index 6400211dedf..8261ef0e999 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product_link-meta.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product_link-meta.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataOperation.xsd">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product_link_extension_attribute-meta.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product_link_extension_attribute-meta.xml
index 5371fa1f5e7..ea2c9264304 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product_link_extension_attribute-meta.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product_link_extension_attribute-meta.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataOperation.xsd">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product_option-meta.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product_option-meta.xml
index 5e3f66c51e1..dcb65c8032e 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product_option-meta.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product_option-meta.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataOperation.xsd">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product_option_value-meta.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product_option_value-meta.xml
index 4be46958db3..c1b50759e0a 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product_option_value-meta.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product_option_value-meta.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataOperation.xsd">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/stock_item-meta.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/stock_item-meta.xml
index 70626de4211..15b4a47de15 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/stock_item-meta.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/stock_item-meta.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataOperation.xsd">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Page/AdminCategoryPage.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Page/AdminCategoryPage.xml
index b00effeb20e..0ff498d84fd 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Page/AdminCategoryPage.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Page/AdminCategoryPage.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/PageObject.xsd">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Page/AdminProductEditPage.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Page/AdminProductEditPage.xml
index 907407acf8e..ec19e6f3cc0 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Page/AdminProductEditPage.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Page/AdminProductEditPage.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/PageObject.xsd">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Page/AdminProductIndexPage.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Page/AdminProductIndexPage.xml
index b3f5ef1ba11..e3ad5dac78c 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Page/AdminProductIndexPage.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Page/AdminProductIndexPage.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/PageObject.xsd">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Page/StorefrontCategoryPage.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Page/StorefrontCategoryPage.xml
index 1346b05af4c..7cc0fcf1364 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Page/StorefrontCategoryPage.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Page/StorefrontCategoryPage.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/PageObject.xsd">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Page/StorefrontProductPage.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Page/StorefrontProductPage.xml
index 4436742a13b..998bf0035f5 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Page/StorefrontProductPage.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Page/StorefrontProductPage.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/PageObject.xsd">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminCategoryBasicFieldSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminCategoryBasicFieldSection.xml
index f83cc99b1b6..5720e198df0 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminCategoryBasicFieldSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminCategoryBasicFieldSection.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminCategoryMainActionsSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminCategoryMainActionsSection.xml
index dbec4c295e4..425b98d2a4f 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminCategoryMainActionsSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminCategoryMainActionsSection.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminCategoryMessagesSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminCategoryMessagesSection.xml
index e21176d441b..f58e66f9cd9 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminCategoryMessagesSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminCategoryMessagesSection.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminCategorySEOSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminCategorySEOSection.xml
index 3564a6ca78b..f6780f1eb32 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminCategorySEOSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminCategorySEOSection.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminCategorySidebarActionSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminCategorySidebarActionSection.xml
index e3ff829d4ce..0847d229848 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminCategorySidebarActionSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminCategorySidebarActionSection.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminCategorySidebarTreeSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminCategorySidebarTreeSection.xml
index ec537ba4830..6bbf3876fb4 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminCategorySidebarTreeSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminCategorySidebarTreeSection.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminProductFormActionSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminProductFormActionSection.xml
index 713e8b71c23..f7b7b989ace 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminProductFormActionSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminProductFormActionSection.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminProductFormSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminProductFormSection.xml
index 1fef90bdd11..a23112065fd 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminProductFormSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminProductFormSection.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminProductGridActionSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminProductGridActionSection.xml
index 1c32564485c..e45c67c0dcf 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminProductGridActionSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminProductGridActionSection.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminProductGridSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminProductGridSection.xml
index f48ece1a3f0..feecb1cc8f0 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminProductGridSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminProductGridSection.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminProductMessagesSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminProductMessagesSection.xml
index c35d1fe21b5..860fdbe398a 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminProductMessagesSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminProductMessagesSection.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminProductSEOSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminProductSEOSection.xml
index c03899381d1..d994a1d7390 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminProductSEOSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminProductSEOSection.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/StorefrontCategoryMainSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/StorefrontCategoryMainSection.xml
index 47161b95b62..c3dbe95bc6b 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/StorefrontCategoryMainSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/StorefrontCategoryMainSection.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/StorefrontMessagesSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/StorefrontMessagesSection.xml
index e662b0914ce..dcfc2564d3c 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/StorefrontMessagesSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/StorefrontMessagesSection.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/StorefrontMiniCartSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/StorefrontMiniCartSection.xml
index 85964f13a4d..fd814766ea6 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/StorefrontMiniCartSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/StorefrontMiniCartSection.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/StorefrontProductInfoDetailsSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/StorefrontProductInfoDetailsSection.xml
index 92b84d42a4d..ebdff90a69d 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/StorefrontProductInfoDetailsSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/StorefrontProductInfoDetailsSection.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/StorefrontProductInfoMainSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/StorefrontProductInfoMainSection.xml
index be9cde517b5..22b55bb879f 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/StorefrontProductInfoMainSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/StorefrontProductInfoMainSection.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Cest/StorefrontCustomerCheckoutCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Cest/StorefrontCustomerCheckoutCest.xml
index 1932ec0f6e1..8b7922bf453 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Cest/StorefrontCustomerCheckoutCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Cest/StorefrontCustomerCheckoutCest.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Test/etc/testSchema.xsd">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Cest/StorefrontGuestCheckoutCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Cest/StorefrontGuestCheckoutCest.xml
index 5f58cf04e6a..c30a7aac148 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Cest/StorefrontGuestCheckoutCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Cest/StorefrontGuestCheckoutCest.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Test/etc/testSchema.xsd">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Page/CheckoutPage.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Page/CheckoutPage.xml
index 650589ae6ee..54b9062425c 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Page/CheckoutPage.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Page/CheckoutPage.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/PageObject.xsd">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Page/CheckoutSuccessPage.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Page/CheckoutSuccessPage.xml
index 98cfe538f52..4bf40301e5c 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Page/CheckoutSuccessPage.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Page/CheckoutSuccessPage.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/PageObject.xsd">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Page/GuestCheckoutPage.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Page/GuestCheckoutPage.xml
index eaab3ece3bb..a54db5eb82f 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Page/GuestCheckoutPage.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Page/GuestCheckoutPage.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/PageObject.xsd">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Section/CheckoutOrderSummarySection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Section/CheckoutOrderSummarySection.xml
index f9f4957e796..319bafca8c2 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Section/CheckoutOrderSummarySection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Section/CheckoutOrderSummarySection.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Section/CheckoutPaymentSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Section/CheckoutPaymentSection.xml
index c5ed374d70b..fc616a51207 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Section/CheckoutPaymentSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Section/CheckoutPaymentSection.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Section/CheckoutShippingGuestInfoSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Section/CheckoutShippingGuestInfoSection.xml
index 9af04542d85..a783d5ea7aa 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Section/CheckoutShippingGuestInfoSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Section/CheckoutShippingGuestInfoSection.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Section/CheckoutShippingMethodsSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Section/CheckoutShippingMethodsSection.xml
index 5065571381c..dbe09299929 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Section/CheckoutShippingMethodsSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Section/CheckoutShippingMethodsSection.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Section/CheckoutShippingSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Section/CheckoutShippingSection.xml
index c13967e9b12..364c2d92c1d 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Section/CheckoutShippingSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Section/CheckoutShippingSection.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Section/CheckoutSuccessMainSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Section/CheckoutSuccessMainSection.xml
index 28de9f94ae5..cb47bf9900e 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Section/CheckoutSuccessMainSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Section/CheckoutSuccessMainSection.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Section/GuestCheckoutPaymentSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Section/GuestCheckoutPaymentSection.xml
index 5b62584348b..7050068ba27 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Section/GuestCheckoutPaymentSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Section/GuestCheckoutPaymentSection.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Section/GuestCheckoutShippingSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Section/GuestCheckoutShippingSection.xml
index f7bc6e82e3f..a2606edb379 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Section/GuestCheckoutShippingSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Section/GuestCheckoutShippingSection.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Cest/AdminCreateCmsPageCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Cest/AdminCreateCmsPageCest.xml
index 1a15cda8d7e..8553296fc96 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Cest/AdminCreateCmsPageCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Cest/AdminCreateCmsPageCest.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Test/etc/testSchema.xsd">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Data/CmsPageData.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Data/CmsPageData.xml
index ee3e483bba9..32bbec678fa 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Data/CmsPageData.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Data/CmsPageData.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataProfileSchema.xsd">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Page/CmsNewPagePage.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Page/CmsNewPagePage.xml
index 9dd1fb299d2..5624767bb25 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Page/CmsNewPagePage.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Page/CmsNewPagePage.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/PageObject.xsd">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Page/CmsPagesPage.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Page/CmsPagesPage.xml
index 4d52b0f0ba3..f8564145ae3 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Page/CmsPagesPage.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Page/CmsPagesPage.xml
@@ -1,4 +1,10 @@
-<?xml version="1.0" encoding="utf-8"?>
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/PageObject.xsd">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Section/CmsNewPagePageActionsSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Section/CmsNewPagePageActionsSection.xml
index dc6cafa6551..bb5e854078b 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Section/CmsNewPagePageActionsSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Section/CmsNewPagePageActionsSection.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Section/CmsNewPagePageBasicFieldsSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Section/CmsNewPagePageBasicFieldsSection.xml
index e29cc868636..e5f314a0fb5 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Section/CmsNewPagePageBasicFieldsSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Section/CmsNewPagePageBasicFieldsSection.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Section/CmsNewPagePageContentSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Section/CmsNewPagePageContentSection.xml
index cc1a98e31db..c0da938d99b 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Section/CmsNewPagePageContentSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Section/CmsNewPagePageContentSection.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Section/CmsNewPagePageSeoSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Section/CmsNewPagePageSeoSection.xml
index 69b0b0faf67..8f541c0bbf1 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Section/CmsNewPagePageSeoSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Section/CmsNewPagePageSeoSection.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Section/CmsPagesPageActionsSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Section/CmsPagesPageActionsSection.xml
index 88746b3b5b7..75c1c46ed1b 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Section/CmsPagesPageActionsSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Section/CmsPagesPageActionsSection.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/Data/ConfigurableProductData.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/Data/ConfigurableProductData.xml
index 0ae038de3e1..71fd665d096 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/Data/ConfigurableProductData.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/Data/ConfigurableProductData.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataProfileSchema.xsd">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Cest/AdminCreateCustomerCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Cest/AdminCreateCustomerCest.xml
index 66a750304f3..8e4b2a8abd8 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Cest/AdminCreateCustomerCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Cest/AdminCreateCustomerCest.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Test/etc/testSchema.xsd">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Cest/StorefrontCreateCustomerCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Cest/StorefrontCreateCustomerCest.xml
index cba18378530..45bc23e5a0d 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Cest/StorefrontCreateCustomerCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Cest/StorefrontCreateCustomerCest.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Test/etc/testSchema.xsd">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Cest/StorefrontExistingCustomerLoginCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Cest/StorefrontExistingCustomerLoginCest.xml
index 1c3722418cb..11a2a27862e 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Cest/StorefrontExistingCustomerLoginCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Cest/StorefrontExistingCustomerLoginCest.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Test/etc/testSchema.xsd">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Data/AddressData.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Data/AddressData.xml
index 34a8b89b9a2..c38dc9f1ad7 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Data/AddressData.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Data/AddressData.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataProfileSchema.xsd">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Data/CustomAttributeData.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Data/CustomAttributeData.xml
index 01ce261bfa0..ca98ffedd11 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Data/CustomAttributeData.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Data/CustomAttributeData.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataProfileSchema.xsd">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Data/CustomerData.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Data/CustomerData.xml
index b21e1ef1303..b2693d09b6e 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Data/CustomerData.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Data/CustomerData.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataProfileSchema.xsd">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Data/ExtensionAttributeSimple.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Data/ExtensionAttributeSimple.xml
index 2e5072176ed..39f7dd4fc2b 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Data/ExtensionAttributeSimple.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Data/ExtensionAttributeSimple.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataProfileSchema.xsd">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Data/RegionData.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Data/RegionData.xml
index a52c9134f92..9ba5cb7b2c9 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Data/RegionData.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Data/RegionData.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataProfileSchema.xsd">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Metadata/address-meta.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Metadata/address-meta.xml
index 0238f8fe9f9..6e5ea909cbe 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Metadata/address-meta.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Metadata/address-meta.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataOperation.xsd">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Metadata/custom_attribute-meta.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Metadata/custom_attribute-meta.xml
index 7ad804465c7..b019ab3ff42 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Metadata/custom_attribute-meta.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Metadata/custom_attribute-meta.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataOperation.xsd">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Metadata/customer-meta.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Metadata/customer-meta.xml
index f2b6dbe682e..6ee3d020962 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Metadata/customer-meta.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Metadata/customer-meta.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataOperation.xsd">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Metadata/customer_extension_attribute-meta.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Metadata/customer_extension_attribute-meta.xml
index fee39b01336..4028b7f5ea9 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Metadata/customer_extension_attribute-meta.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Metadata/customer_extension_attribute-meta.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataOperation.xsd">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Metadata/customer_nested_extension_attribute-meta.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Metadata/customer_nested_extension_attribute-meta.xml
index cf16e49fce6..3f1ccd2e8b1 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Metadata/customer_nested_extension_attribute-meta.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Metadata/customer_nested_extension_attribute-meta.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataOperation.xsd">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Metadata/empty_extension_attribute-meta.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Metadata/empty_extension_attribute-meta.xml
index 1a5377403e1..ce07c28e6c9 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Metadata/empty_extension_attribute-meta.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Metadata/empty_extension_attribute-meta.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataOperation.xsd">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Metadata/region-meta.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Metadata/region-meta.xml
index ed7d56e3d2a..8ad9ec81eaf 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Metadata/region-meta.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Metadata/region-meta.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataOperation.xsd">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Page/AdminCustomerPage.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Page/AdminCustomerPage.xml
index c08116588f6..40522af259d 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Page/AdminCustomerPage.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Page/AdminCustomerPage.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/PageObject.xsd">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Page/AdminNewCustomerPage.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Page/AdminNewCustomerPage.xml
index c488e2c7cc7..520021c1614 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Page/AdminNewCustomerPage.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Page/AdminNewCustomerPage.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/PageObject.xsd">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Page/StorefrontCustomerCreatePage.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Page/StorefrontCustomerCreatePage.xml
index a3e38d81549..1917f1bd352 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Page/StorefrontCustomerCreatePage.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Page/StorefrontCustomerCreatePage.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/PageObject.xsd">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Page/StorefrontCustomerDashboardPage.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Page/StorefrontCustomerDashboardPage.xml
index 3699b1280d4..179a4e62d06 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Page/StorefrontCustomerDashboardPage.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Page/StorefrontCustomerDashboardPage.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/PageObject.xsd">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Page/StorefrontCustomerSignInPage.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Page/StorefrontCustomerSignInPage.xml
index c170b257387..a5835c2bcc2 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Page/StorefrontCustomerSignInPage.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Page/StorefrontCustomerSignInPage.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/PageObject.xsd">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Page/StorefrontHomePage.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Page/StorefrontHomePage.xml
index ce103f5add6..d54e1776c2c 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Page/StorefrontHomePage.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Page/StorefrontHomePage.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/PageObject.xsd">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/AdminCustomerFiltersSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/AdminCustomerFiltersSection.xml
index 12284623e60..ea9961bb275 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/AdminCustomerFiltersSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/AdminCustomerFiltersSection.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/AdminCustomerGridSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/AdminCustomerGridSection.xml
index ecc9e966802..12055b5314a 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/AdminCustomerGridSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/AdminCustomerGridSection.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/AdminCustomerMainActionsSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/AdminCustomerMainActionsSection.xml
index 95fcc7ab799..fbdff1f9ca5 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/AdminCustomerMainActionsSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/AdminCustomerMainActionsSection.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/AdminCustomerMessagesSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/AdminCustomerMessagesSection.xml
index d27381aa0bc..e82e4c1947e 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/AdminCustomerMessagesSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/AdminCustomerMessagesSection.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/AdminNewCustomerAccountInformationSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/AdminNewCustomerAccountInformationSection.xml
index 3b4b0730914..5bdbef44073 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/AdminNewCustomerAccountInformationSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/AdminNewCustomerAccountInformationSection.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/AdminNewCustomerMainActionsSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/AdminNewCustomerMainActionsSection.xml
index a7e168ba9f2..9366c7c50df 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/AdminNewCustomerMainActionsSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/AdminNewCustomerMainActionsSection.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/StorefrontCustomerCreateFormSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/StorefrontCustomerCreateFormSection.xml
index ef88114d02e..33389a2013d 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/StorefrontCustomerCreateFormSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/StorefrontCustomerCreateFormSection.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/StorefrontCustomerDashboardAccountInformationSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/StorefrontCustomerDashboardAccountInformationSection.xml
index 8b1dbbed1d4..1bff7347636 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/StorefrontCustomerDashboardAccountInformationSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/StorefrontCustomerDashboardAccountInformationSection.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/StorefrontCustomerSignInFormSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/StorefrontCustomerSignInFormSection.xml
index 359a58ad7f0..00c6ed9282e 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/StorefrontCustomerSignInFormSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/StorefrontCustomerSignInFormSection.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/StorefrontPanelHeaderSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/StorefrontPanelHeaderSection.xml
index 63b39955281..cd9f84ce0f1 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/StorefrontPanelHeaderSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/StorefrontPanelHeaderSection.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Cest/AdminCreateInvoiceCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Cest/AdminCreateInvoiceCest.xml
index 832ede6b3df..ed19d94bc53 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Cest/AdminCreateInvoiceCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Cest/AdminCreateInvoiceCest.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Test/etc/testSchema.xsd">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Data/SalesData.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Data/SalesData.xml
index 637e7ef01ba..1a31a5a92cb 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Data/SalesData.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Data/SalesData.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataProfileSchema.xsd">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Page/InvoiceDetailsPage.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Page/InvoiceDetailsPage.xml
index 4fde61b64d2..186097f4040 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Page/InvoiceDetailsPage.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Page/InvoiceDetailsPage.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/PageObject.xsd">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Page/InvoiceNewPage.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Page/InvoiceNewPage.xml
index 760a50d31ad..185d89e80f8 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Page/InvoiceNewPage.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Page/InvoiceNewPage.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/PageObject.xsd">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Page/InvoicesPage.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Page/InvoicesPage.xml
index 93e997fee7b..ae145b50a8e 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Page/InvoicesPage.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Page/InvoicesPage.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/PageObject.xsd">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Page/OrderDetailsPage.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Page/OrderDetailsPage.xml
index 20470e31c8f..050254c7ee5 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Page/OrderDetailsPage.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Page/OrderDetailsPage.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/PageObject.xsd">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Page/OrdersPage.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Page/OrdersPage.xml
index f215af9c21d..0d009bba529 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Page/OrdersPage.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Page/OrdersPage.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/PageObject.xsd">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Section/InvoiceDetailsInformationSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Section/InvoiceDetailsInformationSection.xml
index b1794d6d00f..872e9ac007d 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Section/InvoiceDetailsInformationSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Section/InvoiceDetailsInformationSection.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Section/InvoiceNewSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Section/InvoiceNewSection.xml
index 6cbb05d4989..90e5c31f866 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Section/InvoiceNewSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Section/InvoiceNewSection.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Section/InvoicesFiltersSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Section/InvoicesFiltersSection.xml
index 1d3328fb1ed..e14e651eb1a 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Section/InvoicesFiltersSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Section/InvoicesFiltersSection.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Section/InvoicesGridSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Section/InvoicesGridSection.xml
index 275a4d3506d..aca1aaa747b 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Section/InvoicesGridSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Section/InvoicesGridSection.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Section/OrderDetailsInformationSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Section/OrderDetailsInformationSection.xml
index b080c4b2e2c..4f971c755d2 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Section/OrderDetailsInformationSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Section/OrderDetailsInformationSection.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Section/OrderDetailsInvoicesSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Section/OrderDetailsInvoicesSection.xml
index a05231646ea..7039fb3e250 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Section/OrderDetailsInvoicesSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Section/OrderDetailsInvoicesSection.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Section/OrderDetailsMainActionsSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Section/OrderDetailsMainActionsSection.xml
index b9fb1751f03..78613e58d46 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Section/OrderDetailsMainActionsSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Section/OrderDetailsMainActionsSection.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Section/OrderDetailsMessagesSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Section/OrderDetailsMessagesSection.xml
index 2c1b25dd2c0..b63c1da9a98 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Section/OrderDetailsMessagesSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Section/OrderDetailsMessagesSection.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Section/OrderDetailsOrderViewSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Section/OrderDetailsOrderViewSection.xml
index f17286060d8..63c80a085e0 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Section/OrderDetailsOrderViewSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Section/OrderDetailsOrderViewSection.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Section/OrdersGridSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Section/OrdersGridSection.xml
index c5e5efe0d15..2683305340f 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Section/OrdersGridSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Section/OrdersGridSection.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/MinimumTestCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/MinimumTestCest.xml
index 4a5603e643c..5f69f5d6c43 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/MinimumTestCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/MinimumTestCest.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 <!-- Test XML Example -->
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Test/etc/testSchema.xsd">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/PersistMultipleEntitiesCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/PersistMultipleEntitiesCest.xml
index 59c47371b86..a46500143a8 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/PersistMultipleEntitiesCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/PersistMultipleEntitiesCest.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Test/etc/testSchema.xsd">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/SampleCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/SampleCest.xml
index 92dd201812d..32a18961bfa 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/SampleCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/SampleCest.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 <!-- Test XML Example -->
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Test/etc/testSchema.xsd">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Templates/TemplateCestFile.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Templates/TemplateCestFile.xml
index 7ee5e2dfbc6..88c8639b977 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Templates/TemplateCestFile.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Templates/TemplateCestFile.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Test/etc/testSchema.xsd">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Templates/TemplateDataFile.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Templates/TemplateDataFile.xml
index 3682b7569fc..74fce7e8071 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Templates/TemplateDataFile.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Templates/TemplateDataFile.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataProfileSchema.xsd">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Templates/TemplateMetaDataFile.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Templates/TemplateMetaDataFile.xml
index 952665b0323..28f95508712 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Templates/TemplateMetaDataFile.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Templates/TemplateMetaDataFile.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataOperation.xsd">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Templates/TemplatePageFile.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Templates/TemplatePageFile.xml
index b165e990203..8aceda03855 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Templates/TemplatePageFile.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Templates/TemplatePageFile.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/PageObject.xsd">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Templates/TemplateSectionFile.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Templates/TemplateSectionFile.xml
index c6e284f7607..9cf871a562a 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Templates/TemplateSectionFile.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Templates/TemplateSectionFile.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/User/Data/UserData.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/User/Data/UserData.xml
index 55c934b1717..bb704038a51 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/User/Data/UserData.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/User/Data/UserData.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataProfileSchema.xsd">
-- 
GitLab


From a8ae4a5ffcfdc4f1db6b8964f0ae63e853f5e64f Mon Sep 17 00:00:00 2001
From: John Stennett <john00ivy@gmail.com>
Date: Wed, 27 Sep 2017 21:49:35 +0300
Subject: [PATCH 036/380] MQE-350: Demos for Core and SE Teams

- Updating the README, replacing "Acceptance" with "Functional", adding "./vendor/bin/" to all commands so they will run if you don't have it in your $PATH.
- Updating Robo commands to include "./vendor/bin/" so they will run.
---
 dev/tests/acceptance/README.md    | 142 +++++++++++++++++-------------
 dev/tests/acceptance/RoboFile.php |  24 ++---
 2 files changed, 88 insertions(+), 78 deletions(-)

diff --git a/dev/tests/acceptance/README.md b/dev/tests/acceptance/README.md
index df6c804815b..d55625a6442 100755
--- a/dev/tests/acceptance/README.md
+++ b/dev/tests/acceptance/README.md
@@ -8,21 +8,39 @@
 ----
 
 # Prerequisites
+* **IMPORTANT**: Configure your Magento Store for [Automated Testing](http://devdocs.magento.com/guides/v2.0/mtf/mtf_quickstart/mtf_quickstart_magento.html)
 * [PHP v7.x](http://php.net/manual/en/install.php)
 * [Composer v1.4.x](https://getcomposer.org/download/)
 * [Java](https://www.java.com/en/download/)
-* [Selenium Server](http://www.seleniumhq.org/download/)
+* [Selenium Server](http://www.seleniumhq.org/download/) - [v2.53.x](http://selenium-release.storage.googleapis.com/index.html?path=2.53/)
 * [ChromeDriver](https://sites.google.com/a/chromium.org/chromedriver/downloads)
 * [Allure CLI](https://docs.qameta.io/allure/latest/#_installing_a_commandline)
 * [GitHub](https://desktop.github.com/)
-* GitHub Repos:
-  * [CE Tests](https://github.com/magento-pangolin/magento2ce-acceptance-tests)
-  * [EE Tests](https://github.com/magento-pangolin/magento2ee-acceptance-tests)
-* Configure Magento for [Automated Testing](http://devdocs.magento.com/guides/v2.0/mtf/mtf_quickstart/mtf_quickstart_magento.html)
 
 ### Recommendations
 * We recommend using [PHPStorm 2017](https://www.jetbrains.com/phpstorm/) for your IDE. They recently added support for [Codeception Test execution](https://blog.jetbrains.com/phpstorm/2017/03/codeception-support-comes-to-phpstorm-2017-1/) which is helpful when debugging.
-* We also recommend updating your [$PATH to include](https://stackoverflow.com/questions/7703041/editing-path-variable-on-mac) `vendor/bin` so you can easily execute the necessary `robo` and `codecept` commands instead of `vendor/bin/robo` or `vendor/bin/codecept`.  
+* We also recommend updating your [$PATH to include](https://stackoverflow.com/questions/7703041/editing-path-variable-on-mac) `./vendor/bin` so you can easily execute the necessary `robo` and `codecept` commands instead of `./vendor/bin/robo` or `./vendor/bin/codecept`.  
+
+----
+
+# TEMPORARY INSTALLATION INSTRUCTIONS
+Due to the current setup of the Framework you will need to do the following:
+
+  * `mkdir [DIRECTORY_NAME]`
+  * `cd [DIRECTORY_NAME]`
+  * Pull down - [EE](https://github.com/magento-pangolin/magento2ee)
+  * Pull down - [CE](https://github.com/magento-pangolin/magento2ce)
+  * `cd magento2ee`
+  * `php -f dev/tools/build-ee.php -- --command=link --exclude=true`
+  * Generate a `github-oauth` token: [Instructions](https://help.github.com/articles/creating-a-personal-access-token-for-the-command-line/#creating-a-token)
+  * `touch magento2ce/dev/tests/acceptance/auth.json`
+  * `nano magento2ce/dev/tests/acceptance/auth.json`
+  * Replace `<personal access token>` with the token you generated in GitHub.
+  * Save your work.
+  * `cd ../magento2ce`
+  * `cd dev/tests/acceptance`
+  * `composer install`
+    * **PLEASE IGNORE THE "Installation" SECTION THAT FOLLOWS, START WITH THE "Building The Framework" SECTION INSTEAD.**
 
 ----
 
@@ -31,7 +49,7 @@ You can **either** install through composer **or** clone from git repository.
 ## Git
 ```
 git clone GITHUB_REPO_URL
-cd magento2ce-acceptance-tests
+cd magento2ce
 composer install
 ```
 
@@ -50,85 +68,85 @@ Robo is a task runner for PHP that allows you to alias long complex CLI commands
 ### Example
 
 * Original: `allure generate tests/_output/allure-results/ -o tests/_output/allure-report/`
-* Robo: `robo allure1:generate`
+* Robo: `./vendor/bin/robo allure1:generate`
 
 ## Available Robo Commands
-You can see a list of all available Robo commands by calling `robo` directly in the Terminal.
+You can see a list of all available Robo commands by calling `./vendor/bin/robo` in the Terminal.
 
 ##### Codeception Robo Commands
-* `robo`
+* `./vendor/bin/robo`
   * Lists all available Robo commands.
-* `robo clone:files`
+* `./vendor/bin/robo clone:files`
   * Duplicate the Example configuration files used to customize the Project
-* `robo build:project`
+* `./vendor/bin/robo build:project`
   * Build the Codeception project
-* `robo generate:pages`
+* `./vendor/bin/robo generate:pages`
   * Generate all Page Objects
-* `robo generate:tests`
+* `./vendor/bin/robo generate:tests`
   * Generate all Tests in PHP
-* `robo example`
+* `./vendor/bin/robo example`
   * Run all Tests marked with the @group tag 'example', using the Chrome environment
-* `robo chrome`
-  * Run all Acceptance tests using the Chrome environment
-* `robo firefox`
-  * Run all Acceptance tests using the FireFox environment
-* `robo phantomjs`
-  * Run all Acceptance tests using the PhantomJS environment
-* `robo folder ______`
-  * Run all Acceptance tests located under the Directory Path provided using the Chrome environment
-* `robo group ______`
+* `./vendor/bin/robo chrome`
+  * Run all Functional tests using the Chrome environment
+* `./vendor/bin/robo firefox`
+  * Run all Functional tests using the FireFox environment
+* `./vendor/bin/robo phantomjs`
+  * Run all Functional tests using the PhantomJS environment
+* `./vendor/bin/robo folder ______`
+  * Run all Functional tests located under the Directory Path provided using the Chrome environment
+* `./vendor/bin/robo group ______`
   * Run all Tests with the specified @group tag, excluding @group 'skip', using the Chrome environment
   
 ##### Allure Robo Commands
 To determine which version of the Allure command you need to use please run `allure --version`.
 
-* `robo allure1:generate`
+* `./vendor/bin/robo allure1:generate`
   * Allure v1.x.x - Generate the HTML for the Allure report based on the Test XML output
-* `robo allure1:open`
+* `./vendor/bin/robo allure1:open`
   * Allure v1.x.x - Open the HTML Allure report
-* `robo allure1:report`
+* `./vendor/bin/robo allure1:report`
   * Allure v1.x.x - Generate and open the HTML Allure report
-* `robo allure2:generate`
+* `./vendor/bin/robo allure2:generate`
   * Allure v2.x.x - Generate the HTML for the Allure report based on the Test XML output
-* `robo allure2:open`
+* `./vendor/bin/robo allure2:open`
   * Allure v2.x.x - Open the HTML Allure report
-* `robo allure2:report`
+* `./vendor/bin/robo allure2:report`
   * Allure v2.x.x - Generate and open the HTML Allure report
 
 ----
 
 # Building The Framework
-After installing the dependencies you will want to build the Codeception project in the [Acceptance Test Framework](https://github.com/magento-pangolin/magento2-acceptance-test-framework), which is a dependency of the CE or EE Tests repo. Run `robo build:project` to complete this task.
+After installing the dependencies you will want to build the Codeception project in the [Magento 2 Functional Testing Framework](https://github.com/magento-pangolin/magento2-functional-testing-framework), which is a dependency of the CE or EE Tests repo. Run `./vendor/bin/robo build:project` to complete this task.
 
-`robo build:project`
+`./vendor/bin/robo build:project`
 
 ----
 
 # Configure the Framework
-Before you can generate or run the Tests you will need to clone the Example Configuration files and edit them for your specific Store settings. You can edit these files with out the fear of accidentally committing your credentials or other sensitive information as these files are listed in the *.gitignore* file.
-Run the following command to generate these files:
+Before you can generate or run the Tests you will need to edit the Configuration files and configure them for your specific Store settings. You can edit these files with out the fear of accidentally committing your credentials or other sensitive information as these files are listed in the *.gitignore* file.
 
-`robo setup`
+In the `.env` file you will find key pieces of information that are unique to your local Magento setup that will need to be edited before you can generate tests:
+* **MAGENTO_BASE_URL**
+* **MAGENTO_BACKEND_NAME**
+* **MAGENTO_ADMIN_USERNAME**
+* **MAGENTO_ADMIN_PASSWORD**
 
-In these files you will find key pieces of information that are unique to your local Magento setup that will need to be edited (ex **MAGENTO_BASE_URL**, **MAGENTO_BACKEND_NAME**, **MAGENTO_ADMIN_USERNAME**, **MAGENTO_ADMIN_PASSWORD**, etc...).
-* **tests/acceptance.suite.yml**
+##### Additional Codeception settings can be found in the following files: 
+* **tests/functional.suite.yml**
 * **codeception.dist.yml**
-* **.env**
 
 ----
 
 # Generate PHP files for Tests
-All Tests in the Framework are written in XML and need to have the PHP generated for Codeception to run. Run the following command to generate the PHP files into the following directory: `tests/acceptance/Magento/AcceptanceTest/_generated`
+All Tests in the Framework are written in XML and need to have the PHP generated for Codeception to run. Run the following command to generate the PHP files in the following directory (If this directory does not exist it will be created): `dev/tests/acceptance/tests/functional/Magento/FunctionalTest/_generated`
 
-If this directory doesn't exist it will be created.
-
-`robo generate:tests`
+`./vendor/bin/robo generate:tests`
 
 ----
 
 # Running Tests
 ## Start the Selenium Server
-PLEASE NOTE: You will need to have an instance of the Selenium Server running on your machine before you can execute the Tests.
+**PLEASE NOTE**: You will need to have an instance of the Selenium Server running on your machine before you can execute the Tests.
 
 ```
 cd [LOCATION_OF_SELENIUM_JAR]
@@ -136,7 +154,7 @@ java -jar selenium-server-standalone-X.X.X.jar
 ```
 
 ## Run Tests Manually
-You can run the Codeception tests directly without using Robo if you'd like. To do so please run `codecept run acceptance` to execute all Acceptance tests that DO NOT include @env tags. IF a Test includes an [@env tag](http://codeception.com/docs/07-AdvancedUsage#Environments) you MUST include the `--env ENV_NAME` flag.
+You can run the Codeception tests directly without using Robo if you'd like. To do so please run `./vendor/bin/codecept run functional` to execute all Functional tests that DO NOT include @env tags. IF a Test includes an [@env tag](http://codeception.com/docs/07-AdvancedUsage#Environments) you MUST include the `--env ENV_NAME` flag.
 
 #### Common Codeception Flags:
 
@@ -150,17 +168,17 @@ You can run the Codeception tests directly without using Robo if you'd like. To
 
 #### Examples
 
-* Run ALL Acceptance Tests without an @env tag: `codecept run acceptance`
-* Run ALL Acceptance Tests without the "skip" @group: `codecept run acceptance --skip-group skip`
-* Run ALL Acceptance Tests with the @group tag "example" without the "skip" @group tests: `codecept run acceptance --group example --skip-group skip`
+* Run ALL Functional Tests without an @env tag: `./vendor/bin/codecept run functional`
+* Run ALL Functional Tests without the "skip" @group: `./vendor/bin/codecept run functional --skip-group skip`
+* Run ALL Functional Tests with the @group tag "example" without the "skip" @group tests: `./vendor/bin/codecept run functional --group example --skip-group skip`
 
 ## Run Tests using Robo
-* Run all Acceptance Tests using the @env tag "chrome": `robo chrome`
-* Run all Acceptance Tests using the @env tag "firefox": `robo firefox`
-* Run all Acceptance Tests using the @env tag "phantomjs": `robo phantomjs`
-* Run all Acceptance Tests using the @group tag "example": `robo example`
-* Run all Acceptance Tests using the provided @group tag: `robo group GROUP_NAME`
-* Run all Acceptance Tests listed under the provided Folder Path: `robo folder tests/acceptance/Magento/AcceptanceTest/MODULE_NAME`
+* Run all Functional Tests using the @env tag "chrome": `./vendor/bin/robo chrome`
+* Run all Functional Tests using the @env tag "firefox": `./vendor/bin/robo firefox`
+* Run all Functional Tests using the @env tag "phantomjs": `./vendor/bin/robo phantomjs`
+* Run all Functional Tests using the @group tag "example": `./vendor/bin/robo example`
+* Run all Functional Tests using the provided @group tag: `./vendor/bin/robo group GROUP_NAME`
+* Run all Functional Tests listed under the provided Folder Path: `./vendor/bin/robo folder dev/tests/acceptance/tests/functional/Magento/FunctionalTest/MODULE_NAME`
 
 ----
 
@@ -180,14 +198,14 @@ You can run the following commands in the Terminal to generate and open an Allur
 You can run the following Robo commands in the Terminal to generate and open an Allure report (Run the following terminal command for the Allure version: `allure --version`):
 
 ##### Allure v1.x.x
-* Build the Report: `robo allure1:generate`
-* Open the Report: `robo allure1:open`
-* Build/Open the Report: `robo allure1:report`
+* Build the Report: `./vendor/bin/robo allure1:generate`
+* Open the Report: `./vendor/bin/robo allure1:open`
+* Build/Open the Report: `./vendor/bin/robo allure1:report`
 
 ##### Allure v2.x.x
-* Build the Report: `robo allure2:generate`
-* Open the Report: `robo allure2:open`
-* Build/Open the Report: `robo allure2:report`
+* Build the Report: `./vendor/bin/robo allure2:generate`
+* Open the Report: `./vendor/bin/robo allure2:open`
+* Build/Open the Report: `./vendor/bin/robo allure2:report`
 
 ----
 
@@ -199,9 +217,9 @@ Due to the interdependent nature of the 2 repos it is recommended to Symlink the
 # Troubleshooting
 * TimeZone Error - http://stackoverflow.com/questions/18768276/codeception-datetime-error
 * TimeZone List - http://php.net/manual/en/timezones.america.php
-* System PATH - Make sure you have `vendor/bin/` and `vendor/` listed in your system path so you can run the  `codecept` and `robo` commands directly:
+* System PATH - Make sure you have `./vendor/bin/`, `vendor/bin/` and `vendor/` listed in your system path so you can run the  `codecept` and `robo` commands directly:
 
-    `sudo nano /etc/private/paths`
+    `sudo nano /etc/paths`
     
 * StackOverflow Help: https://stackoverflow.com/questions/7703041/editing-path-variable-on-mac
 * Allure `@env error` - Allure recently changed their Codeception Adapter that breaks Codeception when tests include the `@env` tag. A workaround for this error is to revert the changes they made to a function. 
@@ -225,4 +243,4 @@ public function _initialize(array $ignoredAnnotations = [])
             Model\Provider::setOutputDirectory($outputDirectory);
         }
     }
-```
\ No newline at end of file
+```
diff --git a/dev/tests/acceptance/RoboFile.php b/dev/tests/acceptance/RoboFile.php
index e41816cccbf..4f6346de148 100644
--- a/dev/tests/acceptance/RoboFile.php
+++ b/dev/tests/acceptance/RoboFile.php
@@ -13,15 +13,6 @@ class RoboFile extends \Robo\Tasks
 {
     use Robo\Task\Base\loadShortcuts;
 
-    /**
-     * Complete all Project Setup tasks
-     */
-    function setup()
-    {
-        $this->_exec('vendor/bin/robo clone:files');
-        $this->_exec('vendor/bin/codecept build');
-    }
-
     /**
      * Duplicate the Example configuration files used to customize the Project for customization
      */
@@ -33,12 +24,13 @@ class RoboFile extends \Robo\Tasks
     }
 
     /**
+     * Clone the Example configuration files
      * Build the Codeception project
      */
     function buildProject()
     {
         $this->cloneFiles();
-        $this->_exec('vendor/bin/codecept build');
+        $this->_exec('./vendor/bin/codecept build');
     }
 
     /**
@@ -56,7 +48,7 @@ class RoboFile extends \Robo\Tasks
      */
     function chrome()
     {
-        $this->_exec('codecept run functional --env chrome --skip-group skip');
+        $this->_exec('./vendor/bin/codecept run functional --env chrome --skip-group skip');
     }
 
     /**
@@ -64,7 +56,7 @@ class RoboFile extends \Robo\Tasks
      */
     function firefox()
     {
-        $this->_exec('codecept run functional --env firefox --skip-group skip');
+        $this->_exec('./vendor/bin/codecept run functional --env firefox --skip-group skip');
     }
 
     /**
@@ -72,7 +64,7 @@ class RoboFile extends \Robo\Tasks
      */
     function phantomjs()
     {
-        $this->_exec('codecept run functional --env phantomjs --skip-group skip');
+        $this->_exec('./vendor/bin/codecept run functional --env phantomjs --skip-group skip');
     }
 
     /**
@@ -80,7 +72,7 @@ class RoboFile extends \Robo\Tasks
      */
     function group($args = '')
     {
-        $this->taskExec('codecept run functional --verbose --steps --env chrome --skip-group skip --group')->args($args)->run();
+        $this->taskExec('./vendor/bin/codecept run functional --verbose --steps --env chrome --skip-group skip --group')->args($args)->run();
     }
 
     /**
@@ -88,7 +80,7 @@ class RoboFile extends \Robo\Tasks
      */
     function folder($args = '')
     {
-        $this->taskExec('codecept run functional --env chrome')->args($args)->run();
+        $this->taskExec('./vendor/bin/codecept run functional --env chrome')->args($args)->run();
     }
 
     /**
@@ -96,7 +88,7 @@ class RoboFile extends \Robo\Tasks
      */
     function example()
     {
-        $this->_exec('codecept run --env chrome --group example --skip-group skip');
+        $this->_exec('./vendor/bin/codecept run --env chrome --group example --skip-group skip');
     }
 
     /**
-- 
GitLab


From e536c491955f7fc3836106c62ec37deb066d0ad2 Mon Sep 17 00:00:00 2001
From: Kevin Kozan <kkozan@magento.com>
Date: Wed, 27 Sep 2017 21:14:51 +0300
Subject: [PATCH 037/380] MQE-292: Use "selector" name consistently instead of
 "locator"

 - Renamed all occurences of locator to selector.
---
 .../Backend/Section/AdminLoginFormSection.xml |  6 +-
 .../Backend/Section/AdminMessagesSection.xml  |  4 +-
 .../AdminCategoryBasicFieldSection.xml        |  6 +-
 .../AdminCategoryMainActionsSection.xml       |  2 +-
 .../Section/AdminCategoryMessagesSection.xml  |  2 +-
 .../Section/AdminCategorySEOSection.xml       | 10 +--
 .../AdminCategorySidebarActionSection.xml     |  4 +-
 .../AdminCategorySidebarTreeSection.xml       |  4 +-
 .../Section/AdminProductFormActionSection.xml |  2 +-
 .../Section/AdminProductFormSection.xml       | 66 +++++++++----------
 .../Section/AdminProductGridActionSection.xml |  6 +-
 .../Section/AdminProductGridSection.xml       |  4 +-
 .../Section/AdminProductMessagesSection.xml   |  2 +-
 .../Section/AdminProductSEOSection.xml        |  4 +-
 .../Section/StorefrontCategoryMainSection.xml | 10 +--
 .../Section/StorefrontMessagesSection.xml     |  2 +-
 .../Section/StorefrontMiniCartSection.xml     |  6 +-
 .../StorefrontProductInfoDetailsSection.xml   |  2 +-
 .../StorefrontProductInfoMainSection.xml      | 12 ++--
 .../Section/CheckoutOrderSummarySection.xml   |  8 +--
 .../Section/CheckoutPaymentSection.xml        |  6 +-
 .../CheckoutShippingGuestInfoSection.xml      | 16 ++---
 .../CheckoutShippingMethodsSection.xml        |  4 +-
 .../Section/CheckoutShippingSection.xml       |  4 +-
 .../Section/CheckoutSuccessMainSection.xml    |  6 +-
 .../Section/GuestCheckoutPaymentSection.xml   |  6 +-
 .../Section/GuestCheckoutShippingSection.xml  | 20 +++---
 .../Section/CmsNewPagePageActionsSection.xml  |  2 +-
 .../CmsNewPagePageBasicFieldsSection.xml      |  2 +-
 .../Section/CmsNewPagePageContentSection.xml  |  6 +-
 .../Cms/Section/CmsNewPagePageSeoSection.xml  |  4 +-
 .../Section/CmsPagesPageActionsSection.xml    |  2 +-
 .../Section/AdminCustomerFiltersSection.xml   |  6 +-
 .../Section/AdminCustomerGridSection.xml      |  2 +-
 .../AdminCustomerMainActionsSection.xml       |  2 +-
 .../Section/AdminCustomerMessagesSection.xml  |  2 +-
 ...inNewCustomerAccountInformationSection.xml |  6 +-
 .../AdminNewCustomerMainActionsSection.xml    |  2 +-
 .../StorefrontCustomerCreateFormSection.xml   | 12 ++--
 ...omerDashboardAccountInformationSection.xml |  2 +-
 .../StorefrontCustomerSignInFormSection.xml   |  6 +-
 .../Section/StorefrontPanelHeaderSection.xml  |  2 +-
 .../InvoiceDetailsInformationSection.xml      |  2 +-
 .../Sales/Section/InvoiceNewSection.xml       |  2 +-
 .../Sales/Section/InvoicesFiltersSection.xml  |  2 +-
 .../Sales/Section/InvoicesGridSection.xml     |  6 +-
 .../OrderDetailsInformationSection.xml        | 10 +--
 .../Section/OrderDetailsInvoicesSection.xml   |  4 +-
 .../OrderDetailsMainActionsSection.xml        | 16 ++---
 .../Section/OrderDetailsMessagesSection.xml   |  2 +-
 .../Section/OrderDetailsOrderViewSection.xml  |  4 +-
 .../Sales/Section/OrdersGridSection.xml       | 14 ++--
 .../Templates/TemplateSectionFile.xml         |  2 +-
 53 files changed, 173 insertions(+), 173 deletions(-)

diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/Section/AdminLoginFormSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/Section/AdminLoginFormSection.xml
index 532a354da12..762aa002492 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/Section/AdminLoginFormSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/Section/AdminLoginFormSection.xml
@@ -9,8 +9,8 @@
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
     <section name="AdminLoginFormSection">
-        <element name="username" type="input" locator="#username"/>
-        <element name="password" type="input" locator="#login"/>
-        <element name="signIn" type="button" locator=".actions .action-primary" timeout="30"/>
+        <element name="username" type="input" selector="#username"/>
+        <element name="password" type="input" selector="#login"/>
+        <element name="signIn" type="button" selector=".actions .action-primary" timeout="30"/>
     </section>
 </config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/Section/AdminMessagesSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/Section/AdminMessagesSection.xml
index b77233ab260..591731f53e0 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/Section/AdminMessagesSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/Section/AdminMessagesSection.xml
@@ -7,8 +7,8 @@
 -->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
+        xsi:noNamespaceSchemaLocation="../../../../../../../../../../magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
     <section name="AdminMessagesSection">
-        <element name="test" type="input" locator=".test"/>
+        <element name="test" type="input" selector=".test"/>
     </section>
 </config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminCategoryBasicFieldSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminCategoryBasicFieldSection.xml
index 5720e198df0..4a55b4db465 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminCategoryBasicFieldSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminCategoryBasicFieldSection.xml
@@ -9,8 +9,8 @@
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
     <section name="AdminCategoryBasicFieldSection">
-        <element name="IncludeInMenu" type="checkbox" locator="input[name='include_in_menu']"/>
-        <element name="EnableCategory" type="checkbox" locator="input[name='is_active']"/>
-        <element name="CategoryNameInput" type="input" locator="input[name='name']"/>
+        <element name="IncludeInMenu" type="checkbox" selector="input[name='include_in_menu']"/>
+        <element name="EnableCategory" type="checkbox" selector="input[name='is_active']"/>
+        <element name="CategoryNameInput" type="input" selector="input[name='name']"/>
     </section>
 </config>
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminCategoryMainActionsSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminCategoryMainActionsSection.xml
index 425b98d2a4f..2ca068f0c10 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminCategoryMainActionsSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminCategoryMainActionsSection.xml
@@ -9,6 +9,6 @@
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
     <section name="AdminCategoryMainActionsSection">
-        <element name="SaveButton" type="button" locator=".page-actions-inner #save" timeout="30"/>
+        <element name="SaveButton" type="button" selector=".page-actions-inner #save" timeout="30"/>
     </section>
 </config>
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminCategoryMessagesSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminCategoryMessagesSection.xml
index f58e66f9cd9..bf8b4f79542 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminCategoryMessagesSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminCategoryMessagesSection.xml
@@ -9,6 +9,6 @@
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
     <section name="AdminCategoryMessagesSection">
-        <element name="SuccessMessage" type="text" locator=".message-success"/>
+        <element name="SuccessMessage" type="text" selector=".message-success"/>
     </section>
 </config>
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminCategorySEOSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminCategorySEOSection.xml
index f6780f1eb32..078e591b535 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminCategorySEOSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminCategorySEOSection.xml
@@ -9,10 +9,10 @@
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
     <section name="AdminCategorySEOSection">
-        <element name="SectionHeader" type="button" locator="div[data-index='search_engine_optimization']" timeout="30"/>
-        <element name="UrlKeyInput" type="input" locator="input[name='url_key']"/>
-        <element name="MetaTitleInput" type="input" locator="input[name='meta_title']"/>
-        <element name="MetaKeywordsInput" type="textarea" locator="textarea[name='meta_keywords']"/>
-        <element name="MetaDescriptionInput" type="textarea" locator="textarea[name='meta_description']"/>
+        <element name="SectionHeader" type="button" selector="div[data-index='search_engine_optimization']" timeout="30"/>
+        <element name="UrlKeyInput" type="input" selector="input[name='url_key']"/>
+        <element name="MetaTitleInput" type="input" selector="input[name='meta_title']"/>
+        <element name="MetaKeywordsInput" type="textarea" selector="textarea[name='meta_keywords']"/>
+        <element name="MetaDescriptionInput" type="textarea" selector="textarea[name='meta_description']"/>
     </section>
 </config>
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminCategorySidebarActionSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminCategorySidebarActionSection.xml
index 0847d229848..99ec2595021 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminCategorySidebarActionSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminCategorySidebarActionSection.xml
@@ -9,7 +9,7 @@
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
     <section name="AdminCategorySidebarActionSection">
-        <element name="AddRootCategoryButton" type="button" locator="#add_root_category_button" timeout="30"/>
-        <element name="AddSubcategoryButton" type="button" locator="#add_subcategory_button" timeout="30"/>
+        <element name="AddRootCategoryButton" type="button" selector="#add_root_category_button" timeout="30"/>
+        <element name="AddSubcategoryButton" type="button" selector="#add_subcategory_button" timeout="30"/>
     </section>
 </config>
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminCategorySidebarTreeSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminCategorySidebarTreeSection.xml
index 6bbf3876fb4..d6ddd44bda5 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminCategorySidebarTreeSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminCategorySidebarTreeSection.xml
@@ -9,7 +9,7 @@
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
     <section name="AdminCategorySidebarTreeSection">
-        <element name="Collapse All" type="button" locator=".tree-actions a:first-child"/>
-        <element name="Expand All" type="button" locator=".tree-actions a:last-child"/>
+        <element name="Collapse All" type="button" selector=".tree-actions a:first-child"/>
+        <element name="Expand All" type="button" selector=".tree-actions a:last-child"/>
     </section>
 </config>
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminProductFormActionSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminProductFormActionSection.xml
index f7b7b989ace..696e6cacc3e 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminProductFormActionSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminProductFormActionSection.xml
@@ -9,6 +9,6 @@
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
     <section name="AdminProductFormActionSection">
-        <element name="saveButton" type="button" locator="#save-button" timeout="30"/>
+        <element name="saveButton" type="button" selector="#save-button" timeout="30"/>
     </section>
 </config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminProductFormSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminProductFormSection.xml
index a23112065fd..7b3f6292908 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminProductFormSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminProductFormSection.xml
@@ -9,49 +9,49 @@
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
     <section name="AdminProductFormSection">
-        <element name="productName" type="input" locator=".admin__field[data-index=name] input"/>
-        <element name="productSku" type="input" locator=".admin__field[data-index=sku] input"/>
-        <element name="productPrice" type="input" locator=".admin__field[data-index=price] input"/>
-        <element name="categoriesDropdown" type="multiselect" locator="div[data-index='category_ids']"/>
-        <element name="productQuantity" type="input" locator=".admin__field[data-index=qty] input"/>
+        <element name="productName" type="input" selector=".admin__field[data-index=name] input"/>
+        <element name="productSku" type="input" selector=".admin__field[data-index=sku] input"/>
+        <element name="productPrice" type="input" selector=".admin__field[data-index=price] input"/>
+        <element name="categoriesDropdown" type="multiselect" selector="div[data-index='category_ids']"/>
+        <element name="productQuantity" type="input" selector=".admin__field[data-index=qty] input"/>
     </section>
     <section name="AdminProductFormConfigurationsSection">
-        <element name="createConfigurations" type="button" locator="button[data-index='create_configurable_products_button']" timeout="30"/>
-        <element name="currentVariationsRows" type="button" locator=".data-row"/>
-        <element name="currentVariationsNameCells" type="textarea" locator=".admin__control-fields[data-index='name_container']"/>
-        <element name="currentVariationsSkuCells" type="textarea" locator=".admin__control-fields[data-index='sku_container']"/>
-        <element name="currentVariationsPriceCells" type="textarea" locator=".admin__control-fields[data-index='price_container']"/>
-        <element name="currentVariationsQuantityCells" type="textarea" locator=".admin__control-fields[data-index='quantity_container']"/>
-        <element name="currentVariationsAttributesCells" type="textarea" locator=".admin__control-fields[data-index='attributes']"/>
+        <element name="createConfigurations" type="button" selector="button[data-index='create_configurable_products_button']" timeout="30"/>
+        <element name="currentVariationsRows" type="button" selector=".data-row"/>
+        <element name="currentVariationsNameCells" type="textarea" selector=".admin__control-fields[data-index='name_container']"/>
+        <element name="currentVariationsSkuCells" type="textarea" selector=".admin__control-fields[data-index='sku_container']"/>
+        <element name="currentVariationsPriceCells" type="textarea" selector=".admin__control-fields[data-index='price_container']"/>
+        <element name="currentVariationsQuantityCells" type="textarea" selector=".admin__control-fields[data-index='quantity_container']"/>
+        <element name="currentVariationsAttributesCells" type="textarea" selector=".admin__control-fields[data-index='attributes']"/>
     </section>
     <section name="AdminCreateProductConfigurationsPanel">
-        <element name="next" type="button" locator=".steps-wizard-navigation .action-next-step" timeout="30"/>
-        <element name="createNewAttribute" type="button" locator=".select-attributes-actions button[title='Create New Attribute']" timeout="30"/>
-        <element name="filters" type="button" locator="button[data-action='grid-filter-expand']"/>
-        <element name="attributeCode" type="input" locator=".admin__control-text[name='attribute_code']"/>
-        <element name="applyFilters" type="button" locator="button[data-action='grid-filter-apply']" timeout="30"/>
-        <element name="firstCheckbox" type="input" locator="tr[data-repeat-index='0'] .admin__control-checkbox"/>
+        <element name="next" type="button" selector=".steps-wizard-navigation .action-next-step" timeout="30"/>
+        <element name="createNewAttribute" type="button" selector=".select-attributes-actions button[title='Create New Attribute']" timeout="30"/>
+        <element name="filters" type="button" selector="button[data-action='grid-filter-expand']"/>
+        <element name="attributeCode" type="input" selector=".admin__control-text[name='attribute_code']"/>
+        <element name="applyFilters" type="button" selector="button[data-action='grid-filter-apply']" timeout="30"/>
+        <element name="firstCheckbox" type="input" selector="tr[data-repeat-index='0'] .admin__control-checkbox"/>
 
-        <element name="selectAll" type="button" locator=".action-select-all"/>
-        <element name="createNewValue" type="input" locator=".action-create-new" timeout="30"/>
-        <element name="attributeName" type="input" locator="li[data-attribute-option-title=''] .admin__field-create-new .admin__control-text"/>
-        <element name="saveAttribute" type="button" locator="li[data-attribute-option-title=''] .action-save" timeout="30"/>
+        <element name="selectAll" type="button" selector=".action-select-all"/>
+        <element name="createNewValue" type="input" selector=".action-create-new" timeout="30"/>
+        <element name="attributeName" type="input" selector="li[data-attribute-option-title=''] .admin__field-create-new .admin__control-text"/>
+        <element name="saveAttribute" type="button" selector="li[data-attribute-option-title=''] .action-save" timeout="30"/>
 
-        <element name="applyUniquePricesByAttributeToEachSku" type="radio" locator=".admin__field-label[for='apply-unique-prices-radio']"/>
-        <element name="selectAttribute" type="select" locator="#select-each-price" timeout="30"/>
-        <element name="attribute1" type="input" locator="#apply-single-price-input-0"/>
-        <element name="attribute2" type="input" locator="#apply-single-price-input-1"/>
-        <element name="attribute3" type="input" locator="#apply-single-price-input-2"/>
+        <element name="applyUniquePricesByAttributeToEachSku" type="radio" selector=".admin__field-label[for='apply-unique-prices-radio']"/>
+        <element name="selectAttribute" type="select" selector="#select-each-price" timeout="30"/>
+        <element name="attribute1" type="input" selector="#apply-single-price-input-0"/>
+        <element name="attribute2" type="input" selector="#apply-single-price-input-1"/>
+        <element name="attribute3" type="input" selector="#apply-single-price-input-2"/>
 
-        <element name="applySingleQuantityToEachSkus" type="radio" locator=".admin__field-label[for='apply-single-inventory-radio']" timeout="30"/>
-        <element name="quantity" type="input" locator="#apply-single-inventory-input"/>
+        <element name="applySingleQuantityToEachSkus" type="radio" selector=".admin__field-label[for='apply-single-inventory-radio']" timeout="30"/>
+        <element name="quantity" type="input" selector="#apply-single-inventory-input"/>
     </section>
     <section name="AdminNewAttributePanel">
-        <element name="saveAttribute" type="button" locator="#save" timeout="30"/>
-        <element name="newAttributeIFrame" type="iframe" locator="create_new_attribute_container"/>
-        <element name="defaultLabel" type="input" locator="#attribute_label"/>
+        <element name="saveAttribute" type="button" selector="#save" timeout="30"/>
+        <element name="newAttributeIFrame" type="iframe" selector="create_new_attribute_container"/>
+        <element name="defaultLabel" type="input" selector="#attribute_label"/>
     </section>
     <section name="AdminChooseAffectedAttributeSetPopup">
-        <element name="confirm" type="button" locator="button[data-index='confirm_button']" timeout="30"/>
+        <element name="confirm" type="button" selector="button[data-index='confirm_button']" timeout="30"/>
     </section>
 </config>
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminProductGridActionSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminProductGridActionSection.xml
index e45c67c0dcf..866bcb4223e 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminProductGridActionSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminProductGridActionSection.xml
@@ -9,8 +9,8 @@
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
     <section name="AdminProductGridActionSection">
-        <element name="addProductToggle" type="button" locator=".action-toggle.primary.add" timeout="30"/>
-        <element name="addSimpleProduct" type="button" locator=".item[data-ui-id='products-list-add-new-product-button-item-simple']" timeout="30"/>
-        <element name="addConfigurableProduct" type="button" locator=".item[data-ui-id='products-list-add-new-product-button-item-configurable']" timeout="30"/>
+        <element name="addProductToggle" type="button" selector=".action-toggle.primary.add" timeout="30"/>
+        <element name="addSimpleProduct" type="button" selector=".item[data-ui-id='products-list-add-new-product-button-item-simple']" timeout="30"/>
+        <element name="addConfigurableProduct" type="button" selector=".item[data-ui-id='products-list-add-new-product-button-item-configurable']" timeout="30"/>
     </section>
 </config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminProductGridSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminProductGridSection.xml
index feecb1cc8f0..db8b641c9d2 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminProductGridSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminProductGridSection.xml
@@ -9,7 +9,7 @@
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
     <section name="AdminProductGridSection">
-        <element name="productGridElement1" type="input" locator="#addLocator" />
-        <element name="productGridElement2" type="text" locator="#addLocator" />
+        <element name="productGridElement1" type="input" selector="#addselector" />
+        <element name="productGridElement2" type="text" selector="#addselector" />
     </section>
 </config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminProductMessagesSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminProductMessagesSection.xml
index 860fdbe398a..f20d3f51bec 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminProductMessagesSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminProductMessagesSection.xml
@@ -9,6 +9,6 @@
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
     <section name="AdminProductMessagesSection">
-        <element name="successMessage" type="text" locator=".message-success"/>
+        <element name="successMessage" type="text" selector=".message-success"/>
     </section>
 </config>
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminProductSEOSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminProductSEOSection.xml
index d994a1d7390..1f9fc4fc3fc 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminProductSEOSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminProductSEOSection.xml
@@ -9,7 +9,7 @@
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
     <section name="AdminProductSEOSection">
-        <element name="sectionHeader" type="button" locator="div[data-index='search-engine-optimization']" timeout="30"/>
-        <element name="urlKeyInput" type="input" locator="input[name='product[url_key]']"/>
+        <element name="sectionHeader" type="button" selector="div[data-index='search-engine-optimization']" timeout="30"/>
+        <element name="urlKeyInput" type="input" selector="input[name='product[url_key]']"/>
     </section>
 </config>
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/StorefrontCategoryMainSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/StorefrontCategoryMainSection.xml
index c3dbe95bc6b..83622dd759f 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/StorefrontCategoryMainSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/StorefrontCategoryMainSection.xml
@@ -9,10 +9,10 @@
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
     <section name="StorefrontCategoryMainSection">
-        <element name="CategoryTitle" type="text" locator="#page-title-heading span"/>
-        <element name="ProductItemInfo" type="button" locator=".product-item-info"/>
-        <element name="AddToCartBtn" type="button" locator="button.action.tocart.primary"/>
-        <element name="SuccessMsg" type="button" locator="div.message-success"/>
-        <element name="productCount" type="text" locator="#toolbar-amount"/>
+        <element name="CategoryTitle" type="text" selector="#page-title-heading span"/>
+        <element name="ProductItemInfo" type="button" selector=".product-item-info"/>
+        <element name="AddToCartBtn" type="button" selector="button.action.tocart.primary"/>
+        <element name="SuccessMsg" type="button" selector="div.message-success"/>
+        <element name="productCount" type="text" selector="#toolbar-amount"/>
     </section>
 </config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/StorefrontMessagesSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/StorefrontMessagesSection.xml
index dcfc2564d3c..a7036388814 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/StorefrontMessagesSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/StorefrontMessagesSection.xml
@@ -9,6 +9,6 @@
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
     <section name="StorefrontMessagesSection">
-        <element name="test" type="input" locator=".test"/>
+        <element name="test" type="input" selector=".test"/>
     </section>
 </config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/StorefrontMiniCartSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/StorefrontMiniCartSection.xml
index fd814766ea6..db9e1cd4b23 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/StorefrontMiniCartSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/StorefrontMiniCartSection.xml
@@ -9,8 +9,8 @@
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
     <section name="StorefrontMiniCartSection">
-        <element name="quantity" type="button" locator="span.counter-number"/>
-        <element name="show" type="button" locator="a.showcart"/>
-        <element name="goToCheckout" type="button" locator="#top-cart-btn-checkout"/>
+        <element name="quantity" type="button" selector="span.counter-number"/>
+        <element name="show" type="button" selector="a.showcart"/>
+        <element name="goToCheckout" type="button" selector="#top-cart-btn-checkout"/>
     </section>
 </config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/StorefrontProductInfoDetailsSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/StorefrontProductInfoDetailsSection.xml
index ebdff90a69d..742dbac0e08 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/StorefrontProductInfoDetailsSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/StorefrontProductInfoDetailsSection.xml
@@ -9,6 +9,6 @@
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
     <section name="StorefrontProductInfoDetailsSection">
-        <element name="productNameForReview" type="text" locator=".legend.review-legend>strong" />
+        <element name="productNameForReview" type="text" selector=".legend.review-legend>strong" />
     </section>
 </config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/StorefrontProductInfoMainSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/StorefrontProductInfoMainSection.xml
index 22b55bb879f..78940343506 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/StorefrontProductInfoMainSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/StorefrontProductInfoMainSection.xml
@@ -9,12 +9,12 @@
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
     <section name="StorefrontProductInfoMainSection">
-        <element name="productName" type="text" locator=".base"/>
-        <element name="productSku" type="text" locator=".product.attribute.sku>.value"/>
-        <element name="productPrice" type="text" locator=".price"/>
-        <element name="productStockStatus" type="text" locator=".stock[title=Availability]>span"/>
+        <element name="productName" type="text" selector=".base"/>
+        <element name="productSku" type="text" selector=".product.attribute.sku>.value"/>
+        <element name="productPrice" type="text" selector=".price"/>
+        <element name="productStockStatus" type="text" selector=".stock[title=Availability]>span"/>
         
-        <element name="productAttributeTitle1" type="text" locator="#product-options-wrapper div[tabindex='0'] label"/>
-        <element name="productAttributeOptions1" type="select" locator="#product-options-wrapper div[tabindex='0'] option"/>
+        <element name="productAttributeTitle1" type="text" selector="#product-options-wrapper div[tabindex='0'] label"/>
+        <element name="productAttributeOptions1" type="select" selector="#product-options-wrapper div[tabindex='0'] option"/>
     </section>
 </config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Section/CheckoutOrderSummarySection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Section/CheckoutOrderSummarySection.xml
index 319bafca8c2..5b45d1a24b3 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Section/CheckoutOrderSummarySection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Section/CheckoutOrderSummarySection.xml
@@ -9,9 +9,9 @@
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
     <section name="CheckoutOrderSummarySection">
-        <element name="miniCartTab" type="button" locator=".title[role='tab']"/>
-        <element name="productItemName" type="text" locator=".product-item-name"/>
-        <element name="productItemQty" type="text" locator=".value"/>
-        <element name="productItemPrice" type="text" locator=".price"/>
+        <element name="miniCartTab" type="button" selector=".title[role='tab']"/>
+        <element name="productItemName" type="text" selector=".product-item-name"/>
+        <element name="productItemQty" type="text" selector=".value"/>
+        <element name="productItemPrice" type="text" selector=".price"/>
     </section>
 </config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Section/CheckoutPaymentSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Section/CheckoutPaymentSection.xml
index fc616a51207..29f97e8defa 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Section/CheckoutPaymentSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Section/CheckoutPaymentSection.xml
@@ -9,8 +9,8 @@
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
     <section name="CheckoutPaymentSection">
-        <element name="cartItems" type="text" locator=".minicart-items"/>
-        <element name="billingAddress" type="text" locator="div.billing-address-details"/>
-        <element name="placeOrder" type="button" locator="button.action.primary.checkout" timeout="30"/>
+        <element name="cartItems" type="text" selector=".minicart-items"/>
+        <element name="billingAddress" type="text" selector="div.billing-address-details"/>
+        <element name="placeOrder" type="button" selector="button.action.primary.checkout" timeout="30"/>
     </section>
 </config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Section/CheckoutShippingGuestInfoSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Section/CheckoutShippingGuestInfoSection.xml
index a783d5ea7aa..bbe8b0b1fee 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Section/CheckoutShippingGuestInfoSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Section/CheckoutShippingGuestInfoSection.xml
@@ -9,13 +9,13 @@
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
     <section name="CheckoutShippingGuestInfoSection">
-        <element name="email" type="input" locator="#customer-email"/>
-        <element name="firstName" type="input" locator="input[name=firstname]"/>
-        <element name="lastName" type="input" locator="input[name=lastname]"/>
-        <element name="street" type="input" locator="input[name='street[0]']"/>
-        <element name="city" type="input" locator="input[name=city]"/>
-        <element name="region" type="select" locator="select[name=region_id]"/>
-        <element name="postcode" type="input" locator="input[name=postcode]"/>
-        <element name="telephone" type="input" locator="input[name=telephone]"/>
+        <element name="email" type="input" selector="#customer-email"/>
+        <element name="firstName" type="input" selector="input[name=firstname]"/>
+        <element name="lastName" type="input" selector="input[name=lastname]"/>
+        <element name="street" type="input" selector="input[name='street[0]']"/>
+        <element name="city" type="input" selector="input[name=city]"/>
+        <element name="region" type="select" selector="select[name=region_id]"/>
+        <element name="postcode" type="input" selector="input[name=postcode]"/>
+        <element name="telephone" type="input" selector="input[name=telephone]"/>
     </section>
 </config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Section/CheckoutShippingMethodsSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Section/CheckoutShippingMethodsSection.xml
index dbe09299929..52653d15c41 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Section/CheckoutShippingMethodsSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Section/CheckoutShippingMethodsSection.xml
@@ -9,7 +9,7 @@
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
     <section name="CheckoutShippingMethodsSection">
-        <element name="next" type="button" locator="button.button.action.continue.primary"/>
-        <element name="firstShippingMethod" type="radio" locator=".row:nth-of-type(1) .col-method .radio"/>
+        <element name="next" type="button" selector="button.button.action.continue.primary"/>
+        <element name="firstShippingMethod" type="radio" selector=".row:nth-of-type(1) .col-method .radio"/>
     </section>
 </config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Section/CheckoutShippingSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Section/CheckoutShippingSection.xml
index 364c2d92c1d..3e507dbb898 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Section/CheckoutShippingSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Section/CheckoutShippingSection.xml
@@ -9,7 +9,7 @@
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
     <section name="CheckoutShippingSection">
-        <element name="selectedShippingAddress" type="text" locator=".shipping-address-item.selected-item"/>
-        <element name="newAddressButton" type="button" locator="#checkout-step-shipping button"/>
+        <element name="selectedShippingAddress" type="text" selector=".shipping-address-item.selected-item"/>
+        <element name="newAddressButton" type="button" selector="#checkout-step-shipping button"/>
     </section>
 </config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Section/CheckoutSuccessMainSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Section/CheckoutSuccessMainSection.xml
index cb47bf9900e..9204bf51344 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Section/CheckoutSuccessMainSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Section/CheckoutSuccessMainSection.xml
@@ -9,8 +9,8 @@
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
     <section name="CheckoutSuccessMainSection">
-        <element name="success" type="text" locator="div.checkout-success"/>
-        <element name="orderNumber" type="text" locator="div.checkout-success > p:nth-child(1) > span"/>
-        <element name="orderNumber22" type="text" locator=".order-number>strong"/>
+        <element name="success" type="text" selector="div.checkout-success"/>
+        <element name="orderNumber" type="text" selector="div.checkout-success > p:nth-child(1) > span"/>
+        <element name="orderNumber22" type="text" selector=".order-number>strong"/>
     </section>
 </config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Section/GuestCheckoutPaymentSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Section/GuestCheckoutPaymentSection.xml
index 7050068ba27..200a699d2bb 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Section/GuestCheckoutPaymentSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Section/GuestCheckoutPaymentSection.xml
@@ -9,8 +9,8 @@
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
     <section name="GuestCheckoutPaymentSection">
-        <element name="cartItems" type="text" locator=".minicart-items"/>
-        <element name="billingAddress" type="text" locator="div.billing-address-details"/>
-        <element name="placeOrder" type="button" locator="button.action.primary.checkout" timeout="30"/>
+        <element name="cartItems" type="text" selector=".minicart-items"/>
+        <element name="billingAddress" type="text" selector="div.billing-address-details"/>
+        <element name="placeOrder" type="button" selector="button.action.primary.checkout" timeout="30"/>
     </section>
 </config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Section/GuestCheckoutShippingSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Section/GuestCheckoutShippingSection.xml
index a2606edb379..b2cca4d8f37 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Section/GuestCheckoutShippingSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Section/GuestCheckoutShippingSection.xml
@@ -9,15 +9,15 @@
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
     <section name="GuestCheckoutShippingSection">
-        <element name="email" type="input" locator="#customer-email"/>
-        <element name="firstName" type="input" locator="input[name=firstname]"/>
-        <element name="lastName" type="input" locator="input[name=lastname]"/>
-        <element name="street" type="input" locator="input[name='street[0]']"/>
-        <element name="city" type="input" locator="input[name=city]"/>
-        <element name="region" type="select" locator="select[name=region_id]"/>
-        <element name="postcode" type="input" locator="input[name=postcode]"/>
-        <element name="telephone" type="input" locator="input[name=telephone]"/>
-        <element name="next" type="button" locator="button.button.action.continue.primary"/>
-        <element name="firstShippingMethod" type="radio" locator=".row:nth-of-type(1) .col-method .radio"/>
+        <element name="email" type="input" selector="#customer-email"/>
+        <element name="firstName" type="input" selector="input[name=firstname]"/>
+        <element name="lastName" type="input" selector="input[name=lastname]"/>
+        <element name="street" type="input" selector="input[name='street[0]']"/>
+        <element name="city" type="input" selector="input[name=city]"/>
+        <element name="region" type="select" selector="select[name=region_id]"/>
+        <element name="postcode" type="input" selector="input[name=postcode]"/>
+        <element name="telephone" type="input" selector="input[name=telephone]"/>
+        <element name="next" type="button" selector="button.button.action.continue.primary"/>
+        <element name="firstShippingMethod" type="radio" selector=".row:nth-of-type(1) .col-method .radio"/>
     </section>
 </config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Section/CmsNewPagePageActionsSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Section/CmsNewPagePageActionsSection.xml
index bb5e854078b..521489186e4 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Section/CmsNewPagePageActionsSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Section/CmsNewPagePageActionsSection.xml
@@ -9,6 +9,6 @@
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
     <section name="CmsNewPagePageActionsSection">
-        <element name="savePage" type="button" locator="#save" timeout="30"/>
+        <element name="savePage" type="button" selector="#save" timeout="30"/>
     </section>
 </config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Section/CmsNewPagePageBasicFieldsSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Section/CmsNewPagePageBasicFieldsSection.xml
index e5f314a0fb5..6cd0bfc98c8 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Section/CmsNewPagePageBasicFieldsSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Section/CmsNewPagePageBasicFieldsSection.xml
@@ -9,6 +9,6 @@
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
     <section name="CmsNewPagePageBasicFieldsSection">
-        <element name="pageTitle" type="input" locator="input[name=title]"/>
+        <element name="pageTitle" type="input" selector="input[name=title]"/>
     </section>
 </config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Section/CmsNewPagePageContentSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Section/CmsNewPagePageContentSection.xml
index c0da938d99b..3983259632c 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Section/CmsNewPagePageContentSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Section/CmsNewPagePageContentSection.xml
@@ -9,8 +9,8 @@
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
     <section name="CmsNewPagePageContentSection">
-        <element name="header" type="button" locator="div[data-index=content]"/>
-        <element name="contentHeading" type="input" locator="input[name=content_heading]"/>
-        <element name="content" type="input" locator="#cms_page_form_content"/>
+        <element name="header" type="button" selector="div[data-index=content]"/>
+        <element name="contentHeading" type="input" selector="input[name=content_heading]"/>
+        <element name="content" type="input" selector="#cms_page_form_content"/>
     </section>
 </config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Section/CmsNewPagePageSeoSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Section/CmsNewPagePageSeoSection.xml
index 8f541c0bbf1..56dbe2fad00 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Section/CmsNewPagePageSeoSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Section/CmsNewPagePageSeoSection.xml
@@ -9,7 +9,7 @@
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
     <section name="CmsNewPagePageSeoSection">
-        <element name="header" type="button" locator="div[data-index=search_engine_optimisation]" timeout="30"/>
-        <element name="urlKey" type="input" locator="input[name=identifier]"/>
+        <element name="header" type="button" selector="div[data-index=search_engine_optimisation]" timeout="30"/>
+        <element name="urlKey" type="input" selector="input[name=identifier]"/>
     </section>
 </config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Section/CmsPagesPageActionsSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Section/CmsPagesPageActionsSection.xml
index 75c1c46ed1b..fe759a66cd6 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Section/CmsPagesPageActionsSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Section/CmsPagesPageActionsSection.xml
@@ -9,6 +9,6 @@
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
     <section name="CmsPagesPageActionsSection">
-        <element name="addNewPage" type="button" locator="#add" timeout="30"/>
+        <element name="addNewPage" type="button" selector="#add" timeout="30"/>
     </section>
 </config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/AdminCustomerFiltersSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/AdminCustomerFiltersSection.xml
index ea9961bb275..40a5fc2f119 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/AdminCustomerFiltersSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/AdminCustomerFiltersSection.xml
@@ -9,8 +9,8 @@
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
     <section name="AdminCustomerFiltersSection">
-        <element name="filtersButton" type="button" locator="#container > div > div.admin__data-grid-header > div:nth-child(1) > div.data-grid-filters-actions-wrap > div > button" timeout="30"/>
-        <element name="nameInput" type="input" locator="input[name=name]"/>
-        <element name="apply" type="button" locator="button[data-action=grid-filter-apply]" timeout="30"/>
+        <element name="filtersButton" type="button" selector="#container > div > div.admin__data-grid-header > div:nth-child(1) > div.data-grid-filters-actions-wrap > div > button" timeout="30"/>
+        <element name="nameInput" type="input" selector="input[name=name]"/>
+        <element name="apply" type="button" selector="button[data-action=grid-filter-apply]" timeout="30"/>
     </section>
 </config>
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/AdminCustomerGridSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/AdminCustomerGridSection.xml
index 12055b5314a..ec6dd21c9ed 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/AdminCustomerGridSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/AdminCustomerGridSection.xml
@@ -9,6 +9,6 @@
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
     <section name="AdminCustomerGridSection">
-        <element name="customerGrid" type="text" locator="table[data-role='grid']"/>
+        <element name="customerGrid" type="text" selector="table[data-role='grid']"/>
     </section>
 </config>
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/AdminCustomerMainActionsSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/AdminCustomerMainActionsSection.xml
index fbdff1f9ca5..148958c49d6 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/AdminCustomerMainActionsSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/AdminCustomerMainActionsSection.xml
@@ -9,6 +9,6 @@
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
     <section name="AdminCustomerMainActionsSection">
-        <element name="addNewCustomer" type="button" locator="#add" timeout="30"/>
+        <element name="addNewCustomer" type="button" selector="#add" timeout="30"/>
     </section>
 </config>
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/AdminCustomerMessagesSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/AdminCustomerMessagesSection.xml
index e82e4c1947e..5871da67356 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/AdminCustomerMessagesSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/AdminCustomerMessagesSection.xml
@@ -9,6 +9,6 @@
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
     <section name="AdminCustomerMessagesSection">
-        <element name="successMessage" type="text" locator=".message-success"/>
+        <element name="successMessage" type="text" selector=".message-success"/>
     </section>
 </config>
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/AdminNewCustomerAccountInformationSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/AdminNewCustomerAccountInformationSection.xml
index 5bdbef44073..2e2c2930807 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/AdminNewCustomerAccountInformationSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/AdminNewCustomerAccountInformationSection.xml
@@ -9,8 +9,8 @@
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
     <section name="AdminNewCustomerAccountInformationSection">
-        <element name="firstName" type="input" locator="input[name='customer[firstname]']"/>
-        <element name="lastName" type="input" locator="input[name='customer[lastname]']"/>
-        <element name="email" type="input" locator="input[name='customer[email]']"/>
+        <element name="firstName" type="input" selector="input[name='customer[firstname]']"/>
+        <element name="lastName" type="input" selector="input[name='customer[lastname]']"/>
+        <element name="email" type="input" selector="input[name='customer[email]']"/>
     </section>
 </config>
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/AdminNewCustomerMainActionsSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/AdminNewCustomerMainActionsSection.xml
index 9366c7c50df..18e7e45f992 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/AdminNewCustomerMainActionsSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/AdminNewCustomerMainActionsSection.xml
@@ -9,6 +9,6 @@
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
     <section name="AdminNewCustomerMainActionsSection">
-        <element name="saveButton" type="button" locator="#save" timeout="30"/>
+        <element name="saveButton" type="button" selector="#save" timeout="30"/>
     </section>
 </config>
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/StorefrontCustomerCreateFormSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/StorefrontCustomerCreateFormSection.xml
index 33389a2013d..e578d9c064c 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/StorefrontCustomerCreateFormSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/StorefrontCustomerCreateFormSection.xml
@@ -9,11 +9,11 @@
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
     <section name="StorefrontCustomerCreateFormSection">
-        <element name="firstnameField" type="input" locator="#firstname"/>
-        <element name="lastnameField" type="input" locator="#lastname"/>
-        <element name="emailField" type="input" locator="#email_address"/>
-        <element name="passwordField" type="input" locator="#password"/>
-        <element name="confirmPasswordField" type="input" locator="#password-confirmation"/>
-        <element name="createAccountButton" type="button" locator="button.action.submit.primary" timeout="30"/>
+        <element name="firstnameField" type="input" selector="#firstname"/>
+        <element name="lastnameField" type="input" selector="#lastname"/>
+        <element name="emailField" type="input" selector="#email_address"/>
+        <element name="passwordField" type="input" selector="#password"/>
+        <element name="confirmPasswordField" type="input" selector="#password-confirmation"/>
+        <element name="createAccountButton" type="button" selector="button.action.submit.primary" timeout="30"/>
     </section>
 </config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/StorefrontCustomerDashboardAccountInformationSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/StorefrontCustomerDashboardAccountInformationSection.xml
index 1bff7347636..0ed3b4cceed 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/StorefrontCustomerDashboardAccountInformationSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/StorefrontCustomerDashboardAccountInformationSection.xml
@@ -9,6 +9,6 @@
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
     <section name="StorefrontCustomerDashboardAccountInformationSection">
-        <element name="ContactInformation" type="textarea" locator=".box.box-information .box-content"/>
+        <element name="ContactInformation" type="textarea" selector=".box.box-information .box-content"/>
     </section>
 </config>
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/StorefrontCustomerSignInFormSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/StorefrontCustomerSignInFormSection.xml
index 00c6ed9282e..41b14ac84c0 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/StorefrontCustomerSignInFormSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/StorefrontCustomerSignInFormSection.xml
@@ -9,8 +9,8 @@
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
     <section name="StorefrontCustomerSignInFormSection">
-        <element name="emailField" type="input" locator="#email"/>
-        <element name="passwordField" type="input" locator="#pass"/>
-        <element name="signInAccountButton" type="button" locator="#send2" timeout="30"/>
+        <element name="emailField" type="input" selector="#email"/>
+        <element name="passwordField" type="input" selector="#pass"/>
+        <element name="signInAccountButton" type="button" selector="#send2" timeout="30"/>
     </section>
 </config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/StorefrontPanelHeaderSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/StorefrontPanelHeaderSection.xml
index cd9f84ce0f1..0ada8563eee 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/StorefrontPanelHeaderSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/StorefrontPanelHeaderSection.xml
@@ -9,6 +9,6 @@
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
     <section name="StorefrontPanelHeaderSection">
-        <element name="createAnAccountLink" type="select" locator=".panel.header li:nth-child(3)"/>
+        <element name="createAnAccountLink" type="select" selector=".panel.header li:nth-child(3)"/>
     </section>
 </config>
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Section/InvoiceDetailsInformationSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Section/InvoiceDetailsInformationSection.xml
index 872e9ac007d..0549247e8aa 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Section/InvoiceDetailsInformationSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Section/InvoiceDetailsInformationSection.xml
@@ -9,6 +9,6 @@
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
     <section name="InvoiceDetailsInformationSection">
-        <element name="orderStatus" type="text" locator="#order_status"/>
+        <element name="orderStatus" type="text" selector="#order_status"/>
     </section>
 </config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Section/InvoiceNewSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Section/InvoiceNewSection.xml
index 90e5c31f866..282c9e675e2 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Section/InvoiceNewSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Section/InvoiceNewSection.xml
@@ -9,6 +9,6 @@
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
     <section name="InvoiceNewSection">
-        <element name="submitInvoice" type="button" locator=".action-default.scalable.save.submit-button.primary"/>
+        <element name="submitInvoice" type="button" selector=".action-default.scalable.save.submit-button.primary"/>
     </section>
 </config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Section/InvoicesFiltersSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Section/InvoicesFiltersSection.xml
index e14e651eb1a..9598199dcb7 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Section/InvoicesFiltersSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Section/InvoicesFiltersSection.xml
@@ -9,6 +9,6 @@
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
     <section name="InvoicesFiltersSection">
-        <element name="orderNum" type="input" locator="input[name='order_increment_id']"/>
+        <element name="orderNum" type="input" selector="input[name='order_increment_id']"/>
     </section>
 </config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Section/InvoicesGridSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Section/InvoicesGridSection.xml
index aca1aaa747b..024b3db7141 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Section/InvoicesGridSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Section/InvoicesGridSection.xml
@@ -9,8 +9,8 @@
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
     <section name="InvoicesGridSection">
-        <element name="spinner" type="button" locator=".spinner"/>
-        <element name="filter" type="button" locator="#container > div > div.admin__data-grid-header > div:nth-child(1) > div.data-grid-filters-actions-wrap > div > button"/>
-        <element name="firstRow" type="button" locator="tr.data-row:nth-of-type(1)"/>
+        <element name="spinner" type="button" selector=".spinner"/>
+        <element name="filter" type="button" selector="#container > div > div.admin__data-grid-header > div:nth-child(1) > div.data-grid-filters-actions-wrap > div > button"/>
+        <element name="firstRow" type="button" selector="tr.data-row:nth-of-type(1)"/>
     </section>
 </config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Section/OrderDetailsInformationSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Section/OrderDetailsInformationSection.xml
index 4f971c755d2..a8f8b3dc1e0 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Section/OrderDetailsInformationSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Section/OrderDetailsInformationSection.xml
@@ -9,10 +9,10 @@
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
     <section name="OrderDetailsInformationSection">
-        <element name="orderStatus" type="text" locator="#order_status"/>
-        <element name="accountInformation" type="text" locator=".order-account-information-table"/>
-        <element name="billingAddress" type="text" locator=".order-billing-address"/>
-        <element name="shippingAddress" type="text" locator=".order-shipping-address"/>
-        <element name="itemsOrdered" type="text" locator=".edit-order-table"/>
+        <element name="orderStatus" type="text" selector="#order_status"/>
+        <element name="accountInformation" type="text" selector=".order-account-information-table"/>
+        <element name="billingAddress" type="text" selector=".order-billing-address"/>
+        <element name="shippingAddress" type="text" selector=".order-shipping-address"/>
+        <element name="itemsOrdered" type="text" selector=".edit-order-table"/>
     </section>
 </config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Section/OrderDetailsInvoicesSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Section/OrderDetailsInvoicesSection.xml
index 7039fb3e250..34d42ed419b 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Section/OrderDetailsInvoicesSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Section/OrderDetailsInvoicesSection.xml
@@ -9,7 +9,7 @@
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
     <section name="OrderDetailsInvoicesSection">
-        <element name="spinner" type="button" locator=".spinner"/>
-        <element name="content" type="text" locator="#sales_order_view_tabs_order_invoices_content"/>
+        <element name="spinner" type="button" selector=".spinner"/>
+        <element name="content" type="text" selector="#sales_order_view_tabs_order_invoices_content"/>
     </section>
 </config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Section/OrderDetailsMainActionsSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Section/OrderDetailsMainActionsSection.xml
index 78613e58d46..9632c5e5ddb 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Section/OrderDetailsMainActionsSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Section/OrderDetailsMainActionsSection.xml
@@ -9,13 +9,13 @@
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
     <section name="OrderDetailsMainActionsSection">
-        <element name="back" type="button" locator="#back"/>
-        <element name="cancel" type="button" locator="#order-view-cancel-button"/>
-        <element name="sendEmail" type="button" locator="#send_notification"/>
-        <element name="hold" type="button" locator="#order-view-hold-button"/>
-        <element name="invoice" type="button" locator="#order_invoice"/>
-        <element name="ship" type="button" locator="#order_ship"/>
-        <element name="reorder" type="button" locator="#order_reorder"/>
-        <element name="edit" type="button" locator="#order_edit"/>
+        <element name="back" type="button" selector="#back"/>
+        <element name="cancel" type="button" selector="#order-view-cancel-button"/>
+        <element name="sendEmail" type="button" selector="#send_notification"/>
+        <element name="hold" type="button" selector="#order-view-hold-button"/>
+        <element name="invoice" type="button" selector="#order_invoice"/>
+        <element name="ship" type="button" selector="#order_ship"/>
+        <element name="reorder" type="button" selector="#order_reorder"/>
+        <element name="edit" type="button" selector="#order_edit"/>
     </section>
 </config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Section/OrderDetailsMessagesSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Section/OrderDetailsMessagesSection.xml
index b63c1da9a98..dc32b61bde9 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Section/OrderDetailsMessagesSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Section/OrderDetailsMessagesSection.xml
@@ -9,6 +9,6 @@
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
     <section name="OrderDetailsMessagesSection">
-        <element name="successMessage" type="text" locator="div.message-success"/>
+        <element name="successMessage" type="text" selector="div.message-success"/>
     </section>
 </config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Section/OrderDetailsOrderViewSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Section/OrderDetailsOrderViewSection.xml
index 63c80a085e0..a3c48ecfc61 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Section/OrderDetailsOrderViewSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Section/OrderDetailsOrderViewSection.xml
@@ -9,7 +9,7 @@
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
     <section name="OrderDetailsOrderViewSection">
-        <element name="information" type="button" locator="#sales_order_view_tabs_order_info"/>
-        <element name="invoices" type="button" locator="#sales_order_view_tabs_order_invoices"/>
+        <element name="information" type="button" selector="#sales_order_view_tabs_order_info"/>
+        <element name="invoices" type="button" selector="#sales_order_view_tabs_order_invoices"/>
     </section>
 </config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Section/OrdersGridSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Section/OrdersGridSection.xml
index 2683305340f..c0b3c84fb43 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Section/OrdersGridSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Section/OrdersGridSection.xml
@@ -9,12 +9,12 @@
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
     <section name="OrdersGridSection">
-        <element name="spinner" type="button" locator=".spinner"/>
-        <element name="gridLoadingMask" type="button" locator=".admin__data-grid-loading-mask"/>
-        <element name="search" type="input" locator="#fulltext"/>
-        <element name="submitSearch" type="button" locator=".//*[@id='container']/div/div[2]/div[1]/div[2]/button"/>
-        <element name="submitSearch22" type="button" locator=".//*[@class=&quot;admin__data-grid-filters-wrap&quot;]/parent::*/div[@class=&quot;data-grid-search-control-wrap&quot;]/button"/>
-        <element name="firstRow" type="button" locator="tr.data-row:nth-of-type(1)"/>
-        <element name="createNewOrder" type="button" locator="button[title='Create New Order'"/>
+        <element name="spinner" type="button" selector=".spinner"/>
+        <element name="gridLoadingMask" type="button" selector=".admin__data-grid-loading-mask"/>
+        <element name="search" type="input" selector="#fulltext"/>
+        <element name="submitSearch" type="button" selector=".//*[@id='container']/div/div[2]/div[1]/div[2]/button"/>
+        <element name="submitSearch22" type="button" selector=".//*[@class=&quot;admin__data-grid-filters-wrap&quot;]/parent::*/div[@class=&quot;data-grid-search-control-wrap&quot;]/button"/>
+        <element name="firstRow" type="button" selector="tr.data-row:nth-of-type(1)"/>
+        <element name="createNewOrder" type="button" selector="button[title='Create New Order'"/>
     </section>
 </config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Templates/TemplateSectionFile.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Templates/TemplateSectionFile.xml
index 9cf871a562a..df29d4c6a54 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Templates/TemplateSectionFile.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Templates/TemplateSectionFile.xml
@@ -9,6 +9,6 @@
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
     <section name="">
-        <element name="" type="" locator=""/>
+        <element name="" type="" selector=""/>
     </section>
 </config>
\ No newline at end of file
-- 
GitLab


From 92664471f9097a7964a87979bd51138462655cc1 Mon Sep 17 00:00:00 2001
From: John S <ivy00johns@users.noreply.github.com>
Date: Thu, 21 Sep 2017 22:03:39 +0300
Subject: [PATCH 038/380] MQE-350: Demos for Core and SE Teams

 - Adding unique="suffix" to data that was missed during the merge. 1 test fails without it.
---
 .../Magento/FunctionalTest/Catalog/Data/ProductData.xml         | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Data/ProductData.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Data/ProductData.xml
index cdbcd2d130d..55b7192405a 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Data/ProductData.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Data/ProductData.xml
@@ -24,7 +24,7 @@
         <data key="sku" unique="suffix">SimpleProduct</data>
         <data key="type_id">simple</data>
         <data key="attribute_set_id">4</data>
-        <data key="name">SimpleProduct</data>
+        <data key="name" unique="suffix">SimpleProduct</data>
         <data key="price">123.00</data>
         <data key="visibility">4</data>
         <data key="status">1</data>
-- 
GitLab


From 995f013be0cf8a1c8ea723fd8a9913e2b50940fa Mon Sep 17 00:00:00 2001
From: Ji Lu <jilu1@magento.com>
Date: Thu, 28 Sep 2017 22:32:29 +0300
Subject: [PATCH 039/380] MQE-369: [Data Input] Non Web Api Data Persistence

---
 .../Catalog/Metadata/category-meta.xml        |  72 ++++++------
 .../Metadata/custom_attribute-meta.xml        |  19 ----
 .../Catalog/Metadata/product-meta.xml         |  68 ++++++------
 .../product_extension_attribute-meta.xml      |   4 +-
 .../Catalog/Metadata/product_link-meta.xml    |  20 ++--
 .../product_link_extension_attribute-meta.xml |   4 +-
 .../Catalog/Metadata/product_option-meta.xml  |  52 ++++-----
 .../Metadata/product_option_value-meta.xml    |  24 ++--
 .../Catalog/Metadata/stock_item-meta.xml      |   8 +-
 .../Customer/Metadata/address-meta.xml        |  70 ++++++------
 .../Metadata/custom_attribute-meta.xml        |   8 +-
 .../Customer/Metadata/customer-meta.xml       | 104 +++++++++---------
 .../customer_extension_attribute-meta.xml     |   8 +-
 ...stomer_nested_extension_attribute-meta.xml |  12 +-
 .../Customer/Metadata/region-meta.xml         |  16 +--
 .../Store/Cest/AdminCreateStoreGroupCest.xml  |  47 ++++++++
 .../FunctionalTest/Store/Data/StoreData.xml   |  14 +++
 .../Store/Data/StoreGroupData.xml             |  13 +++
 .../Store/Metadata/store-meta.xml             |  17 +++
 .../Store/Metadata/store_group-meta.xml       |  18 +++
 .../Store/Page/AdminSystemStorePage.xml       |   8 ++
 .../Section/AdminNewStoreGroupSection.xml     |   7 ++
 .../Store/Section/AdminNewStoreSection.xml    |   9 ++
 .../Store/Section/AdminStoresGridSection.xml  |  13 +++
 .../Section/AdminStoresMainActionsSection.xml |   9 ++
 25 files changed, 387 insertions(+), 257 deletions(-)
 delete mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/custom_attribute-meta.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/Cest/AdminCreateStoreGroupCest.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/Data/StoreData.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/Data/StoreGroupData.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/Metadata/store-meta.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/Metadata/store_group-meta.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/Page/AdminSystemStorePage.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/Section/AdminNewStoreGroupSection.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/Section/AdminNewStoreSection.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/Section/AdminStoresGridSection.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/Section/AdminStoresMainActionsSection.xml

diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/category-meta.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/category-meta.xml
index 7299e47ae1d..25941242651 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/category-meta.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/category-meta.xml
@@ -1,62 +1,56 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!--
- /**
-  * Copyright © Magento, Inc. All rights reserved.
-  * See COPYING.txt for license details.
-  */
--->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataOperation.xsd">
-    <operation name="CreateCategory" dataType="category" type="create" auth="/rest/V1/integration/admin/token" url="/rest/V1/categories" method="POST">
-        <header param="Content-Type">application/json</header>
-        <jsonObject key="category" dataType="category">
-            <entry key="parent_id">integer</entry>
-            <entry key="name">string</entry>
-            <entry key="is_active">boolean</entry>
-            <entry key="position">integer</entry>
-            <entry key="level">integer</entry>
-            <entry key="children">string</entry>
-            <entry key="created_at">string</entry>
-            <entry key="updated_at">string</entry>
-            <entry key="path">string</entry>
-            <entry key="include_in_menu">boolean</entry>
+    <operation name="CreateCategory" dataType="category" type="create" auth="adminOauth" url="/V1/categories" method="POST">
+        <contentType>application/json</contentType>
+        <object key="category" dataType="category">
+            <field key="parent_id">integer</field>
+            <field key="name">string</field>
+            <field key="is_active">boolean</field>
+            <field key="position">integer</field>
+            <field key="level">integer</field>
+            <field key="children">string</field>
+            <field key="created_at">string</field>
+            <field key="updated_at">string</field>
+            <field key="path">string</field>
+            <field key="include_in_menu">boolean</field>
             <array key="available_sort_by">
                 <value>string</value>
             </array>
-            <entry key="extension_attributes">empty_extension_attribute</entry>
+            <field key="extension_attributes">empty_extension_attribute</field>
             <array key="custom_attributes">
                 <value>custom_attribute</value>
             </array>
-        </jsonObject>
+        </object>
     </operation>
 
-    <operation name="UpdateCategory" dataType="category" type="update" auth="/rest/V1/integration/admin/token" url="/rest/V1/categories" method="PUT">
-        <header param="Content-Type">application/json</header>
-        <jsonObject key="category" dataType="category">
-            <entry key="id">integer</entry>
-            <entry key="parent_id">integer</entry>
-            <entry key="name">string</entry>
-            <entry key="is_active">boolean</entry>
-            <entry key="position">integer</entry>
-            <entry key="level">integer</entry>
-            <entry key="children">string</entry>
-            <entry key="created_at">string</entry>
-            <entry key="updated_at">string</entry>
-            <entry key="path">string</entry>
+    <operation name="UpdateCategory" dataType="category" type="update" auth="adminOauth" url="/V1/categories" method="PUT">
+        <contentType>application/json</contentType>
+        <object key="category" dataType="category">
+            <field key="id">integer</field>
+            <field key="parent_id">integer</field>
+            <field key="name">string</field>
+            <field key="is_active">boolean</field>
+            <field key="position">integer</field>
+            <field key="level">integer</field>
+            <field key="children">string</field>
+            <field key="created_at">string</field>
+            <field key="updated_at">string</field>
+            <field key="path">string</field>
             <array key="available_sort_by">
                 <value>string</value>
             </array>
-            <entry key="include_in_menu">boolean</entry>
-            <entry key="extension_attributes">empty_extension_attribute</entry>
+            <field key="include_in_menu">boolean</field>
+            <field key="extension_attributes">empty_extension_attribute</field>
             <array key="custom_attributes">
                 <value>custom_attribute</value>
             </array>
-        </jsonObject>
+        </object>
     </operation>
 
-    <operation name="DeleteCategory" dataType="category" type="delete" auth="/rest/V1/integration/admin/token" url="/rest/V1/categories" method="DELETE">
-        <header param="Content-Type">application/json</header>
+    <operation name="DeleteCategory" dataType="category" type="delete" auth="adminOauth" url="/V1/categories" method="DELETE">
+        <contentType>application/json</contentType>
         <param key="categoryId" type="path">{id}</param>
     </operation>
 </config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/custom_attribute-meta.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/custom_attribute-meta.xml
deleted file mode 100644
index b019ab3ff42..00000000000
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/custom_attribute-meta.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- /**
-  * Copyright © Magento, Inc. All rights reserved.
-  * See COPYING.txt for license details.
-  */
--->
-
-<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataOperation.xsd">
-    <operation name="CreateCustomAttribute" dataType="custom_attribute" type="create">
-        <entry key="attribute_code">string</entry>
-        <entry key="value">string</entry>
-    </operation>
-    <operation name="UpdateCustomAttribute" dataType="custom_attribute" type="update">
-        <entry key="attribute_code">string</entry>
-        <entry key="value">string</entry>
-    </operation>
-</config>
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product-meta.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product-meta.xml
index 4f313af3f7f..37880ef4355 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product-meta.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product-meta.xml
@@ -8,20 +8,20 @@
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataOperation.xsd">
-    <operation name="CreateProduct" dataType="product" type="create" auth="/rest/V1/integration/admin/token" url="/rest/V1/products" method="POST">
-        <header param="Content-Type">application/json</header>
-        <jsonObject dataType="product" key="product">
-            <entry key="sku">string</entry>
-            <entry key="name">string</entry>
-            <entry key="attribute_set_id">integer</entry>
-            <entry key="price">integer</entry>
-            <entry key="status">integer</entry>
-            <entry key="visibility">integer</entry>
-            <entry key="type_id">string</entry>
-            <entry key="created_at">string</entry>
-            <entry key="updated_at">string</entry>
-            <entry key="weight">integer</entry>
-            <entry key="extension_attributes">product_extension_attribute</entry>
+    <operation name="CreateProduct" dataType="product" type="create" auth="adminOauth" url="/V1/products" method="POST">
+        <contentType>application/json</contentType>
+        <object dataType="product" key="product">
+            <field key="sku">string</field>
+            <field key="name">string</field>
+            <field key="attribute_set_id">integer</field>
+            <field key="price">integer</field>
+            <field key="status">integer</field>
+            <field key="visibility">integer</field>
+            <field key="type_id">string</field>
+            <field key="created_at">string</field>
+            <field key="updated_at">string</field>
+            <field key="weight">integer</field>
+            <field key="extension_attributes">product_extension_attribute</field>
             <array key="product_links">
                 <value>product_link</value>
             </array>
@@ -31,23 +31,23 @@
             <array key="options">
                 <value>product_option</value>
             </array>
-        </jsonObject>
+        </object>
     </operation>
-    <operation name="UpdateProduct" dataType="product" type="update" auth="/rest/V1/integration/admin/token" url="/rest/V1/products" method="PUT">
-        <header param="Content-Type">application/json</header>
-        <jsonObject dataType="product" key="product">
-            <entry key="id">integer</entry>
-            <entry key="sku">string</entry>
-            <entry key="name">string</entry>
-            <entry key="attribute_set_id">integer</entry>
-            <entry key="price">integer</entry>
-            <entry key="status">integer</entry>
-            <entry key="visibility">integer</entry>
-            <entry key="type_id">string</entry>
-            <entry key="created_at">string</entry>
-            <entry key="updated_at">string</entry>
-            <entry key="weight">integer</entry>
-            <entry key="extension_attributes">product_extension_attribute</entry>
+    <operation name="UpdateProduct" dataType="product" type="update" auth="adminOauth" url="/V1/products" method="PUT">
+        <contentType>application/json</contentType>
+        <object dataType="product" key="product">
+            <field key="id">integer</field>
+            <field key="sku">string</field>
+            <field key="name">string</field>
+            <field key="attribute_set_id">integer</field>
+            <field key="price">integer</field>
+            <field key="status">integer</field>
+            <field key="visibility">integer</field>
+            <field key="type_id">string</field>
+            <field key="created_at">string</field>
+            <field key="updated_at">string</field>
+            <field key="weight">integer</field>
+            <field key="extension_attributes">product_extension_attribute</field>
             <array key="product_links">
                 <value>product_link</value>
             </array>
@@ -63,11 +63,11 @@
             <array key="tier_prices">
                 <value>tier_prices</value>
             </array-->
-        </jsonObject>
-        <entry key="saveOptions">boolean</entry>
+        </object>
+        <field key="saveOptions">boolean</field>
     </operation>
-    <operation name="deleteProduct" dataType="product" type="delete" auth="/rest/V1/integration/admin/token" url="/rest/V1/products" method="DELETE">
-        <header param="Content-Type">application/json</header>
+    <operation name="deleteProduct" dataType="product" type="delete" auth="adminOauth" url="/V1/products" method="DELETE">
+        <contentType>application/json</contentType>
         <param key="sku" type="path">{sku}</param>
     </operation>
 </config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product_extension_attribute-meta.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product_extension_attribute-meta.xml
index f68459121f3..7d55badaebf 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product_extension_attribute-meta.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product_extension_attribute-meta.xml
@@ -9,9 +9,9 @@
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataOperation.xsd">
     <operation name="CreateProductExtensionAttribute" dataType="product_extension_attribute" type="create">
-        <entry key="stock_item">stock_item</entry>
+        <field key="stock_item">stock_item</field>
     </operation>
     <operation name="UpdateProductExtensionAttribute" dataType="product_extension_attribute" type="update">
-        <entry key="stock_item">stock_item</entry>
+        <field key="stock_item">stock_item</field>
     </operation>
 </config>
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product_link-meta.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product_link-meta.xml
index 8261ef0e999..1cb109442a1 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product_link-meta.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product_link-meta.xml
@@ -9,21 +9,21 @@
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataOperation.xsd">
     <operation name="CreateProductLink" dataType="product_link" type="create">
-        <entry key="sku">string</entry>
-        <entry key="link_type">string</entry>
-        <entry key="linked_product_sku">string</entry>
-        <entry key="linked_product_type">string</entry>
-        <entry key="position">integer</entry>
+        <field key="sku">string</field>
+        <field key="link_type">string</field>
+        <field key="linked_product_sku">string</field>
+        <field key="linked_product_type">string</field>
+        <field key="position">integer</field>
         <array key="extension_attributes">
             <value>product_link_extension_attribute</value>
         </array>
     </operation>
     <operation name="UpdateProductLink" dataType="product_link" type="update">
-        <entry key="sku">string</entry>
-        <entry key="link_type">string</entry>
-        <entry key="linked_product_sku">string</entry>
-        <entry key="linked_product_type">string</entry>
-        <entry key="position">integer</entry>
+        <field key="sku">string</field>
+        <field key="link_type">string</field>
+        <field key="linked_product_sku">string</field>
+        <field key="linked_product_type">string</field>
+        <field key="position">integer</field>
         <array key="extension_attributes">
             <value>product_link_extension_attribute</value>
         </array>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product_link_extension_attribute-meta.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product_link_extension_attribute-meta.xml
index ea2c9264304..261c0113b27 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product_link_extension_attribute-meta.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product_link_extension_attribute-meta.xml
@@ -10,10 +10,10 @@
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataOperation.xsd">
     <operation name="CreateProductLinkExtensionAttribute" dataType="product_link_extension_attribute" type="create">
         <header param="Content-Type">application/json</header>
-        <entry key="qty">integer</entry>
+        <field key="qty">integer</field>
     </operation>
     <operation name="UpdateProductLinkExtensionAttribute" dataType="product_link_extension_attribute" type="update">
         <header param="Content-Type">application/json</header>
-        <entry key="qty">integer</entry>
+        <field key="qty">integer</field>
     </operation>
 </config>
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product_option-meta.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product_option-meta.xml
index dcb65c8032e..33be20a90a8 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product_option-meta.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product_option-meta.xml
@@ -9,37 +9,37 @@
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataOperation.xsd">
     <operation name="CreateProductOption" dataType="product_option" type="create">
-        <entry key="product_sku">string</entry>
-        <entry key="option_id">integer</entry>
-        <entry key="title">string</entry>
-        <entry key="type">string</entry>
-        <entry key="sort_order">integer</entry>
-        <entry key="is_require">boolean</entry>
-        <entry key="price">integer</entry>
-        <entry key="price_type">string</entry>
-        <entry key="sku">string</entry>
-        <entry key="file_extension">string</entry>
-        <entry key="max_characters">integer</entry>
-        <entry key="max_size_x">integer</entry>
-        <entry key="max_size_y">integer</entry>
+        <field key="product_sku">string</field>
+        <field key="option_id">integer</field>
+        <field key="title">string</field>
+        <field key="type">string</field>
+        <field key="sort_order">integer</field>
+        <field key="is_require">boolean</field>
+        <field key="price">integer</field>
+        <field key="price_type">string</field>
+        <field key="sku">string</field>
+        <field key="file_extension">string</field>
+        <field key="max_characters">integer</field>
+        <field key="max_size_x">integer</field>
+        <field key="max_size_y">integer</field>
         <array key="values">
             <value>product_option_value</value>
         </array>
     </operation>
     <operation name="UpdateProductOption" dataType="product_option" type="update">
-        <entry key="product_sku">string</entry>
-        <entry key="option_id">integer</entry>
-        <entry key="title">string</entry>
-        <entry key="type">string</entry>
-        <entry key="sort_order">integer</entry>
-        <entry key="is_require">boolean</entry>
-        <entry key="price">integer</entry>
-        <entry key="price_type">string</entry>
-        <entry key="sku">string</entry>
-        <entry key="file_extension">string</entry>
-        <entry key="max_characters">integer</entry>
-        <entry key="max_size_x">integer</entry>
-        <entry key="max_size_y">integer</entry>
+        <field key="product_sku">string</field>
+        <field key="option_id">integer</field>
+        <field key="title">string</field>
+        <field key="type">string</field>
+        <field key="sort_order">integer</field>
+        <field key="is_require">boolean</field>
+        <field key="price">integer</field>
+        <field key="price_type">string</field>
+        <field key="sku">string</field>
+        <field key="file_extension">string</field>
+        <field key="max_characters">integer</field>
+        <field key="max_size_x">integer</field>
+        <field key="max_size_y">integer</field>
         <array key="values">
             <value>product_option_value</value>
         </array>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product_option_value-meta.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product_option_value-meta.xml
index c1b50759e0a..abe43e0dc2d 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product_option_value-meta.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product_option_value-meta.xml
@@ -9,19 +9,19 @@
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataOperation.xsd">
     <operation name="CreateProductOptionValue" dataType="product_option_value" type="create">
-        <entry key="title">string</entry>
-        <entry key="sort_order">integer</entry>
-        <entry key="price">integer</entry>
-        <entry key="price_type">string</entry>
-        <entry key="sku">string</entry>
-        <entry key="option_type_id">integer</entry>
+        <field key="title">string</field>
+        <field key="sort_order">integer</field>
+        <field key="price">integer</field>
+        <field key="price_type">string</field>
+        <field key="sku">string</field>
+        <field key="option_type_id">integer</field>
     </operation>
     <operation name="UpdateProductOptionValue" dataType="product_option_value" type="update">
-        <entry key="title">string</entry>
-        <entry key="sort_order">integer</entry>
-        <entry key="price">integer</entry>
-        <entry key="price_type">string</entry>
-        <entry key="sku">string</entry>
-        <entry key="option_type_id">integer</entry>
+        <field key="title">string</field>
+        <field key="sort_order">integer</field>
+        <field key="price">integer</field>
+        <field key="price_type">string</field>
+        <field key="sku">string</field>
+        <field key="option_type_id">integer</field>
     </operation>
 </config>
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/stock_item-meta.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/stock_item-meta.xml
index 15b4a47de15..4f883469432 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/stock_item-meta.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/stock_item-meta.xml
@@ -9,11 +9,11 @@
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataOperation.xsd">
     <operation name="CreateStockItem" dataType="stock_item" type="create">
-        <entry key="qty">integer</entry>
-        <entry key="is_in_stock">boolean</entry>
+        <field key="qty">integer</field>
+        <field key="is_in_stock">boolean</field>
     </operation>
     <operation name="UpdateStockItem" dataType="stock_item" type="update">
-        <entry key="qty">integer</entry>
-        <entry key="is_in_stock">boolean</entry>
+        <field key="qty">integer</field>
+        <field key="is_in_stock">boolean</field>
     </operation>
 </config>
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Metadata/address-meta.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Metadata/address-meta.xml
index 6e5ea909cbe..af789417ab7 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Metadata/address-meta.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Metadata/address-meta.xml
@@ -9,52 +9,52 @@
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataOperation.xsd">
     <operation name="CreateAddress" dataType="address" type="create">
-        <entry key="region">region</entry>
-        <entry key="country_id">string</entry>
+        <field key="region">region</field>
+        <field key="country_id">string</field>
         <array key="street">
             <value>string</value>
         </array>
-        <entry key="company">string</entry>
-        <entry key="telephone">string</entry>
-        <entry key="fax">string</entry>
-        <entry key="postcode">string</entry>
-        <entry key="city">string</entry>
-        <entry key="firstname">string</entry>
-        <entry key="lastname">string</entry>
-        <entry key="middlename">string</entry>
-        <entry key="prefix">string</entry>
-        <entry key="suffix">string</entry>
-        <entry key="vat_id">string</entry>
-        <entry key="default_shipping">boolean</entry>
-        <entry key="default_billing">boolean</entry>
-        <entry key="extension_attributes">empty_extension_attribute</entry>
+        <field key="company">string</field>
+        <field key="telephone">string</field>
+        <field key="fax">string</field>
+        <field key="postcode">string</field>
+        <field key="city">string</field>
+        <field key="firstname">string</field>
+        <field key="lastname">string</field>
+        <field key="middlename">string</field>
+        <field key="prefix">string</field>
+        <field key="suffix">string</field>
+        <field key="vat_id">string</field>
+        <field key="default_shipping">boolean</field>
+        <field key="default_billing">boolean</field>
+        <field key="extension_attributes">empty_extension_attribute</field>
         <array key="custom_attributes">
             <value>custom_attribute</value>
         </array>
     </operation>
     <operation name="UpdateAddress" dataType="address" type="update">
-        <entry key="id">integer</entry>
-        <entry key="customer_id">integer</entry>
-        <entry key="region">region</entry>
-        <entry key="region_id">integer</entry>
-        <entry key="country_id">string</entry>
+        <field key="id">integer</field>
+        <field key="customer_id">integer</field>
+        <field key="region">region</field>
+        <field key="region_id">integer</field>
+        <field key="country_id">string</field>
         <array key="street">
             <value>string</value>
         </array>
-        <entry key="company">string</entry>
-        <entry key="telephone">string</entry>
-        <entry key="fax">string</entry>
-        <entry key="postcode">string</entry>
-        <entry key="city">string</entry>
-        <entry key="firstname">string</entry>
-        <entry key="lastname">string</entry>
-        <entry key="middlename">string</entry>
-        <entry key="prefix">string</entry>
-        <entry key="suffix">string</entry>
-        <entry key="vat_id">string</entry>
-        <entry key="default_shipping">boolean</entry>
-        <entry key="default_billing">boolean</entry>
-        <entry key="extension_attributes">empty_extension_attribute</entry>
+        <field key="company">string</field>
+        <field key="telephone">string</field>
+        <field key="fax">string</field>
+        <field key="postcode">string</field>
+        <field key="city">string</field>
+        <field key="firstname">string</field>
+        <field key="lastname">string</field>
+        <field key="middlename">string</field>
+        <field key="prefix">string</field>
+        <field key="suffix">string</field>
+        <field key="vat_id">string</field>
+        <field key="default_shipping">boolean</field>
+        <field key="default_billing">boolean</field>
+        <field key="extension_attributes">empty_extension_attribute</field>
         <array key="custom_attributes">
             <value>custom_attribute</value>
         </array>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Metadata/custom_attribute-meta.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Metadata/custom_attribute-meta.xml
index b019ab3ff42..3414ba7694c 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Metadata/custom_attribute-meta.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Metadata/custom_attribute-meta.xml
@@ -9,11 +9,11 @@
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataOperation.xsd">
     <operation name="CreateCustomAttribute" dataType="custom_attribute" type="create">
-        <entry key="attribute_code">string</entry>
-        <entry key="value">string</entry>
+        <field key="attribute_code">string</field>
+        <field key="value">string</field>
     </operation>
     <operation name="UpdateCustomAttribute" dataType="custom_attribute" type="update">
-        <entry key="attribute_code">string</entry>
-        <entry key="value">string</entry>
+        <field key="attribute_code">string</field>
+        <field key="value">string</field>
     </operation>
 </config>
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Metadata/customer-meta.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Metadata/customer-meta.xml
index 6ee3d020962..bbad0da9b8f 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Metadata/customer-meta.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Metadata/customer-meta.xml
@@ -8,72 +8,72 @@
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataOperation.xsd">
-    <operation name="CreateCustomer" dataType="customer" type="create" auth="/rest/V1/integration/admin/token" url="/rest/V1/customers" method="POST">
-        <header param="Content-Type">application/json</header>
-        <jsonObject dataType="customer" key="customer">
-            <entry key="group_id">integer</entry>
-            <entry key="default_billing">string</entry>
-            <entry key="default_shipping">string</entry>
-            <entry key="confirmation">string</entry>
-            <entry key="created_at">string</entry>
-            <entry key="updated_at">string</entry>
-            <entry key="created_in">string</entry>
-            <entry key="dob">string</entry>
-            <entry key="email">string</entry>
-            <entry key="firstname">string</entry>
-            <entry key="lastname">string</entry>
-            <entry key="middlename">string</entry>
-            <entry key="prefix">string</entry>
-            <entry key="suffix">string</entry>
-            <entry key="gender">integer</entry>
-            <entry key="store_id">integer</entry>
-            <entry key="taxvat">string</entry>
-            <entry key="website_id">integer</entry>
+    <operation name="CreateCustomer" dataType="customer" type="create" auth="adminOauth" url="/V1/customers" method="POST">
+        <contentType>application/json</contentType>
+        <object dataType="customer" key="customer">
+            <field key="group_id">integer</field>
+            <field key="default_billing">string</field>
+            <field key="default_shipping">string</field>
+            <field key="confirmation">string</field>
+            <field key="created_at">string</field>
+            <field key="updated_at">string</field>
+            <field key="created_in">string</field>
+            <field key="dob">string</field>
+            <field key="email">string</field>
+            <field key="firstname">string</field>
+            <field key="lastname">string</field>
+            <field key="middlename">string</field>
+            <field key="prefix">string</field>
+            <field key="suffix">string</field>
+            <field key="gender">integer</field>
+            <field key="store_id">integer</field>
+            <field key="taxvat">string</field>
+            <field key="website_id">integer</field>
             <array key="addresses">
                 <value>address</value>
             </array>
-            <entry key="disable_auto_group_change">integer</entry>
-            <entry key="extension_attributes">customer_extension_attribute</entry>
+            <field key="disable_auto_group_change">integer</field>
+            <field key="extension_attributes">customer_extension_attribute</field>
             <array key="custom_attributes">
                 <value>custom_attribute</value>
             </array>
-        </jsonObject>
-        <entry key="password">string</entry>
+        </object>
+        <field key="password">string</field>
     </operation>
-    <operation name="UpdateCustomer" dataType="customer" type="update" auth="/rest/V1/integration/admin/token" url="/rest/V1/customers" method="PUT">
-        <header param="Content-Type">application/json</header>
-        <entry key="id">integer</entry>
-        <entry key="group_id">integer</entry>
-        <entry key="default_billing">string</entry>
-        <entry key="default_shipping">string</entry>
-        <entry key="confirmation">string</entry>
-        <entry key="created_at">string</entry>
-        <entry key="updated_at">string</entry>
-        <entry key="created_in">string</entry>
-        <entry key="dob">string</entry>
-        <entry key="email">string</entry>
-        <entry key="firstname">string</entry>
-        <entry key="lastname">string</entry>
-        <entry key="middlename">string</entry>
-        <entry key="prefix">string</entry>
-        <entry key="suffix">string</entry>
-        <entry key="gender">integer</entry>
-        <entry key="store_id">integer</entry>
-        <entry key="taxvat">string</entry>
-        <entry key="website_id">integer</entry>
+    <operation name="UpdateCustomer" dataType="customer" type="update" auth="adminOauth" url="/V1/customers" method="PUT">
+        <contentType>application/json</contentType>
+        <field key="id">integer</field>
+        <field key="group_id">integer</field>
+        <field key="default_billing">string</field>
+        <field key="default_shipping">string</field>
+        <field key="confirmation">string</field>
+        <field key="created_at">string</field>
+        <field key="updated_at">string</field>
+        <field key="created_in">string</field>
+        <field key="dob">string</field>
+        <field key="email">string</field>
+        <field key="firstname">string</field>
+        <field key="lastname">string</field>
+        <field key="middlename">string</field>
+        <field key="prefix">string</field>
+        <field key="suffix">string</field>
+        <field key="gender">integer</field>
+        <field key="store_id">integer</field>
+        <field key="taxvat">string</field>
+        <field key="website_id">integer</field>
         <array key="addresses">
             <value>address</value>
         </array>
-        <entry key="disable_auto_group_change">integer</entry>
-        <entry key="extension_attributes">customer_extension_attribute</entry>
+        <field key="disable_auto_group_change">integer</field>
+        <field key="extension_attributes">customer_extension_attribute</field>
         <array key="custom_attributes">
             <value>custom_attribute</value>
         </array>
-        <entry key="password">string</entry>
-        <entry key="redirectUrl">string</entry>
+        <field key="password">string</field>
+        <field key="redirectUrl">string</field>
     </operation>
-    <operation name="DeleteCustomer" dataType="customer" type="delete" auth="/rest/V1/integration/admin/token" url="/rest/V1/customers" method="DELETE">
-        <header param="Content-Type">application/json</header>
+    <operation name="DeleteCustomer" dataType="customer" type="delete" auth="adminOauth" url="/V1/customers" method="DELETE">
+        <contentType>application/json</contentType>
         <param key="id" type="path">{id}</param>
     </operation>
 </config>
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Metadata/customer_extension_attribute-meta.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Metadata/customer_extension_attribute-meta.xml
index 4028b7f5ea9..c148081c4be 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Metadata/customer_extension_attribute-meta.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Metadata/customer_extension_attribute-meta.xml
@@ -9,11 +9,11 @@
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataOperation.xsd">
     <operation name="CreateCustomerExtensionAttribute" dataType="customer_extension_attribute" type="create">
-        <entry key="is_subscribed">boolean</entry>
-        <entry key="extension_attribute">customer_nested_extension_attribute</entry>
+        <field key="is_subscribed">boolean</field>
+        <field key="extension_attribute">customer_nested_extension_attribute</field>
     </operation>
     <operation name="UpdateCustomerExtensionAttribute" dataType="customer_extension_attribute" type="update">
-        <entry key="is_subscribed">boolean</entry>
-        <entry key="extension_attribute">customer_nested_extension_attribute</entry>
+        <field key="is_subscribed">boolean</field>
+        <field key="extension_attribute">customer_nested_extension_attribute</field>
     </operation>
 </config>
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Metadata/customer_nested_extension_attribute-meta.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Metadata/customer_nested_extension_attribute-meta.xml
index 3f1ccd2e8b1..5b189e186f4 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Metadata/customer_nested_extension_attribute-meta.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Metadata/customer_nested_extension_attribute-meta.xml
@@ -9,13 +9,13 @@
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataOperation.xsd">
     <operation name="CreateNestedExtensionAttribute" dataType="customer_nested_extension_attribute" type="create">
-        <entry key="id">integer</entry>
-        <entry key="customer_id">integer</entry>
-        <entry key="value">string</entry>
+        <field key="id">integer</field>
+        <field key="customer_id">integer</field>
+        <field key="value">string</field>
     </operation>
     <operation name="UpdateNestedExtensionAttribute" dataType="customer_nested_extension_attribute" type="update">
-        <entry key="id">integer</entry>
-        <entry key="customer_id">integer</entry>
-        <entry key="value">string</entry>
+        <field key="id">integer</field>
+        <field key="customer_id">integer</field>
+        <field key="value">string</field>
     </operation>
 </config>
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Metadata/region-meta.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Metadata/region-meta.xml
index 8ad9ec81eaf..6982b4a6ae5 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Metadata/region-meta.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Metadata/region-meta.xml
@@ -9,15 +9,15 @@
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataOperation.xsd">
     <operation name="CreateRegion" dataType="region" type="create">
-        <entry key="region_code">string</entry>
-        <entry key="region">string</entry>
-        <entry key="region_id">string</entry>
-        <entry key="extension_attributes">extension_attributes</entry>
+        <field key="region_code">string</field>
+        <field key="region">string</field>
+        <field key="region_id">string</field>
+        <field key="extension_attributes">extension_attributes</field>
     </operation>
     <operation name="UpdateRegion" dataType="region" type="update">
-        <entry key="region_code">string</entry>
-        <entry key="region">string</entry>
-        <entry key="region_id">string</entry>
-        <entry key="extension_attributes">empty_extension_attribute</entry>
+        <field key="region_code">string</field>
+        <field key="region">string</field>
+        <field key="region_id">string</field>
+        <field key="extension_attributes">empty_extension_attribute</field>
     </operation>
 </config>
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/Cest/AdminCreateStoreGroupCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/Cest/AdminCreateStoreGroupCest.xml
new file mode 100644
index 00000000000..87d40cb40bf
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/Cest/AdminCreateStoreGroupCest.xml
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Test XML Example -->
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Test/etc/testSchema.xsd">
+    <cest name="AdminCreateStoreGroupCest">
+        <annotations>
+            <features value="Create a store group in admin"/>
+            <stories value="Create a store group in admin"/>
+            <env value="chrome"/>
+            <env value="firefox"/>
+            <env value="phantomjs"/>
+            <group value="store"/>
+        </annotations>
+        <before>
+            <createData mergeKey="b1" entity="customStoreGroup"/>
+            <createData mergeKey="b2" entity="customStoreGroup"/>
+        </before>
+        <test name="AdminCreateStoreGroupTest">
+            <annotations>
+                <title value="Create a store group in admin"/>
+                <description value="Create a store group in admin"/>
+                <severity value="CRITICAL"/>
+                <testCaseId value="MAGETWO-?????"/>
+            </annotations>
+            <amOnPage mergeKey="s1" url="{{AdminLoginPage}}"/>
+            <fillField mergeKey="s3" selector="{{AdminLoginFormSection.username}}" userInput="{{_ENV.MAGENTO_ADMIN_USERNAME}}"/>
+            <fillField mergeKey="s5" selector="{{AdminLoginFormSection.password}}" userInput="{{_ENV.MAGENTO_ADMIN_PASSWORD}}"/>
+            <click mergeKey="s7" selector="{{AdminLoginFormSection.signIn}}"/>
+            <amOnPage mergeKey="s9" url="{{AdminSystemStorePage}}"/>
+
+            <click mergeKey="s11" selector="{{AdminStoresGridSection.resetButton}}"/>
+            <waitForPageLoad mergeKey="s15" time="10"/>
+
+            <!-- Uncomment after MFTF Bug MQE-391 is fixed -->
+            <!--fillField mergeKey="s17" selector="{{AdminStoresGridSection.storeGrpFilterTextField}}" userInput="$$b1.group[name]$$"/-->
+            <click mergeKey="s19" selector="{{AdminStoresGridSection.searchButton}}"/>
+            <waitForPageLoad mergeKey="s21" time="10"/>
+            <!--see mergeKey="s23" selector="{{AdminStoresGridSection.storeGrpNameInFirstRow}}" userInput="$$b1.group[name]$$"/-->
+
+            <click mergeKey="s31" selector="{{AdminStoresGridSection.resetButton}}"/>
+            <waitForPageLoad mergeKey="s35" time="10"/>
+            <!--fillField mergeKey="s37" selector="{{AdminStoresGridSection.storeGrpFilterTextField}}" userInput="$$b2.group[name]$$"/-->
+            <click mergeKey="s39" selector="{{AdminStoresGridSection.searchButton}}"/>
+            <waitForPageLoad mergeKey="s41" time="10"/>
+            <!--see mergeKey="s43" selector="{{AdminStoresGridSection.storeGrpNameInFirstRow}}" userInput="$$b2.group[name]$$"/-->
+        </test>
+    </cest>
+</config>
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/Data/StoreData.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/Data/StoreData.xml
new file mode 100644
index 00000000000..4b5bc9a8d83
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/Data/StoreData.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataProfileSchema.xsd">
+    <entity name="customStore" type="store">
+        <!--data key="group_id">customStoreGroup.id</data-->
+        <data key="name" unique="suffix">store</data>
+        <data key="code" unique="suffix">store</data>
+        <data key="is_active">1</data>
+        <data key="store_id">null</data>
+        <data key="store_action">add</data>
+        <data key="store_type">group</data>
+        <required-entity type="storeGroup">customStoreGroup</required-entity>
+    </entity>
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/Data/StoreGroupData.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/Data/StoreGroupData.xml
new file mode 100644
index 00000000000..c0124b206d1
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/Data/StoreGroupData.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataProfileSchema.xsd">
+    <entity name="customStoreGroup" type="group">
+        <data key="group_id">null</data>
+        <data key="name" unique="suffix">store</data>
+        <data key="code" unique="suffix">store</data>
+        <data key="root_category_id">2</data>
+        <data key="website_id">1</data>
+        <data key="store_action">add</data>
+        <data key="store_type">group</data>
+    </entity>
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/Metadata/store-meta.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/Metadata/store-meta.xml
new file mode 100644
index 00000000000..5b9f0022755
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/Metadata/store-meta.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataOperation.xsd">
+    <operation name="CreateStore" dataType="store" type="create"
+               auth="adminFormKey" url="/admin/system_store/save" method="POST" successRegex="messages-message-success" returnRegex="" >
+        <object dataType="store" key="store">
+            <field key="group_id">string</field>
+            <field key="name">string</field>
+            <field key="code">string</field>
+            <field key="is_active">boolean</field>
+            <field key="store_id">integer</field>
+        </object>
+        <field key="store_action">string</field>
+        <field key="store_type">string</field>
+    </operation>
+</config>
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/Metadata/store_group-meta.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/Metadata/store_group-meta.xml
new file mode 100644
index 00000000000..6f1667398a6
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/Metadata/store_group-meta.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataOperation.xsd">
+    <operation name="CreateStoreGroup" dataType="group" type="create"
+               auth="adminFormKey" url="/admin/system_store/save" method="POST" successRegex="messages-message-success" returnRegex="" >
+        <contentType>application/x-www-form-urlencoded</contentType>
+        <object dataType="group" key="group">
+            <field key="group_id">string</field>
+            <field key="name">string</field>
+            <field key="code">string</field>
+            <field key="root_category_id">integer</field>
+            <field key="website_id">integer</field>
+        </object>
+        <field key="store_action">string</field>
+        <field key="store_type">string</field>
+    </operation>
+</config>
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/Page/AdminSystemStorePage.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/Page/AdminSystemStorePage.xml
new file mode 100644
index 00000000000..542c618171d
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/Page/AdminSystemStorePage.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/PageObject.xsd">
+    <page name="AdminSystemStorePage" urlPath="/admin/admin/system_store/" module="Store">
+        <section name="AdminStoresMainActionsSection"/>
+        <section name="AdminStoresGridSection"/>
+    </page>
+</config>
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/Section/AdminNewStoreGroupSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/Section/AdminNewStoreGroupSection.xml
new file mode 100644
index 00000000000..1471832d528
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/Section/AdminNewStoreGroupSection.xml
@@ -0,0 +1,7 @@
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
+    <section name="AdminNewStoreGroupSection">
+        <element name="storeGrpNameTextField" type="input" selector="#group_name"/>
+        <element name="storeGrpCodeTextField" type="input" selector="#group_code"/>
+        <element name="storeRootCategoryDropdown" type="button" selector="#group_root_category_id"/>
+    </section>
+</config>
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/Section/AdminNewStoreSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/Section/AdminNewStoreSection.xml
new file mode 100644
index 00000000000..d44df4dc6f6
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/Section/AdminNewStoreSection.xml
@@ -0,0 +1,9 @@
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
+    <section name="AdminNewStoreSection">
+        <element name="storeNameTextField" type="input" selector="#store_name"/>
+        <element name="storeCodeTextField" type="input" selector="#store_code"/>
+        <element name="statusDropdown" type="button" selector="#store_is_active"/>
+        <element name="storeGrpDropdown" type="button" selector="#store_group_id"/>
+        <element name="sortOrderTextField" type="input" selector="#store_sort_order"/>
+    </section>
+</config>
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/Section/AdminStoresGridSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/Section/AdminStoresGridSection.xml
new file mode 100644
index 00000000000..42b171cc5e8
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/Section/AdminStoresGridSection.xml
@@ -0,0 +1,13 @@
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
+    <section name="AdminStoresGridSection">
+        <element name="storeGrpFilterTextField" type="input" selector="#storeGrid_filter_group_title"/>
+        <element name="websiteFilterTextField" type="input" selector="#storeGrid_filter_website_title"/>
+        <element name="storeFilterTextField" type="input" selector="#storeGrid_filter_store_title"/>
+        <element name="searchButton" type="button" selector=".admin__data-grid-header button[title=Search]"/>
+        <element name="resetButton" type="button" selector="button[title='Reset Filter']"/>
+        <element name="websiteNameInFirstRow" type="text" selector=".col-website_title>a"/>
+        <element name="storeGrpNameInFirstRow" type="text" selector=".col-group_title>a"/>
+        <element name="storeNameInFirstRow" type="text" selector=".col-store_title>a"/>
+
+    </section>
+</config>
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/Section/AdminStoresMainActionsSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/Section/AdminStoresMainActionsSection.xml
new file mode 100644
index 00000000000..cd136a0de15
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/Section/AdminStoresMainActionsSection.xml
@@ -0,0 +1,9 @@
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
+    <section name="AdminStoresMainActionsSection">
+        <element name="createStoreViewButton" type="button" selector="#add_store"/>
+        <element name="createStoreButton" type="button" selector="#add_group"/>
+        <element name="createWebsiteButton" type="button" selector="#add"/>
+        <element name="saveButton" type="button" selector="#save"/>
+        <element name="backButton" type="button" selector="#back"/>
+    </section>
+</config>
\ No newline at end of file
-- 
GitLab


From 2879aae340d46bb9a8f127c0039a05f3ed6ea7ba Mon Sep 17 00:00:00 2001
From: Tom Reece <treece@magento.com>
Date: Fri, 29 Sep 2017 21:50:20 +0300
Subject: [PATCH 040/380] MQE-378: Create API metadata for Coupon Code

---
 .../Checkout/Data/CouponData.xml              | 18 +++++++++++
 .../Checkout/Metadata/coupon-meta.xml         | 32 +++++++++++++++++++
 2 files changed, 50 insertions(+)
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Data/CouponData.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Metadata/coupon-meta.xml

diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Data/CouponData.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Data/CouponData.xml
new file mode 100644
index 00000000000..d33ac172d44
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Data/CouponData.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataProfileSchema.xsd">
+    <entity name="_defaultCoupon" type="coupon">
+        <data key="rule_id">4</data>
+        <data key="code">FREESHIPPING123</data>
+        <data key="times_used">0</data>
+        <data key="is_primary">false</data>
+    </entity>
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Metadata/coupon-meta.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Metadata/coupon-meta.xml
new file mode 100644
index 00000000000..450c80065b6
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Metadata/coupon-meta.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataOperation.xsd">
+    <operation name="CreateCoupon" dataType="coupon" type="create" auth="/rest/V1/integration/admin/token" url="/rest/V1/coupons" method="POST">
+        <header param="Content-Type">application/json</header>
+        <jsonObject key="coupon" dataType="coupon">
+            <entry key="rule_id" required="true">integer</entry>
+            <entry key="times_used" required="true">integer</entry>
+            <entry key="is_primary" required="true">boolean</entry>
+            <entry key="code">string</entry>
+            <entry key="usage_limit">integer</entry>
+            <entry key="usage_per_customer">integer</entry>
+            <entry key="expiration_date">string</entry>
+            <entry key="created_at">string</entry>
+            <entry key="type">integer</entry>
+            <entry key="extension_attributes">empty_extension_attribute</entry>
+        </jsonObject>
+    </operation>
+
+    <operation name="DeleteCoupon" dataType="coupon" type="delete" auth="/rest/V1/integration/admin/token" url="/rest/V1/coupons" method="DELETE">
+        <header param="Content-Type">application/json</header>
+        <param key="couponId" type="path">{coupon_id}</param>
+    </operation>
+</config>
-- 
GitLab


From 1865c60f0f6a0370779c4fb97a219ebb9138abc4 Mon Sep 17 00:00:00 2001
From: Ian Meron <imeron@magento.com>
Date: Mon, 2 Oct 2017 21:25:45 +0300
Subject: [PATCH 041/380] MQE-309: [Customizability] Update nested API
 dependency schema and execution

---
 ...goryUrlKeyData.xml => CustomAttributeData.xml} |  8 ++++++++
 .../Data/CustomAttributeProductUrlKeyData.xml     | 15 ---------------
 .../FunctionalTest/Catalog/Data/ProductData.xml   |  2 ++
 .../Catalog/Metadata/product-meta.xml             |  4 ++--
 .../Cest/StorefrontCustomerCheckoutCest.xml       |  6 +-----
 .../Checkout/Cest/StorefrontGuestCheckoutCest.xml |  6 +-----
 .../Customer/Metadata/custom_attribute-meta.xml   |  6 ++++++
 .../Sales/Cest/AdminCreateInvoiceCest.xml         |  6 +-----
 .../Cest/PersistMultipleEntitiesCest.xml          |  9 ++-------
 9 files changed, 23 insertions(+), 39 deletions(-)
 rename dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Data/{CustomAttributeCategoryUrlKeyData.xml => CustomAttributeData.xml} (60%)
 delete mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Data/CustomAttributeProductUrlKeyData.xml

diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Data/CustomAttributeCategoryUrlKeyData.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Data/CustomAttributeData.xml
similarity index 60%
rename from dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Data/CustomAttributeCategoryUrlKeyData.xml
rename to dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Data/CustomAttributeData.xml
index 911fd3d73a2..46383269b88 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Data/CustomAttributeCategoryUrlKeyData.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Data/CustomAttributeData.xml
@@ -12,4 +12,12 @@
         <data key="attribute_code">url_key</data>
         <data key="value" unique="suffix">category</data>
     </entity>
+    <entity name="CustomAttributeProductUrlKey" type="custom_attribute">
+        <data key="attribute_code">url_key</data>
+        <data key="value" unique="suffix">product</data>
+    </entity>
+    <entity name="CustomAttributeCategoryIds" type="custom_attribute_array">
+        <data key="attribute_code">category_ids</data>
+        <var key="value" entityType="category" entityKey="id"/>
+    </entity>
 </config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Data/CustomAttributeProductUrlKeyData.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Data/CustomAttributeProductUrlKeyData.xml
deleted file mode 100644
index acc9517d229..00000000000
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Data/CustomAttributeProductUrlKeyData.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- /**
-  * Copyright © Magento, Inc. All rights reserved.
-  * See COPYING.txt for license details.
-  */
--->
-
-<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataProfileSchema.xsd">
-    <entity name="CustomAttributeProductUrlKey" type="custom_attribute">
-        <data key="attribute_code">url_key</data>
-        <data key="value" unique="suffix">product</data>
-    </entity>
-</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Data/ProductData.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Data/ProductData.xml
index 55b7192405a..5be4b73510c 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Data/ProductData.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Data/ProductData.xml
@@ -19,6 +19,7 @@
         <data key="status">1</data>
         <data key="quantity">100</data>
         <required-entity type="product_extension_attribute">EavStockItem</required-entity>
+        <required-entity type="custom_attribute_array">CustomAttributeCategoryIds</required-entity>
     </entity>
     <entity name="SimpleProduct" type="product">
         <data key="sku" unique="suffix">SimpleProduct</data>
@@ -29,6 +30,7 @@
         <data key="visibility">4</data>
         <data key="status">1</data>
         <required-entity type="product_extension_attribute">EavStockItem</required-entity>
+        <required-entity type="custom_attribute_array">CustomAttributeCategoryIds</required-entity>
         <!--required-entity type="custom_attribute">CustomAttributeProductUrlKey</required-entity-->
     </entity>
 </config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product-meta.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product-meta.xml
index 37880ef4355..068eb692a46 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product-meta.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product-meta.xml
@@ -26,7 +26,7 @@
                 <value>product_link</value>
             </array>
             <array key="custom_attributes">
-                <value>custom_attribute</value>
+                <value>custom_attribute_array</value>
             </array>
             <array key="options">
                 <value>product_option</value>
@@ -52,7 +52,7 @@
                 <value>product_link</value>
             </array>
             <array key="custom_attributes">
-                <value>custom_attribute</value>
+                <value>custom_attribute_array</value>
             </array>
             <array key="options">
                 <value>product_option</value>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Cest/StorefrontCustomerCheckoutCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Cest/StorefrontCustomerCheckoutCest.xml
index 8b7922bf453..67e48feb8e4 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Cest/StorefrontCustomerCheckoutCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Cest/StorefrontCustomerCheckoutCest.xml
@@ -19,12 +19,8 @@
         </annotations>
         <before>
             <createData entity="SimpleSubCategory" mergeKey="simplecategory"/>
-            <entity name="categoryLink" type="custom_attribute" mergeKey="categoryLink">
-                <data key="attribute_code">category_ids</data>
-                <data key="value">$$simplecategory.id$$</data>
-            </entity>
             <createData entity="SimpleProduct" mergeKey="simpleproduct1">
-                <required-entity name="categoryLink"/>
+                <required-entity persistedKey="simplecategory"/>
             </createData>
             <createData entity="Simple_US_Customer" mergeKey="simpleuscustomer"/>
         </before>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Cest/StorefrontGuestCheckoutCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Cest/StorefrontGuestCheckoutCest.xml
index c30a7aac148..d4d6fcb9572 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Cest/StorefrontGuestCheckoutCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Cest/StorefrontGuestCheckoutCest.xml
@@ -19,12 +19,8 @@
         </annotations>
         <before>
             <createData entity="_defaultCategory" mergeKey="createCategory"/>
-            <entity name="categoryLink" type="custom_attribute" mergeKey="categoryLink">
-                <data key="attribute_code">category_ids</data>
-                <data key="value">$$createCategory.id$$</data>
-            </entity>
             <createData entity="_defaultProduct" mergeKey="createProduct">
-                <required-entity name="categoryLink"/>
+                <required-entity persistedKey="createCategory"/>
             </createData>
         </before>
         <after>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Metadata/custom_attribute-meta.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Metadata/custom_attribute-meta.xml
index 3414ba7694c..5188675e4e9 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Metadata/custom_attribute-meta.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Metadata/custom_attribute-meta.xml
@@ -12,6 +12,12 @@
         <field key="attribute_code">string</field>
         <field key="value">string</field>
     </operation>
+    <operation name="CreateCustomAttributeArray" dataType="custom_attribute_array" type="create">
+        <field key="attribute_code">string</field>
+        <array key="value">
+            <value>string</value>
+        </array>
+    </operation>
     <operation name="UpdateCustomAttribute" dataType="custom_attribute" type="update">
         <field key="attribute_code">string</field>
         <field key="value">string</field>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Cest/AdminCreateInvoiceCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Cest/AdminCreateInvoiceCest.xml
index ed19d94bc53..e374ffbd6f1 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Cest/AdminCreateInvoiceCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Cest/AdminCreateInvoiceCest.xml
@@ -19,12 +19,8 @@
         </annotations>
         <before>
             <createData entity="_defaultCategory" mergeKey="createCategory"/>
-            <entity name="categoryLink" type="custom_attribute" mergeKey="categoryLink">
-                <data key="attribute_code">category_ids</data>
-                <data key="value">$$createCategory.id$$</data>
-            </entity>
             <createData entity="_defaultProduct" mergeKey="createProduct">
-                <required-entity name="categoryLink"/>
+                <required-entity persistedKey="createCategory"/>
             </createData>
         </before>
 
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/PersistMultipleEntitiesCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/PersistMultipleEntitiesCest.xml
index a46500143a8..560b3b46cb5 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/PersistMultipleEntitiesCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/PersistMultipleEntitiesCest.xml
@@ -15,16 +15,11 @@
         </annotations>
         <before>
             <createData entity="simplesubcategory" mergeKey="simplecategory"/>
-            <entity name="categoryLink" type="custom_attribute" mergeKey="categoryLink">
-                <data key="attribute_code">category_ids</data>
-                <data key="value">$$simplecategory.id$$</data>
-            </entity>
-
             <createData entity="simpleproduct" mergeKey="simpleproduct1">
-                <required-entity name="categoryLink"/>
+                <required-entity persistedKey="simplecategory"/>
             </createData>
             <createData entity="simpleproduct" mergeKey="simpleproduct2">
-                <required-entity name="categoryLink"/>
+                <required-entity persistedKey="categoryLink"/>
             </createData>
         </before>
         <after>
-- 
GitLab


From 497e3ecfe38a043cde68fe09db6caed5b9d856f9 Mon Sep 17 00:00:00 2001
From: John Stennett <john00ivy@gmail.com>
Date: Mon, 2 Oct 2017 23:25:18 +0300
Subject: [PATCH 042/380] MQE-365: Template Files

 - Adding a note for "<!-- ADD TEST STEPS HERE -->" to the Cest and ActionGroup files.
 - Adding a Template file for ActionGroup.
 - Moving the Template files to their own directory.
 - Listing each file under the correct directory name it needs to live under for a Module.
---
 .../ActionGroup/TemplateActionGroupFile.xml       | 14 ++++++++++++++
 .../Cest}/TemplateCestFile.xml                    |  1 +
 .../Data}/TemplateDataFile.xml                    |  0
 .../Metadata/TemplateMetaFile.xml}                | 15 ++++++---------
 .../Page}/TemplatePageFile.xml                    |  0
 .../Section}/TemplateSectionFile.xml              |  0
 6 files changed, 21 insertions(+), 9 deletions(-)
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTemplates/ActionGroup/TemplateActionGroupFile.xml
 rename dev/tests/acceptance/tests/functional/Magento/FunctionalTest/{SampleTests/Templates => SampleTemplates/Cest}/TemplateCestFile.xml (95%)
 rename dev/tests/acceptance/tests/functional/Magento/FunctionalTest/{SampleTests/Templates => SampleTemplates/Data}/TemplateDataFile.xml (100%)
 rename dev/tests/acceptance/tests/functional/Magento/FunctionalTest/{SampleTests/Templates/TemplateMetaDataFile.xml => SampleTemplates/Metadata/TemplateMetaFile.xml} (62%)
 rename dev/tests/acceptance/tests/functional/Magento/FunctionalTest/{SampleTests/Templates => SampleTemplates/Page}/TemplatePageFile.xml (100%)
 rename dev/tests/acceptance/tests/functional/Magento/FunctionalTest/{SampleTests/Templates => SampleTemplates/Section}/TemplateSectionFile.xml (100%)

diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTemplates/ActionGroup/TemplateActionGroupFile.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTemplates/ActionGroup/TemplateActionGroupFile.xml
new file mode 100644
index 00000000000..13e1467cbd2
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTemplates/ActionGroup/TemplateActionGroupFile.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Test/etc/testSchema.xsd">
+    <actionGroup name="">
+        <!-- ADD TEST STEPS HERE -->
+    </actionGroup>
+</config>
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Templates/TemplateCestFile.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTemplates/Cest/TemplateCestFile.xml
similarity index 95%
rename from dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Templates/TemplateCestFile.xml
rename to dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTemplates/Cest/TemplateCestFile.xml
index 88c8639b977..5e45eeed07c 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Templates/TemplateCestFile.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTemplates/Cest/TemplateCestFile.xml
@@ -28,6 +28,7 @@
                 <severity value=""/>
                 <testCaseId value=""/>
             </annotations>
+            <!-- ADD TEST STEPS HERE -->
         </test>
     </cest>
 </config>
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Templates/TemplateDataFile.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTemplates/Data/TemplateDataFile.xml
similarity index 100%
rename from dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Templates/TemplateDataFile.xml
rename to dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTemplates/Data/TemplateDataFile.xml
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Templates/TemplateMetaDataFile.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTemplates/Metadata/TemplateMetaFile.xml
similarity index 62%
rename from dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Templates/TemplateMetaDataFile.xml
rename to dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTemplates/Metadata/TemplateMetaFile.xml
index 28f95508712..3e011446414 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Templates/TemplateMetaDataFile.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTemplates/Metadata/TemplateMetaFile.xml
@@ -9,14 +9,11 @@
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataOperation.xsd">
     <operation name="" dataType="" type="" auth="" url="" method="">
-        <header param="">application/json</header>
-        <param key="" type="">{}</param>
-        <jsonObject dataType="" key="">
-            <entry key=""></entry>
-            <array key="">
-                <value></value>
-            </array>
-        </jsonObject>
-        <entry key=""></entry>
+        <contentType>application/json</contentType>
+        <field key=""></field>
+        <array key="">
+            <value></value>
+        </array>
+        <param key="" type=""></param>
     </operation>
 </config>
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Templates/TemplatePageFile.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTemplates/Page/TemplatePageFile.xml
similarity index 100%
rename from dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Templates/TemplatePageFile.xml
rename to dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTemplates/Page/TemplatePageFile.xml
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Templates/TemplateSectionFile.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTemplates/Section/TemplateSectionFile.xml
similarity index 100%
rename from dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Templates/TemplateSectionFile.xml
rename to dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTemplates/Section/TemplateSectionFile.xml
-- 
GitLab


From e3d3e311b018e46538462daa69d3b5c0ca0d6295 Mon Sep 17 00:00:00 2001
From: Ji Lu <jilu1@magento.com>
Date: Mon, 2 Oct 2017 23:18:47 +0300
Subject: [PATCH 043/380] MQE-411: Fixed template and coupon meta data files.

---
 .../Checkout/Metadata/coupon-meta.xml         | 28 +++++++++----------
 .../Metadata/TemplateMetaFile.xml             | 17 ++++++-----
 2 files changed, 24 insertions(+), 21 deletions(-)

diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Metadata/coupon-meta.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Metadata/coupon-meta.xml
index 450c80065b6..5be13e54fc5 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Metadata/coupon-meta.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Metadata/coupon-meta.xml
@@ -9,23 +9,23 @@
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataOperation.xsd">
-    <operation name="CreateCoupon" dataType="coupon" type="create" auth="/rest/V1/integration/admin/token" url="/rest/V1/coupons" method="POST">
+    <operation name="CreateCoupon" dataType="coupon" type="create" auth="adminOauth" url="/rest/V1/coupons" method="POST">
         <header param="Content-Type">application/json</header>
-        <jsonObject key="coupon" dataType="coupon">
-            <entry key="rule_id" required="true">integer</entry>
-            <entry key="times_used" required="true">integer</entry>
-            <entry key="is_primary" required="true">boolean</entry>
-            <entry key="code">string</entry>
-            <entry key="usage_limit">integer</entry>
-            <entry key="usage_per_customer">integer</entry>
-            <entry key="expiration_date">string</entry>
-            <entry key="created_at">string</entry>
-            <entry key="type">integer</entry>
-            <entry key="extension_attributes">empty_extension_attribute</entry>
-        </jsonObject>
+        <object key="coupon" dataType="coupon">
+            <field key="rule_id" required="true">integer</field>
+            <field key="times_used" required="true">integer</field>
+            <field key="is_primary" required="true">boolean</field>
+            <field key="code">string</field>
+            <field key="usage_limit">integer</field>
+            <field key="usage_per_customer">integer</field>
+            <field key="expiration_date">string</field>
+            <field key="created_at">string</field>
+            <field key="type">integer</field>
+            <field key="extension_attributes">empty_extension_attribute</field>
+        </object>
     </operation>
 
-    <operation name="DeleteCoupon" dataType="coupon" type="delete" auth="/rest/V1/integration/admin/token" url="/rest/V1/coupons" method="DELETE">
+    <operation name="DeleteCoupon" dataType="coupon" type="delete" auth="adminOauth" url="/rest/V1/coupons" method="DELETE">
         <header param="Content-Type">application/json</header>
         <param key="couponId" type="path">{coupon_id}</param>
     </operation>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTemplates/Metadata/TemplateMetaFile.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTemplates/Metadata/TemplateMetaFile.xml
index 3e011446414..3610dc97935 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTemplates/Metadata/TemplateMetaFile.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTemplates/Metadata/TemplateMetaFile.xml
@@ -8,12 +8,15 @@
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataOperation.xsd">
-    <operation name="" dataType="" type="" auth="" url="" method="">
-        <contentType>application/json</contentType>
+    <operation name="" dataType="" type="" auth="adminOauth" url="" method="">
+        <header param="">application/json</header>
+        <param key="" type="">{}</param>
+        <object dataType="" key="">
+            <field key=""></field>
+            <array key="">
+                <value></value>
+            </array>
+        </object>
         <field key=""></field>
-        <array key="">
-            <value></value>
-        </array>
-        <param key="" type=""></param>
     </operation>
-</config>
\ No newline at end of file
+</config>
-- 
GitLab


From 257c757ce8a63352f63753e4886e024d0b021f6e Mon Sep 17 00:00:00 2001
From: John Stennett <john00ivy@gmail.com>
Date: Tue, 3 Oct 2017 22:47:26 +0300
Subject: [PATCH 044/380] MQE-402: Workshop Feedback

 - Updating the README, adding instructions that we missed that were pointed out in the Workshop sessions.
 - Adding an additional work around for the Allure @env error.
---
 dev/tests/acceptance/README.md | 93 +++++++++++++++++++++++-----------
 1 file changed, 63 insertions(+), 30 deletions(-)

diff --git a/dev/tests/acceptance/README.md b/dev/tests/acceptance/README.md
index d55625a6442..ea6eedd3f84 100755
--- a/dev/tests/acceptance/README.md
+++ b/dev/tests/acceptance/README.md
@@ -8,18 +8,20 @@
 ----
 
 # Prerequisites
-* **IMPORTANT**: Configure your Magento Store for [Automated Testing](http://devdocs.magento.com/guides/v2.0/mtf/mtf_quickstart/mtf_quickstart_magento.html)
+* **IMPORTANT**
+    * You will need to have a running instance of Magento that you can access.
+    * You will need to configure your instance of Magento for [Automated Testing](http://devdocs.magento.com/guides/v2.0/mtf/mtf_quickstart/mtf_quickstart_magento.html).
 * [PHP v7.x](http://php.net/manual/en/install.php)
 * [Composer v1.4.x](https://getcomposer.org/download/)
-* [Java](https://www.java.com/en/download/)
+* [Java v1.8.x](https://www.java.com/en/download/)
 * [Selenium Server](http://www.seleniumhq.org/download/) - [v2.53.x](http://selenium-release.storage.googleapis.com/index.html?path=2.53/)
-* [ChromeDriver](https://sites.google.com/a/chromium.org/chromedriver/downloads)
-* [Allure CLI](https://docs.qameta.io/allure/latest/#_installing_a_commandline)
+* [ChromeDriver v2.32.x](https://sites.google.com/a/chromium.org/chromedriver/downloads)
+* [Allure CLI v2.3.x](https://docs.qameta.io/allure/latest/#_installing_a_commandline)
 * [GitHub](https://desktop.github.com/)
 
 ### Recommendations
 * We recommend using [PHPStorm 2017](https://www.jetbrains.com/phpstorm/) for your IDE. They recently added support for [Codeception Test execution](https://blog.jetbrains.com/phpstorm/2017/03/codeception-support-comes-to-phpstorm-2017-1/) which is helpful when debugging.
-* We also recommend updating your [$PATH to include](https://stackoverflow.com/questions/7703041/editing-path-variable-on-mac) `./vendor/bin` so you can easily execute the necessary `robo` and `codecept` commands instead of `./vendor/bin/robo` or `./vendor/bin/codecept`.  
+* We also recommend updating your [$PATH to include](https://stackoverflow.com/questions/7703041/editing-path-variable-on-mac) `./vendor/bin` so you can easily execute the necessary `robo` and `codecept` commands instead of using `./vendor/bin/robo` or `./vendor/bin/codecept`.  
 
 ----
 
@@ -32,15 +34,34 @@ Due to the current setup of the Framework you will need to do the following:
   * Pull down - [CE](https://github.com/magento-pangolin/magento2ce)
   * `cd magento2ee`
   * `php -f dev/tools/build-ee.php -- --command=link --exclude=true`
-  * Generate a `github-oauth` token: [Instructions](https://help.github.com/articles/creating-a-personal-access-token-for-the-command-line/#creating-a-token)
+  * `cd ..`
+  * Generate a `github-oauth` token: 
+      * [How to setup an auth.json file for the Composer?](https://mage2.pro/t/topic/743)
+      * [Creating a personal access token for the command line.](https://help.github.com/articles/creating-a-personal-access-token-for-the-command-line/#creating-a-token)
   * `touch magento2ce/dev/tests/acceptance/auth.json`
   * `nano magento2ce/dev/tests/acceptance/auth.json`
+  * Copy/Paste the following:
+    ```
+    {
+      "github-oauth": {
+          "github.com": "<personal access token>"
+      }
+    }
+    ```
   * Replace `<personal access token>` with the token you generated in GitHub.
   * Save your work.
   * `cd ../magento2ce`
   * `cd dev/tests/acceptance`
+  * Open the `composer.json` file.
+  * Make the following edits:
+      * `url`:
+          1. ORIGINAL: `"url": "git@github.com:magento/magento2-functional-testing-framework.git"`  
+          1. UPDATED: `"url": "git@github.com:magento-pangolin/magento2-functional-testing-framework.git"`
+      * `magento/magento2-functional-testing-framework`:
+          1. ORIGINAL: `"magento/magento2-functional-testing-framework": "dev-develop"`
+          1. UPDATED: `"magento/magento2-functional-testing-framework": "dev-sprint-develop"`
   * `composer install`
-    * **PLEASE IGNORE THE "Installation" SECTION THAT FOLLOWS, START WITH THE "Building The Framework" SECTION INSTEAD.**
+      * **PLEASE IGNORE THE "Installation" SECTION THAT FOLLOWS, START WITH THE "Building The Framework" SECTION INSTEAD.**
 
 ----
 
@@ -116,7 +137,7 @@ To determine which version of the Allure command you need to use please run `all
 ----
 
 # Building The Framework
-After installing the dependencies you will want to build the Codeception project in the [Magento 2 Functional Testing Framework](https://github.com/magento-pangolin/magento2-functional-testing-framework), which is a dependency of the CE or EE Tests repo. Run `./vendor/bin/robo build:project` to complete this task.
+After installing the dependencies you will want to build the Codeception project in the [Magento 2 Functional Testing Framework](https://github.com/magento-pangolin/magento2-functional-testing-framework), which is a dependency of the CE or EE Tests repo. Run the following to complete this task:
 
 `./vendor/bin/robo build:project`
 
@@ -127,9 +148,15 @@ Before you can generate or run the Tests you will need to edit the Configuration
 
 In the `.env` file you will find key pieces of information that are unique to your local Magento setup that will need to be edited before you can generate tests:
 * **MAGENTO_BASE_URL**
+    * Example: `MAGENTO_BASE_URL=http://127.0.0.1:32772/`
+    * Note: Please end the URL with a `/`.
 * **MAGENTO_BACKEND_NAME**
+    * Example: `MAGENTO_BACKEND_NAME=admin`
+    * Note: Set this variable to `admin`.
 * **MAGENTO_ADMIN_USERNAME**
+    * Example: `MAGENTO_ADMIN_USERNAME=admin`
 * **MAGENTO_ADMIN_PASSWORD**
+    * Example: `MAGENTO_ADMIN_PASSWORD=123123`
 
 ##### Additional Codeception settings can be found in the following files: 
 * **tests/functional.suite.yml**
@@ -222,25 +249,31 @@ Due to the interdependent nature of the 2 repos it is recommended to Symlink the
     `sudo nano /etc/paths`
     
 * StackOverflow Help: https://stackoverflow.com/questions/7703041/editing-path-variable-on-mac
-* Allure `@env error` - Allure recently changed their Codeception Adapter that breaks Codeception when tests include the `@env` tag. A workaround for this error is to revert the changes they made to a function. 
-    * Locate the `AllureAdapter.php` file here: `vendor/allure-framework/allure-codeception/src/Yandex/Allure/Adapter/AllureAdapter.php`
-    * Edit the `_initialize()` function found on line 77 and replace it with the following:
-```
-public function _initialize(array $ignoredAnnotations = [])
-    {
-        parent::_initialize();
-        Annotation\AnnotationProvider::registerAnnotationNamespaces();
-        // Add standard PHPUnit annotations
-        Annotation\AnnotationProvider::addIgnoredAnnotations($this->ignoredAnnotations);
-        // Add custom ignored annotations
-        $ignoredAnnotations = $this->tryGetOption('ignoredAnnotations', []);
-        Annotation\AnnotationProvider::addIgnoredAnnotations($ignoredAnnotations);
-        $outputDirectory = $this->getOutputDirectory();
-        $deletePreviousResults =
-            $this->tryGetOption(DELETE_PREVIOUS_RESULTS_PARAMETER, false);
-        $this->prepareOutputDirectory($outputDirectory, $deletePreviousResults);
-        if (is_null(Model\Provider::getOutputDirectory())) {
-            Model\Provider::setOutputDirectory($outputDirectory);
-        }
-    }
-```
+* Allure `@env error` - Allure recently changed their Codeception Adapter that breaks Codeception when tests include the `@env` tag. There are 2 workarounds for this issue currently.
+    1. You can edit the `composer.json` and point the Allure-Codeception Adapter to a previous commit:
+        * Edit the `composer.json` file.
+        * Make the following change:
+            * ORIGINAL: `“allure-framework/allure-codeception”: "dev-master"`
+            * UPDATED: `“allure-framework/allure-codeception”: “dev-master#af40af5ae2b717618a42fe3e137d75878508c75d”`
+    1. You can revert the changes that they made manually: 
+        * Locate the `AllureAdapter.php` file here: `vendor/allure-framework/allure-codeception/src/Yandex/Allure/Adapter/AllureAdapter.php`
+        * Edit the `_initialize()` function found on line 77 and replace it with the following:
+            ```
+            public function _initialize(array $ignoredAnnotations = [])
+                {
+                    parent::_initialize();
+                    Annotation\AnnotationProvider::registerAnnotationNamespaces();
+                    // Add standard PHPUnit annotations
+                    Annotation\AnnotationProvider::addIgnoredAnnotations($this->ignoredAnnotations);
+                    // Add custom ignored annotations
+                    $ignoredAnnotations = $this->tryGetOption('ignoredAnnotations', []);
+                    Annotation\AnnotationProvider::addIgnoredAnnotations($ignoredAnnotations);
+                    $outputDirectory = $this->getOutputDirectory();
+                    $deletePreviousResults =
+                        $this->tryGetOption(DELETE_PREVIOUS_RESULTS_PARAMETER, false);
+                    $this->prepareOutputDirectory($outputDirectory, $deletePreviousResults);
+                    if (is_null(Model\Provider::getOutputDirectory())) {
+                        Model\Provider::setOutputDirectory($outputDirectory);
+                    }
+                }
+            ```
-- 
GitLab


From b8f403474290b48903b9fb45ef052c416fb78e6b Mon Sep 17 00:00:00 2001
From: Tom Reece <treece@magento.com>
Date: Wed, 27 Sep 2017 23:21:00 +0300
Subject: [PATCH 045/380] MQE-352: Review and Update SampleCest.xml for added
 functionality

---
 .../ActionGroup/SampleActionGroup.xml         | 12 +++++
 .../SampleTests/Cest/AdvancedSampleCest.xml   | 53 +++++++++++++++++++
 .../SampleTests/Cest/SampleCest.xml           | 25 ++++++++-
 .../SampleTests/Data/SampleData.xml           | 22 ++++++++
 .../SampleTests/Page/SamplePage.xml           | 14 +++++
 .../SampleTests/Section/SampleSection.xml     | 17 ++++++
 6 files changed, 141 insertions(+), 2 deletions(-)
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/ActionGroup/SampleActionGroup.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/AdvancedSampleCest.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Data/SampleData.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Page/SamplePage.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Section/SampleSection.xml

diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/ActionGroup/SampleActionGroup.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/ActionGroup/SampleActionGroup.xml
new file mode 100644
index 00000000000..ac03b2e349b
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/ActionGroup/SampleActionGroup.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Test/etc/testSchema.xsd">
+    <actionGroup name="SampleActionGroup">
+        <arguments>
+            <argument name="person" defaultValue="SamplePerson"/>
+        </arguments>
+        <fillField selector="#foo" userInput="{{person.foo}}" mergeKey="fillField1"/>
+        <fillField selector="#bar" userInput="{{person.bar}}" mergeKey="fillField2"/>
+    </actionGroup>
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/AdvancedSampleCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/AdvancedSampleCest.xml
new file mode 100644
index 00000000000..cce5b0c2c9f
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/AdvancedSampleCest.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Test/etc/testSchema.xsd">
+    <cest name="AdvancedSampleCest">
+        <annotations>
+            <features value=""/>
+            <stories value=""/>
+            <group value="skip"/>
+        </annotations>
+        <before>
+            <createData entity="SamplePerson" mergeKey="beforeData"/>
+        </before>
+        <after>
+
+        </after>
+        <test name="OneTest">
+            <annotations>
+                <title value=""/>
+                <description value=""/>
+                <severity value="CRITICAL"/>
+                <testCaseId value="#"/>
+            </annotations>
+
+            <!-- Create an entity that depends on another entity -->
+            <createData entity="_defaultCategory" mergeKey="createCategory"/>
+            <createData entity="_defaultProduct" mergeKey="createProduct">
+                <required-entity persistedKey="createCategory"/>
+            </createData>
+
+            <!-- Parameterized url -->
+            <amOnPage url="{{SamplePage('foo', SamplePerson.bar)}}" mergeKey="amOnPage"/>
+
+            <!-- Parameterized selector -->
+            <grabTextFrom selector="{{SampleSection.twoParamElement(SamplePerson.foo, 'bar')}}" returnVariable="myReturnVar" mergeKey="grabTextFrom"/>
+
+            <!-- Element with a timeout -->
+            <click selector="{{SampleSection.timeoutElement}}" mergeKey="click"/>
+
+            <!-- ActionGroup -->
+            <actionGroup ref="SampleActionGroup" mergeKey="actionGroup">
+                <argument name="person" value="OverrideDefaultPerson"/>
+            </actionGroup>
+        </test>
+    </cest>
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/SampleCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/SampleCest.xml
index 32a18961bfa..0eea2c79a39 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/SampleCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/SampleCest.xml
@@ -8,7 +8,7 @@
 <!-- Test XML Example -->
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Test/etc/testSchema.xsd">
-    <cest name="SampleGeneratorCest">
+    <cest name="SampleCest">
         <annotations>
             <features value="Test Generator"/>
             <stories value="Verify each Codeception command is generated correctly."/>
@@ -247,5 +247,26 @@
             <unselectOption selector="#option" variable="randomStuff" mergeKey="unselectOption1"/>
             <waitForText variable="randomStuff" time="5" mergeKey="waitForText1"/>
         </test>
+        <test name="AllReplacementTest">
+            <annotations>
+                <title value="Exercise reference replacement."/>
+                <description value="Exercises {{foo}}, $foo$, and $$foo$$ replacement."/>
+                <severity value="CRITICAL"/>
+                <testCaseId value="#"/>
+            </annotations>
+            <createData entity="CustomerEntity1" mergeKey="testScopeData"/>
+            <amOnPage url="{{SamplePage.url('success','success2')}}" mergeKey="a0"/>
+            <amOnPage url="/$testScopeData.firstname$.html" mergeKey="a1"/>
+            <amOnPage url="/$$createData1.firstname$$.html" mergeKey="a2"/>
+            <amOnPage url="{{SamplePage.url($testScopeData.firstname$,$testScopeData.lastname$)}}" mergeKey="a3"/>
+            <amOnPage url="{{SamplePage.url($$createData1.firstname$$,$$createData1.lastname$$)}}" mergeKey="a4"/>
+            <click selector="{{SampleSection.oneParamElement('success')}}" mergeKey="c1"/>
+            <click selector="{{SampleSection.twoParamElement('success','success2')}}" mergeKey="c2"/>
+            <click selector="{{SampleSection.threeParamElement('John', SamplePerson.lastname, $testScopeData.lastname$)}}" mergeKey="c3"/>
+            <click selector="#$testScopeData.firstname$ .$testScopeData.lastname$" mergeKey="c4"/>
+            <click selector="#$$createData1.firstname$$ .$$createData1.lastname$$" mergeKey="c5"/>
+            <fillField selector="#sample" userInput="Hello $testScopeData.firstname$ $testScopeData.lastname$" mergeKey="f1"/>
+            <fillField selector="#sample" userInput="Hello $$createData1.firstname$$ $$createData1.lastname$$" mergeKey="f2"/>
+        </test>
     </cest>
-</config>
\ No newline at end of file
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Data/SampleData.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Data/SampleData.xml
new file mode 100644
index 00000000000..7f5fbde6217
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Data/SampleData.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataProfileSchema.xsd">
+    <entity name="SamplePerson" type="samplePerson">
+        <data key="foo">foo</data>
+        <data key="bar">bar</data>
+        <data key="lastName">Doe</data>
+        <data key="email" unique="prefix">.email@gmail.com</data>
+    </entity>
+    <entity name="OverrideDefaultPerson" type="samplePerson">
+        <data key="foo">fizz</data>
+        <data key="bar">buzz</data>
+    </entity>
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Page/SamplePage.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Page/SamplePage.xml
new file mode 100644
index 00000000000..034e0dd50dd
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Page/SamplePage.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/PageObject.xsd">
+    <page name="SamplePage" urlPath="/{{var1}}/{{var2}}.html" module="SampleTests" parameterized="true">
+        <section name="SampleSection"/>
+    </page>
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Section/SampleSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Section/SampleSection.xml
new file mode 100644
index 00000000000..789e8dfd3a7
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Section/SampleSection.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
+    <section name="SampleSection">
+        <element name="oneParamElement" type="button" selector="#element .{{var1}}" parameterized="true"/>
+        <element name="twoParamElement" type="button" selector="#{{var1}} .{{var2}}" parameterized="true"/>
+        <element name="threeParamElement" type="button" selector="#{{var1}}-{{var2}} .{{var3}}" parameterized="true"/>
+        <element name="timeoutElement" type="button" selector="#foo" timeout="30"/>
+    </section>
+</config>
-- 
GitLab


From 5477a1098504f04cba67e916e4ef5b0f86754089 Mon Sep 17 00:00:00 2001
From: Tom Reece <treece@magento.com>
Date: Wed, 4 Oct 2017 21:33:49 +0300
Subject: [PATCH 046/380] MQE-419: README.MD should not reference the
 magento-pangolin org

---
 dev/tests/acceptance/README.md | 17 ++++-------------
 1 file changed, 4 insertions(+), 13 deletions(-)

diff --git a/dev/tests/acceptance/README.md b/dev/tests/acceptance/README.md
index ea6eedd3f84..805c89e126d 100755
--- a/dev/tests/acceptance/README.md
+++ b/dev/tests/acceptance/README.md
@@ -30,8 +30,8 @@ Due to the current setup of the Framework you will need to do the following:
 
   * `mkdir [DIRECTORY_NAME]`
   * `cd [DIRECTORY_NAME]`
-  * Pull down - [EE](https://github.com/magento-pangolin/magento2ee)
-  * Pull down - [CE](https://github.com/magento-pangolin/magento2ce)
+  * Pull down - [EE](https://github.com/magento/magento2ee)
+  * Pull down - [CE](https://github.com/magento/magento2ce)
   * `cd magento2ee`
   * `php -f dev/tools/build-ee.php -- --command=link --exclude=true`
   * `cd ..`
@@ -50,16 +50,7 @@ Due to the current setup of the Framework you will need to do the following:
     ```
   * Replace `<personal access token>` with the token you generated in GitHub.
   * Save your work.
-  * `cd ../magento2ce`
-  * `cd dev/tests/acceptance`
-  * Open the `composer.json` file.
-  * Make the following edits:
-      * `url`:
-          1. ORIGINAL: `"url": "git@github.com:magento/magento2-functional-testing-framework.git"`  
-          1. UPDATED: `"url": "git@github.com:magento-pangolin/magento2-functional-testing-framework.git"`
-      * `magento/magento2-functional-testing-framework`:
-          1. ORIGINAL: `"magento/magento2-functional-testing-framework": "dev-develop"`
-          1. UPDATED: `"magento/magento2-functional-testing-framework": "dev-sprint-develop"`
+  * `cd magento2ce/dev/tests/acceptance`
   * `composer install`
       * **PLEASE IGNORE THE "Installation" SECTION THAT FOLLOWS, START WITH THE "Building The Framework" SECTION INSTEAD.**
 
@@ -137,7 +128,7 @@ To determine which version of the Allure command you need to use please run `all
 ----
 
 # Building The Framework
-After installing the dependencies you will want to build the Codeception project in the [Magento 2 Functional Testing Framework](https://github.com/magento-pangolin/magento2-functional-testing-framework), which is a dependency of the CE or EE Tests repo. Run the following to complete this task:
+After installing the dependencies you will want to build the Codeception project in the [Magento 2 Functional Testing Framework](https://github.com/magento/magento2-functional-testing-framework), which is a dependency of the CE or EE Tests repo. Run the following to complete this task:
 
 `./vendor/bin/robo build:project`
 
-- 
GitLab


From aa1035a22ffa92c3921bab014ae0eaaa807fdb64 Mon Sep 17 00:00:00 2001
From: Alex Kolesnyk <okolesnyk@magento.com>
Date: Thu, 5 Oct 2017 15:16:05 +0300
Subject: [PATCH 047/380] MQE-424: Fix static code issues in MFTF tests and
 MFTF

---
 .../FunctionalTest/Catalog/Metadata/category-meta.xml    | 7 ++++++-
 .../Metadata/product_extension_attribute-meta.xml        | 2 +-
 .../Catalog/Metadata/product_link-meta.xml               | 2 +-
 .../Metadata/product_link_extension_attribute-meta.xml   | 2 +-
 .../Catalog/Metadata/product_option-meta.xml             | 2 +-
 .../Catalog/Metadata/product_option_value-meta.xml       | 2 +-
 .../FunctionalTest/Catalog/Metadata/stock_item-meta.xml  | 2 +-
 .../FunctionalTest/Catalog/Page/AdminCategoryPage.xml    | 2 +-
 .../Catalog/Section/AdminCategoryBasicFieldSection.xml   | 2 +-
 .../Catalog/Section/AdminCategoryMainActionsSection.xml  | 2 +-
 .../Catalog/Section/AdminCategoryMessagesSection.xml     | 2 +-
 .../Catalog/Section/AdminCategorySEOSection.xml          | 2 +-
 .../Section/AdminCategorySidebarActionSection.xml        | 2 +-
 .../Catalog/Section/AdminCategorySidebarTreeSection.xml  | 2 +-
 .../Catalog/Section/AdminProductFormSection.xml          | 2 +-
 .../Catalog/Section/AdminProductMessagesSection.xml      | 2 +-
 .../Catalog/Section/AdminProductSEOSection.xml           | 2 +-
 .../FunctionalTest/Checkout/Page/CheckoutSuccessPage.xml | 2 +-
 .../ConfigurableProduct/Data/ConfigurableProductData.xml | 2 +-
 .../Customer/Cest/AdminCreateCustomerCest.xml            | 2 +-
 .../Cest/StorefrontExistingCustomerLoginCest.xml         | 2 +-
 .../FunctionalTest/Customer/Metadata/address-meta.xml    | 2 +-
 .../Customer/Metadata/custom_attribute-meta.xml          | 2 +-
 .../FunctionalTest/Customer/Metadata/customer-meta.xml   | 2 +-
 .../Metadata/customer_extension_attribute-meta.xml       | 2 +-
 .../customer_nested_extension_attribute-meta.xml         | 2 +-
 .../Customer/Metadata/empty_extension_attribute-meta.xml | 2 +-
 .../FunctionalTest/Customer/Metadata/region-meta.xml     | 2 +-
 .../FunctionalTest/Customer/Page/AdminCustomerPage.xml   | 2 +-
 .../Customer/Page/AdminNewCustomerPage.xml               | 2 +-
 .../Customer/Page/StorefrontCustomerCreatePage.xml       | 2 +-
 .../Customer/Page/StorefrontCustomerDashboardPage.xml    | 2 +-
 .../Customer/Page/StorefrontCustomerSignInPage.xml       | 2 +-
 .../FunctionalTest/Customer/Page/StorefrontHomePage.xml  | 2 +-
 .../Customer/Section/AdminCustomerFiltersSection.xml     | 2 +-
 .../Customer/Section/AdminCustomerGridSection.xml        | 2 +-
 .../Customer/Section/AdminCustomerMainActionsSection.xml | 2 +-
 .../Customer/Section/AdminCustomerMessagesSection.xml    | 2 +-
 .../AdminNewCustomerAccountInformationSection.xml        | 2 +-
 .../Section/AdminNewCustomerMainActionsSection.xml       | 2 +-
 ...refrontCustomerDashboardAccountInformationSection.xml | 2 +-
 .../Customer/Section/StorefrontPanelHeaderSection.xml    | 2 +-
 .../Magento/FunctionalTest/Sales/Data/SalesData.xml      | 2 +-
 .../ActionGroup/TemplateActionGroupFile.xml              | 2 +-
 .../SampleTemplates/Cest/TemplateCestFile.xml            | 2 +-
 .../SampleTemplates/Page/TemplatePageFile.xml            | 2 +-
 .../SampleTemplates/Section/TemplateSectionFile.xml      | 2 +-
 .../SampleTests/ActionGroup/SampleActionGroup.xml        | 6 ++++++
 .../FunctionalTest/SampleTests/Cest/MinimumTestCest.xml  | 2 +-
 .../Store/Cest/AdminCreateStoreGroupCest.xml             | 8 +++++++-
 .../Magento/FunctionalTest/Store/Data/StoreData.xml      | 7 ++++++-
 .../Magento/FunctionalTest/Store/Data/StoreGroupData.xml | 7 ++++++-
 .../Magento/FunctionalTest/Store/Metadata/store-meta.xml | 9 +++++++--
 .../FunctionalTest/Store/Metadata/store_group-meta.xml   | 9 +++++++--
 .../FunctionalTest/Store/Page/AdminSystemStorePage.xml   | 9 +++++++--
 .../Store/Section/AdminNewStoreGroupSection.xml          | 9 ++++++++-
 .../Store/Section/AdminNewStoreSection.xml               | 9 ++++++++-
 .../Store/Section/AdminStoresGridSection.xml             | 9 ++++++++-
 .../Store/Section/AdminStoresMainActionsSection.xml      | 9 ++++++++-
 .../Magento/FunctionalTest/User/Data/UserData.xml        | 2 +-
 60 files changed, 132 insertions(+), 62 deletions(-)

diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/category-meta.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/category-meta.xml
index 25941242651..0ab9bd1f562 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/category-meta.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/category-meta.xml
@@ -1,5 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
-
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataOperation.xsd">
     <operation name="CreateCategory" dataType="category" type="create" auth="adminOauth" url="/V1/categories" method="POST">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product_extension_attribute-meta.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product_extension_attribute-meta.xml
index 7d55badaebf..d8d20b5e1ed 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product_extension_attribute-meta.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product_extension_attribute-meta.xml
@@ -14,4 +14,4 @@
     <operation name="UpdateProductExtensionAttribute" dataType="product_extension_attribute" type="update">
         <field key="stock_item">stock_item</field>
     </operation>
-</config>
\ No newline at end of file
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product_link-meta.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product_link-meta.xml
index 1cb109442a1..7a07ffc3d68 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product_link-meta.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product_link-meta.xml
@@ -28,4 +28,4 @@
             <value>product_link_extension_attribute</value>
         </array>
     </operation>
-</config>
\ No newline at end of file
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product_link_extension_attribute-meta.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product_link_extension_attribute-meta.xml
index 261c0113b27..eaeedafe042 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product_link_extension_attribute-meta.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product_link_extension_attribute-meta.xml
@@ -16,4 +16,4 @@
         <header param="Content-Type">application/json</header>
         <field key="qty">integer</field>
     </operation>
-</config>
\ No newline at end of file
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product_option-meta.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product_option-meta.xml
index 33be20a90a8..a6f2d2a8f5a 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product_option-meta.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product_option-meta.xml
@@ -44,4 +44,4 @@
             <value>product_option_value</value>
         </array>
     </operation>
-</config>
\ No newline at end of file
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product_option_value-meta.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product_option_value-meta.xml
index abe43e0dc2d..ebf9a82a134 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product_option_value-meta.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product_option_value-meta.xml
@@ -24,4 +24,4 @@
         <field key="sku">string</field>
         <field key="option_type_id">integer</field>
     </operation>
-</config>
\ No newline at end of file
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/stock_item-meta.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/stock_item-meta.xml
index 4f883469432..97556fb932b 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/stock_item-meta.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/stock_item-meta.xml
@@ -16,4 +16,4 @@
         <field key="qty">integer</field>
         <field key="is_in_stock">boolean</field>
     </operation>
-</config>
\ No newline at end of file
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Page/AdminCategoryPage.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Page/AdminCategoryPage.xml
index 0ff498d84fd..5cb797de26c 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Page/AdminCategoryPage.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Page/AdminCategoryPage.xml
@@ -14,4 +14,4 @@
         <section name="AdminCategoryBasicFieldSection"/>
         <section name="AdminCategorySEOSection"/>
     </page>
-</config>
\ No newline at end of file
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminCategoryBasicFieldSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminCategoryBasicFieldSection.xml
index 4a55b4db465..10d55fab9eb 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminCategoryBasicFieldSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminCategoryBasicFieldSection.xml
@@ -13,4 +13,4 @@
         <element name="EnableCategory" type="checkbox" selector="input[name='is_active']"/>
         <element name="CategoryNameInput" type="input" selector="input[name='name']"/>
     </section>
-</config>
\ No newline at end of file
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminCategoryMainActionsSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminCategoryMainActionsSection.xml
index 2ca068f0c10..f6223b6b5f2 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminCategoryMainActionsSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminCategoryMainActionsSection.xml
@@ -11,4 +11,4 @@
     <section name="AdminCategoryMainActionsSection">
         <element name="SaveButton" type="button" selector=".page-actions-inner #save" timeout="30"/>
     </section>
-</config>
\ No newline at end of file
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminCategoryMessagesSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminCategoryMessagesSection.xml
index bf8b4f79542..e496968dd2b 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminCategoryMessagesSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminCategoryMessagesSection.xml
@@ -11,4 +11,4 @@
     <section name="AdminCategoryMessagesSection">
         <element name="SuccessMessage" type="text" selector=".message-success"/>
     </section>
-</config>
\ No newline at end of file
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminCategorySEOSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminCategorySEOSection.xml
index 078e591b535..83aef318c28 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminCategorySEOSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminCategorySEOSection.xml
@@ -15,4 +15,4 @@
         <element name="MetaKeywordsInput" type="textarea" selector="textarea[name='meta_keywords']"/>
         <element name="MetaDescriptionInput" type="textarea" selector="textarea[name='meta_description']"/>
     </section>
-</config>
\ No newline at end of file
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminCategorySidebarActionSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminCategorySidebarActionSection.xml
index 99ec2595021..f8ca01d7a00 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminCategorySidebarActionSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminCategorySidebarActionSection.xml
@@ -12,4 +12,4 @@
         <element name="AddRootCategoryButton" type="button" selector="#add_root_category_button" timeout="30"/>
         <element name="AddSubcategoryButton" type="button" selector="#add_subcategory_button" timeout="30"/>
     </section>
-</config>
\ No newline at end of file
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminCategorySidebarTreeSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminCategorySidebarTreeSection.xml
index d6ddd44bda5..450c13a70a0 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminCategorySidebarTreeSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminCategorySidebarTreeSection.xml
@@ -12,4 +12,4 @@
         <element name="Collapse All" type="button" selector=".tree-actions a:first-child"/>
         <element name="Expand All" type="button" selector=".tree-actions a:last-child"/>
     </section>
-</config>
\ No newline at end of file
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminProductFormSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminProductFormSection.xml
index 7b3f6292908..b91c9145ee4 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminProductFormSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminProductFormSection.xml
@@ -54,4 +54,4 @@
     <section name="AdminChooseAffectedAttributeSetPopup">
         <element name="confirm" type="button" selector="button[data-index='confirm_button']" timeout="30"/>
     </section>
-</config>
\ No newline at end of file
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminProductMessagesSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminProductMessagesSection.xml
index f20d3f51bec..b99e365352c 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminProductMessagesSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminProductMessagesSection.xml
@@ -11,4 +11,4 @@
     <section name="AdminProductMessagesSection">
         <element name="successMessage" type="text" selector=".message-success"/>
     </section>
-</config>
\ No newline at end of file
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminProductSEOSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminProductSEOSection.xml
index 1f9fc4fc3fc..ffc2bcc0a56 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminProductSEOSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminProductSEOSection.xml
@@ -12,4 +12,4 @@
         <element name="sectionHeader" type="button" selector="div[data-index='search-engine-optimization']" timeout="30"/>
         <element name="urlKeyInput" type="input" selector="input[name='product[url_key]']"/>
     </section>
-</config>
\ No newline at end of file
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Page/CheckoutSuccessPage.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Page/CheckoutSuccessPage.xml
index 4bf40301e5c..44b82ab9270 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Page/CheckoutSuccessPage.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Page/CheckoutSuccessPage.xml
@@ -11,4 +11,4 @@
     <page name="CheckoutSuccessPage" urlPath="/checkout/onepage/success/" module="Checkout">
         <section name="CheckoutSuccessMainSection"/>
     </page>
-</config>
\ No newline at end of file
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/Data/ConfigurableProductData.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/Data/ConfigurableProductData.xml
index 71fd665d096..1e5538dae88 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/Data/ConfigurableProductData.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/Data/ConfigurableProductData.xml
@@ -11,4 +11,4 @@
     <entity name="ConfigurableProductOne" type="configurableProduct">
         <data key="configurableProductName">data</data>
     </entity>
-</config>
\ No newline at end of file
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Cest/AdminCreateCustomerCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Cest/AdminCreateCustomerCest.xml
index 8e4b2a8abd8..47939e42d5c 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Cest/AdminCreateCustomerCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Cest/AdminCreateCustomerCest.xml
@@ -46,4 +46,4 @@
             <see userInput="{{CustomerEntityOne.email}}" selector="{{AdminCustomerGridSection.customerGrid}}" mergeKey="assertEmail"/>
         </test>
     </cest>
-</config>
\ No newline at end of file
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Cest/StorefrontExistingCustomerLoginCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Cest/StorefrontExistingCustomerLoginCest.xml
index 11a2a27862e..ae2609221c5 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Cest/StorefrontExistingCustomerLoginCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Cest/StorefrontExistingCustomerLoginCest.xml
@@ -39,4 +39,4 @@
             <see mergeKey="seeEmail" userInput="$$Simple_US_Customer.email$$" selector="{{StorefrontCustomerDashboardAccountInformationSection.ContactInformation}}" />
         </test>
     </cest>
-</config>
\ No newline at end of file
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Metadata/address-meta.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Metadata/address-meta.xml
index af789417ab7..6c2b1c002ff 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Metadata/address-meta.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Metadata/address-meta.xml
@@ -59,4 +59,4 @@
             <value>custom_attribute</value>
         </array>
     </operation>
-</config>
\ No newline at end of file
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Metadata/custom_attribute-meta.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Metadata/custom_attribute-meta.xml
index 5188675e4e9..f3312bb08c3 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Metadata/custom_attribute-meta.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Metadata/custom_attribute-meta.xml
@@ -22,4 +22,4 @@
         <field key="attribute_code">string</field>
         <field key="value">string</field>
     </operation>
-</config>
\ No newline at end of file
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Metadata/customer-meta.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Metadata/customer-meta.xml
index bbad0da9b8f..797ffff72f8 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Metadata/customer-meta.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Metadata/customer-meta.xml
@@ -76,4 +76,4 @@
         <contentType>application/json</contentType>
         <param key="id" type="path">{id}</param>
     </operation>
-</config>
\ No newline at end of file
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Metadata/customer_extension_attribute-meta.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Metadata/customer_extension_attribute-meta.xml
index c148081c4be..49f6ae1f264 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Metadata/customer_extension_attribute-meta.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Metadata/customer_extension_attribute-meta.xml
@@ -16,4 +16,4 @@
         <field key="is_subscribed">boolean</field>
         <field key="extension_attribute">customer_nested_extension_attribute</field>
     </operation>
-</config>
\ No newline at end of file
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Metadata/customer_nested_extension_attribute-meta.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Metadata/customer_nested_extension_attribute-meta.xml
index 5b189e186f4..d7c24c59f71 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Metadata/customer_nested_extension_attribute-meta.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Metadata/customer_nested_extension_attribute-meta.xml
@@ -18,4 +18,4 @@
         <field key="customer_id">integer</field>
         <field key="value">string</field>
     </operation>
-</config>
\ No newline at end of file
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Metadata/empty_extension_attribute-meta.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Metadata/empty_extension_attribute-meta.xml
index ce07c28e6c9..76c3e39bd6f 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Metadata/empty_extension_attribute-meta.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Metadata/empty_extension_attribute-meta.xml
@@ -12,4 +12,4 @@
     </operation>
     <operation name="UpdateEmptyExtensionAttribute" dataType="empty_extension_attribute" type="update">
     </operation>
-</config>
\ No newline at end of file
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Metadata/region-meta.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Metadata/region-meta.xml
index 6982b4a6ae5..c126ef3709d 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Metadata/region-meta.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Metadata/region-meta.xml
@@ -20,4 +20,4 @@
         <field key="region_id">string</field>
         <field key="extension_attributes">empty_extension_attribute</field>
     </operation>
-</config>
\ No newline at end of file
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Page/AdminCustomerPage.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Page/AdminCustomerPage.xml
index 40522af259d..450372d2d8b 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Page/AdminCustomerPage.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Page/AdminCustomerPage.xml
@@ -14,4 +14,4 @@
         <section name="AdminCustomerGridSection"/>
         <section name="AdminCustomerFiltersSection"/>
     </page>
-</config>
\ No newline at end of file
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Page/AdminNewCustomerPage.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Page/AdminNewCustomerPage.xml
index 520021c1614..725fe9f9618 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Page/AdminNewCustomerPage.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Page/AdminNewCustomerPage.xml
@@ -12,4 +12,4 @@
         <section name="AdminNewCustomerAccountInformationSection"/>
         <section name="AdminNewCustomerMainActionsSection"/>
     </page>
-</config>
\ No newline at end of file
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Page/StorefrontCustomerCreatePage.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Page/StorefrontCustomerCreatePage.xml
index 1917f1bd352..12f6c61f762 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Page/StorefrontCustomerCreatePage.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Page/StorefrontCustomerCreatePage.xml
@@ -11,4 +11,4 @@
     <page name="StorefrontCustomerCreatePage" urlPath="/customer/account/create/" module="Magento_Customer">
         <section name="StorefrontCustomerCreateFormSection" />
     </page>
-</config>
\ No newline at end of file
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Page/StorefrontCustomerDashboardPage.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Page/StorefrontCustomerDashboardPage.xml
index 179a4e62d06..498c39a1f6a 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Page/StorefrontCustomerDashboardPage.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Page/StorefrontCustomerDashboardPage.xml
@@ -11,4 +11,4 @@
     <page name="StorefrontCustomerDashboardPage" urlPath="/customer/account/" module="Magento_Customer">
         <section name="StorefrontCustomerDashboardAccountInformationSection" />
     </page>
-</config>
\ No newline at end of file
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Page/StorefrontCustomerSignInPage.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Page/StorefrontCustomerSignInPage.xml
index a5835c2bcc2..ddf5769bdcb 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Page/StorefrontCustomerSignInPage.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Page/StorefrontCustomerSignInPage.xml
@@ -11,4 +11,4 @@
     <page name="StorefrontCustomerSignInPage" urlPath="/customer/account/login/" module="Magento_Customer">
         <section name="StorefrontCustomerSignInFormSection" />
     </page>
-</config>
\ No newline at end of file
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Page/StorefrontHomePage.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Page/StorefrontHomePage.xml
index d54e1776c2c..3d826553ab8 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Page/StorefrontHomePage.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Page/StorefrontHomePage.xml
@@ -11,4 +11,4 @@
     <page name="StorefrontProductPage" urlPath="/" module="Magento_Customer">
         <section name="StorefrontPanelHeader" />
     </page>
-</config>
\ No newline at end of file
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/AdminCustomerFiltersSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/AdminCustomerFiltersSection.xml
index 40a5fc2f119..57449d2b22b 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/AdminCustomerFiltersSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/AdminCustomerFiltersSection.xml
@@ -13,4 +13,4 @@
         <element name="nameInput" type="input" selector="input[name=name]"/>
         <element name="apply" type="button" selector="button[data-action=grid-filter-apply]" timeout="30"/>
     </section>
-</config>
\ No newline at end of file
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/AdminCustomerGridSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/AdminCustomerGridSection.xml
index ec6dd21c9ed..efc54c77c5f 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/AdminCustomerGridSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/AdminCustomerGridSection.xml
@@ -11,4 +11,4 @@
     <section name="AdminCustomerGridSection">
         <element name="customerGrid" type="text" selector="table[data-role='grid']"/>
     </section>
-</config>
\ No newline at end of file
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/AdminCustomerMainActionsSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/AdminCustomerMainActionsSection.xml
index 148958c49d6..e673dfd7577 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/AdminCustomerMainActionsSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/AdminCustomerMainActionsSection.xml
@@ -11,4 +11,4 @@
     <section name="AdminCustomerMainActionsSection">
         <element name="addNewCustomer" type="button" selector="#add" timeout="30"/>
     </section>
-</config>
\ No newline at end of file
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/AdminCustomerMessagesSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/AdminCustomerMessagesSection.xml
index 5871da67356..972a8cd6fea 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/AdminCustomerMessagesSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/AdminCustomerMessagesSection.xml
@@ -11,4 +11,4 @@
     <section name="AdminCustomerMessagesSection">
         <element name="successMessage" type="text" selector=".message-success"/>
     </section>
-</config>
\ No newline at end of file
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/AdminNewCustomerAccountInformationSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/AdminNewCustomerAccountInformationSection.xml
index 2e2c2930807..7ba2dd5937d 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/AdminNewCustomerAccountInformationSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/AdminNewCustomerAccountInformationSection.xml
@@ -13,4 +13,4 @@
         <element name="lastName" type="input" selector="input[name='customer[lastname]']"/>
         <element name="email" type="input" selector="input[name='customer[email]']"/>
     </section>
-</config>
\ No newline at end of file
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/AdminNewCustomerMainActionsSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/AdminNewCustomerMainActionsSection.xml
index 18e7e45f992..c8ca91e9eec 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/AdminNewCustomerMainActionsSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/AdminNewCustomerMainActionsSection.xml
@@ -11,4 +11,4 @@
     <section name="AdminNewCustomerMainActionsSection">
         <element name="saveButton" type="button" selector="#save" timeout="30"/>
     </section>
-</config>
\ No newline at end of file
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/StorefrontCustomerDashboardAccountInformationSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/StorefrontCustomerDashboardAccountInformationSection.xml
index 0ed3b4cceed..6d5eb53adc9 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/StorefrontCustomerDashboardAccountInformationSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/StorefrontCustomerDashboardAccountInformationSection.xml
@@ -11,4 +11,4 @@
     <section name="StorefrontCustomerDashboardAccountInformationSection">
         <element name="ContactInformation" type="textarea" selector=".box.box-information .box-content"/>
     </section>
-</config>
\ No newline at end of file
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/StorefrontPanelHeaderSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/StorefrontPanelHeaderSection.xml
index 0ada8563eee..e7072579cc7 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/StorefrontPanelHeaderSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/StorefrontPanelHeaderSection.xml
@@ -11,4 +11,4 @@
     <section name="StorefrontPanelHeaderSection">
         <element name="createAnAccountLink" type="select" selector=".panel.header li:nth-child(3)"/>
     </section>
-</config>
\ No newline at end of file
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Data/SalesData.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Data/SalesData.xml
index 1a31a5a92cb..b96d8fe088f 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Data/SalesData.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Data/SalesData.xml
@@ -11,4 +11,4 @@
     <entity name="salesRecordOne" type="sales">
         <data key="salesId">data</data>
     </entity>
-</config>
\ No newline at end of file
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTemplates/ActionGroup/TemplateActionGroupFile.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTemplates/ActionGroup/TemplateActionGroupFile.xml
index 13e1467cbd2..7a235e041ec 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTemplates/ActionGroup/TemplateActionGroupFile.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTemplates/ActionGroup/TemplateActionGroupFile.xml
@@ -11,4 +11,4 @@
     <actionGroup name="">
         <!-- ADD TEST STEPS HERE -->
     </actionGroup>
-</config>
\ No newline at end of file
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTemplates/Cest/TemplateCestFile.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTemplates/Cest/TemplateCestFile.xml
index 5e45eeed07c..f0d843581a4 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTemplates/Cest/TemplateCestFile.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTemplates/Cest/TemplateCestFile.xml
@@ -31,4 +31,4 @@
             <!-- ADD TEST STEPS HERE -->
         </test>
     </cest>
-</config>
\ No newline at end of file
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTemplates/Page/TemplatePageFile.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTemplates/Page/TemplatePageFile.xml
index 8aceda03855..17be26f6b6f 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTemplates/Page/TemplatePageFile.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTemplates/Page/TemplatePageFile.xml
@@ -11,4 +11,4 @@
     <page name="" urlPath="" module="">
         <section name=""/>
     </page>
-</config>
\ No newline at end of file
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTemplates/Section/TemplateSectionFile.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTemplates/Section/TemplateSectionFile.xml
index df29d4c6a54..a85e72c274d 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTemplates/Section/TemplateSectionFile.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTemplates/Section/TemplateSectionFile.xml
@@ -11,4 +11,4 @@
     <section name="">
         <element name="" type="" selector=""/>
     </section>
-</config>
\ No newline at end of file
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/ActionGroup/SampleActionGroup.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/ActionGroup/SampleActionGroup.xml
index ac03b2e349b..858d5017dd9 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/ActionGroup/SampleActionGroup.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/ActionGroup/SampleActionGroup.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Test/etc/testSchema.xsd">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/MinimumTestCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/MinimumTestCest.xml
index 5f69f5d6c43..8eb88ad53ce 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/MinimumTestCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/MinimumTestCest.xml
@@ -31,4 +31,4 @@
             <click selector="{{AdminLoginFormSection.signIn}}" mergeKey="clickLogin"/>
         </test>
     </cest>
-</config>
\ No newline at end of file
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/Cest/AdminCreateStoreGroupCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/Cest/AdminCreateStoreGroupCest.xml
index 87d40cb40bf..7d1c8895b41 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/Cest/AdminCreateStoreGroupCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/Cest/AdminCreateStoreGroupCest.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 <!-- Test XML Example -->
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Test/etc/testSchema.xsd">
     <cest name="AdminCreateStoreGroupCest">
@@ -44,4 +50,4 @@
             <!--see mergeKey="s43" selector="{{AdminStoresGridSection.storeGrpNameInFirstRow}}" userInput="$$b2.group[name]$$"/-->
         </test>
     </cest>
-</config>
\ No newline at end of file
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/Data/StoreData.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/Data/StoreData.xml
index 4b5bc9a8d83..9625fa31527 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/Data/StoreData.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/Data/StoreData.xml
@@ -1,5 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
-
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataProfileSchema.xsd">
     <entity name="customStore" type="store">
         <!--data key="group_id">customStoreGroup.id</data-->
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/Data/StoreGroupData.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/Data/StoreGroupData.xml
index c0124b206d1..81ee940acf7 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/Data/StoreGroupData.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/Data/StoreGroupData.xml
@@ -1,5 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
-
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataProfileSchema.xsd">
     <entity name="customStoreGroup" type="group">
         <data key="group_id">null</data>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/Metadata/store-meta.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/Metadata/store-meta.xml
index 5b9f0022755..0cf7683f87c 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/Metadata/store-meta.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/Metadata/store-meta.xml
@@ -1,5 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
-
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataOperation.xsd">
     <operation name="CreateStore" dataType="store" type="create"
@@ -14,4 +19,4 @@
         <field key="store_action">string</field>
         <field key="store_type">string</field>
     </operation>
-</config>
\ No newline at end of file
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/Metadata/store_group-meta.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/Metadata/store_group-meta.xml
index 6f1667398a6..a4820aea080 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/Metadata/store_group-meta.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/Metadata/store_group-meta.xml
@@ -1,5 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
-
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataOperation.xsd">
     <operation name="CreateStoreGroup" dataType="group" type="create"
@@ -15,4 +20,4 @@
         <field key="store_action">string</field>
         <field key="store_type">string</field>
     </operation>
-</config>
\ No newline at end of file
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/Page/AdminSystemStorePage.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/Page/AdminSystemStorePage.xml
index 542c618171d..4d981b218b7 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/Page/AdminSystemStorePage.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/Page/AdminSystemStorePage.xml
@@ -1,8 +1,13 @@
 <?xml version="1.0" encoding="utf-8"?>
-
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/PageObject.xsd">
     <page name="AdminSystemStorePage" urlPath="/admin/admin/system_store/" module="Store">
         <section name="AdminStoresMainActionsSection"/>
         <section name="AdminStoresGridSection"/>
     </page>
-</config>
\ No newline at end of file
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/Section/AdminNewStoreGroupSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/Section/AdminNewStoreGroupSection.xml
index 1471832d528..1bc347d0c5a 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/Section/AdminNewStoreGroupSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/Section/AdminNewStoreGroupSection.xml
@@ -1,7 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
     <section name="AdminNewStoreGroupSection">
         <element name="storeGrpNameTextField" type="input" selector="#group_name"/>
         <element name="storeGrpCodeTextField" type="input" selector="#group_code"/>
         <element name="storeRootCategoryDropdown" type="button" selector="#group_root_category_id"/>
     </section>
-</config>
\ No newline at end of file
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/Section/AdminNewStoreSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/Section/AdminNewStoreSection.xml
index d44df4dc6f6..50e009c88f4 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/Section/AdminNewStoreSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/Section/AdminNewStoreSection.xml
@@ -1,3 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
     <section name="AdminNewStoreSection">
         <element name="storeNameTextField" type="input" selector="#store_name"/>
@@ -6,4 +13,4 @@
         <element name="storeGrpDropdown" type="button" selector="#store_group_id"/>
         <element name="sortOrderTextField" type="input" selector="#store_sort_order"/>
     </section>
-</config>
\ No newline at end of file
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/Section/AdminStoresGridSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/Section/AdminStoresGridSection.xml
index 42b171cc5e8..ef9c27faa19 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/Section/AdminStoresGridSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/Section/AdminStoresGridSection.xml
@@ -1,3 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
     <section name="AdminStoresGridSection">
         <element name="storeGrpFilterTextField" type="input" selector="#storeGrid_filter_group_title"/>
@@ -10,4 +17,4 @@
         <element name="storeNameInFirstRow" type="text" selector=".col-store_title>a"/>
 
     </section>
-</config>
\ No newline at end of file
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/Section/AdminStoresMainActionsSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/Section/AdminStoresMainActionsSection.xml
index cd136a0de15..5f8d1800aab 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/Section/AdminStoresMainActionsSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/Section/AdminStoresMainActionsSection.xml
@@ -1,3 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
     <section name="AdminStoresMainActionsSection">
         <element name="createStoreViewButton" type="button" selector="#add_store"/>
@@ -6,4 +13,4 @@
         <element name="saveButton" type="button" selector="#save"/>
         <element name="backButton" type="button" selector="#back"/>
     </section>
-</config>
\ No newline at end of file
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/User/Data/UserData.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/User/Data/UserData.xml
index bb704038a51..a8461be7f49 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/User/Data/UserData.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/User/Data/UserData.xml
@@ -12,4 +12,4 @@
         <data key="email">admin@magento.com</data>
         <data key="password">admin123</data>
     </entity>
-</config>
\ No newline at end of file
+</config>
-- 
GitLab


From e973f95e0e266def85cf28cbedc2961564795883 Mon Sep 17 00:00:00 2001
From: John Stennett <john00ivy@gmail.com>
Date: Fri, 6 Oct 2017 17:35:55 +0300
Subject: [PATCH 048/380] MQE-335: Headless Browser Spike

 - Updating all @env tags for tests. Only listing the ones that the test works in currently.
 - Updating README. Replacing "Acceptance" with "Functional".
 - Adding Headless command to robo.
---
 dev/tests/acceptance/RoboFile.php              | 18 ++++++++++++++----
 .../acceptance/tests/functional.suite.dist.yml |  2 +-
 .../Backend/Cest/AdminLoginCest.xml            | 11 ++++++-----
 .../Catalog/Cest/AdminCreateCategoryCest.xml   |  7 +++----
 .../AdminCreateConfigurableProductCest.xml     |  8 +++-----
 .../Cest/AdminCreateSimpleProductCest.xml      |  7 +++----
 .../Cest/StorefrontCustomerCheckoutCest.xml    |  7 +++----
 .../Cest/StorefrontGuestCheckoutCest.xml       |  7 +++----
 .../Cms/Cest/AdminCreateCmsPageCest.xml        |  8 ++++----
 .../Customer/Cest/AdminCreateCustomerCest.xml  |  8 ++++----
 .../Cest/StorefrontCreateCustomerCest.xml      |  9 +++++----
 .../StorefrontExistingCustomerLoginCest.xml    |  9 +++++----
 .../Sales/Cest/AdminCreateInvoiceCest.xml      |  7 +++----
 .../SampleTemplates/Cest/TemplateCestFile.xml  |  4 ++--
 .../SampleTests/Cest/MinimumTestCest.xml       |  9 +++++----
 .../Cest/PersistMultipleEntitiesCest.xml       |  8 ++++----
 16 files changed, 68 insertions(+), 61 deletions(-)

diff --git a/dev/tests/acceptance/RoboFile.php b/dev/tests/acceptance/RoboFile.php
index 4f6346de148..ac1e9f40763 100644
--- a/dev/tests/acceptance/RoboFile.php
+++ b/dev/tests/acceptance/RoboFile.php
@@ -44,7 +44,7 @@ class RoboFile extends \Robo\Tasks
     }
 
     /**
-     * Run all Acceptance tests using the Chrome environment
+     * Run all Functional tests using the Chrome environment
      */
     function chrome()
     {
@@ -52,7 +52,7 @@ class RoboFile extends \Robo\Tasks
     }
 
     /**
-     * Run all Acceptance tests using the FireFox environment
+     * Run all Functional tests using the FireFox environment
      */
     function firefox()
     {
@@ -60,15 +60,24 @@ class RoboFile extends \Robo\Tasks
     }
 
     /**
-     * Run all Acceptance tests using the PhantomJS environment
+     * Run all Functional tests using the PhantomJS environment
      */
     function phantomjs()
     {
         $this->_exec('./vendor/bin/codecept run functional --env phantomjs --skip-group skip');
     }
 
+    /**
+     * Run all Functional tests using the Chrome Headless environment
+     */
+    function headless()
+    {
+        $this->_exec('./vendor/bin/codecept run functional --env headless --skip-group skip');
+    }
+
     /**
      * Run all Tests with the specified @group tag, excluding @group 'skip', using the Chrome environment
+     * @param string $args
      */
     function group($args = '')
     {
@@ -76,7 +85,8 @@ class RoboFile extends \Robo\Tasks
     }
 
     /**
-     * Run all Acceptance tests located under the Directory Path provided using the Chrome environment
+     * Run all Functional tests located under the Directory Path provided using the Chrome environment
+     * @param string $args
      */
     function folder($args = '')
     {
diff --git a/dev/tests/acceptance/tests/functional.suite.dist.yml b/dev/tests/acceptance/tests/functional.suite.dist.yml
index 12ca2eae436..afba145ca9a 100644
--- a/dev/tests/acceptance/tests/functional.suite.dist.yml
+++ b/dev/tests/acceptance/tests/functional.suite.dist.yml
@@ -26,7 +26,7 @@ modules:
         \Magento\FunctionalTestingFramework\Module\MagentoWebDriver:
             url: "%MAGENTO_BASE_URL%"
             backend_name: admin
-            browser: chrome
+            browser: 'chrome'
             window_size: maximize
             username: "%MAGENTO_ADMIN_USERNAME%"
             password: "%MAGENTO_ADMIN_PASSWORD%"
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/Cest/AdminLoginCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/Cest/AdminLoginCest.xml
index bb36605b3cd..4b14e76edb0 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/Cest/AdminLoginCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/Cest/AdminLoginCest.xml
@@ -12,11 +12,6 @@
         <annotations>
             <features value="Admin Login"/>
             <stories value="Login on the Admin Login page"/>
-            <group value="example"/>
-            <group value="login"/>
-            <env value="chrome"/>
-            <env value="firefox"/>
-            <env value="phantomjs"/>
         </annotations>
         <test name="LoginAsAdmin">
             <annotations>
@@ -24,6 +19,12 @@
                 <description value="You should be able to log into the Magento Admin backend."/>
                 <severity value="CRITICAL"/>
                 <testCaseId value="MAGETWO-71572"/>
+                <group value="example"/>
+                <group value="login"/>
+                <env value="chrome"/>
+                <env value="firefox"/>
+                <env value="phantomjs"/>
+                <env value="headless"/>
             </annotations>
             <amOnPage url="{{AdminLoginPage}}" mergeKey="amOnAdminLoginPage"/>
             <fillField selector="{{AdminLoginFormSection.username}}" userInput="{{_ENV.MAGENTO_ADMIN_USERNAME}}" mergeKey="fillUsername"/>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Cest/AdminCreateCategoryCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Cest/AdminCreateCategoryCest.xml
index bb22cb72910..0cb12ebe6df 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Cest/AdminCreateCategoryCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Cest/AdminCreateCategoryCest.xml
@@ -12,10 +12,6 @@
         <annotations>
             <features value="Category Creation"/>
             <stories value="Create a Category via the Admin"/>
-            <group value="category"/>
-            <env value="chrome"/>
-            <env value="firefox"/>
-            <env value="phantomjs"/>
         </annotations>
         <after>
             <amOnPage url="admin/admin/auth/logout/" mergeKey="amOnLogoutPage"/>
@@ -26,6 +22,9 @@
                 <description value="You should be able to create a Category in the admin back-end."/>
                 <severity value="CRITICAL"/>
                 <testCaseId value="MAGETWO-72102"/>
+                <group value="category"/>
+                <env value="chrome"/>
+                <env value="headless"/>
             </annotations>
             <amOnPage url="{{AdminLoginPage}}" mergeKey="amOnAdminLoginPage"/>
             <fillField selector="{{AdminLoginFormSection.username}}" userInput="{{_ENV.MAGENTO_ADMIN_USERNAME}}" mergeKey="fillUsername"/>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Cest/AdminCreateConfigurableProductCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Cest/AdminCreateConfigurableProductCest.xml
index b8fbb0a93e7..a595cf8b476 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Cest/AdminCreateConfigurableProductCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Cest/AdminCreateConfigurableProductCest.xml
@@ -12,11 +12,6 @@
         <annotations>
             <features value="Product Creation"/>
             <stories value="Create a Configurable Product via the Admin"/>
-            <group value="configurable"/>
-            <group value="product"/>
-            <env value="chrome"/>
-            <env value="firefox"/>
-            <env value="phantomjs"/>
         </annotations>
         <before>
             <loginAsAdmin mergeKey="loginAsAdmin"/>
@@ -30,6 +25,9 @@
                 <description value="You should be able to create a Configurable Product via the Admin."/>
                 <severity value="CRITICAL"/>
                 <testCaseId value="MAGETWO-26041"/>
+                <group value="configurable"/>
+                <group value="product"/>
+                <env value="chrome"/>
             </annotations>
 
             <amOnPage url="{{AdminCategoryPage.urlPath}}" mergeKey="amOnCategoryGridPage"/>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Cest/AdminCreateSimpleProductCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Cest/AdminCreateSimpleProductCest.xml
index 7508d00f134..87b8e2a1d94 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Cest/AdminCreateSimpleProductCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Cest/AdminCreateSimpleProductCest.xml
@@ -12,10 +12,6 @@
         <annotations>
             <features value="Product Creation"/>
             <stories value="Create a Simple Product via Admin"/>
-            <group value="product"/>
-            <env value="chrome"/>
-            <env value="firefox"/>
-            <env value="phantomjs"/>
         </annotations>
         <before>
             <createData entity="_defaultCategory" mergeKey="createPreReqCategory"/>
@@ -26,6 +22,9 @@
                 <description value="You should be able to create a Simple Product in the admin back-end."/>
                 <severity value="CRITICAL"/>
                 <testCaseId value="MAGETWO-23414"/>
+                <group value="product"/>
+                <env value="chrome"/>
+                <env value="headless"/>
             </annotations>
             <amOnPage url="{{AdminLoginPage.url}}" mergeKey="navigateToAdmin"/>
             <fillField userInput="{{_ENV.MAGENTO_ADMIN_USERNAME}}" selector="{{AdminLoginFormSection.username}}" mergeKey="fillUsername"/>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Cest/StorefrontCustomerCheckoutCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Cest/StorefrontCustomerCheckoutCest.xml
index 67e48feb8e4..e8d03c447f3 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Cest/StorefrontCustomerCheckoutCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Cest/StorefrontCustomerCheckoutCest.xml
@@ -12,10 +12,6 @@
         <annotations>
             <features value="Checkout"/>
             <stories value="Checkout via the Admin"/>
-            <group value="checkout"/>
-            <env value="chrome"/>
-            <env value="firefox"/>
-            <env value="phantomjs"/>
         </annotations>
         <before>
             <createData entity="SimpleSubCategory" mergeKey="simplecategory"/>
@@ -35,6 +31,9 @@
                 <description value="Should be able to place an order as a customer."/>
                 <severity value="CRITICAL"/>
                 <testCaseId value="#"/>
+                <group value="checkout"/>
+                <env value="chrome"/>
+                <env value="headless"/>
             </annotations>
 
             <amOnPage mergeKey="s1"  url="customer/account/login/"/>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Cest/StorefrontGuestCheckoutCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Cest/StorefrontGuestCheckoutCest.xml
index d4d6fcb9572..15f7db461e5 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Cest/StorefrontGuestCheckoutCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Cest/StorefrontGuestCheckoutCest.xml
@@ -12,10 +12,6 @@
         <annotations>
             <features value="Checkout"/>
             <stories value="Checkout via Guest Checkout"/>
-            <group value="checkout"/>
-            <env value="chrome"/>
-            <env value="firefox"/>
-            <env value="phantomjs"/>
         </annotations>
         <before>
             <createData entity="_defaultCategory" mergeKey="createCategory"/>
@@ -33,6 +29,9 @@
                 <description value="Should be able to place an order as a Guest."/>
                 <severity value="CRITICAL"/>
                 <testCaseId value="MAGETWO-72094"/>
+                <group value="checkout"/>
+                <env value="chrome"/>
+                <env value="headless"/>
             </annotations>
             <amOnPage url="{{StorefrontCategoryPage.url($$createCategory.name$$)}}" mergeKey="onCategoryPage"/>
             <waitForPageLoad mergeKey="waitForPageLoad1"/>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Cest/AdminCreateCmsPageCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Cest/AdminCreateCmsPageCest.xml
index 8553296fc96..cf1f9564c4b 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Cest/AdminCreateCmsPageCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Cest/AdminCreateCmsPageCest.xml
@@ -12,10 +12,6 @@
         <annotations>
             <features value="CMS Page Creation"/>
             <stories value="Create a CMS Page via the Admin"/>
-            <group value="cms"/>
-            <env value="chrome"/>
-            <env value="firefox"/>
-            <env value="phantomjs"/>
         </annotations>
         <after>
             <amOnPage url="admin/admin/auth/logout/" mergeKey="amOnLogoutPage"/>
@@ -26,6 +22,10 @@
                 <description value="You should be able to create a CMS Page via the Admin."/>
                 <severity value="CRITICAL"/>
                 <testCaseId value="MAGETWO-25580"/>
+                <group value="cms"/>
+                <env value="chrome"/>
+                <env value="firefox"/>
+                <env value="headless"/>
             </annotations>
             <amOnPage url="{{AdminLoginPage}}" mergeKey="navigateToAdmin"/>
             <fillField selector="{{AdminLoginFormSection.username}}" userInput="{{_ENV.MAGENTO_ADMIN_USERNAME}}" mergeKey="fillUsername"/>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Cest/AdminCreateCustomerCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Cest/AdminCreateCustomerCest.xml
index 47939e42d5c..b577bca92e3 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Cest/AdminCreateCustomerCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Cest/AdminCreateCustomerCest.xml
@@ -12,10 +12,6 @@
         <annotations>
             <features value="Customer Creation"/>
             <stories value="Create a Customer via the Admin"/>
-            <group value="customer"/>
-            <env value="chrome"/>
-            <env value="firefox"/>
-            <env value="phantomjs"/>
         </annotations>
         <test name="CreateCustomerViaAdminCest">
             <annotations>
@@ -23,6 +19,10 @@
                 <description value="You should be able to create a customer in the Admin back-end."/>
                 <severity value="CRITICAL"/>
                 <testCaseId value="MAGETWO-72095"/>
+                <group value="customer"/>
+                <group value="create"/>
+                <env value="chrome"/>
+                <env value="headless"/>
             </annotations>
             <amOnPage url="{{AdminLoginPage.url}}" mergeKey="navigateToAdmin"/>
             <fillField userInput="{{_ENV.MAGENTO_ADMIN_USERNAME}}" selector="{{AdminLoginFormSection.username}}" mergeKey="fillUsername"/>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Cest/StorefrontCreateCustomerCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Cest/StorefrontCreateCustomerCest.xml
index 45bc23e5a0d..37fe0017b86 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Cest/StorefrontCreateCustomerCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Cest/StorefrontCreateCustomerCest.xml
@@ -12,17 +12,18 @@
         <annotations>
             <features value="Customer Creation"/>
             <stories value="Create a Customer via the Storefront"/>
-            <env value="chrome"/>
-            <env value="firefox"/>
-            <env value="phantomjs"/>
         </annotations>
         <test name="CreateCustomerViaStorefront">
             <annotations>
                 <title value="You should be able to create a customer via the storefront"/>
                 <description value="You should be able to create a customer via the storefront."/>
                 <severity value="CRITICAL"/>
-                <group value="create"/>
                 <testCaseId value="MAGETWO-23546"/>
+                <group value="customer"/>
+                <group value="create"/>
+                <env value="chrome"/>
+                <env value="firefox"/>
+                <env value="headless"/>
             </annotations>
             <amOnPage mergeKey="amOnStorefrontPage"  url="/"/>
             <click mergeKey="clickOnCreateAccountLink" selector="{{StorefrontPanelHeaderSection.createAnAccountLink}}"/>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Cest/StorefrontExistingCustomerLoginCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Cest/StorefrontExistingCustomerLoginCest.xml
index ae2609221c5..0d6212a96e7 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Cest/StorefrontExistingCustomerLoginCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Cest/StorefrontExistingCustomerLoginCest.xml
@@ -12,10 +12,6 @@
         <annotations>
             <features value="Customer Login"/>
             <stories value="Existing Customer can Login on the Storefront"/>
-            <group value="customer"/>
-            <env value="chrome"/>
-            <env value="firefox"/>
-            <env value="phantomjs"/>
         </annotations>
         <before>
             <createData entity="Simple_US_Customer" mergeKey="Simple_US_Customer"/>
@@ -29,6 +25,11 @@
                 <description value="You should be able to create a customer via the storefront."/>
                 <severity value="CRITICAL"/>
                 <testCaseId value="MAGETWO-72103"/>
+                <group value="customer"/>
+                <env value="chrome"/>
+                <env value="firefox"/>
+                <env value="phantomjs"/>
+                <env value="headless"/>
             </annotations>
             <amOnPage mergeKey="amOnSignInPage"  url="customer/account/login/"/>
             <fillField  mergeKey="fillEmail" userInput="$$Simple_US_Customer.email$$" selector="{{StorefrontCustomerSignInFormSection.emailField}}"/>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Cest/AdminCreateInvoiceCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Cest/AdminCreateInvoiceCest.xml
index e374ffbd6f1..57e3837e972 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Cest/AdminCreateInvoiceCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Cest/AdminCreateInvoiceCest.xml
@@ -12,10 +12,6 @@
         <annotations>
             <features value="Invoice Creation"/>
             <stories value="Create an Invoice via the Admin"/>
-            <group value="sales"/>
-            <env value="chrome"/>
-            <env value="firefox"/>
-            <env value="phantomjs"/>
         </annotations>
         <before>
             <createData entity="_defaultCategory" mergeKey="createCategory"/>
@@ -30,6 +26,9 @@
                 <description value="Should be able to create an invoice via the admin."/>
                 <severity value="NORMAL"/>
                 <testCaseId value="MAGETWO-72096"/>
+                <group value="sales"/>
+                <env value="chrome"/>
+                <env value="headless"/>
             </annotations>
 
             <!-- todo: Create an order via the api instead of driving the browser  -->
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTemplates/Cest/TemplateCestFile.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTemplates/Cest/TemplateCestFile.xml
index f0d843581a4..bc29e788f90 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTemplates/Cest/TemplateCestFile.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTemplates/Cest/TemplateCestFile.xml
@@ -12,8 +12,6 @@
         <annotations>
             <features value=""/>
             <stories value=""/>
-            <group value=""/>
-            <env value=""/>
         </annotations>
         <before>
 
@@ -27,6 +25,8 @@
                 <description value=""/>
                 <severity value=""/>
                 <testCaseId value=""/>
+                <group value=""/>
+                <env value=""/>
             </annotations>
             <!-- ADD TEST STEPS HERE -->
         </test>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/MinimumTestCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/MinimumTestCest.xml
index 8eb88ad53ce..6d4e6a73c87 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/MinimumTestCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/MinimumTestCest.xml
@@ -12,10 +12,6 @@
         <annotations>
             <features value="Minimum Test"/>
             <stories value="Minimum Test"/>
-            <group value="example"/>
-            <env value="chrome"/>
-            <env value="firefox"/>
-            <env value="phantomjs"/>
         </annotations>
         <after>
             <seeInCurrentUrl url="/admin/admin/" mergeKey="seeInCurrentUrl"/>
@@ -24,6 +20,11 @@
             <annotations>
                 <title value="Minimum Test"/>
                 <description value="Minimum Test"/>
+                <group value="example"/>
+                <env value="chrome"/>
+                <env value="firefox"/>
+                <env value="phantomjs"/>
+                <env value="headless"/>
             </annotations>
             <amOnPage url="{{AdminLoginPage}}" mergeKey="navigateToAdmin"/>
             <fillField selector="{{AdminLoginFormSection.username}}" userInput="{{_ENV.MAGENTO_ADMIN_USERNAME}}" mergeKey="fillUsername"/>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/PersistMultipleEntitiesCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/PersistMultipleEntitiesCest.xml
index 560b3b46cb5..ae64bf4cdb6 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/PersistMultipleEntitiesCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/PersistMultipleEntitiesCest.xml
@@ -9,10 +9,6 @@
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Test/etc/testSchema.xsd">
     <cest name="PersistMultipleEntitiesCest">
-        <annotations>
-            <group value="ff"/>
-            <group value="skip"/>
-        </annotations>
         <before>
             <createData entity="simplesubcategory" mergeKey="simplecategory"/>
             <createData entity="simpleproduct" mergeKey="simpleproduct1">
@@ -28,6 +24,10 @@
             <deleteData createDataKey="simplecategory" mergeKey="deleteCategory"/>
         </after>
         <test name="PersistMultipleEntitiesTest">
+            <annotations>
+                <group value="ff"/>
+                <group value="skip"/>
+            </annotations>
             <amOnPage mergeKey="s11" url="/$$simplecategory.name$$.html" />
             <waitForPageLoad mergeKey="s33"/>
             <see mergeKey="s35" selector="{{StorefrontCategoryMainSection.productCount}}" userInput="2"/>
-- 
GitLab


From fe072e060092fcb52ace562999366ec713907e13 Mon Sep 17 00:00:00 2001
From: Tom Reece <treece@magento.com>
Date: Fri, 6 Oct 2017 17:49:51 +0300
Subject: [PATCH 049/380] MQE-415: Change required-entity's persistedKey in
 test schema to createDataKey

---
 .../Checkout/Cest/StorefrontCustomerCheckoutCest.xml          | 2 +-
 .../Checkout/Cest/StorefrontGuestCheckoutCest.xml             | 2 +-
 .../FunctionalTest/Sales/Cest/AdminCreateInvoiceCest.xml      | 2 +-
 .../FunctionalTest/SampleTests/Cest/AdvancedSampleCest.xml    | 2 +-
 .../SampleTests/Cest/PersistMultipleEntitiesCest.xml          | 4 ++--
 5 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Cest/StorefrontCustomerCheckoutCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Cest/StorefrontCustomerCheckoutCest.xml
index e8d03c447f3..20442a48733 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Cest/StorefrontCustomerCheckoutCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Cest/StorefrontCustomerCheckoutCest.xml
@@ -16,7 +16,7 @@
         <before>
             <createData entity="SimpleSubCategory" mergeKey="simplecategory"/>
             <createData entity="SimpleProduct" mergeKey="simpleproduct1">
-                <required-entity persistedKey="simplecategory"/>
+                <required-entity createDataKey="simplecategory"/>
             </createData>
             <createData entity="Simple_US_Customer" mergeKey="simpleuscustomer"/>
         </before>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Cest/StorefrontGuestCheckoutCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Cest/StorefrontGuestCheckoutCest.xml
index 15f7db461e5..03e36ff28d9 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Cest/StorefrontGuestCheckoutCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Cest/StorefrontGuestCheckoutCest.xml
@@ -16,7 +16,7 @@
         <before>
             <createData entity="_defaultCategory" mergeKey="createCategory"/>
             <createData entity="_defaultProduct" mergeKey="createProduct">
-                <required-entity persistedKey="createCategory"/>
+                <required-entity createDataKey="createCategory"/>
             </createData>
         </before>
         <after>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Cest/AdminCreateInvoiceCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Cest/AdminCreateInvoiceCest.xml
index 57e3837e972..7ff96a3bed9 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Cest/AdminCreateInvoiceCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Cest/AdminCreateInvoiceCest.xml
@@ -16,7 +16,7 @@
         <before>
             <createData entity="_defaultCategory" mergeKey="createCategory"/>
             <createData entity="_defaultProduct" mergeKey="createProduct">
-                <required-entity persistedKey="createCategory"/>
+                <required-entity createDataKey="createCategory"/>
             </createData>
         </before>
 
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/AdvancedSampleCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/AdvancedSampleCest.xml
index cce5b0c2c9f..50a3793fb2d 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/AdvancedSampleCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/AdvancedSampleCest.xml
@@ -32,7 +32,7 @@
             <!-- Create an entity that depends on another entity -->
             <createData entity="_defaultCategory" mergeKey="createCategory"/>
             <createData entity="_defaultProduct" mergeKey="createProduct">
-                <required-entity persistedKey="createCategory"/>
+                <required-entity createDataKey="createCategory"/>
             </createData>
 
             <!-- Parameterized url -->
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/PersistMultipleEntitiesCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/PersistMultipleEntitiesCest.xml
index ae64bf4cdb6..74bde899cb4 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/PersistMultipleEntitiesCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/PersistMultipleEntitiesCest.xml
@@ -12,10 +12,10 @@
         <before>
             <createData entity="simplesubcategory" mergeKey="simplecategory"/>
             <createData entity="simpleproduct" mergeKey="simpleproduct1">
-                <required-entity persistedKey="simplecategory"/>
+                <required-entity createDataKey="simplecategory"/>
             </createData>
             <createData entity="simpleproduct" mergeKey="simpleproduct2">
-                <required-entity persistedKey="categoryLink"/>
+                <required-entity createDataKey="categoryLink"/>
             </createData>
         </before>
         <after>
-- 
GitLab


From 13b1dbf61b1359ac8b156cc8519987ed804bc1d5 Mon Sep 17 00:00:00 2001
From: Tom Reece <treece@magento.com>
Date: Fri, 6 Oct 2017 19:21:01 +0300
Subject: [PATCH 050/380] MQE-352: Review and Update SampleCest.xml for added
 functionality

---
 .../SampleTests/Cest/SampleCest.xml           | 21 +++++++++++++++++--
 1 file changed, 19 insertions(+), 2 deletions(-)

diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/SampleCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/SampleCest.xml
index 0eea2c79a39..21c3e6ef347 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/SampleCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/SampleCest.xml
@@ -254,17 +254,34 @@
                 <severity value="CRITICAL"/>
                 <testCaseId value="#"/>
             </annotations>
+
             <createData entity="CustomerEntity1" mergeKey="testScopeData"/>
+
+            <!-- parameterized url that uses literal params -->
             <amOnPage url="{{SamplePage.url('success','success2')}}" mergeKey="a0"/>
-            <amOnPage url="/$testScopeData.firstname$.html" mergeKey="a1"/>
-            <amOnPage url="/$$createData1.firstname$$.html" mergeKey="a2"/>
+
+            <!-- url referencing data that was created in this <test> -->
+            <amOnPage url="$testScopeData.firstname$.html" mergeKey="a1"/>
+
+            <!-- url referencing data that was created in a <before> -->
+            <amOnPage url="$$createData1.firstname$$.html" mergeKey="a2"/>
+
+            <!-- parameterized url that uses created data params -->
             <amOnPage url="{{SamplePage.url($testScopeData.firstname$,$testScopeData.lastname$)}}" mergeKey="a3"/>
             <amOnPage url="{{SamplePage.url($$createData1.firstname$$,$$createData1.lastname$$)}}" mergeKey="a4"/>
+
+            <!-- parameterized selector that uses literal params -->
             <click selector="{{SampleSection.oneParamElement('success')}}" mergeKey="c1"/>
             <click selector="{{SampleSection.twoParamElement('success','success2')}}" mergeKey="c2"/>
+
+            <!-- parameterized selector with literal, static data, and created data  -->
             <click selector="{{SampleSection.threeParamElement('John', SamplePerson.lastname, $testScopeData.lastname$)}}" mergeKey="c3"/>
+
+            <!-- selector that uses created data -->
             <click selector="#$testScopeData.firstname$ .$testScopeData.lastname$" mergeKey="c4"/>
             <click selector="#$$createData1.firstname$$ .$$createData1.lastname$$" mergeKey="c5"/>
+
+            <!-- userInput that uses created data -->
             <fillField selector="#sample" userInput="Hello $testScopeData.firstname$ $testScopeData.lastname$" mergeKey="f1"/>
             <fillField selector="#sample" userInput="Hello $$createData1.firstname$$ $$createData1.lastname$$" mergeKey="f2"/>
         </test>
-- 
GitLab


From dd1a467993fb3e1514e036064609ab3b94aedbee Mon Sep 17 00:00:00 2001
From: Tom Reece <treece@magento.com>
Date: Sat, 7 Oct 2017 02:17:24 +0300
Subject: [PATCH 051/380] MQE-428: Update Magento2 Acceptance Readme File

---
 dev/tests/acceptance/README.md | 270 ---------------------------------
 1 file changed, 270 deletions(-)
 delete mode 100755 dev/tests/acceptance/README.md

diff --git a/dev/tests/acceptance/README.md b/dev/tests/acceptance/README.md
deleted file mode 100755
index 805c89e126d..00000000000
--- a/dev/tests/acceptance/README.md
+++ /dev/null
@@ -1,270 +0,0 @@
-# Magento 2 Functional Tests
- 
-# Built With
-* [Codeception](http://codeception.com/)
-* [Robo](http://robo.li/)
-* [Allure](http://allure.qatools.ru/)
-
-----
-
-# Prerequisites
-* **IMPORTANT**
-    * You will need to have a running instance of Magento that you can access.
-    * You will need to configure your instance of Magento for [Automated Testing](http://devdocs.magento.com/guides/v2.0/mtf/mtf_quickstart/mtf_quickstart_magento.html).
-* [PHP v7.x](http://php.net/manual/en/install.php)
-* [Composer v1.4.x](https://getcomposer.org/download/)
-* [Java v1.8.x](https://www.java.com/en/download/)
-* [Selenium Server](http://www.seleniumhq.org/download/) - [v2.53.x](http://selenium-release.storage.googleapis.com/index.html?path=2.53/)
-* [ChromeDriver v2.32.x](https://sites.google.com/a/chromium.org/chromedriver/downloads)
-* [Allure CLI v2.3.x](https://docs.qameta.io/allure/latest/#_installing_a_commandline)
-* [GitHub](https://desktop.github.com/)
-
-### Recommendations
-* We recommend using [PHPStorm 2017](https://www.jetbrains.com/phpstorm/) for your IDE. They recently added support for [Codeception Test execution](https://blog.jetbrains.com/phpstorm/2017/03/codeception-support-comes-to-phpstorm-2017-1/) which is helpful when debugging.
-* We also recommend updating your [$PATH to include](https://stackoverflow.com/questions/7703041/editing-path-variable-on-mac) `./vendor/bin` so you can easily execute the necessary `robo` and `codecept` commands instead of using `./vendor/bin/robo` or `./vendor/bin/codecept`.  
-
-----
-
-# TEMPORARY INSTALLATION INSTRUCTIONS
-Due to the current setup of the Framework you will need to do the following:
-
-  * `mkdir [DIRECTORY_NAME]`
-  * `cd [DIRECTORY_NAME]`
-  * Pull down - [EE](https://github.com/magento/magento2ee)
-  * Pull down - [CE](https://github.com/magento/magento2ce)
-  * `cd magento2ee`
-  * `php -f dev/tools/build-ee.php -- --command=link --exclude=true`
-  * `cd ..`
-  * Generate a `github-oauth` token: 
-      * [How to setup an auth.json file for the Composer?](https://mage2.pro/t/topic/743)
-      * [Creating a personal access token for the command line.](https://help.github.com/articles/creating-a-personal-access-token-for-the-command-line/#creating-a-token)
-  * `touch magento2ce/dev/tests/acceptance/auth.json`
-  * `nano magento2ce/dev/tests/acceptance/auth.json`
-  * Copy/Paste the following:
-    ```
-    {
-      "github-oauth": {
-          "github.com": "<personal access token>"
-      }
-    }
-    ```
-  * Replace `<personal access token>` with the token you generated in GitHub.
-  * Save your work.
-  * `cd magento2ce/dev/tests/acceptance`
-  * `composer install`
-      * **PLEASE IGNORE THE "Installation" SECTION THAT FOLLOWS, START WITH THE "Building The Framework" SECTION INSTEAD.**
-
-----
-
-# Installation
-You can **either** install through composer **or** clone from git repository.
-## Git
-```
-git clone GITHUB_REPO_URL
-cd magento2ce
-composer install
-```
-
-## Composer
-```
-mkdir DIR_NAME
-cd DIR_NAME
-composer create-project --repository-url=GITHUB_REPO_URL magento/magento2ce-acceptance-tests-metapackage
-```
-
-----
-
-# Robo
-Robo is a task runner for PHP that allows you to alias long complex CLI commands to simple commands.
-
-### Example
-
-* Original: `allure generate tests/_output/allure-results/ -o tests/_output/allure-report/`
-* Robo: `./vendor/bin/robo allure1:generate`
-
-## Available Robo Commands
-You can see a list of all available Robo commands by calling `./vendor/bin/robo` in the Terminal.
-
-##### Codeception Robo Commands
-* `./vendor/bin/robo`
-  * Lists all available Robo commands.
-* `./vendor/bin/robo clone:files`
-  * Duplicate the Example configuration files used to customize the Project
-* `./vendor/bin/robo build:project`
-  * Build the Codeception project
-* `./vendor/bin/robo generate:pages`
-  * Generate all Page Objects
-* `./vendor/bin/robo generate:tests`
-  * Generate all Tests in PHP
-* `./vendor/bin/robo example`
-  * Run all Tests marked with the @group tag 'example', using the Chrome environment
-* `./vendor/bin/robo chrome`
-  * Run all Functional tests using the Chrome environment
-* `./vendor/bin/robo firefox`
-  * Run all Functional tests using the FireFox environment
-* `./vendor/bin/robo phantomjs`
-  * Run all Functional tests using the PhantomJS environment
-* `./vendor/bin/robo folder ______`
-  * Run all Functional tests located under the Directory Path provided using the Chrome environment
-* `./vendor/bin/robo group ______`
-  * Run all Tests with the specified @group tag, excluding @group 'skip', using the Chrome environment
-  
-##### Allure Robo Commands
-To determine which version of the Allure command you need to use please run `allure --version`.
-
-* `./vendor/bin/robo allure1:generate`
-  * Allure v1.x.x - Generate the HTML for the Allure report based on the Test XML output
-* `./vendor/bin/robo allure1:open`
-  * Allure v1.x.x - Open the HTML Allure report
-* `./vendor/bin/robo allure1:report`
-  * Allure v1.x.x - Generate and open the HTML Allure report
-* `./vendor/bin/robo allure2:generate`
-  * Allure v2.x.x - Generate the HTML for the Allure report based on the Test XML output
-* `./vendor/bin/robo allure2:open`
-  * Allure v2.x.x - Open the HTML Allure report
-* `./vendor/bin/robo allure2:report`
-  * Allure v2.x.x - Generate and open the HTML Allure report
-
-----
-
-# Building The Framework
-After installing the dependencies you will want to build the Codeception project in the [Magento 2 Functional Testing Framework](https://github.com/magento/magento2-functional-testing-framework), which is a dependency of the CE or EE Tests repo. Run the following to complete this task:
-
-`./vendor/bin/robo build:project`
-
-----
-
-# Configure the Framework
-Before you can generate or run the Tests you will need to edit the Configuration files and configure them for your specific Store settings. You can edit these files with out the fear of accidentally committing your credentials or other sensitive information as these files are listed in the *.gitignore* file.
-
-In the `.env` file you will find key pieces of information that are unique to your local Magento setup that will need to be edited before you can generate tests:
-* **MAGENTO_BASE_URL**
-    * Example: `MAGENTO_BASE_URL=http://127.0.0.1:32772/`
-    * Note: Please end the URL with a `/`.
-* **MAGENTO_BACKEND_NAME**
-    * Example: `MAGENTO_BACKEND_NAME=admin`
-    * Note: Set this variable to `admin`.
-* **MAGENTO_ADMIN_USERNAME**
-    * Example: `MAGENTO_ADMIN_USERNAME=admin`
-* **MAGENTO_ADMIN_PASSWORD**
-    * Example: `MAGENTO_ADMIN_PASSWORD=123123`
-
-##### Additional Codeception settings can be found in the following files: 
-* **tests/functional.suite.yml**
-* **codeception.dist.yml**
-
-----
-
-# Generate PHP files for Tests
-All Tests in the Framework are written in XML and need to have the PHP generated for Codeception to run. Run the following command to generate the PHP files in the following directory (If this directory does not exist it will be created): `dev/tests/acceptance/tests/functional/Magento/FunctionalTest/_generated`
-
-`./vendor/bin/robo generate:tests`
-
-----
-
-# Running Tests
-## Start the Selenium Server
-**PLEASE NOTE**: You will need to have an instance of the Selenium Server running on your machine before you can execute the Tests.
-
-```
-cd [LOCATION_OF_SELENIUM_JAR]
-java -jar selenium-server-standalone-X.X.X.jar
-```
-
-## Run Tests Manually
-You can run the Codeception tests directly without using Robo if you'd like. To do so please run `./vendor/bin/codecept run functional` to execute all Functional tests that DO NOT include @env tags. IF a Test includes an [@env tag](http://codeception.com/docs/07-AdvancedUsage#Environments) you MUST include the `--env ENV_NAME` flag.
-
-#### Common Codeception Flags:
-
-* --env
-* --group
-* --skip-group
-* --steps
-* --verbose
-* --debug
-  * [Full List of CLI Flags](http://codeception.com/docs/reference/Commands#Run)
-
-#### Examples
-
-* Run ALL Functional Tests without an @env tag: `./vendor/bin/codecept run functional`
-* Run ALL Functional Tests without the "skip" @group: `./vendor/bin/codecept run functional --skip-group skip`
-* Run ALL Functional Tests with the @group tag "example" without the "skip" @group tests: `./vendor/bin/codecept run functional --group example --skip-group skip`
-
-## Run Tests using Robo
-* Run all Functional Tests using the @env tag "chrome": `./vendor/bin/robo chrome`
-* Run all Functional Tests using the @env tag "firefox": `./vendor/bin/robo firefox`
-* Run all Functional Tests using the @env tag "phantomjs": `./vendor/bin/robo phantomjs`
-* Run all Functional Tests using the @group tag "example": `./vendor/bin/robo example`
-* Run all Functional Tests using the provided @group tag: `./vendor/bin/robo group GROUP_NAME`
-* Run all Functional Tests listed under the provided Folder Path: `./vendor/bin/robo folder dev/tests/acceptance/tests/functional/Magento/FunctionalTest/MODULE_NAME`
-
-----
-
-# Allure Reports
-### Manually
-You can run the following commands in the Terminal to generate and open an Allure report.
-
-##### Allure v1.x.x
-* Build the Report: `allure generate tests/_output/allure-results/ -o tests/_output/allure-report/`
-* Open the Report: `allure report open --report-dir tests/_output/allure-report/`
-
-##### Allure v2.x.x
-* Build the Report: `allure generate tests/_output/allure-results/ --output tests/_output/allure-report/ --clean`
-* Open the Report: `allure open --port 0 tests/_output/allure-report/`
-
-### Using Robo
-You can run the following Robo commands in the Terminal to generate and open an Allure report (Run the following terminal command for the Allure version: `allure --version`):
-
-##### Allure v1.x.x
-* Build the Report: `./vendor/bin/robo allure1:generate`
-* Open the Report: `./vendor/bin/robo allure1:open`
-* Build/Open the Report: `./vendor/bin/robo allure1:report`
-
-##### Allure v2.x.x
-* Build the Report: `./vendor/bin/robo allure2:generate`
-* Open the Report: `./vendor/bin/robo allure2:open`
-* Build/Open the Report: `./vendor/bin/robo allure2:report`
-
-----
-
-# Composer SymLinking
-Due to the interdependent nature of the 2 repos it is recommended to Symlink the repos so you develop locally easier. Please refer to this GitHub page: https://github.com/gossi/composer-localdev-plugin
-
-----
-
-# Troubleshooting
-* TimeZone Error - http://stackoverflow.com/questions/18768276/codeception-datetime-error
-* TimeZone List - http://php.net/manual/en/timezones.america.php
-* System PATH - Make sure you have `./vendor/bin/`, `vendor/bin/` and `vendor/` listed in your system path so you can run the  `codecept` and `robo` commands directly:
-
-    `sudo nano /etc/paths`
-    
-* StackOverflow Help: https://stackoverflow.com/questions/7703041/editing-path-variable-on-mac
-* Allure `@env error` - Allure recently changed their Codeception Adapter that breaks Codeception when tests include the `@env` tag. There are 2 workarounds for this issue currently.
-    1. You can edit the `composer.json` and point the Allure-Codeception Adapter to a previous commit:
-        * Edit the `composer.json` file.
-        * Make the following change:
-            * ORIGINAL: `“allure-framework/allure-codeception”: "dev-master"`
-            * UPDATED: `“allure-framework/allure-codeception”: “dev-master#af40af5ae2b717618a42fe3e137d75878508c75d”`
-    1. You can revert the changes that they made manually: 
-        * Locate the `AllureAdapter.php` file here: `vendor/allure-framework/allure-codeception/src/Yandex/Allure/Adapter/AllureAdapter.php`
-        * Edit the `_initialize()` function found on line 77 and replace it with the following:
-            ```
-            public function _initialize(array $ignoredAnnotations = [])
-                {
-                    parent::_initialize();
-                    Annotation\AnnotationProvider::registerAnnotationNamespaces();
-                    // Add standard PHPUnit annotations
-                    Annotation\AnnotationProvider::addIgnoredAnnotations($this->ignoredAnnotations);
-                    // Add custom ignored annotations
-                    $ignoredAnnotations = $this->tryGetOption('ignoredAnnotations', []);
-                    Annotation\AnnotationProvider::addIgnoredAnnotations($ignoredAnnotations);
-                    $outputDirectory = $this->getOutputDirectory();
-                    $deletePreviousResults =
-                        $this->tryGetOption(DELETE_PREVIOUS_RESULTS_PARAMETER, false);
-                    $this->prepareOutputDirectory($outputDirectory, $deletePreviousResults);
-                    if (is_null(Model\Provider::getOutputDirectory())) {
-                        Model\Provider::setOutputDirectory($outputDirectory);
-                    }
-                }
-            ```
-- 
GitLab


From 158e47e1b4004513a6c88bb074771344fd668f78 Mon Sep 17 00:00:00 2001
From: Pieter Cappelle <pieter@newance.be>
Date: Fri, 20 Oct 2017 20:24:01 +0200
Subject: [PATCH 052/380] Fix issue 10347

---
 app/code/Magento/Tax/Model/Plugin/OrderSave.php | 9 ++++++---
 1 file changed, 6 insertions(+), 3 deletions(-)

diff --git a/app/code/Magento/Tax/Model/Plugin/OrderSave.php b/app/code/Magento/Tax/Model/Plugin/OrderSave.php
index 72032852486..c7bef8b69a4 100644
--- a/app/code/Magento/Tax/Model/Plugin/OrderSave.php
+++ b/app/code/Magento/Tax/Model/Plugin/OrderSave.php
@@ -97,8 +97,12 @@ class OrderSave
                         } else {
                             $percentSum = 0;
                             foreach ($taxRates as $rate) {
-                                $realAmount = $rates['amount'] * $rate['percent'] / $rates['percent'];
-                                $realBaseAmount = $rates['base_amount'] * $rate['percent'] / $rates['percent'];
+                                $percentSum += $rate['percent'];
+                            }
+
+                            foreach ($taxRates as $rate) {
+                                $realAmount = $rates['amount'] * $rate['percent'] / $percentSum;
+                                $realBaseAmount = $rates['base_amount'] * $rate['percent'] / $percentSum;
                                 $ratesIdQuoteItemId[$rates['id']][] = [
                                     'id' => $taxesArray['item_id'],
                                     'percent' => $rate['percent'],
@@ -110,7 +114,6 @@ class OrderSave
                                     'real_amount' => $realAmount,
                                     'real_base_amount' => $realBaseAmount,
                                 ];
-                                $percentSum += $rate['percent'];
                             }
                         }
                     }
-- 
GitLab


From 40d51e4646e47eb3b25ae68b3673ff06e1c51270 Mon Sep 17 00:00:00 2001
From: root <sylink@gmail.com>
Date: Sat, 21 Oct 2017 02:09:18 +0000
Subject: [PATCH 053/380] fix for issue 9633 setup wizard and memcache

---
 lib/internal/Magento/Framework/Session/Config.php | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/lib/internal/Magento/Framework/Session/Config.php b/lib/internal/Magento/Framework/Session/Config.php
index 26ae1635f18..73a5eb26df4 100644
--- a/lib/internal/Magento/Framework/Session/Config.php
+++ b/lib/internal/Magento/Framework/Session/Config.php
@@ -133,6 +133,14 @@ class Config implements ConfigInterface
         if ($savePath) {
             $this->setSavePath($savePath);
         }
+	/**
+	* Session save handler - memcache,files,etc
+	*/
+	$saveHandler=$deploymentConfig->get(self::PARAM_SESSION_SAVE_METHOD);
+	if ($saveHandler) {
+		$this->setOption('session.save_handler', $saveHandler);
+	}
+
 
         /**
          * Session cache limiter
-- 
GitLab


From 8a6c3f2d833b9ec4a9cea76c3926b1a193a038f7 Mon Sep 17 00:00:00 2001
From: Anton Evers <anton@eve.rs>
Date: Sun, 22 Oct 2017 13:54:46 +0600
Subject: [PATCH 054/380] Loose integer check for creditmemo state

`$creditmemo->getState() = "1"`
`Creditmemo::STATE_OPEN = 1`
---
 app/code/Magento/Sales/Model/Service/CreditmemoService.php | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/app/code/Magento/Sales/Model/Service/CreditmemoService.php b/app/code/Magento/Sales/Model/Service/CreditmemoService.php
index c7541e6cb7e..24f56c0dbd5 100644
--- a/app/code/Magento/Sales/Model/Service/CreditmemoService.php
+++ b/app/code/Magento/Sales/Model/Service/CreditmemoService.php
@@ -195,7 +195,7 @@ class CreditmemoService implements \Magento\Sales\Api\CreditmemoManagementInterf
      */
     protected function validateForRefund(\Magento\Sales\Api\Data\CreditmemoInterface $creditmemo)
     {
-        if ($creditmemo->getId() && $creditmemo->getState() !== \Magento\Sales\Model\Order\Creditmemo::STATE_OPEN) {
+        if ($creditmemo->getId() && $creditmemo->getState() != \Magento\Sales\Model\Order\Creditmemo::STATE_OPEN) {
             throw new \Magento\Framework\Exception\LocalizedException(
                 __('We cannot register an existing credit memo.')
             );
-- 
GitLab


From cfd92c4ff13bcd55d0ac6b06a820d74ee78f2558 Mon Sep 17 00:00:00 2001
From: Anton Evers <anton@eve.rs>
Date: Tue, 24 Oct 2017 11:41:51 +0600
Subject: [PATCH 055/380] save invoice ID on credit memo when using API method
 salesRefundInvoiceV1

---
 .../Magento/Sales/Model/Order/Creditmemo.php  | 23 ++++++++++++++++++-
 1 file changed, 22 insertions(+), 1 deletion(-)

diff --git a/app/code/Magento/Sales/Model/Order/Creditmemo.php b/app/code/Magento/Sales/Model/Order/Creditmemo.php
index 68339e7db93..771b8ea459a 100644
--- a/app/code/Magento/Sales/Model/Order/Creditmemo.php
+++ b/app/code/Magento/Sales/Model/Order/Creditmemo.php
@@ -9,8 +9,10 @@
 namespace Magento\Sales\Model\Order;
 
 use Magento\Framework\Api\AttributeValueFactory;
+use Magento\Framework\App\ObjectManager;
 use Magento\Framework\Pricing\PriceCurrencyInterface;
 use Magento\Sales\Api\Data\CreditmemoInterface;
+use Magento\Sales\Api\InvoiceRepositoryInterface;
 use Magento\Sales\Model\AbstractModel;
 use Magento\Sales\Model\EntityInterface;
 
@@ -114,6 +116,11 @@ class Creditmemo extends AbstractModel implements EntityInterface, CreditmemoInt
      */
     protected $priceCurrency;
 
+    /**
+     * @var InvoiceRepository
+     */
+    private $invoiceRepository;
+
     /**
      * @param \Magento\Framework\Model\Context $context
      * @param \Magento\Framework\Registry $registry
@@ -130,6 +137,7 @@ class Creditmemo extends AbstractModel implements EntityInterface, CreditmemoInt
      * @param \Magento\Framework\Model\ResourceModel\AbstractResource $resource
      * @param \Magento\Framework\Data\Collection\AbstractDb $resourceCollection
      * @param array $data
+     * @param InvoiceRepository $invoiceRepository
      * @SuppressWarnings(PHPMD.ExcessiveParameterList)
      */
     public function __construct(
@@ -147,7 +155,8 @@ class Creditmemo extends AbstractModel implements EntityInterface, CreditmemoInt
         PriceCurrencyInterface $priceCurrency,
         \Magento\Framework\Model\ResourceModel\AbstractResource $resource = null,
         \Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null,
-        array $data = []
+        array $data = [],
+        InvoiceRepository $invoiceRepository = null
     ) {
         $this->_creditmemoConfig = $creditmemoConfig;
         $this->_orderFactory = $orderFactory;
@@ -157,6 +166,7 @@ class Creditmemo extends AbstractModel implements EntityInterface, CreditmemoInt
         $this->_commentFactory = $commentFactory;
         $this->_commentCollectionFactory = $commentCollectionFactory;
         $this->priceCurrency = $priceCurrency;
+        $this->invoiceRepository = $invoiceRepository;
         parent::__construct(
             $context,
             $registry,
@@ -379,6 +389,9 @@ class Creditmemo extends AbstractModel implements EntityInterface, CreditmemoInt
      */
     public function getInvoice()
     {
+        if (!$this->getData('invoice') instanceof \Magento\Sales\Model\Order\Invoice && $this->getInvoiceId()) {
+            $this->setInvoice($this->getInvoiceRepository()->get($this->getInvoiceId()));
+        }
         return $this->getData('invoice');
     }
 
@@ -391,6 +404,7 @@ class Creditmemo extends AbstractModel implements EntityInterface, CreditmemoInt
     public function setInvoice(Invoice $invoice)
     {
         $this->setData('invoice', $invoice);
+        $this->setInvoiceId($invoice->getId());
         return $this;
     }
 
@@ -1525,5 +1539,12 @@ class Creditmemo extends AbstractModel implements EntityInterface, CreditmemoInt
         return $this->_setExtensionAttributes($extensionAttributes);
     }
 
+    /**
+     * @return InvoiceRepositoryInterface|mixed
+     * @deprecated
+     */
+    private function getInvoiceRepository() {
+        return $this->invoiceRepository ?: ObjectManager::getInstance()->get(InvoiceRepositoryInterface::class);
+    }
     //@codeCoverageIgnoreEnd
 }
-- 
GitLab


From 94ae23d423c1647e2d9722f6a5cdd42c9bb7902d Mon Sep 17 00:00:00 2001
From: Anton Evers <anton@eve.rs>
Date: Tue, 24 Oct 2017 12:21:44 +0600
Subject: [PATCH 056/380] Move deprecated method logic to constructor

---
 app/code/Magento/Sales/Model/Order/Creditmemo.php | 10 +---------
 1 file changed, 1 insertion(+), 9 deletions(-)

diff --git a/app/code/Magento/Sales/Model/Order/Creditmemo.php b/app/code/Magento/Sales/Model/Order/Creditmemo.php
index 771b8ea459a..cea854cae6c 100644
--- a/app/code/Magento/Sales/Model/Order/Creditmemo.php
+++ b/app/code/Magento/Sales/Model/Order/Creditmemo.php
@@ -166,7 +166,7 @@ class Creditmemo extends AbstractModel implements EntityInterface, CreditmemoInt
         $this->_commentFactory = $commentFactory;
         $this->_commentCollectionFactory = $commentCollectionFactory;
         $this->priceCurrency = $priceCurrency;
-        $this->invoiceRepository = $invoiceRepository;
+        $this->invoiceRepository = $invoiceRepository ?: ObjectManager::getInstance()->get(InvoiceRepositoryInterface::class);
         parent::__construct(
             $context,
             $registry,
@@ -1538,13 +1538,5 @@ class Creditmemo extends AbstractModel implements EntityInterface, CreditmemoInt
     {
         return $this->_setExtensionAttributes($extensionAttributes);
     }
-
-    /**
-     * @return InvoiceRepositoryInterface|mixed
-     * @deprecated
-     */
-    private function getInvoiceRepository() {
-        return $this->invoiceRepository ?: ObjectManager::getInstance()->get(InvoiceRepositoryInterface::class);
-    }
     //@codeCoverageIgnoreEnd
 }
-- 
GitLab


From 02bc89297aad77fbd68c6263d421a0d254af7a41 Mon Sep 17 00:00:00 2001
From: Jeroen van Leusden <jeroen@h-o.nl>
Date: Fri, 13 Oct 2017 15:38:45 +0200
Subject: [PATCH 057/380] Remove unused eavConfig in Order Model

---
 app/code/Magento/Sales/Model/Order.php | 7 +------
 1 file changed, 1 insertion(+), 6 deletions(-)

diff --git a/app/code/Magento/Sales/Model/Order.php b/app/code/Magento/Sales/Model/Order.php
index 50497e8d47b..85443ee7f4f 100644
--- a/app/code/Magento/Sales/Model/Order.php
+++ b/app/code/Magento/Sales/Model/Order.php
@@ -214,11 +214,6 @@ class Order extends AbstractModel implements EntityInterface, OrderInterface
      */
     protected $_currencyFactory;
 
-    /**
-     * @var \Magento\Eav\Model\Config
-     */
-    private $_eavConfig;
-
     /**
      * @var \Magento\Sales\Model\Order\Status\HistoryFactory
      */
@@ -309,6 +304,7 @@ class Order extends AbstractModel implements EntityInterface, OrderInterface
      * @param array $data
      * @param ResolverInterface $localeResolver
      * @SuppressWarnings(PHPMD.ExcessiveParameterList)
+     * @SuppressWarnings(PHPMD.UnusedFormalParameter)
      */
     public function __construct(
         \Magento\Framework\Model\Context $context,
@@ -349,7 +345,6 @@ class Order extends AbstractModel implements EntityInterface, OrderInterface
         $this->_productVisibility = $productVisibility;
         $this->invoiceManagement = $invoiceManagement;
         $this->_currencyFactory = $currencyFactory;
-        $this->_eavConfig = $eavConfig;
         $this->_orderHistoryFactory = $orderHistoryFactory;
         $this->_addressCollectionFactory = $addressCollectionFactory;
         $this->_paymentCollectionFactory = $paymentCollectionFactory;
-- 
GitLab


From 914520985b2ed374a57dd74df8688fff46f06e5b Mon Sep 17 00:00:00 2001
From: Anton Evers <anton@eve.rs>
Date: Tue, 24 Oct 2017 15:59:23 +0600
Subject: [PATCH 058/380] Replace call to removed method

---
 app/code/Magento/Sales/Model/Order/Creditmemo.php | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/app/code/Magento/Sales/Model/Order/Creditmemo.php b/app/code/Magento/Sales/Model/Order/Creditmemo.php
index cea854cae6c..d29a4bc58d5 100644
--- a/app/code/Magento/Sales/Model/Order/Creditmemo.php
+++ b/app/code/Magento/Sales/Model/Order/Creditmemo.php
@@ -390,7 +390,7 @@ class Creditmemo extends AbstractModel implements EntityInterface, CreditmemoInt
     public function getInvoice()
     {
         if (!$this->getData('invoice') instanceof \Magento\Sales\Model\Order\Invoice && $this->getInvoiceId()) {
-            $this->setInvoice($this->getInvoiceRepository()->get($this->getInvoiceId()));
+            $this->setInvoice($this->invoiceRepository->get($this->getInvoiceId()));
         }
         return $this->getData('invoice');
     }
-- 
GitLab


From 480f8ae7f4948918cffcf9d63838a584dce9b5b4 Mon Sep 17 00:00:00 2001
From: Anton Evers <anton@eve.rs>
Date: Tue, 24 Oct 2017 17:06:17 +0600
Subject: [PATCH 059/380] add tests for refunding pending credit memos

---
 .../Model/Service/CreditmemoServiceTest.php   | 72 +++++++++++++++++++
 1 file changed, 72 insertions(+)

diff --git a/app/code/Magento/Sales/Test/Unit/Model/Service/CreditmemoServiceTest.php b/app/code/Magento/Sales/Test/Unit/Model/Service/CreditmemoServiceTest.php
index 9ecab6cf9ab..2e668f0b0d6 100644
--- a/app/code/Magento/Sales/Test/Unit/Model/Service/CreditmemoServiceTest.php
+++ b/app/code/Magento/Sales/Test/Unit/Model/Service/CreditmemoServiceTest.php
@@ -243,6 +243,78 @@ class CreditmemoServiceTest extends \PHPUnit\Framework\TestCase
         $this->assertSame($creditMemoMock, $this->creditmemoService->refund($creditMemoMock, true));
     }
 
+    public function testRefundPendingCreditMemo()
+    {
+        $creditMemoMock = $this->getMockBuilder(\Magento\Sales\Api\Data\CreditmemoInterface::class)
+            ->setMethods(['getId', 'getOrder', 'getState', 'getInvoice'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $creditMemoMock->expects($this->once())->method('getId')->willReturn(444);
+        $creditMemoMock->expects($this->once())->method('getState')
+            ->willReturn(\Magento\Sales\Model\Order\Creditmemo::STATE_OPEN);
+        $orderMock = $this->getMockBuilder(Order::class)->disableOriginalConstructor()->getMock();
+
+        $creditMemoMock->expects($this->atLeastOnce())->method('getOrder')->willReturn($orderMock);
+        $orderMock->expects($this->once())->method('getBaseTotalRefunded')->willReturn(0);
+        $orderMock->expects($this->once())->method('getBaseTotalPaid')->willReturn(10);
+        $creditMemoMock->expects($this->once())->method('getBaseGrandTotal')->willReturn(10);
+
+        $this->priceCurrencyMock->expects($this->any())
+            ->method('round')
+            ->willReturnArgument(0);
+
+        // Set payment adapter dependency
+        $refundAdapterMock = $this->getMockBuilder(\Magento\Sales\Model\Order\RefundAdapterInterface::class)
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $this->objectManagerHelper->setBackwardCompatibleProperty(
+            $this->creditmemoService,
+            'refundAdapter',
+            $refundAdapterMock
+        );
+
+        // Set resource dependency
+        $resourceMock = $this->getMockBuilder(\Magento\Framework\App\ResourceConnection::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $this->objectManagerHelper->setBackwardCompatibleProperty(
+            $this->creditmemoService,
+            'resource',
+            $resourceMock
+        );
+
+        // Set order repository dependency
+        $orderRepositoryMock = $this->getMockBuilder(\Magento\Sales\Api\OrderRepositoryInterface::class)
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $this->objectManagerHelper->setBackwardCompatibleProperty(
+            $this->creditmemoService,
+            'orderRepository',
+            $orderRepositoryMock
+        );
+
+        $adapterMock = $this->getMockBuilder(\Magento\Framework\DB\Adapter\AdapterInterface::class)
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $resourceMock->expects($this->once())->method('getConnection')->with('sales')->willReturn($adapterMock);
+        $adapterMock->expects($this->once())->method('beginTransaction');
+        $refundAdapterMock->expects($this->once())
+            ->method('refund')
+            ->with($creditMemoMock, $orderMock, false)
+            ->willReturn($orderMock);
+        $orderRepositoryMock->expects($this->once())
+            ->method('save')
+            ->with($orderMock);
+        $creditMemoMock->expects($this->once())
+            ->method('getInvoice')
+            ->willReturn(null);
+        $adapterMock->expects($this->once())->method('commit');
+        $this->creditmemoRepositoryMock->expects($this->once())
+            ->method('save');
+
+        $this->assertSame($creditMemoMock, $this->creditmemoService->refund($creditMemoMock, true));
+    }
+
     /**
      * @expectedExceptionMessage The most money available to refund is 1.
      * @expectedException \Magento\Framework\Exception\LocalizedException
-- 
GitLab


From cbda7b821c976d82eb3c513c435cd941e4b287fb Mon Sep 17 00:00:00 2001
From: Marius <mariuscris@users.noreply.github.com>
Date: Tue, 24 Oct 2017 14:39:44 +0300
Subject: [PATCH 060/380] Remove FQCN

Remove FQCN
---
 .../Magento/Catalog/Block/Product/ListProduct.php    | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/app/code/Magento/Catalog/Block/Product/ListProduct.php b/app/code/Magento/Catalog/Block/Product/ListProduct.php
index abcc1063376..5bb0b772f90 100644
--- a/app/code/Magento/Catalog/Block/Product/ListProduct.php
+++ b/app/code/Magento/Catalog/Block/Product/ListProduct.php
@@ -37,29 +37,29 @@ class ListProduct extends AbstractProduct implements IdentityInterface
     /**
      * Product Collection
      *
-     * @var \Magento\Eav\Model\Entity\Collection\AbstractCollection
+     * @var AbstractCollection
      */
     protected $_productCollection;
 
     /**
      * Catalog layer
      *
-     * @var \Magento\Catalog\Model\Layer
+     * @var Layer
      */
     protected $_catalogLayer;
 
     /**
-     * @var \Magento\Framework\Data\Helper\PostHelper
+     * @var PostHelper
      */
     protected $_postDataHelper;
 
     /**
-     * @var \Magento\Framework\Url\Helper\Data
+     * @var Data
      */
     protected $urlHelper;
 
     /**
-     * @var \Magento\Catalog\Api\CategoryRepositoryInterface
+     * @var CategoryRepositoryInterface
      */
     protected $categoryRepository;
 
@@ -151,7 +151,7 @@ class ListProduct extends AbstractProduct implements IdentityInterface
     /**
      * Get listing mode for products if toolbar is removed from layout.
      * Use the general configuration for product list mode from config path catalog/frontend/list_mode as default value
-    // or mode data from block declaration from layout.
+     * or mode data from block declaration from layout.
      *
      * @return string
      */
-- 
GitLab


From 0eea3b38ae20f690187e858457a7e97d7547347c Mon Sep 17 00:00:00 2001
From: Timon de Groot <tdegroot96@gmail.com>
Date: Tue, 24 Oct 2017 19:37:17 +0200
Subject: [PATCH 061/380] Fix getReservedOrderId() to use current store instead
 of default store

---
 app/code/Magento/Quote/Model/ResourceModel/Quote.php | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/app/code/Magento/Quote/Model/ResourceModel/Quote.php b/app/code/Magento/Quote/Model/ResourceModel/Quote.php
index 9f491b749a8..f38ea81b3dd 100644
--- a/app/code/Magento/Quote/Model/ResourceModel/Quote.php
+++ b/app/code/Magento/Quote/Model/ResourceModel/Quote.php
@@ -167,7 +167,7 @@ class Quote extends AbstractDb
     {
         return $this->sequenceManager->getSequence(
             \Magento\Sales\Model\Order::ENTITY,
-            $quote->getStore()->getGroup()->getDefaultStoreId()
+            $quote->getStore()->getStoreId()
         )
         ->getNextValue();
     }
-- 
GitLab


From 73b4aa5dec630cf1529afd43a6c44e18ce0f4dbe Mon Sep 17 00:00:00 2001
From: Timon de Groot <tdegroot96@gmail.com>
Date: Tue, 24 Oct 2017 19:54:26 +0200
Subject: [PATCH 062/380] Refactor method substractProductFromQuotes to
 subtractProductFromQuotes

---
 .../Magento/Quote/Model/ResourceModel/Quote.php | 17 ++++++++++++++++-
 .../Backend/SubtractQtyFromQuotesObserver.php   |  2 +-
 .../SubtractQtyFromQuotesObserverTest.php       |  6 +++---
 3 files changed, 20 insertions(+), 5 deletions(-)

diff --git a/app/code/Magento/Quote/Model/ResourceModel/Quote.php b/app/code/Magento/Quote/Model/ResourceModel/Quote.php
index f38ea81b3dd..4ab0c803c87 100644
--- a/app/code/Magento/Quote/Model/ResourceModel/Quote.php
+++ b/app/code/Magento/Quote/Model/ResourceModel/Quote.php
@@ -211,7 +211,7 @@ class Quote extends AbstractDb
      * @param \Magento\Catalog\Model\Product $product
      * @return $this
      */
-    public function substractProductFromQuotes($product)
+    public function subtractProductFromQuotes($product)
     {
         $productId = (int)$product->getId();
         if (!$productId) {
@@ -251,6 +251,21 @@ class Quote extends AbstractDb
         return $this;
     }
 
+    /**
+     * Subtract product from all quotes quantities
+     *
+     * @param \Magento\Catalog\Model\Product $product
+     *
+     * @deprecated 101.0.0
+     * @see \Magento\Quote\Model\ResourceModel\Quote::subtractProductFromQuotes
+     *
+     * @return $this
+     */
+    public function substractProductFromQuotes($product)
+    {
+        return $this->subtractProductFromQuotes($product);
+    }
+
     /**
      * Mark recollect contain product(s) quotes
      *
diff --git a/app/code/Magento/Sales/Observer/Backend/SubtractQtyFromQuotesObserver.php b/app/code/Magento/Sales/Observer/Backend/SubtractQtyFromQuotesObserver.php
index 775a7dab95c..cd8c705750d 100644
--- a/app/code/Magento/Sales/Observer/Backend/SubtractQtyFromQuotesObserver.php
+++ b/app/code/Magento/Sales/Observer/Backend/SubtractQtyFromQuotesObserver.php
@@ -31,6 +31,6 @@ class SubtractQtyFromQuotesObserver implements ObserverInterface
     public function execute(\Magento\Framework\Event\Observer $observer)
     {
         $product = $observer->getEvent()->getProduct();
-        $this->_quote->substractProductFromQuotes($product);
+        $this->_quote->subtractProductFromQuotes($product);
     }
 }
diff --git a/app/code/Magento/Sales/Test/Unit/Observer/Backend/SubtractQtyFromQuotesObserverTest.php b/app/code/Magento/Sales/Test/Unit/Observer/Backend/SubtractQtyFromQuotesObserverTest.php
index a6a828c888f..6b946051088 100644
--- a/app/code/Magento/Sales/Test/Unit/Observer/Backend/SubtractQtyFromQuotesObserverTest.php
+++ b/app/code/Magento/Sales/Test/Unit/Observer/Backend/SubtractQtyFromQuotesObserverTest.php
@@ -15,12 +15,12 @@ class SubtractQtyFromQuotesObserverTest extends \PHPUnit\Framework\TestCase
     protected $_model;
 
     /**
-     * @var \PHPUnit_Framework_MockObject_MockObject
+     * @var \Magento\Quote\Model\ResourceModel\Quote|\PHPUnit_Framework_MockObject_MockObject
      */
     protected $_quoteMock;
 
     /**
-     * @var \PHPUnit_Framework_MockObject_MockObject
+     * @var \Magento\Framework\Event\Observer|\PHPUnit_Framework_MockObject_MockObject
      */
     protected $_observerMock;
 
@@ -48,7 +48,7 @@ class SubtractQtyFromQuotesObserverTest extends \PHPUnit\Framework\TestCase
             ['getId', 'getStatus', '__wakeup']
         );
         $this->_eventMock->expects($this->once())->method('getProduct')->will($this->returnValue($productMock));
-        $this->_quoteMock->expects($this->once())->method('substractProductFromQuotes')->with($productMock);
+        $this->_quoteMock->expects($this->once())->method('subtractProductFromQuotes')->with($productMock);
         $this->_model->execute($this->_observerMock);
     }
 }
-- 
GitLab


From 7ff22bf30987dc0902d10eae1b11f797a3b9ff75 Mon Sep 17 00:00:00 2001
From: marina <marina.gociu@gmail.com>
Date: Tue, 24 Oct 2017 23:07:16 +0300
Subject: [PATCH 063/380] Update product option value getPrice unit test

---
 .../Unit/Model/Product/Option/ValueTest.php   | 22 +++++++++++++++----
 1 file changed, 18 insertions(+), 4 deletions(-)

diff --git a/app/code/Magento/Catalog/Test/Unit/Model/Product/Option/ValueTest.php b/app/code/Magento/Catalog/Test/Unit/Model/Product/Option/ValueTest.php
index a2d31f377e9..3f0df9bcd55 100644
--- a/app/code/Magento/Catalog/Test/Unit/Model/Product/Option/ValueTest.php
+++ b/app/code/Magento/Catalog/Test/Unit/Model/Product/Option/ValueTest.php
@@ -164,13 +164,27 @@ class ValueTest extends \PHPUnit\Framework\TestCase
     private function getMockedProduct()
     {
         $mockBuilder = $this->getMockBuilder(\Magento\Catalog\Model\Product::class)
-            ->setMethods(['getFinalPrice', '__wakeup'])
+            ->setMethods(['getPriceInfo', '__wakeup'])
             ->disableOriginalConstructor();
         $mock = $mockBuilder->getMock();
 
-        $mock->expects($this->any())
-            ->method('getFinalPrice')
-            ->will($this->returnValue(10));
+        $priceInfoMock = $this->getMockForAbstractClass(
+            \Magento\Framework\Pricing\PriceInfoInterface::class,
+            [],
+            '',
+            false,
+            false,
+            true,
+            ['getPrice']
+        );
+
+        $priceMock = $this->getMockForAbstractClass(\Magento\Framework\Pricing\Price\PriceInterface::class);
+
+        $priceInfoMock->expects($this->any())->method('getPrice')->willReturn($priceMock);
+
+        $mock->expects($this->any())->method('getPriceInfo')->willReturn($priceInfoMock);
+
+        $priceMock->expects($this->any())->method('getValue')->willReturn(10);
 
         return $mock;
     }
-- 
GitLab


From ce20c0a5a9b27ace8d9891e38e864ffecadb2eff Mon Sep 17 00:00:00 2001
From: Anton Evers <anton@eve.rs>
Date: Wed, 25 Oct 2017 11:08:09 +0600
Subject: [PATCH 064/380] Refactor invoice id persistance and retrieval to be
 more like the get and setOrder

---
 app/code/Magento/Sales/Model/Order/Creditmemo.php | 15 +++++++--------
 .../Model/ResourceModel/Order/Creditmemo.php      |  4 ++++
 2 files changed, 11 insertions(+), 8 deletions(-)

diff --git a/app/code/Magento/Sales/Model/Order/Creditmemo.php b/app/code/Magento/Sales/Model/Order/Creditmemo.php
index d29a4bc58d5..a516b52bcb3 100644
--- a/app/code/Magento/Sales/Model/Order/Creditmemo.php
+++ b/app/code/Magento/Sales/Model/Order/Creditmemo.php
@@ -12,9 +12,9 @@ use Magento\Framework\Api\AttributeValueFactory;
 use Magento\Framework\App\ObjectManager;
 use Magento\Framework\Pricing\PriceCurrencyInterface;
 use Magento\Sales\Api\Data\CreditmemoInterface;
-use Magento\Sales\Api\InvoiceRepositoryInterface;
 use Magento\Sales\Model\AbstractModel;
 use Magento\Sales\Model\EntityInterface;
+use Magento\Sales\Model\InvoiceFactory;
 
 /**
  * Order creditmemo model
@@ -117,9 +117,9 @@ class Creditmemo extends AbstractModel implements EntityInterface, CreditmemoInt
     protected $priceCurrency;
 
     /**
-     * @var InvoiceRepository
+     * @var InvoiceFactory
      */
-    private $invoiceRepository;
+    private $invoiceFactory;
 
     /**
      * @param \Magento\Framework\Model\Context $context
@@ -137,7 +137,7 @@ class Creditmemo extends AbstractModel implements EntityInterface, CreditmemoInt
      * @param \Magento\Framework\Model\ResourceModel\AbstractResource $resource
      * @param \Magento\Framework\Data\Collection\AbstractDb $resourceCollection
      * @param array $data
-     * @param InvoiceRepository $invoiceRepository
+     * @param InvoiceFactory $invoiceFactory
      * @SuppressWarnings(PHPMD.ExcessiveParameterList)
      */
     public function __construct(
@@ -156,7 +156,7 @@ class Creditmemo extends AbstractModel implements EntityInterface, CreditmemoInt
         \Magento\Framework\Model\ResourceModel\AbstractResource $resource = null,
         \Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null,
         array $data = [],
-        InvoiceRepository $invoiceRepository = null
+        InvoiceFactory $invoiceFactory = null
     ) {
         $this->_creditmemoConfig = $creditmemoConfig;
         $this->_orderFactory = $orderFactory;
@@ -166,7 +166,7 @@ class Creditmemo extends AbstractModel implements EntityInterface, CreditmemoInt
         $this->_commentFactory = $commentFactory;
         $this->_commentCollectionFactory = $commentCollectionFactory;
         $this->priceCurrency = $priceCurrency;
-        $this->invoiceRepository = $invoiceRepository ?: ObjectManager::getInstance()->get(InvoiceRepositoryInterface::class);
+        $this->invoiceFactory = $invoiceFactory ?: ObjectManager::getInstance()->get(InvoiceFactory::class);
         parent::__construct(
             $context,
             $registry,
@@ -390,7 +390,7 @@ class Creditmemo extends AbstractModel implements EntityInterface, CreditmemoInt
     public function getInvoice()
     {
         if (!$this->getData('invoice') instanceof \Magento\Sales\Model\Order\Invoice && $this->getInvoiceId()) {
-            $this->setInvoice($this->invoiceRepository->get($this->getInvoiceId()));
+            $this->setInvoice($this->invoiceFactory->create()->load($this->getInvoiceId()));
         }
         return $this->getData('invoice');
     }
@@ -404,7 +404,6 @@ class Creditmemo extends AbstractModel implements EntityInterface, CreditmemoInt
     public function setInvoice(Invoice $invoice)
     {
         $this->setData('invoice', $invoice);
-        $this->setInvoiceId($invoice->getId());
         return $this;
     }
 
diff --git a/app/code/Magento/Sales/Model/ResourceModel/Order/Creditmemo.php b/app/code/Magento/Sales/Model/ResourceModel/Order/Creditmemo.php
index f95a3206ce7..5ecbbd777a1 100644
--- a/app/code/Magento/Sales/Model/ResourceModel/Order/Creditmemo.php
+++ b/app/code/Magento/Sales/Model/ResourceModel/Order/Creditmemo.php
@@ -50,6 +50,10 @@ class Creditmemo extends SalesResource implements CreditmemoResourceInterface
             $object->setBillingAddressId($object->getOrder()->getBillingAddress()->getId());
         }
 
+        if (!$object->getInvoiceId() && $object->getInvoice()) {
+            $object->setInvoiceId($object->getInvoice()->getId());
+        }
+
         return parent::_beforeSave($object);
     }
 }
-- 
GitLab


From 23f315c82601a3b89499b7a288833f5d36c798a2 Mon Sep 17 00:00:00 2001
From: Anton Evers <anton@eve.rs>
Date: Wed, 25 Oct 2017 11:09:19 +0600
Subject: [PATCH 065/380] Fix IpnTest In the IpnTest creates a creditmemo for
 the invoice in $ipnModel->processIpnRequest() already So if
 Magento/Paypal/_files/order_express_with_invoice_and_creditmemo.php is used,
 the invoice is already refunded before the start of the test

---
 .../integration/testsuite/Magento/Paypal/Model/IpnTest.php    | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/dev/tests/integration/testsuite/Magento/Paypal/Model/IpnTest.php b/dev/tests/integration/testsuite/Magento/Paypal/Model/IpnTest.php
index 2da602c5224..1a22ea947f8 100644
--- a/dev/tests/integration/testsuite/Magento/Paypal/Model/IpnTest.php
+++ b/dev/tests/integration/testsuite/Magento/Paypal/Model/IpnTest.php
@@ -123,7 +123,7 @@ class IpnTest extends \PHPUnit\Framework\TestCase
     /**
      * Refund rest of order amount by Paypal Express IPN message service.
      *
-     * @magentoDataFixture Magento/Paypal/_files/order_express_with_invoice_and_creditmemo.php
+     * @magentoDataFixture Magento/Paypal/_files/order_express_with_invoice_and_shipping.php
      * @magentoConfigFixture current_store payment/paypal_express/active 1
      * @magentoConfigFixture current_store paypal/general/merchant_country US
      */
@@ -147,7 +147,7 @@ class IpnTest extends \PHPUnit\Framework\TestCase
         $creditmemoItems = $order->getCreditmemosCollection()->getItems();
 
         $this->assertEquals(Order::STATE_CLOSED, $order->getState()) ;
-        $this->assertEquals(2, count($creditmemoItems));
+        $this->assertEquals(1, count($creditmemoItems));
         $this->assertEquals(10, $order->getSubtotalRefunded());
         $this->assertEquals(10, $order->getBaseSubtotalRefunded());
         $this->assertEquals(20, $order->getShippingRefunded());
-- 
GitLab


From 72533ad5801b3839398e1bd091495537a5429361 Mon Sep 17 00:00:00 2001
From: Anton Evers <anton@eve.rs>
Date: Wed, 25 Oct 2017 11:15:10 +0600
Subject: [PATCH 066/380] specify the correct invoice factory

---
 app/code/Magento/Sales/Model/Order/Creditmemo.php | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/app/code/Magento/Sales/Model/Order/Creditmemo.php b/app/code/Magento/Sales/Model/Order/Creditmemo.php
index a516b52bcb3..3cf4d017273 100644
--- a/app/code/Magento/Sales/Model/Order/Creditmemo.php
+++ b/app/code/Magento/Sales/Model/Order/Creditmemo.php
@@ -14,7 +14,7 @@ use Magento\Framework\Pricing\PriceCurrencyInterface;
 use Magento\Sales\Api\Data\CreditmemoInterface;
 use Magento\Sales\Model\AbstractModel;
 use Magento\Sales\Model\EntityInterface;
-use Magento\Sales\Model\InvoiceFactory;
+use Magento\Sales\Model\Order\InvoiceFactory;
 
 /**
  * Order creditmemo model
-- 
GitLab


From 5afcc52ed7a3a422f6b7dfa83e6db9e6164cc15a Mon Sep 17 00:00:00 2001
From: Timon de Groot <tdegroot96@gmail.com>
Date: Wed, 25 Oct 2017 08:19:45 +0200
Subject: [PATCH 067/380] Add
 \Magento\Quote\Test\Unit\Model\ResourceModel\QuoteTest

---
 .../Unit/Model/ResourceModel/QuoteTest.php    | 105 ++++++++++++++++++
 1 file changed, 105 insertions(+)
 create mode 100644 app/code/Magento/Quote/Test/Unit/Model/ResourceModel/QuoteTest.php

diff --git a/app/code/Magento/Quote/Test/Unit/Model/ResourceModel/QuoteTest.php b/app/code/Magento/Quote/Test/Unit/Model/ResourceModel/QuoteTest.php
new file mode 100644
index 00000000000..d60dd073d12
--- /dev/null
+++ b/app/code/Magento/Quote/Test/Unit/Model/ResourceModel/QuoteTest.php
@@ -0,0 +1,105 @@
+<?php
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Quote\Test\Unit\Model\ResourceModel;
+
+class QuoteTest extends \PHPUnit\Framework\TestCase
+{
+    /**
+     * @var \Magento\Quote\Model\Quote|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $quoteMock;
+
+    /**
+     * @var \Magento\SalesSequence\Model\Manager|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $sequenceManagerMock;
+
+    /**
+     * @var \Magento\Framework\DB\Sequence\SequenceInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $sequenceMock;
+
+    /**
+     * @var \Magento\Sales\Model\Order|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $storeMock;
+
+    /**
+     * @var \Magento\Quote\Model\ResourceModel\Quote
+     */
+    private $quote;
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function setUp()
+    {
+        $context = $this->getMockBuilder(\Magento\Framework\Model\ResourceModel\Db\Context::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $snapshot = $this->getMockBuilder(\Magento\Framework\Model\ResourceModel\Db\VersionControl\Snapshot::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $entityRelationComposite = $this->getMockBuilder(\Magento\Framework\Model\ResourceModel\Db\VersionControl\RelationComposite::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $this->quoteMock = $this->getMockBuilder(\Magento\Quote\Model\Quote::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $this->sequenceManagerMock = $this->getMockBuilder(\Magento\SalesSequence\Model\Manager::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $this->sequenceMock = $this->getMockBuilder(\Magento\Framework\DB\Sequence\SequenceInterface::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $this->storeMock = $this->getMockBuilder(\Magento\Sales\Model\Order::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $this->quote = new \Magento\Quote\Model\ResourceModel\Quote(
+            $context,
+            $snapshot,
+            $entityRelationComposite,
+            $this->sequenceManagerMock,
+            null
+        );
+    }
+
+    /**
+     * @param $entityType
+     * @param $storeId
+     * @dataProvider getReservedOrderIdDataProvider
+     */
+    public function testGetReservedOrderId($entityType, $storeId)
+    {
+        $this->sequenceManagerMock->expects($this->once())
+            ->method('getSequence')
+            ->with(\Magento\Sales\Model\Order::ENTITY, $storeId)
+            ->willReturn($this->sequenceMock);
+        $this->quoteMock->expects($this->once())
+            ->method('getStore')
+            ->willReturn($this->storeMock);
+        $this->storeMock->expects($this->once())
+            ->method('getStoreId')
+            ->willReturn($storeId);
+        $this->sequenceMock->expects($this->once())
+            ->method('getNextValue');
+
+        $this->quote->getReservedOrderId($this->quoteMock);
+    }
+
+    /**
+     * @return array
+     */
+    public function getReservedOrderIdDataProvider(): array
+    {
+        return [
+            [\Magento\Sales\Model\Order::ENTITY, 1],
+            [\Magento\Sales\Model\Order::ENTITY, 2],
+            [\Magento\Sales\Model\Order::ENTITY, 3]
+        ];
+    }
+}
\ No newline at end of file
-- 
GitLab


From 6b325e1356a463fa9a3f435c91c5c149615e2fcd Mon Sep 17 00:00:00 2001
From: Timon de Groot <tdegroot96@gmail.com>
Date: Wed, 25 Oct 2017 17:53:28 +0200
Subject: [PATCH 068/380] Use $quote->getStoreId() in
 Quote::getReservedOrderId()

---
 .../Quote/Model/ResourceModel/Quote.php       |  2 +-
 .../Unit/Model/ResourceModel/QuoteTest.php    | 27 +++++++------------
 2 files changed, 10 insertions(+), 19 deletions(-)

diff --git a/app/code/Magento/Quote/Model/ResourceModel/Quote.php b/app/code/Magento/Quote/Model/ResourceModel/Quote.php
index 4ab0c803c87..0efbc514553 100644
--- a/app/code/Magento/Quote/Model/ResourceModel/Quote.php
+++ b/app/code/Magento/Quote/Model/ResourceModel/Quote.php
@@ -167,7 +167,7 @@ class Quote extends AbstractDb
     {
         return $this->sequenceManager->getSequence(
             \Magento\Sales\Model\Order::ENTITY,
-            $quote->getStore()->getStoreId()
+            $quote->getStoreId()
         )
         ->getNextValue();
     }
diff --git a/app/code/Magento/Quote/Test/Unit/Model/ResourceModel/QuoteTest.php b/app/code/Magento/Quote/Test/Unit/Model/ResourceModel/QuoteTest.php
index d60dd073d12..27d11376702 100644
--- a/app/code/Magento/Quote/Test/Unit/Model/ResourceModel/QuoteTest.php
+++ b/app/code/Magento/Quote/Test/Unit/Model/ResourceModel/QuoteTest.php
@@ -23,11 +23,6 @@ class QuoteTest extends \PHPUnit\Framework\TestCase
      */
     private $sequenceMock;
 
-    /**
-     * @var \Magento\Sales\Model\Order|\PHPUnit_Framework_MockObject_MockObject
-     */
-    private $storeMock;
-
     /**
      * @var \Magento\Quote\Model\ResourceModel\Quote
      */
@@ -56,9 +51,6 @@ class QuoteTest extends \PHPUnit\Framework\TestCase
         $this->sequenceMock = $this->getMockBuilder(\Magento\Framework\DB\Sequence\SequenceInterface::class)
             ->disableOriginalConstructor()
             ->getMock();
-        $this->storeMock = $this->getMockBuilder(\Magento\Sales\Model\Order::class)
-            ->disableOriginalConstructor()
-            ->getMock();
         $this->quote = new \Magento\Quote\Model\ResourceModel\Quote(
             $context,
             $snapshot,
@@ -71,24 +63,23 @@ class QuoteTest extends \PHPUnit\Framework\TestCase
     /**
      * @param $entityType
      * @param $storeId
+     * @param $reservedOrderId
      * @dataProvider getReservedOrderIdDataProvider
      */
-    public function testGetReservedOrderId($entityType, $storeId)
+    public function testGetReservedOrderId($entityType, $storeId, $reservedOrderId)
     {
         $this->sequenceManagerMock->expects($this->once())
             ->method('getSequence')
-            ->with(\Magento\Sales\Model\Order::ENTITY, $storeId)
+            ->with($entityType, $storeId)
             ->willReturn($this->sequenceMock);
         $this->quoteMock->expects($this->once())
-            ->method('getStore')
-            ->willReturn($this->storeMock);
-        $this->storeMock->expects($this->once())
             ->method('getStoreId')
             ->willReturn($storeId);
         $this->sequenceMock->expects($this->once())
-            ->method('getNextValue');
+            ->method('getNextValue')
+            ->willReturn($reservedOrderId);
 
-        $this->quote->getReservedOrderId($this->quoteMock);
+        $this->assertEquals($reservedOrderId, $this->quote->getReservedOrderId($this->quoteMock));
     }
 
     /**
@@ -97,9 +88,9 @@ class QuoteTest extends \PHPUnit\Framework\TestCase
     public function getReservedOrderIdDataProvider(): array
     {
         return [
-            [\Magento\Sales\Model\Order::ENTITY, 1],
-            [\Magento\Sales\Model\Order::ENTITY, 2],
-            [\Magento\Sales\Model\Order::ENTITY, 3]
+            [\Magento\Sales\Model\Order::ENTITY, 1, '1000000001'],
+            [\Magento\Sales\Model\Order::ENTITY, 2, '2000000001'],
+            [\Magento\Sales\Model\Order::ENTITY, 3, '3000000001']
         ];
     }
 }
\ No newline at end of file
-- 
GitLab


From 3cf3ce650b4b7120cd31f920f2c035181dc6dc87 Mon Sep 17 00:00:00 2001
From: Timon de Groot <tdegroot96@gmail.com>
Date: Thu, 26 Oct 2017 19:18:00 +0200
Subject: [PATCH 069/380] Fix variable exceeding max character length

---
 .../Unit/Model/ResourceModel/QuoteTest.php    | 29 ++++++++++++-------
 1 file changed, 18 insertions(+), 11 deletions(-)

diff --git a/app/code/Magento/Quote/Test/Unit/Model/ResourceModel/QuoteTest.php b/app/code/Magento/Quote/Test/Unit/Model/ResourceModel/QuoteTest.php
index 27d11376702..ab36746da5e 100644
--- a/app/code/Magento/Quote/Test/Unit/Model/ResourceModel/QuoteTest.php
+++ b/app/code/Magento/Quote/Test/Unit/Model/ResourceModel/QuoteTest.php
@@ -6,20 +6,27 @@
 
 namespace Magento\Quote\Test\Unit\Model\ResourceModel;
 
+use Magento\Framework\DB\Sequence\SequenceInterface;
+use Magento\Framework\Model\ResourceModel\Db\Context;
+use Magento\Framework\Model\ResourceModel\Db\VersionControl\RelationComposite;
+use Magento\Framework\Model\ResourceModel\Db\VersionControl\Snapshot;
+use Magento\Quote\Model\Quote;
+use Magento\SalesSequence\Model\Manager;
+
 class QuoteTest extends \PHPUnit\Framework\TestCase
 {
     /**
-     * @var \Magento\Quote\Model\Quote|\PHPUnit_Framework_MockObject_MockObject
+     * @var Quote|\PHPUnit_Framework_MockObject_MockObject
      */
     private $quoteMock;
 
     /**
-     * @var \Magento\SalesSequence\Model\Manager|\PHPUnit_Framework_MockObject_MockObject
+     * @var Manager|\PHPUnit_Framework_MockObject_MockObject
      */
     private $sequenceManagerMock;
 
     /**
-     * @var \Magento\Framework\DB\Sequence\SequenceInterface|\PHPUnit_Framework_MockObject_MockObject
+     * @var SequenceInterface|\PHPUnit_Framework_MockObject_MockObject
      */
     private $sequenceMock;
 
@@ -33,28 +40,28 @@ class QuoteTest extends \PHPUnit\Framework\TestCase
      */
     protected function setUp()
     {
-        $context = $this->getMockBuilder(\Magento\Framework\Model\ResourceModel\Db\Context::class)
+        $context = $this->getMockBuilder(Context::class)
             ->disableOriginalConstructor()
             ->getMock();
-        $snapshot = $this->getMockBuilder(\Magento\Framework\Model\ResourceModel\Db\VersionControl\Snapshot::class)
+        $snapshot = $this->getMockBuilder(Snapshot::class)
             ->disableOriginalConstructor()
             ->getMock();
-        $entityRelationComposite = $this->getMockBuilder(\Magento\Framework\Model\ResourceModel\Db\VersionControl\RelationComposite::class)
+        $relationComposite = $this->getMockBuilder(RelationComposite::class)
             ->disableOriginalConstructor()
             ->getMock();
-        $this->quoteMock = $this->getMockBuilder(\Magento\Quote\Model\Quote::class)
+        $this->quoteMock = $this->getMockBuilder(Quote::class)
             ->disableOriginalConstructor()
             ->getMock();
-        $this->sequenceManagerMock = $this->getMockBuilder(\Magento\SalesSequence\Model\Manager::class)
+        $this->sequenceManagerMock = $this->getMockBuilder(Manager::class)
             ->disableOriginalConstructor()
             ->getMock();
-        $this->sequenceMock = $this->getMockBuilder(\Magento\Framework\DB\Sequence\SequenceInterface::class)
+        $this->sequenceMock = $this->getMockBuilder(SequenceInterface::class)
             ->disableOriginalConstructor()
             ->getMock();
         $this->quote = new \Magento\Quote\Model\ResourceModel\Quote(
             $context,
             $snapshot,
-            $entityRelationComposite,
+            $relationComposite,
             $this->sequenceManagerMock,
             null
         );
@@ -93,4 +100,4 @@ class QuoteTest extends \PHPUnit\Framework\TestCase
             [\Magento\Sales\Model\Order::ENTITY, 3, '3000000001']
         ];
     }
-}
\ No newline at end of file
+}
-- 
GitLab


From f76d7cb4afe82c235fbaacae296656ca684b80f5 Mon Sep 17 00:00:00 2001
From: Timon de Groot <tdegroot96@gmail.com>
Date: Thu, 26 Oct 2017 19:24:14 +0200
Subject: [PATCH 070/380] Change deprecation version to 101.0.1 in
 Magento\Quote\Model\ResourceModel\Quote::substractProductFromQuotes

---
 app/code/Magento/Quote/Model/ResourceModel/Quote.php | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/app/code/Magento/Quote/Model/ResourceModel/Quote.php b/app/code/Magento/Quote/Model/ResourceModel/Quote.php
index 0efbc514553..2645d52c87d 100644
--- a/app/code/Magento/Quote/Model/ResourceModel/Quote.php
+++ b/app/code/Magento/Quote/Model/ResourceModel/Quote.php
@@ -256,7 +256,7 @@ class Quote extends AbstractDb
      *
      * @param \Magento\Catalog\Model\Product $product
      *
-     * @deprecated 101.0.0
+     * @deprecated 101.0.1
      * @see \Magento\Quote\Model\ResourceModel\Quote::subtractProductFromQuotes
      *
      * @return $this
-- 
GitLab


From 0f948ac1403ecbdacae6c58cfdd5b045698c1ea8 Mon Sep 17 00:00:00 2001
From: Harald Deiser <h.deiser@techdivision.com>
Date: Sun, 29 Oct 2017 16:02:43 +0100
Subject: [PATCH 071/380] Fixed a js bug where ui_component labels have the
 wrong sort order.

---
 .../base/web/js/dynamic-rows/dynamic-rows.js  | 25 +++++++++++++++++++
 1 file changed, 25 insertions(+)

diff --git a/app/code/Magento/Ui/view/base/web/js/dynamic-rows/dynamic-rows.js b/app/code/Magento/Ui/view/base/web/js/dynamic-rows/dynamic-rows.js
index d4eea859b4d..bcd15880a81 100644
--- a/app/code/Magento/Ui/view/base/web/js/dynamic-rows/dynamic-rows.js
+++ b/app/code/Magento/Ui/view/base/web/js/dynamic-rows/dynamic-rows.js
@@ -548,6 +548,13 @@ define([
                     });
 
                     this.labels.push(data);
+
+                    /**
+                     * Sort the array after an element was added to fix an bug where
+                     * additional added field labels in ui_components haven't the right
+                     * sort order.
+                     */
+                    this.labels.sort(this._compare);
                 }, this);
             }
         },
@@ -914,6 +921,24 @@ define([
             }));
         },
 
+        /**
+         * Compare two objects by the sortOrder property.
+         *
+         * @param {Object} $object1
+         * @param {Object} $object2
+         * @returns {Number}
+         * @private
+         */
+        _compare: function ($object1, $object2) {
+            if ($object1.sortOrder > $object2.sortOrder) {
+                return 1;
+            } else if ($object1.sortOrder < $object2.sortOrder) {
+                return -1;
+            }
+
+            return 0;
+        },
+
         /**
          * Set new data to dataSource,
          * delete element
-- 
GitLab


From 12cb7fc32036641eba87e74479c41709879649e2 Mon Sep 17 00:00:00 2001
From: magento-engcom-team <mikola.malevanec@transoftgroup.com>
Date: Wed, 1 Nov 2017 11:48:03 +0200
Subject: [PATCH 072/380] 8255: Export Products action doesn't consider
 hide_for_product_page value.

---
 .../Model/Export/Product.php                  |  68 +++++--
 .../Model/Import/Product.php                  | 181 +++++++++++++-----
 .../Model/Export/ProductTest.php              |  35 ++++
 .../Model/Import/ProductTest.php              |  22 ++-
 .../Import/_files/import_media_two_stores.csv |   3 +
 .../_files/product_export_with_images.php     |  47 +++++
 6 files changed, 287 insertions(+), 69 deletions(-)
 create mode 100644 dev/tests/integration/testsuite/Magento/CatalogImportExport/Model/Import/_files/import_media_two_stores.csv
 create mode 100644 dev/tests/integration/testsuite/Magento/CatalogImportExport/_files/product_export_with_images.php

diff --git a/app/code/Magento/CatalogImportExport/Model/Export/Product.php b/app/code/Magento/CatalogImportExport/Model/Export/Product.php
index 8ff71faaacd..c5618ef482e 100644
--- a/app/code/Magento/CatalogImportExport/Model/Export/Product.php
+++ b/app/code/Magento/CatalogImportExport/Model/Export/Product.php
@@ -532,11 +532,12 @@ class Product extends \Magento\ImportExport\Model\Export\Entity\AbstractEntity
             ]
         )->joinLeft(
             ['mgv' => $this->_resourceModel->getTableName('catalog_product_entity_media_gallery_value')],
-            '(mg.value_id = mgv.value_id AND mgv.store_id = 0)',
+            '(mg.value_id = mgv.value_id)',
             [
                 'mgv.label',
                 'mgv.position',
-                'mgv.disabled'
+                'mgv.disabled',
+                'mgv.store_id'
             ]
         )->where(
             "mgvte.{$this->getProductEntityLinkField()} IN (?)",
@@ -552,6 +553,7 @@ class Product extends \Magento\ImportExport\Model\Export\Entity\AbstractEntity
                 '_media_label' => $mediaRow['label'],
                 '_media_position' => $mediaRow['position'],
                 '_media_is_disabled' => $mediaRow['disabled'],
+                '_media_store_id' => $mediaRow['store_id'],
             ];
         }
 
@@ -903,7 +905,7 @@ class Product extends \Magento\ImportExport\Model\Export\Entity\AbstractEntity
                         $dataRow = array_merge($dataRow, $stockItemRows[$productId]);
                     }
                     $this->appendMultirowData($dataRow, $multirawData);
-                    if ($dataRow) {
+                    if ($dataRow && !$this->skipRow($dataRow)) {
                         $exportData[] = $dataRow;
                     }
                 }
@@ -931,8 +933,8 @@ class Product extends \Magento\ImportExport\Model\Export\Entity\AbstractEntity
             foreach ($collection as $itemId => $item) {
                 $data[$itemId][$storeId] = $item;
             }
+            $collection->clear();
         }
-        $collection->clear();
 
         return $data;
     }
@@ -1024,12 +1026,10 @@ class Product extends \Magento\ImportExport\Model\Export\Entity\AbstractEntity
                     unset($data[$itemId][$storeId][self::COL_ADDITIONAL_ATTRIBUTES]);
                 }
 
-                if (!empty($data[$itemId][$storeId]) || $this->hasMultiselectData($item, $storeId)) {
-                    $attrSetId = $item->getAttributeSetId();
-                    $data[$itemId][$storeId][self::COL_STORE] = $storeCode;
-                    $data[$itemId][$storeId][self::COL_ATTR_SET] = $this->_attrSetIdToName[$attrSetId];
-                    $data[$itemId][$storeId][self::COL_TYPE] = $item->getTypeId();
-                }
+                $attrSetId = $item->getAttributeSetId();
+                $data[$itemId][$storeId][self::COL_STORE] = $storeCode;
+                $data[$itemId][$storeId][self::COL_ATTR_SET] = $this->_attrSetIdToName[$attrSetId];
+                $data[$itemId][$storeId][self::COL_TYPE] = $item->getTypeId();
                 $data[$itemId][$storeId][self::COL_SKU] = htmlspecialchars_decode($item->getSku());
                 $data[$itemId][$storeId]['store_id'] = $storeId;
                 $data[$itemId][$storeId]['product_id'] = $itemId;
@@ -1162,7 +1162,7 @@ class Product extends \Magento\ImportExport\Model\Export\Entity\AbstractEntity
      * @SuppressWarnings(PHPMD.NPathComplexity)
      * @SuppressWarnings(PHPMD.ExcessiveMethodLength)
      */
-    private function appendMultirowData(&$dataRow, &$multiRawData)
+    private function appendMultirowData(&$dataRow, $multiRawData)
     {
         $productId = $dataRow['product_id'];
         $productLinkId = $dataRow['product_link_id'];
@@ -1191,11 +1191,13 @@ class Product extends \Magento\ImportExport\Model\Export\Entity\AbstractEntity
                 $additionalImageLabels = [];
                 $additionalImageIsDisabled = [];
                 foreach ($multiRawData['mediaGalery'][$productLinkId] as $mediaItem) {
-                    $additionalImages[] = $mediaItem['_media_image'];
-                    $additionalImageLabels[] = $mediaItem['_media_label'];
+                    if ((int)$mediaItem['_media_store_id'] === Store::DEFAULT_STORE_ID) {
+                        $additionalImages[] = $mediaItem['_media_image'];
+                        $additionalImageLabels[] = $mediaItem['_media_label'];
 
-                    if ($mediaItem['_media_is_disabled'] == true) {
-                        $additionalImageIsDisabled[] = $mediaItem['_media_image'];
+                        if ($mediaItem['_media_is_disabled'] == true) {
+                            $additionalImageIsDisabled[] = $mediaItem['_media_image'];
+                        }
                     }
                 }
                 $dataRow['additional_images'] =
@@ -1229,6 +1231,21 @@ class Product extends \Magento\ImportExport\Model\Export\Entity\AbstractEntity
                 }
             }
             $dataRow = $this->rowCustomizer->addData($dataRow, $productId);
+        } else {
+            $additionalImageIsDisabled = [];
+            if (!empty($multiRawData['mediaGalery'][$productLinkId])) {
+                foreach ($multiRawData['mediaGalery'][$productLinkId] as $mediaItem) {
+                    if ((int)$mediaItem['_media_store_id'] === $storeId) {
+                        if ($mediaItem['_media_is_disabled'] == true) {
+                            $additionalImageIsDisabled[] = $mediaItem['_media_image'];
+                        }
+                    }
+                }
+            }
+            if ($additionalImageIsDisabled) {
+                $dataRow['hide_from_product_page'] =
+                    implode(Import::DEFAULT_GLOBAL_MULTI_VALUE_SEPARATOR, $additionalImageIsDisabled);
+            }
         }
 
         if (!empty($this->collectedMultiselectsData[$storeId][$productId])) {
@@ -1494,4 +1511,25 @@ class Product extends \Magento\ImportExport\Model\Export\Entity\AbstractEntity
         }
         return $this->productEntityLinkField;
     }
+
+    /**
+     * Check if row has valuable information to export.
+     *
+     * @param array $dataRow
+     * @return bool
+     */
+    private function skipRow(array $dataRow)
+    {
+        $baseInfo = [
+            self::COL_STORE,
+            self::COL_ATTR_SET,
+            self::COL_TYPE,
+            self::COL_SKU,
+            'store_id',
+            'product_id',
+            'product_link_id',
+        ];
+
+        return empty(array_diff(array_keys($dataRow), $baseInfo));
+    }
 }
diff --git a/app/code/Magento/CatalogImportExport/Model/Import/Product.php b/app/code/Magento/CatalogImportExport/Model/Import/Product.php
index a0f1e25cf65..36c0524bfae 100644
--- a/app/code/Magento/CatalogImportExport/Model/Import/Product.php
+++ b/app/code/Magento/CatalogImportExport/Model/Import/Product.php
@@ -8,7 +8,6 @@ namespace Magento\CatalogImportExport\Model\Import;
 use Magento\Catalog\Model\Product\Visibility;
 use Magento\CatalogImportExport\Model\Import\Product\RowValidatorInterface as ValidatorInterface;
 use Magento\Framework\App\Filesystem\DirectoryList;
-use Magento\Framework\App\ObjectManager;
 use Magento\Framework\Model\ResourceModel\Db\ObjectRelationProcessor;
 use Magento\Framework\Model\ResourceModel\Db\TransactionManagerInterface;
 use Magento\Framework\Stdlib\DateTime;
@@ -1694,10 +1693,25 @@ class Product extends \Magento\ImportExport\Model\Import\Entity\AbstractEntity
                 // 5. Media gallery phase
                 $disabledImages = [];
                 list($rowImages, $rowLabels) = $this->getImagesFromRow($rowData);
+                $storeId = !empty($rowData[self::COL_STORE])
+                    ? $this->getStoreIdByCode($rowData[self::COL_STORE])
+                    : Store::DEFAULT_STORE_ID;
                 if (isset($rowData['_media_is_disabled'])) {
                     $disabledImages = array_flip(
                         explode($this->getMultipleValueSeparator(), $rowData['_media_is_disabled'])
                     );
+                    foreach ($disabledImages as $disabledImage => $position) {
+                        $uploadedFile = $this->uploadMediaFiles($disabledImage, true);
+                        $uploadedFile = $uploadedFile ?: $this->getSystemFile($disabledImage);
+                        $mediaGallery[$storeId][$rowSku][$uploadedFile] = [
+                            'attribute_id' => $this->getMediaGalleryAttributeId(),
+                            'label' => $rowLabels[self::COL_MEDIA_IMAGE][$position] ?? '',
+                            'position' => $position,
+                            'disabled' => 1,
+                            'value' => $disabledImage,
+                            'store_id' => $storeId,
+                        ];
+                    }
                 }
                 $rowData[self::COL_MEDIA_IMAGE] = [];
 
@@ -1730,7 +1744,7 @@ class Product extends \Magento\ImportExport\Model\Import\Entity\AbstractEntity
                             $rowData[$column] = $uploadedFile;
                         }
 
-                        if ($uploadedFile && !isset($mediaGallery[$rowSku][$uploadedFile])) {
+                        if ($uploadedFile && !isset($mediaGallery[$storeId][$rowSku][$uploadedFile])) {
                             if (isset($existingImages[$rowSku][$uploadedFile])) {
                                 if (isset($rowLabels[$column][$columnImageKey])
                                     && $rowLabels[$column][$columnImageKey] != $existingImages[$rowSku][$uploadedFile]['label']
@@ -1744,7 +1758,7 @@ class Product extends \Magento\ImportExport\Model\Import\Entity\AbstractEntity
                                 if ($column == self::COL_MEDIA_IMAGE) {
                                     $rowData[$column][] = $uploadedFile;
                                 }
-                                $mediaGallery[$rowSku][$uploadedFile] = [
+                                $mediaGallery[$storeId][$rowSku][$uploadedFile] = [
                                     'attribute_id' => $this->getMediaGalleryAttributeId(),
                                     'label' => isset($rowLabels[$column][$columnImageKey]) ? $rowLabels[$column][$columnImageKey] : '',
                                     'position' => ++$position,
@@ -1756,6 +1770,10 @@ class Product extends \Magento\ImportExport\Model\Import\Entity\AbstractEntity
                     }
                 }
 
+                //Add images to restore "hide from product page" value for specified store and product.
+                if (empty($mediaGallery[$storeId][$rowSku])) {
+                    $mediaGallery[$storeId][$rowSku]['all'] = ['restore' => true];
+                }
                 // 6. Attributes phase
                 $rowStore = (self::SCOPE_STORE == $rowScope)
                     ? $this->storeResolver->getStoreCodeToId($rowData[self::COL_STORE])
@@ -2075,66 +2093,64 @@ class Product extends \Magento\ImportExport\Model\Import\Entity\AbstractEntity
             return $this;
         }
         $this->initMediaGalleryResources();
-        $productIds = [];
         $imageNames = [];
         $multiInsertData = [];
         $valueToProductId = [];
-        foreach ($mediaGalleryData as $productSku => $mediaGalleryRows) {
-            $productId = $this->skuProcessor->getNewSku($productSku)[$this->getProductEntityLinkField()];
-            $productIds[] = $productId;
-            $insertedGalleryImgs = [];
-            foreach ($mediaGalleryRows as $insertValue) {
-                if (!in_array($insertValue['value'], $insertedGalleryImgs)) {
-                    $valueArr = [
-                        'attribute_id' => $insertValue['attribute_id'],
-                        'value' => $insertValue['value'],
-                    ];
-                    $valueToProductId[$insertValue['value']][] = $productId;
-                    $imageNames[] = $insertValue['value'];
-                    $multiInsertData[] = $valueArr;
-                    $insertedGalleryImgs[] = $insertValue['value'];
+        $mediaGalleryData = $this->restoreDisableImage($mediaGalleryData);
+        foreach (array_keys($mediaGalleryData) as $storeId) {
+            foreach ($mediaGalleryData[$storeId] as $productSku => $mediaGalleryRows) {
+                $productId = $this->skuProcessor->getNewSku($productSku)[$this->getProductEntityLinkField()];
+
+                $insertedGalleryImgs = [];
+                foreach ($mediaGalleryRows as $insertValue) {
+                    if (!in_array($insertValue['value'], $insertedGalleryImgs)) {
+                        $valueArr = [
+                            'attribute_id' => $insertValue['attribute_id'],
+                            'value' => $insertValue['value'],
+                        ];
+                        $valueToProductId[$insertValue['value']][] = $productId;
+                        $imageNames[] = $insertValue['value'];
+                        $multiInsertData[] = $valueArr;
+                        $insertedGalleryImgs[] = $insertValue['value'];
+                    }
                 }
             }
         }
-        $oldMediaValues = $this->_connection->fetchAssoc(
-            $this->_connection->select()->from($this->mediaGalleryTableName, ['value_id', 'value'])
-                ->where('value IN (?)', $imageNames)
-        );
-        $this->_connection->insertOnDuplicate($this->mediaGalleryTableName, $multiInsertData, []);
-        $multiInsertData = [];
+        $multiInsertData = $this->filterImageInsertData($multiInsertData, $imageNames);
+        if ($multiInsertData) {
+            $this->_connection->insertOnDuplicate($this->mediaGalleryTableName, $multiInsertData);
+        }
         $newMediaSelect = $this->_connection->select()->from($this->mediaGalleryTableName, ['value_id', 'value'])
             ->where('value IN (?)', $imageNames);
-        if (array_keys($oldMediaValues)) {
-            $newMediaSelect->where('value_id NOT IN (?)', array_keys($oldMediaValues));
-        }
-
         $dataForSkinnyTable = [];
+        $multiInsertData = [];
         $newMediaValues = $this->_connection->fetchAssoc($newMediaSelect);
-        foreach ($mediaGalleryData as $productSku => $mediaGalleryRows) {
-            foreach ($mediaGalleryRows as $insertValue) {
-                foreach ($newMediaValues as $value_id => $values) {
-                    if ($values['value'] == $insertValue['value']) {
-                        $insertValue['value_id'] = $value_id;
-                        $insertValue[$this->getProductEntityLinkField()]
-                            = array_shift($valueToProductId[$values['value']]);
-                        unset($newMediaValues[$value_id]);
-                        break;
+        foreach (array_keys($mediaGalleryData) as $storeId) {
+            foreach ($mediaGalleryData[$storeId] as $productSku => $mediaGalleryRows) {
+                foreach ($mediaGalleryRows as $insertValue) {
+                    foreach ($newMediaValues as $value_id => $values) {
+                        if ($values['value'] == $insertValue['value']) {
+                            $insertValue['value_id'] = $value_id;
+                            $insertValue[$this->getProductEntityLinkField()]
+                                = array_shift($valueToProductId[$values['value']]);
+                            break;
+                        }
+                    }
+                    if (isset($insertValue['value_id'])) {
+                        $valueArr = [
+                            'value_id' => $insertValue['value_id'],
+                            'store_id' => $storeId,
+                            $this->getProductEntityLinkField() => $insertValue[$this->getProductEntityLinkField()],
+                            'label' => $insertValue['label'],
+                            'position' => $insertValue['position'],
+                            'disabled' => $insertValue['disabled'],
+                        ];
+                        $multiInsertData[] = $valueArr;
+                        $dataForSkinnyTable[] = [
+                            'value_id' => $insertValue['value_id'],
+                            $this->getProductEntityLinkField() => $insertValue[$this->getProductEntityLinkField()],
+                        ];
                     }
-                }
-                if (isset($insertValue['value_id'])) {
-                    $valueArr = [
-                        'value_id' => $insertValue['value_id'],
-                        'store_id' => \Magento\Store\Model\Store::DEFAULT_STORE_ID,
-                        $this->getProductEntityLinkField() => $insertValue[$this->getProductEntityLinkField()],
-                        'label' => $insertValue['label'],
-                        'position' => $insertValue['position'],
-                        'disabled' => $insertValue['disabled'],
-                    ];
-                    $multiInsertData[] = $valueArr;
-                    $dataForSkinnyTable[] = [
-                        'value_id' => $insertValue['value_id'],
-                        $this->getProductEntityLinkField() => $insertValue[$this->getProductEntityLinkField()],
-                    ];
                 }
             }
         }
@@ -2155,6 +2171,7 @@ class Product extends \Magento\ImportExport\Model\Import\Entity\AbstractEntity
                 $this->_connection->quoteInto('value_id IN (?)', $newMediaValues)
             );
         }
+
         return $this;
     }
 
@@ -2976,4 +2993,64 @@ class Product extends \Magento\ImportExport\Model\Import\Entity\AbstractEntity
     {
         return $this->_oldSku[strtolower($sku)];
     }
+
+    /**
+     * Set product images 'disable' = 0 for specified store.
+     *
+     * @param array $mediaGalleryData
+     * @return array
+     */
+    private function restoreDisableImage(array $mediaGalleryData)
+    {
+        $restoreData = [];
+        foreach (array_keys($mediaGalleryData) as $storeId) {
+            foreach ($mediaGalleryData[$storeId] as $productSku => $mediaGalleryRows) {
+                $productId = $this->skuProcessor->getNewSku($productSku)[$this->getProductEntityLinkField()];
+                $restoreData[] = sprintf(
+                    'store_id = %s and %s = %s',
+                    $storeId,
+                    $this->getProductEntityLinkField(),
+                    $productId
+                );
+                if (isset($mediaGalleryRows['all']['restore'])) {
+                    unset($mediaGalleryData[$storeId][$productSku]);
+                }
+            }
+        }
+
+        $this->_connection->update(
+            $this->mediaGalleryValueTableName,
+            ['disabled' => 0],
+            new \Zend_Db_Expr(implode(' or ', $restoreData))
+        );
+
+        return $mediaGalleryData;
+    }
+
+    /**
+     * Remove existed images from insert data.
+     *
+     * @param array $multiInsertData
+     * @param array $imageNames
+     * @return array
+     */
+    private function filterImageInsertData(array $multiInsertData, array $imageNames)
+    {
+        //Remove image duplicates for stores.
+        $multiInsertData = array_map("unserialize", array_unique(array_map("serialize", $multiInsertData)));
+        $oldMediaValues = $this->_connection->fetchAssoc(
+            $this->_connection->select()->from($this->mediaGalleryTableName, ['value_id', 'value', 'attribute_id'])
+                ->where('value IN (?)', $imageNames)
+        );
+        foreach ($multiInsertData as $key => $data) {
+            foreach ($oldMediaValues as $mediaValue) {
+                if ($data['value'] == $mediaValue['value'] && $data['attribute_id'] == $mediaValue['attribute_id']) {
+                    unset($multiInsertData[$key]);
+                    break;
+                }
+            }
+        }
+
+        return $multiInsertData;
+    }
 }
diff --git a/dev/tests/integration/testsuite/Magento/CatalogImportExport/Model/Export/ProductTest.php b/dev/tests/integration/testsuite/Magento/CatalogImportExport/Model/Export/ProductTest.php
index 085d6fac0e0..269572ebcc2 100644
--- a/dev/tests/integration/testsuite/Magento/CatalogImportExport/Model/Export/ProductTest.php
+++ b/dev/tests/integration/testsuite/Magento/CatalogImportExport/Model/Export/ProductTest.php
@@ -9,6 +9,8 @@ namespace Magento\CatalogImportExport\Model\Export;
  * @magentoDataFixtureBeforeTransaction Magento/Catalog/_files/enable_reindex_schedule.php
  * @magentoAppIsolation enabled
  * @magentoDbIsolation enabled
+ *
+ * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
  */
 class ProductTest extends \PHPUnit\Framework\TestCase
 {
@@ -288,4 +290,37 @@ class ProductTest extends \PHPUnit\Framework\TestCase
         $this->assertNotContains('Simple Product Two', $exportData);
         $this->assertNotContains('Simple Product Not Visible On Storefront', $exportData);
     }
+
+    /**
+     * Test 'hide from product page' export for non-default store.
+     *
+     * @magentoDataFixture Magento/CatalogImportExport/_files/product_export_with_images.php
+     */
+    public function testExportWithMedia()
+    {
+        /** @var \Magento\Catalog\Api\ProductRepositoryInterface $productRepository */
+        $productRepository = $this->objectManager->get(\Magento\Catalog\Api\ProductRepositoryInterface::class);
+        $product = $productRepository->get('simple', 1);
+        $mediaGallery = $product->getData('media_gallery');
+        $image = array_shift($mediaGallery['images']);
+        $expected = [
+            'hide_from_product_page' => 'hide_from_product_page',
+            '' => '',
+            $image['file'] => $image['file'],
+        ];
+        $this->model->setWriter(
+            $this->objectManager->create(
+                \Magento\ImportExport\Model\Export\Adapter\Csv::class
+            )
+        );
+        $exportData = $this->model->export();
+        /** @var $varDirectory \Magento\Framework\Filesystem\Directory\WriteInterface */
+        $varDirectory = $this->objectManager->get(\Magento\Framework\Filesystem::class)
+            ->getDirectoryWrite(\Magento\Framework\App\Filesystem\DirectoryList::VAR_DIR);
+        $varDirectory->writeFile('test_product_with_image.csv', $exportData);
+        /** @var \Magento\Framework\File\Csv $csv */
+        $csv = $this->objectManager->get(\Magento\Framework\File\Csv::class);
+        $data = $csv->getDataPairs($varDirectory->getAbsolutePath('test_product_with_image.csv'), 76, 76);
+        self::assertSame($expected, $data);
+    }
 }
diff --git a/dev/tests/integration/testsuite/Magento/CatalogImportExport/Model/Import/ProductTest.php b/dev/tests/integration/testsuite/Magento/CatalogImportExport/Model/Import/ProductTest.php
index 0f9cb373e59..fc2a2de24f4 100644
--- a/dev/tests/integration/testsuite/Magento/CatalogImportExport/Model/Import/ProductTest.php
+++ b/dev/tests/integration/testsuite/Magento/CatalogImportExport/Model/Import/ProductTest.php
@@ -22,11 +22,10 @@ use Magento\CatalogImportExport\Model\Import\Product\RowValidatorInterface;
 use Magento\Framework\App\Bootstrap;
 use Magento\Framework\App\Filesystem\DirectoryList;
 use Magento\Framework\App\ObjectManager;
-use Magento\Framework\Registry;
 use Magento\Framework\Filesystem;
+use Magento\Framework\Registry;
 use Magento\ImportExport\Model\Import;
 use Magento\Store\Model\Store;
-use Magento\UrlRewrite\Model\UrlRewrite;
 
 /**
  * Class ProductTest
@@ -1919,4 +1918,23 @@ class ProductTest extends \Magento\TestFramework\Indexer\TestCase
             );
         }
     }
+
+    /**
+     * Test that product import with images for non-default store works properly.
+     *
+     * @magentoDataIsolation enabled
+     * @magentoDataFixture mediaImportImageFixture
+     * @magentoAppIsolation enabled
+     */
+    public function testImportImageForNonDefaultStore()
+    {
+        $this->importDataForMediaTest('import_media_two_stores.csv');
+        $product = $this->getProductBySku('simple_with_images');
+        $mediaGallery = $product->getData('media_gallery');
+        foreach ($mediaGallery['images'] as $image) {
+            $image['file'] === 'magento_image.jpg'
+                ? self::assertSame('1', $image['disabled'])
+                : self::assertSame('0', $image['disabled']);
+        }
+    }
 }
diff --git a/dev/tests/integration/testsuite/Magento/CatalogImportExport/Model/Import/_files/import_media_two_stores.csv b/dev/tests/integration/testsuite/Magento/CatalogImportExport/Model/Import/_files/import_media_two_stores.csv
new file mode 100644
index 00000000000..59f8df69f55
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/CatalogImportExport/Model/Import/_files/import_media_two_stores.csv
@@ -0,0 +1,3 @@
+sku,store_view_code,attribute_set_code,product_type,categories,product_websites,name,description,short_description,weight,product_online,tax_class_name,visibility,price,special_price,special_price_from_date,special_price_to_date,url_key,meta_title,meta_keywords,meta_description,base_image,base_image_label,small_image,small_image_label,thumbnail_image,thumbnail_image_label,swatch_image,swatch_image_label,created_at,updated_at,new_from_date,new_to_date,display_product_options_in,map_price,msrp_price,map_enabled,gift_message_available,custom_design,custom_design_from,custom_design_to,custom_layout_update,page_layout,product_options_container,msrp_display_actual_price_type,country_of_manufacture,additional_attributes,qty,out_of_stock_qty,use_config_min_qty,is_qty_decimal,allow_backorders,use_config_backorders,min_cart_qty,use_config_min_sale_qty,max_cart_qty,use_config_max_sale_qty,is_in_stock,notify_on_stock_below,use_config_notify_stock_qty,manage_stock,use_config_manage_stock,use_config_qty_increments,qty_increments,use_config_enable_qty_inc,enable_qty_increments,is_decimal_divided,website_id,related_skus,related_position,crosssell_skus,crosssell_position,upsell_skus,upsell_position,additional_images,additional_image_labels,hide_from_product_page,custom_options,bundle_price_type,bundle_sku_type,bundle_price_view,bundle_weight_type,bundle_values,bundle_shipment_type,configurable_variations,configurable_variation_labels,associated_skus
+simple_with_images,,Default,simple,Default Category,base,Simple Product,Description with <b>html tag</b>,Short description,1,1,0,"Catalog, Search",10,,,,simple-product,meta title,meta keyword,meta description,magento_image.jpg,,magento_image.jpg,,magento_image.jpg,,,,"11/1/17, 1:41 AM","11/1/17, 1:41 AM",,,Block after Info Column,,,,,,,,,,,,,,100,0,1,0,0,1,1,1,0,1,1,,1,0,1,1,0,1,0,0,0,,,,,,,magento_image.jpg,Image Alt Text,,"name=Test Select,type=drop_down,required=1,price=3.0000,price_type=fixed,sku=3-1-select,file_extension=,image_size_x=,image_size_y=,option_title=Option 1|name=Test Select,type=drop_down,required=1,price=3.0000,price_type=fixed,sku=3-2-select,file_extension=,image_size_x=,image_size_y=,option_title=Option 2|name=Test Field,type=field,required=1,price=1.0000,price_type=fixed,sku=1-text,max_characters=100,file_extension=,image_size_x=,image_size_y=|name=Test Radio,type=radio,required=1,price=3.0000,price_type=fixed,sku=4-1-radio,file_extension=,image_size_x=,image_size_y=,option_title=Option 1|name=Test Radio,type=radio,required=1,price=3.0000,price_type=fixed,sku=4-2-radio,file_extension=,image_size_x=,image_size_y=,option_title=Option 2|name=Test Date and Time,type=date_time,required=1,price=2.0000,price_type=fixed,sku=2-date,file_extension=,image_size_x=,image_size_y=",,,,,,,,,
+simple_with_images,default,Default,simple,,,,,,,,,,,,,,,,,,,Image Alt Text,,Image Alt Text,,Image Alt Text,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,magento_image.jpg,,,,,,,,,,
diff --git a/dev/tests/integration/testsuite/Magento/CatalogImportExport/_files/product_export_with_images.php b/dev/tests/integration/testsuite/Magento/CatalogImportExport/_files/product_export_with_images.php
new file mode 100644
index 00000000000..1c9dbbb5553
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/CatalogImportExport/_files/product_export_with_images.php
@@ -0,0 +1,47 @@
+<?php
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+require dirname(__DIR__, 2) . '/Catalog/_files/product_image.php';
+require dirname(__DIR__, 2) . '/Catalog/_files/product_simple.php';
+
+$objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
+/** @var \Magento\Catalog\Api\ProductRepositoryInterface $productRepository */
+$productRepository = $objectManager->create(\Magento\Catalog\Api\ProductRepositoryInterface::class);
+$product = $productRepository->get('simple');
+$product->setStoreId(0)
+    ->setImage('/m/a/magento_image.jpg')
+    ->setSmallImage('/m/a/magento_image.jpg')
+    ->setThumbnail('/m/a/magento_image.jpg')
+    ->setData(
+        'media_gallery',
+        [
+            'images' => [
+                [
+                    'file' => '/m/a/magento_image.jpg',
+                    'position' => 1,
+                    'label' => 'Image Alt Text',
+                    'disabled' => 0,
+                    'media_type' => 'image',
+                ],
+            ],
+        ]
+    )->save();
+$image = array_shift($product->getData('media_gallery')['images']);
+$product->setStoreId(1)->setData(
+    'media_gallery',
+    [
+        'images' => [
+            [
+                'file' => $image['file'],
+                'value_id' => $image['value_id'],
+                'position' => 1,
+                'label' => 'Image Alt Text',
+                'disabled' => 1,
+                'media_type' => 'image',
+            ],
+        ],
+    ]
+)->save();
-- 
GitLab


From b7703ac414d52093790eb1df1012f7b9492ad56f Mon Sep 17 00:00:00 2001
From: magento-engcom-team <mikola.malevanec@transoftgroup.com>
Date: Wed, 1 Nov 2017 16:28:23 +0200
Subject: [PATCH 073/380] 8255: Export Products action doesn't consider
 hide_for_product_page value.

---
 .../Magento/CatalogImportExport/Model/Import/Product.php     | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/app/code/Magento/CatalogImportExport/Model/Import/Product.php b/app/code/Magento/CatalogImportExport/Model/Import/Product.php
index 14fd7f58b7c..bdf7062e246 100644
--- a/app/code/Magento/CatalogImportExport/Model/Import/Product.php
+++ b/app/code/Magento/CatalogImportExport/Model/Import/Product.php
@@ -5,18 +5,19 @@
  */
 namespace Magento\CatalogImportExport\Model\Import;
 
+use Magento\Catalog\Model\Config as CatalogConfig;
 use Magento\Catalog\Model\Product\Visibility;
 use Magento\CatalogImportExport\Model\Import\Product\RowValidatorInterface as ValidatorInterface;
 use Magento\Framework\App\Filesystem\DirectoryList;
+use Magento\Framework\Filesystem;
 use Magento\Framework\Model\ResourceModel\Db\ObjectRelationProcessor;
 use Magento\Framework\Model\ResourceModel\Db\TransactionManagerInterface;
 use Magento\Framework\Stdlib\DateTime;
-use Magento\Framework\Filesystem;
 use Magento\ImportExport\Model\Import;
 use Magento\ImportExport\Model\Import\Entity\AbstractEntity;
 use Magento\ImportExport\Model\Import\ErrorProcessing\ProcessingError;
 use Magento\ImportExport\Model\Import\ErrorProcessing\ProcessingErrorAggregatorInterface;
-use Magento\Catalog\Model\Config as CatalogConfig;
+use Magento\Store\Model\Store;
 
 /**
  * Import entity product model
-- 
GitLab


From 426183c1c771c4897f2fa16b4d9c083090e0ccd3 Mon Sep 17 00:00:00 2001
From: magento-engcom-team <mikola.malevanec@transoftgroup.com>
Date: Thu, 2 Nov 2017 10:53:33 +0200
Subject: [PATCH 074/380] 8255: Export Products action doesn't consider
 hide_for_product_page value.

---
 .../Magento/CatalogImportExport/Model/Import/ProductTest.php     | 1 +
 1 file changed, 1 insertion(+)

diff --git a/dev/tests/integration/testsuite/Magento/CatalogImportExport/Model/Import/ProductTest.php b/dev/tests/integration/testsuite/Magento/CatalogImportExport/Model/Import/ProductTest.php
index fd9f24f980c..3d4dd7c9cf8 100644
--- a/dev/tests/integration/testsuite/Magento/CatalogImportExport/Model/Import/ProductTest.php
+++ b/dev/tests/integration/testsuite/Magento/CatalogImportExport/Model/Import/ProductTest.php
@@ -34,6 +34,7 @@ use Psr\Log\LoggerInterface;
  * @magentoDbIsolation enabled
  * @magentoDataFixtureBeforeTransaction Magento/Catalog/_files/enable_reindex_schedule.php
  * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
+ * @SuppressWarnings(PHPMD.ExcessiveClassComplexity)
  */
 class ProductTest extends \Magento\TestFramework\Indexer\TestCase
 {
-- 
GitLab


From 081a3b793be0b76eb0e8058d2e54efe17ddd5fb8 Mon Sep 17 00:00:00 2001
From: RomanKis <romaikiss@gmail.com>
Date: Thu, 2 Nov 2017 17:11:08 +0200
Subject: [PATCH 075/380] 11792: Can't add customizable options to product

---
 .../Product/Form/Modifier/CustomOptionsTest.php      | 12 +++++++++++-
 .../Product/Form/Modifier/CustomOptions.php          |  3 ++-
 2 files changed, 13 insertions(+), 2 deletions(-)

diff --git a/app/code/Magento/Catalog/Test/Unit/Ui/DataProvider/Product/Form/Modifier/CustomOptionsTest.php b/app/code/Magento/Catalog/Test/Unit/Ui/DataProvider/Product/Form/Modifier/CustomOptionsTest.php
index 921a8dcdfe6..1b81845234b 100644
--- a/app/code/Magento/Catalog/Test/Unit/Ui/DataProvider/Product/Form/Modifier/CustomOptionsTest.php
+++ b/app/code/Magento/Catalog/Test/Unit/Ui/DataProvider/Product/Form/Modifier/CustomOptionsTest.php
@@ -154,7 +154,17 @@ class CustomOptionsTest extends AbstractModifierTest
             ->method('getAll')
             ->willReturn([]);
 
-        $this->assertArrayHasKey(CustomOptions::GROUP_CUSTOM_OPTIONS_NAME, $this->getModel()->modifyMeta([]));
+        $meta = $this->getModel()->modifyMeta([]);
+
+        $this->assertArrayHasKey(CustomOptions::GROUP_CUSTOM_OPTIONS_NAME, $meta);
+
+        $buttonAdd = $meta['custom_options']['children']['container_header']['children']['button_add'];
+        $buttonAddTargetName = $buttonAdd['arguments']['data']['config']['actions'][0]['targetName'];
+        $expectedTargetName = '${ $.ns }.${ $.ns }.' . CustomOptions::GROUP_CUSTOM_OPTIONS_NAME
+            . '.' . CustomOptions::GRID_OPTIONS_NAME;
+
+        $this->assertEquals($expectedTargetName, $buttonAddTargetName);
+
     }
 
     /**
diff --git a/app/code/Magento/Catalog/Ui/DataProvider/Product/Form/Modifier/CustomOptions.php b/app/code/Magento/Catalog/Ui/DataProvider/Product/Form/Modifier/CustomOptions.php
index 73fecd17c69..7995926d27d 100755
--- a/app/code/Magento/Catalog/Ui/DataProvider/Product/Form/Modifier/CustomOptions.php
+++ b/app/code/Magento/Catalog/Ui/DataProvider/Product/Form/Modifier/CustomOptions.php
@@ -348,7 +348,8 @@ class CustomOptions extends AbstractModifier
                                 'sortOrder' => 20,
                                 'actions' => [
                                     [
-                                        'targetName' => 'ns = ${ $.ns }, index = ' . static::GRID_OPTIONS_NAME,
+                                        'targetName' => '${ $.ns }.${ $.ns }.' . static::GROUP_CUSTOM_OPTIONS_NAME
+                                            . '.' . static::GRID_OPTIONS_NAME,
                                         'actionName' => 'processingAddChild',
                                     ]
                                 ]
-- 
GitLab


From 559020c9c45b272f83a27180aa70ccb248ad19a7 Mon Sep 17 00:00:00 2001
From: RomanKis <romaikiss@gmail.com>
Date: Fri, 3 Nov 2017 10:48:18 +0200
Subject: [PATCH 076/380] 11792: Can't add customizable options to product

---
 .../Ui/DataProvider/Product/Form/Modifier/CustomOptionsTest.php  | 1 -
 1 file changed, 1 deletion(-)

diff --git a/app/code/Magento/Catalog/Test/Unit/Ui/DataProvider/Product/Form/Modifier/CustomOptionsTest.php b/app/code/Magento/Catalog/Test/Unit/Ui/DataProvider/Product/Form/Modifier/CustomOptionsTest.php
index 1b81845234b..dd9819cdbc5 100644
--- a/app/code/Magento/Catalog/Test/Unit/Ui/DataProvider/Product/Form/Modifier/CustomOptionsTest.php
+++ b/app/code/Magento/Catalog/Test/Unit/Ui/DataProvider/Product/Form/Modifier/CustomOptionsTest.php
@@ -164,7 +164,6 @@ class CustomOptionsTest extends AbstractModifierTest
             . '.' . CustomOptions::GRID_OPTIONS_NAME;
 
         $this->assertEquals($expectedTargetName, $buttonAddTargetName);
-
     }
 
     /**
-- 
GitLab


From 9193745655b641d142d487c5e88f1a839cff821e Mon Sep 17 00:00:00 2001
From: RomanKis <romaikiss@gmail.com>
Date: Fri, 3 Nov 2017 12:50:34 +0200
Subject: [PATCH 077/380] 11740: Sending emails from Admin in Multi-Store
 Environment defaults to Primary Store

---
 .../Sales/Model/Order/Email/SenderBuilder.php |  5 ++-
 .../Model/Order/Email/SenderBuilderTest.php   | 43 +++++++++++++++----
 .../Mail/Template/TransportBuilder.php        | 14 ++++++
 .../Unit/Template/TransportBuilderTest.php    | 20 +++++++++
 4 files changed, 73 insertions(+), 9 deletions(-)

diff --git a/app/code/Magento/Sales/Model/Order/Email/SenderBuilder.php b/app/code/Magento/Sales/Model/Order/Email/SenderBuilder.php
index 93c6f19b086..af3ace90908 100644
--- a/app/code/Magento/Sales/Model/Order/Email/SenderBuilder.php
+++ b/app/code/Magento/Sales/Model/Order/Email/SenderBuilder.php
@@ -98,6 +98,9 @@ class SenderBuilder
         $this->transportBuilder->setTemplateIdentifier($this->templateContainer->getTemplateId());
         $this->transportBuilder->setTemplateOptions($this->templateContainer->getTemplateOptions());
         $this->transportBuilder->setTemplateVars($this->templateContainer->getTemplateVars());
-        $this->transportBuilder->setFrom($this->identityContainer->getEmailIdentity());
+        $this->transportBuilder->setFromByStore(
+            $this->identityContainer->getEmailIdentity(),
+            $this->identityContainer->getStore()->getId()
+        );
     }
 }
diff --git a/app/code/Magento/Sales/Test/Unit/Model/Order/Email/SenderBuilderTest.php b/app/code/Magento/Sales/Test/Unit/Model/Order/Email/SenderBuilderTest.php
index 5319aa510be..d537cab8ff5 100644
--- a/app/code/Magento/Sales/Test/Unit/Model/Order/Email/SenderBuilderTest.php
+++ b/app/code/Magento/Sales/Test/Unit/Model/Order/Email/SenderBuilderTest.php
@@ -3,6 +3,7 @@
  * Copyright © Magento, Inc. All rights reserved.
  * See COPYING.txt for license details.
  */
+
 namespace Magento\Sales\Test\Unit\Model\Order\Email;
 
 use Magento\Sales\Model\Order\Email\SenderBuilder;
@@ -29,6 +30,11 @@ class SenderBuilderTest extends \PHPUnit\Framework\TestCase
      */
     protected $transportBuilder;
 
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    private $storeMock;
+
     protected function setUp()
     {
         $templateId = 'test_template_id';
@@ -42,7 +48,11 @@ class SenderBuilderTest extends \PHPUnit\Framework\TestCase
             ['getTemplateVars', 'getTemplateOptions', 'getTemplateId']
         );
 
-        $this->storeMock = $this->createPartialMock(\Magento\Store\Model\Store::class, ['getStoreId', '__wakeup']);
+        $this->storeMock = $this->createPartialMock(\Magento\Store\Model\Store::class, [
+            'getStoreId',
+            '__wakeup',
+            'getId',
+        ]);
 
         $this->identityContainerMock = $this->createPartialMock(
             \Magento\Sales\Model\Order\Email\Container\ShipmentIdentity::class,
@@ -52,14 +62,20 @@ class SenderBuilderTest extends \PHPUnit\Framework\TestCase
                 'getCustomerName',
                 'getTemplateOptions',
                 'getEmailCopyTo',
-                'getCopyMethod'
+                'getCopyMethod',
+                'getStore',
             ]
         );
 
-        $this->transportBuilder = $this->createPartialMock(\Magento\Framework\Mail\Template\TransportBuilder::class, [
-                'addTo', 'addBcc', 'getTransport',
-                'setTemplateIdentifier', 'setTemplateOptions', 'setTemplateVars',
-                'setFrom',
+        $this->transportBuilder = $this->createPartialMock(\Magento\Framework\Mail\Template\TransportBuilder::class,
+            [
+                'addTo',
+                'addBcc',
+                'getTransport',
+                'setTemplateIdentifier',
+                'setTemplateOptions',
+                'setTemplateVars',
+                'setFromByStore',
             ]);
 
         $this->templateContainerMock->expects($this->once())
@@ -85,7 +101,7 @@ class SenderBuilderTest extends \PHPUnit\Framework\TestCase
             ->method('getEmailIdentity')
             ->will($this->returnValue($emailIdentity));
         $this->transportBuilder->expects($this->once())
-            ->method('setFrom')
+            ->method('setFromByStore')
             ->with($this->equalTo($emailIdentity));
 
         $this->identityContainerMock->expects($this->once())
@@ -119,6 +135,12 @@ class SenderBuilderTest extends \PHPUnit\Framework\TestCase
         $this->identityContainerMock->expects($this->once())
             ->method('getCustomerName')
             ->will($this->returnValue($customerName));
+        $this->identityContainerMock->expects($this->once())
+            ->method('getStore')
+            ->willReturn($this->storeMock);
+        $this->storeMock->expects($this->once())
+            ->method('getId')
+            ->willReturn(1);
         $this->transportBuilder->expects($this->once())
             ->method('addTo')
             ->with($this->equalTo($customerEmail), $this->equalTo($customerName));
@@ -145,7 +167,12 @@ class SenderBuilderTest extends \PHPUnit\Framework\TestCase
         $this->transportBuilder->expects($this->once())
             ->method('addTo')
             ->with($this->equalTo('example@mail.com'));
-
+        $this->identityContainerMock->expects($this->once())
+            ->method('getStore')
+            ->willReturn($this->storeMock);
+        $this->storeMock->expects($this->once())
+            ->method('getId')
+            ->willReturn(1);
         $this->transportBuilder->expects($this->once())
             ->method('getTransport')
             ->will($this->returnValue($transportMock));
diff --git a/lib/internal/Magento/Framework/Mail/Template/TransportBuilder.php b/lib/internal/Magento/Framework/Mail/Template/TransportBuilder.php
index 18b241d77a4..8e474a58cda 100644
--- a/lib/internal/Magento/Framework/Mail/Template/TransportBuilder.php
+++ b/lib/internal/Magento/Framework/Mail/Template/TransportBuilder.php
@@ -171,6 +171,20 @@ class TransportBuilder
         return $this;
     }
 
+    /**
+     * Set mail from address by store.
+     *
+     * @param string|array $from
+     * @param string|int $store
+     * @return $this
+     */
+    public function setFromByStore($from, $store)
+    {
+        $result = $this->_senderResolver->resolve($from, $store);
+        $this->message->setFrom($result['email'], $result['name']);
+        return $this;
+    }
+
     /**
      * Set template identifier
      *
diff --git a/lib/internal/Magento/Framework/Mail/Test/Unit/Template/TransportBuilderTest.php b/lib/internal/Magento/Framework/Mail/Test/Unit/Template/TransportBuilderTest.php
index 696e0a9f310..ab03be5ee84 100644
--- a/lib/internal/Magento/Framework/Mail/Test/Unit/Template/TransportBuilderTest.php
+++ b/lib/internal/Magento/Framework/Mail/Test/Unit/Template/TransportBuilderTest.php
@@ -3,6 +3,7 @@
  * Copyright © Magento, Inc. All rights reserved.
  * See COPYING.txt for license details.
  */
+
 namespace Magento\Framework\Mail\Test\Unit\Template;
 
 use Magento\Framework\App\TemplateTypesInterface;
@@ -167,6 +168,25 @@ class TransportBuilderTest extends \PHPUnit\Framework\TestCase
         $this->builder->setFrom($sender);
     }
 
+    /**
+     * @return void
+     */
+    public function setFromByStore()
+    {
+        $sender = ['email' => 'from@example.com', 'name' => 'name'];
+        $store = 1;
+        $this->senderResolverMock->expects($this->once())
+            ->method('resolve')
+            ->with($sender, $store)
+            ->willReturn($sender);
+        $this->messageMock->expects($this->once())
+            ->method('setFrom')
+            ->with('from@example.com', 'name')
+            ->willReturnSelf();
+
+        $this->builder->setFromByStore($sender);
+    }
+
     /**
      * @return void
      */
-- 
GitLab


From ef03b523315c07c7cd26a5292885cf668a0b6e3d Mon Sep 17 00:00:00 2001
From: RomanKis <romaikiss@gmail.com>
Date: Fri, 3 Nov 2017 16:07:23 +0200
Subject: [PATCH 078/380] 11740: Sending emails from Admin in Multi-Store
 Environment defaults to Primary Store

---
 .../Sales/Test/Unit/Model/Order/Email/SenderBuilderTest.php | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/app/code/Magento/Sales/Test/Unit/Model/Order/Email/SenderBuilderTest.php b/app/code/Magento/Sales/Test/Unit/Model/Order/Email/SenderBuilderTest.php
index d537cab8ff5..00be3c10d64 100644
--- a/app/code/Magento/Sales/Test/Unit/Model/Order/Email/SenderBuilderTest.php
+++ b/app/code/Magento/Sales/Test/Unit/Model/Order/Email/SenderBuilderTest.php
@@ -67,7 +67,8 @@ class SenderBuilderTest extends \PHPUnit\Framework\TestCase
             ]
         );
 
-        $this->transportBuilder = $this->createPartialMock(\Magento\Framework\Mail\Template\TransportBuilder::class,
+        $this->transportBuilder = $this->createPartialMock(
+            \Magento\Framework\Mail\Template\TransportBuilder::class,
             [
                 'addTo',
                 'addBcc',
@@ -76,7 +77,8 @@ class SenderBuilderTest extends \PHPUnit\Framework\TestCase
                 'setTemplateOptions',
                 'setTemplateVars',
                 'setFromByStore',
-            ]);
+            ]
+        );
 
         $this->templateContainerMock->expects($this->once())
             ->method('getTemplateId')
-- 
GitLab


From 6d5c1f5414af9fc44868913ae484596c2fc04bc8 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Gonzalo=20M=C3=A9ndez=20Calzada?=
 <gonzalo.mendez@interactiv4.com>
Date: Sun, 5 Nov 2017 12:32:57 +0100
Subject: [PATCH 079/380] add swatch option: prevent loosing data and default
 value if data is not populated via adminhtml

---
 .../Magento/Swatches/Model/Plugin/EavAttribute.php | 14 +++++++++++---
 1 file changed, 11 insertions(+), 3 deletions(-)

diff --git a/app/code/Magento/Swatches/Model/Plugin/EavAttribute.php b/app/code/Magento/Swatches/Model/Plugin/EavAttribute.php
index f363ffe70e8..599406f4552 100644
--- a/app/code/Magento/Swatches/Model/Plugin/EavAttribute.php
+++ b/app/code/Magento/Swatches/Model/Plugin/EavAttribute.php
@@ -130,9 +130,17 @@ class EavAttribute
             $swatchesArray = $attribute->getData('swatchtext');
         }
         if ($canReplace == true) {
-            $attribute->setData('option', $optionsArray);
-            $attribute->setData('default', $defaultValue);
-            $attribute->setData('swatch', $swatchesArray);
+            if (!empty($optionsArray)) {
+                $attribute->setData('option', $optionsArray);
+            }
+            if (!empty($defaultValue)) {
+                $attribute->setData('default', $defaultValue);
+            } else {
+                $attribute->setData('default', [0 => $attribute->getDefaultValue()]);
+            }
+            if (!empty($swatchesArray)) {
+                $attribute->setData('swatch', $swatchesArray);
+            }
         }
     }
 
-- 
GitLab


From ed5d2f524410f34e632a9cec3ccc8348eb395420 Mon Sep 17 00:00:00 2001
From: luismi <luismiguelyange@interactiv4.com>
Date: Sun, 5 Nov 2017 13:53:09 +0100
Subject: [PATCH 080/380] change remove validation to modal close

---
 .../Product/Form/Modifier/AdvancedPricing.php | 21 ++++++++-----------
 1 file changed, 9 insertions(+), 12 deletions(-)

diff --git a/app/code/Magento/Catalog/Ui/DataProvider/Product/Form/Modifier/AdvancedPricing.php b/app/code/Magento/Catalog/Ui/DataProvider/Product/Form/Modifier/AdvancedPricing.php
index a8378c364a6..d66c8db01b4 100644
--- a/app/code/Magento/Catalog/Ui/DataProvider/Product/Form/Modifier/AdvancedPricing.php
+++ b/app/code/Magento/Catalog/Ui/DataProvider/Product/Form/Modifier/AdvancedPricing.php
@@ -7,14 +7,15 @@ namespace Magento\Catalog\Ui\DataProvider\Product\Form\Modifier;
 
 use Magento\Catalog\Api\Data\ProductAttributeInterface;
 use Magento\Catalog\Model\Locator\LocatorInterface;
-use Magento\Customer\Model\Customer\Source\GroupSourceInterface;
-use Magento\Directory\Helper\Data;
-use Magento\Framework\App\ObjectManager;
-use Magento\Store\Model\StoreManagerInterface;
 use Magento\Customer\Api\GroupManagementInterface;
 use Magento\Customer\Api\GroupRepositoryInterface;
+use Magento\Customer\Model\Customer\Source\GroupSourceInterface;
+use Magento\Directory\Helper\Data;
 use Magento\Framework\Api\SearchCriteriaBuilder;
+use Magento\Framework\App\ObjectManager;
 use Magento\Framework\Module\Manager as ModuleManager;
+use Magento\Framework\Stdlib\ArrayManager;
+use Magento\Store\Model\StoreManagerInterface;
 use Magento\Ui\Component\Container;
 use Magento\Ui\Component\Form\Element\DataType\Number;
 use Magento\Ui\Component\Form\Element\DataType\Price;
@@ -23,7 +24,6 @@ use Magento\Ui\Component\Form\Element\Input;
 use Magento\Ui\Component\Form\Element\Select;
 use Magento\Ui\Component\Form\Field;
 use Magento\Ui\Component\Modal;
-use Magento\Framework\Stdlib\ArrayManager;
 
 /**
  * Class AdvancedPricing
@@ -396,8 +396,7 @@ class AdvancedPricing extends AbstractModifier
                 'additionalForGroup' => true,
                 'provider' => false,
                 'source' => 'product_details',
-                'sortOrder' =>
-                    $this->arrayManager->get($pricePath . '/arguments/data/config/sortOrder', $this->meta) + 1,
+                'sortOrder' => $this->arrayManager->get($pricePath . '/arguments/data/config/sortOrder', $this->meta) + 1,
             ];
 
             $this->meta = $this->arrayManager->set(
@@ -434,8 +433,7 @@ class AdvancedPricing extends AbstractModifier
                         ],
                         'disabled' => false,
                         'required' => false,
-                        'sortOrder' =>
-                            $this->arrayManager->get($tierPricePath . '/arguments/data/config/sortOrder', $this->meta),
+                        'sortOrder' => $this->arrayManager->get($tierPricePath . '/arguments/data/config/sortOrder', $this->meta),
                     ],
                 ],
             ],
@@ -569,8 +567,7 @@ class AdvancedPricing extends AbstractModifier
                     'additionalClasses' => 'admin__control-grouped-date',
                     'breakLine' => false,
                     'component' => 'Magento_Ui/js/form/components/group',
-                    'scopeLabel' =>
-                        $this->arrayManager->get($pathFrom . '/arguments/data/config/scopeLabel', $this->meta),
+                    'scopeLabel' => $this->arrayManager->get($pathFrom . '/arguments/data/config/scopeLabel', $this->meta),
                 ]
             );
             $this->meta = $this->arrayManager->merge(
@@ -622,7 +619,7 @@ class AdvancedPricing extends AbstractModifier
             'componentType' => Modal::NAME,
             'dataScope' => '',
             'provider' => 'product_form.product_form_data_source',
-            'onCancel' => 'actionDone',
+            'onCancel' => 'closeModal',
             'options' => [
                 'title' => __('Advanced Pricing'),
                 'buttons' => [
-- 
GitLab


From 1caffdc0ef7e9b006444afab8f0060fe8684e29b Mon Sep 17 00:00:00 2001
From: luismi <luismiguelyange@interactiv4.com>
Date: Sun, 5 Nov 2017 22:49:53 +0100
Subject: [PATCH 081/380] Line exceeds maximum limit of 120 characters(travis),
 solved in this commit

-- 
GitLab


From c2a245037a3085c09d2e645b701affeca3b11ceb Mon Sep 17 00:00:00 2001
From: Pavel Bystritsky <p.bystritsky@yandex.ru>
Date: Mon, 6 Nov 2017 14:17:45 +0200
Subject: [PATCH 082/380] magento/magento2#9961: Unused product attributes
 display with value N/A or NO on storefront.

---
 .../Catalog/Block/Product/View/Attributes.php |   4 +-
 .../Unit/Block/Product/View/AttributeTest.php | 157 ++++++++++++++++++
 2 files changed, 160 insertions(+), 1 deletion(-)
 create mode 100644 app/code/Magento/Catalog/Test/Unit/Block/Product/View/AttributeTest.php

diff --git a/app/code/Magento/Catalog/Block/Product/View/Attributes.php b/app/code/Magento/Catalog/Block/Product/View/Attributes.php
index fbdda684343..a5caf5b79a2 100644
--- a/app/code/Magento/Catalog/Block/Product/View/Attributes.php
+++ b/app/code/Magento/Catalog/Block/Product/View/Attributes.php
@@ -85,13 +85,15 @@ class Attributes extends \Magento\Framework\View\Element\Template
 
                 if (!$product->hasData($attribute->getAttributeCode())) {
                     $value = __('N/A');
+                } elseif ($value instanceof Phrase) {
+                    $value = (string)$value;
                 } elseif ((string)$value == '') {
                     $value = __('No');
                 } elseif ($attribute->getFrontendInput() == 'price' && is_string($value)) {
                     $value = $this->priceCurrency->convertAndFormat($value);
                 }
 
-                if ($value instanceof Phrase || (is_string($value) && strlen($value))) {
+                if (is_string($value) && strlen($value)) {
                     $data[$attribute->getAttributeCode()] = [
                         'label' => __($attribute->getStoreLabel()),
                         'value' => $value,
diff --git a/app/code/Magento/Catalog/Test/Unit/Block/Product/View/AttributeTest.php b/app/code/Magento/Catalog/Test/Unit/Block/Product/View/AttributeTest.php
new file mode 100644
index 00000000000..2311af6ed8c
--- /dev/null
+++ b/app/code/Magento/Catalog/Test/Unit/Block/Product/View/AttributeTest.php
@@ -0,0 +1,157 @@
+<?php
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Catalog\Test\Unit\Block\Product\View;
+
+use \PHPUnit\Framework\TestCase;
+use \Magento\Framework\Phrase;
+use \Magento\Eav\Model\Entity\Attribute\AbstractAttribute;
+use \Magento\Eav\Model\Entity\Attribute\Frontend\AbstractFrontend;
+use \Magento\Catalog\Model\Product;
+use \Magento\Framework\View\Element\Template\Context;
+use \Magento\Framework\Registry;
+use \Magento\Framework\Pricing\PriceCurrencyInterface;
+use \Magento\Catalog\Block\Product\View\Attributes as AttributesBlock;
+
+/**
+ * Test class for \Magento\Catalog\Block\Product\View\Attributes
+ *
+ * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
+ */
+class AttributesTest extends TestCase
+{
+    /**
+     * @var \Magento\Framework\Phrase
+     */
+    private $phrase;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Eav\Model\Entity\Attribute\AbstractAttribute
+     */
+    private $attribute;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Eav\Model\Entity\Attribute\Frontend\AbstractFrontend
+     */
+    private $frontendAttribute;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Catalog\Model\Product
+     */
+    private $product;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Framework\View\Element\Template\Context
+     */
+    private $context;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Framework\Registry
+     */
+    private $registry;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Framework\Pricing\PriceCurrencyInterface
+     */
+    private $priceCurrencyInterface;
+
+    /**
+     * @var \Magento\Catalog\Block\Product\View\Attributes
+     */
+    private $attributesBlock;
+
+    protected function setUp()
+    {
+        $this->phrase = new Phrase(__(''));
+        $this->attribute = $this
+            ->getMockBuilder(AbstractAttribute::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $this->attribute
+            ->expects($this->any())
+            ->method('getIsVisibleOnFront')
+            ->willReturn(true);
+        $this->attribute
+            ->expects($this->any())
+            ->method('getAttributeCode')
+            ->willReturn('phrase');
+        $this->frontendAttribute = $this
+            ->getMockBuilder(AbstractFrontend::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $this->attribute
+            ->expects($this->any())
+            ->method('getFrontendInput')
+            ->willReturn('phrase');
+        $this->attribute
+            ->expects($this->any())
+            ->method('getFrontend')
+            ->willReturn($this->frontendAttribute);
+        $this->product = $this
+            ->getMockBuilder(Product::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $this->product
+            ->expects($this->any())
+            ->method('getAttributes')
+            ->willReturn([$this->attribute]);
+        $this->product
+            ->expects($this->any())
+            ->method('hasData')
+            ->willReturn(true);
+        $this->context = $this
+            ->getMockBuilder(Context::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $this->registry = $this
+            ->getMockBuilder(Registry::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $this->registry
+            ->expects($this->any())
+            ->method('registry')
+            ->willReturn($this->product);
+        $this->priceCurrencyInterface = $this
+            ->getMockBuilder(PriceCurrencyInterface::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $this->attributesBlock = new AttributesBlock(
+            $this->context,
+            $this->registry,
+            $this->priceCurrencyInterface
+        );
+    }
+
+    /**
+     * @return void
+     */
+    public function testGetAttributeNoValue()
+    {
+        $this->phrase = new Phrase(__(''));
+        $this->frontendAttribute
+            ->expects($this->any())
+            ->method('getValue')
+            ->willReturn($this->phrase);
+        $attributes = $this->attributesBlock->getAdditionalData();
+        $this->assertTrue(empty($attributes['phrase']));
+    }
+
+    /**
+     * @return void
+     */
+    public function testGetAttributeHasValue()
+    {
+        $this->phrase = new Phrase(__('Yes'));
+        $this->frontendAttribute
+            ->expects($this->any())
+            ->method('getValue')
+            ->willReturn($this->phrase);
+        $attributes = $this->attributesBlock->getAdditionalData();
+        $this->assertNotTrue(empty($attributes['phrase']));
+        $this->assertNotTrue(empty($attributes['phrase']['value']));
+        $this->assertEquals('Yes', $attributes['phrase']['value']);
+    }
+}
-- 
GitLab


From a5c064a315dee782d961777a813a141d3712a017 Mon Sep 17 00:00:00 2001
From: Pavel Bystritsky <p.bystritsky@yandex.ru>
Date: Mon, 6 Nov 2017 15:52:17 +0200
Subject: [PATCH 083/380] magento/magento2#9961: Unused product attributes
 display with value N/A or NO on storefront.

---
 .../Product/View/{AttributeTest.php => AttributesTest.php}    | 4 ++++
 1 file changed, 4 insertions(+)
 rename app/code/Magento/Catalog/Test/Unit/Block/Product/View/{AttributeTest.php => AttributesTest.php} (96%)

diff --git a/app/code/Magento/Catalog/Test/Unit/Block/Product/View/AttributeTest.php b/app/code/Magento/Catalog/Test/Unit/Block/Product/View/AttributesTest.php
similarity index 96%
rename from app/code/Magento/Catalog/Test/Unit/Block/Product/View/AttributeTest.php
rename to app/code/Magento/Catalog/Test/Unit/Block/Product/View/AttributesTest.php
index 2311af6ed8c..f3e3a5d579a 100644
--- a/app/code/Magento/Catalog/Test/Unit/Block/Product/View/AttributeTest.php
+++ b/app/code/Magento/Catalog/Test/Unit/Block/Product/View/AttributesTest.php
@@ -65,7 +65,9 @@ class AttributesTest extends TestCase
 
     protected function setUp()
     {
+        // @codingStandardsIgnoreStart
         $this->phrase = new Phrase(__(''));
+        // @codingStandardsIgnoreEnd
         $this->attribute = $this
             ->getMockBuilder(AbstractAttribute::class)
             ->disableOriginalConstructor()
@@ -130,7 +132,9 @@ class AttributesTest extends TestCase
      */
     public function testGetAttributeNoValue()
     {
+        // @codingStandardsIgnoreStart
         $this->phrase = new Phrase(__(''));
+        // @codingStandardsIgnoreEnd
         $this->frontendAttribute
             ->expects($this->any())
             ->method('getValue')
-- 
GitLab


From 3473c1c578f4c2c01ef410e303bca15e20789e37 Mon Sep 17 00:00:00 2001
From: Pavel Bystritsky <p.bystritsky@yandex.ru>
Date: Mon, 6 Nov 2017 18:15:39 +0200
Subject: [PATCH 084/380] magento/magento2#9961: Unused product attributes
 display with value N/A or NO on storefront.

---
 .../Test/Unit/Block/Product/View/AttributesTest.php      | 9 ++-------
 1 file changed, 2 insertions(+), 7 deletions(-)

diff --git a/app/code/Magento/Catalog/Test/Unit/Block/Product/View/AttributesTest.php b/app/code/Magento/Catalog/Test/Unit/Block/Product/View/AttributesTest.php
index f3e3a5d579a..4602a0d99f6 100644
--- a/app/code/Magento/Catalog/Test/Unit/Block/Product/View/AttributesTest.php
+++ b/app/code/Magento/Catalog/Test/Unit/Block/Product/View/AttributesTest.php
@@ -65,9 +65,6 @@ class AttributesTest extends TestCase
 
     protected function setUp()
     {
-        // @codingStandardsIgnoreStart
-        $this->phrase = new Phrase(__(''));
-        // @codingStandardsIgnoreEnd
         $this->attribute = $this
             ->getMockBuilder(AbstractAttribute::class)
             ->disableOriginalConstructor()
@@ -132,9 +129,7 @@ class AttributesTest extends TestCase
      */
     public function testGetAttributeNoValue()
     {
-        // @codingStandardsIgnoreStart
-        $this->phrase = new Phrase(__(''));
-        // @codingStandardsIgnoreEnd
+        $this->phrase = '';
         $this->frontendAttribute
             ->expects($this->any())
             ->method('getValue')
@@ -148,7 +143,7 @@ class AttributesTest extends TestCase
      */
     public function testGetAttributeHasValue()
     {
-        $this->phrase = new Phrase(__('Yes'));
+        $this->phrase = __('Yes');
         $this->frontendAttribute
             ->expects($this->any())
             ->method('getValue')
-- 
GitLab


From 0c82649c1f6e9151a5503782bdf874e3d4606fa8 Mon Sep 17 00:00:00 2001
From: RomanKis <romaikiss@gmail.com>
Date: Mon, 6 Nov 2017 17:23:32 +0200
Subject: [PATCH 085/380] 11946: Layer navigation showing wrong product count

---
 .../Mysql/Aggregation/DataProvider.php        |  67 ++-----
 .../Aggregation/DataProvider/QueryBuilder.php | 183 ++++++++++++++++++
 .../DataProvider/QueryBuilderTest.php         | 152 +++++++++++++++
 .../Mysql/Aggregation/DataProviderTest.php    |  67 +++----
 4 files changed, 380 insertions(+), 89 deletions(-)
 create mode 100644 app/code/Magento/CatalogSearch/Model/Adapter/Mysql/Aggregation/DataProvider/QueryBuilder.php
 create mode 100644 app/code/Magento/CatalogSearch/Test/Unit/Model/Adapter/Mysql/Aggregation/DataProvider/QueryBuilderTest.php

diff --git a/app/code/Magento/CatalogSearch/Model/Adapter/Mysql/Aggregation/DataProvider.php b/app/code/Magento/CatalogSearch/Model/Adapter/Mysql/Aggregation/DataProvider.php
index a2242ff0f35..5887c76e8dd 100644
--- a/app/code/Magento/CatalogSearch/Model/Adapter/Mysql/Aggregation/DataProvider.php
+++ b/app/code/Magento/CatalogSearch/Model/Adapter/Mysql/Aggregation/DataProvider.php
@@ -3,10 +3,11 @@
  * Copyright © Magento, Inc. All rights reserved.
  * See COPYING.txt for license details.
  */
+
 namespace Magento\CatalogSearch\Model\Adapter\Mysql\Aggregation;
 
 use Magento\Catalog\Model\Product;
-use Magento\CatalogInventory\Model\Stock;
+use Magento\CatalogSearch\Model\Adapter\Mysql\Aggregation\DataProvider\QueryBuilder;
 use Magento\Customer\Model\Session;
 use Magento\Eav\Model\Config;
 use Magento\Framework\App\ResourceConnection;
@@ -19,7 +20,7 @@ use Magento\Framework\Search\Request\BucketInterface;
 use Magento\Framework\App\ObjectManager;
 
 /**
- * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
+ * DataProvider for Catalog search Mysql.
  */
 class DataProvider implements DataProviderInterface
 {
@@ -48,23 +49,31 @@ class DataProvider implements DataProviderInterface
      */
     private $connection;
 
+    /**
+     * @var QueryBuilder;
+     */
+    private $queryBuilder;
+
     /**
      * @param Config $eavConfig
      * @param ResourceConnection $resource
      * @param ScopeResolverInterface $scopeResolver
      * @param Session $customerSession
+     * @param QueryBuilder|null $queryBuilder
      */
     public function __construct(
         Config $eavConfig,
         ResourceConnection $resource,
         ScopeResolverInterface $scopeResolver,
-        Session $customerSession
+        Session $customerSession,
+        QueryBuilder $queryBuilder = null
     ) {
         $this->eavConfig = $eavConfig;
         $this->resource = $resource;
         $this->connection = $resource->getConnection();
         $this->scopeResolver = $scopeResolver;
         $this->customerSession = $customerSession;
+        $this->queryBuilder = $queryBuilder ?: ObjectManager::getInstance()->get(QueryBuilder::class);
     }
 
     /**
@@ -79,47 +88,13 @@ class DataProvider implements DataProviderInterface
 
         $attribute = $this->eavConfig->getAttribute(Product::ENTITY, $bucket->getField());
 
-        $select = $this->getSelect();
-
-        $select->joinInner(
-            ['entities' => $entityIdsTable->getName()],
-            'main_table.entity_id  = entities.entity_id',
-            []
+        $select = $this->queryBuilder->build(
+            $attribute,
+            $entityIdsTable->getName(),
+            $currentScope,
+            $this->customerSession->getCustomerGroupId()
         );
 
-        if ($attribute->getAttributeCode() === 'price') {
-            /** @var \Magento\Store\Model\Store $store */
-            $store = $this->scopeResolver->getScope($currentScope);
-            if (!$store instanceof \Magento\Store\Model\Store) {
-                throw new \RuntimeException('Illegal scope resolved');
-            }
-            $table = $this->resource->getTableName('catalog_product_index_price');
-            $select->from(['main_table' => $table], null)
-                ->columns([BucketInterface::FIELD_VALUE => 'main_table.min_price'])
-                ->where('main_table.customer_group_id = ?', $this->customerSession->getCustomerGroupId())
-                ->where('main_table.website_id = ?', $store->getWebsiteId());
-        } else {
-            $currentScopeId = $this->scopeResolver->getScope($currentScope)
-                ->getId();
-            $table = $this->resource->getTableName(
-                'catalog_product_index_eav' . ($attribute->getBackendType() === 'decimal' ? '_decimal' : '')
-            );
-            $subSelect = $select;
-            $subSelect->from(['main_table' => $table], ['main_table.entity_id', 'main_table.value'])
-                ->distinct()
-                ->joinLeft(
-                    ['stock_index' => $this->resource->getTableName('cataloginventory_stock_status')],
-                    'main_table.source_id = stock_index.product_id',
-                    []
-                )
-                ->where('main_table.attribute_id = ?', $attribute->getAttributeId())
-                ->where('main_table.store_id = ? ', $currentScopeId)
-                ->where('stock_index.stock_status = ?', Stock::STOCK_IN_STOCK);
-            $parentSelect = $this->getSelect();
-            $parentSelect->from(['main_table' => $subSelect], ['main_table.value']);
-            $select = $parentSelect;
-        }
-
         return $select;
     }
 
@@ -130,12 +105,4 @@ class DataProvider implements DataProviderInterface
     {
         return $this->connection->fetchAssoc($select);
     }
-
-    /**
-     * @return Select
-     */
-    private function getSelect()
-    {
-        return $this->connection->select();
-    }
 }
diff --git a/app/code/Magento/CatalogSearch/Model/Adapter/Mysql/Aggregation/DataProvider/QueryBuilder.php b/app/code/Magento/CatalogSearch/Model/Adapter/Mysql/Aggregation/DataProvider/QueryBuilder.php
new file mode 100644
index 00000000000..d27b6dd2658
--- /dev/null
+++ b/app/code/Magento/CatalogSearch/Model/Adapter/Mysql/Aggregation/DataProvider/QueryBuilder.php
@@ -0,0 +1,183 @@
+<?php
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\CatalogSearch\Model\Adapter\Mysql\Aggregation\DataProvider;
+
+use Magento\CatalogInventory\Model\Configuration as CatalogInventoryConfiguration;
+use Magento\CatalogInventory\Model\Stock;
+use Magento\Eav\Model\Entity\Attribute\AbstractAttribute;
+use Magento\Framework\App\ObjectManager;
+use Magento\Framework\App\ResourceConnection;
+use Magento\Framework\App\ScopeResolverInterface;
+use Magento\Framework\DB\Adapter\AdapterInterface;
+use Magento\Framework\DB\Select;
+use Magento\Framework\Search\Request\BucketInterface;
+
+/**
+ *  Class for query building for Magento\CatalogSearch\Model\Adapter\Mysql\Aggregation\DataProvider.
+ */
+class QueryBuilder
+{
+    /**
+     * @var Resource
+     */
+    private $resource;
+
+    /**
+     * @var ScopeResolverInterface
+     */
+    private $scopeResolver;
+
+    /**
+     * @var CatalogInventoryConfiguration
+     */
+    private $inventoryConfig;
+
+    /**
+     * @var AdapterInterface
+     */
+    private $connection;
+
+    /**
+     * @param ResourceConnection $resource
+     * @param ScopeResolverInterface $scopeResolver
+     * @param CatalogInventoryConfiguration|null $inventoryConfig
+     */
+    public function __construct(
+        ResourceConnection $resource,
+        ScopeResolverInterface $scopeResolver,
+        CatalogInventoryConfiguration $inventoryConfig = null
+    ) {
+        $this->resource = $resource;
+        $this->scopeResolver = $scopeResolver;
+        $this->inventoryConfig = $inventoryConfig ?: ObjectManager::getInstance()->get(
+            CatalogInventoryConfiguration::class
+        );
+        $this->connection = $resource->getConnection();
+    }
+
+    /**
+     * Build select.
+     *
+     * @param AbstractAttribute $attribute
+     * @param string $tableName
+     * @param int $currentScope
+     * @param int $customerGroupId
+     *
+     * @return Select
+     */
+    public function build(
+        AbstractAttribute $attribute,
+        $tableName,
+        $currentScope,
+        $customerGroupId
+    ) {
+        $select = $this->getSelect();
+
+        $select->joinInner(
+            ['entities' => $tableName],
+            'main_table.entity_id  = entities.entity_id',
+            []
+        );
+
+        if ($attribute->getAttributeCode() === 'price') {
+            /** @var \Magento\Store\Model\Store $store */
+            $store = $this->scopeResolver->getScope($currentScope);
+            if (!$store instanceof \Magento\Store\Model\Store) {
+                throw new \RuntimeException('Illegal scope resolved');
+            }
+
+            $select = $this->buildIfPrice(
+                $store->getWebsiteId(),
+                $customerGroupId,
+                $select
+            );
+        } else {
+            $currentScopeId = $this->scopeResolver->getScope($currentScope)
+                ->getId();
+
+            $select = $this->buildIfNotPrice(
+                $currentScopeId,
+                $attribute,
+                $select
+            );
+        }
+
+        return $select;
+    }
+
+    /**
+     * Build select if it is price attribute.
+     *
+     * @param int $websiteId
+     * @param int $customerGroupId
+     * @param Select $select
+     *
+     * @return Select
+     */
+    private function buildIfPrice(
+        $websiteId,
+        $customerGroupId,
+        Select $select
+    ) {
+        $table = $this->resource->getTableName('catalog_product_index_price');
+        $select->from(['main_table' => $table], null)
+            ->columns([BucketInterface::FIELD_VALUE => 'main_table.min_price'])
+            ->where('main_table.customer_group_id = ?', $customerGroupId)
+            ->where('main_table.website_id = ?', $websiteId);
+
+        return $select;
+    }
+
+    /**
+     * Build select if it is not price attribute.
+     *
+     * @param int $currentScopeId
+     * @param AbstractAttribute $attribute
+     * @param Select $select
+     *
+     * @return Select
+     */
+    private function buildIfNotPrice(
+        $currentScopeId,
+        AbstractAttribute $attribute,
+        Select $select
+    ) {
+        $table = $this->resource->getTableName(
+            'catalog_product_index_eav' . ($attribute->getBackendType() === 'decimal' ? '_decimal' : '')
+        );
+        $subSelect = $select;
+        $subSelect->from(['main_table' => $table], ['main_table.entity_id', 'main_table.value'])
+            ->distinct()
+            ->joinLeft(
+                ['stock_index' => $this->resource->getTableName('cataloginventory_stock_status')],
+                'main_table.source_id = stock_index.product_id',
+                []
+            )
+            ->where('main_table.attribute_id = ?', $attribute->getAttributeId())
+            ->where('main_table.store_id = ? ', $currentScopeId);
+
+        if (!$this->inventoryConfig->isShowOutOfStock($currentScopeId)) {
+            $subSelect->where('stock_index.stock_status = ?', Stock::STOCK_IN_STOCK);
+        }
+
+        $parentSelect = $this->getSelect();
+        $parentSelect->from(['main_table' => $subSelect], ['main_table.value']);
+        $select = $parentSelect;
+
+        return $select;
+    }
+
+    /**
+     * Get empty select.
+     *
+     * @return Select
+     */
+    private function getSelect()
+    {
+        return $this->connection->select();
+    }
+}
diff --git a/app/code/Magento/CatalogSearch/Test/Unit/Model/Adapter/Mysql/Aggregation/DataProvider/QueryBuilderTest.php b/app/code/Magento/CatalogSearch/Test/Unit/Model/Adapter/Mysql/Aggregation/DataProvider/QueryBuilderTest.php
new file mode 100644
index 00000000000..3a5e2838ef2
--- /dev/null
+++ b/app/code/Magento/CatalogSearch/Test/Unit/Model/Adapter/Mysql/Aggregation/DataProvider/QueryBuilderTest.php
@@ -0,0 +1,152 @@
+<?php
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\CatalogSearch\Test\Unit\Model\Adapter\Mysql\Aggregation\DataProvider;
+
+use Magento\CatalogInventory\Model\Configuration as CatalogInventoryConfiguration;
+use Magento\CatalogInventory\Model\Stock;
+use Magento\CatalogSearch\Model\Adapter\Mysql\Aggregation\DataProvider\QueryBuilder;
+use Magento\Eav\Model\Entity\Attribute\AbstractAttribute;
+use Magento\Framework\App\ResourceConnection;
+use Magento\Framework\App\ScopeResolverInterface;
+use Magento\Framework\DB\Adapter\AdapterInterface;
+use Magento\Framework\DB\Select;
+use Magento\Store\Model\Store;
+
+/**
+ *  Test for Magento\CatalogSearch\Model\Adapter\Mysql\Aggregation\DataProvider\QueryBuilder.
+ */
+class QueryBuilderTest extends \PHPUnit\Framework\TestCase
+{
+    /**
+     * @var QueryBuilder
+     */
+    private $model;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    private $resourceConnectionMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    private $scopeResolverMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    private $adapterMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    private $inventoryConfigMock;
+
+    protected function setUp()
+    {
+        $this->resourceConnectionMock = $this->createMock(ResourceConnection::class);
+        $this->scopeResolverMock = $this->createMock(ScopeResolverInterface::class);
+        $this->adapterMock = $this->createMock(AdapterInterface::class);
+        $this->inventoryConfigMock = $this->createMock(CatalogInventoryConfiguration::class);
+
+        $this->resourceConnectionMock->expects($this->once())->method('getConnection')->willReturn($this->adapterMock);
+
+        $this->model = new QueryBuilder(
+            $this->resourceConnectionMock,
+            $this->scopeResolverMock,
+            $this->inventoryConfigMock
+        );
+    }
+
+    public function testBuildWithPriceAttributeCode()
+    {
+        $tableName = 'test_table';
+        $scope = 1;
+        $selectMock = $this->createMock(Select::class);
+        $attributeMock = $this->createMock(AbstractAttribute::class);
+        $storeMock = $this->createMock(Store::class);
+
+        $this->adapterMock->expects($this->atLeastOnce())->method('select')
+            ->willReturn($selectMock);
+        $selectMock->expects($this->once())->method('joinInner')
+            ->with(['entities' => $tableName], 'main_table.entity_id  = entities.entity_id', []);
+        $attributeMock->expects($this->once())->method('getAttributeCode')
+            ->willReturn('price');
+        $this->scopeResolverMock->expects($this->once())->method('getScope')
+            ->with($scope)->willReturn($storeMock);
+        $storeMock->expects($this->once())->method('getWebsiteId')->willReturn(1);
+        $this->resourceConnectionMock->expects($this->once())->method('getTableName')
+            ->with('catalog_product_index_price')->willReturn('catalog_product_index_price');
+        $selectMock->expects($this->once())->method('from')
+            ->with(['main_table' => 'catalog_product_index_price'], null)
+            ->willReturn($selectMock);
+        $selectMock->expects($this->once())->method('columns')
+            ->with(['value' => 'main_table.min_price'])
+            ->willReturn($selectMock);
+        $selectMock->expects($this->exactly(2))->method('where')
+            ->withConsecutive(
+                ['main_table.customer_group_id = ?', 1],
+                ['main_table.website_id = ?', 1]
+            )->willReturn($selectMock);
+
+        $this->model->build($attributeMock, $tableName, $scope, 1);
+    }
+
+    public function testBuildWithNotPriceAttributeCode()
+    {
+        $tableName = 'test_table';
+        $scope = 1;
+        $selectMock = $this->createMock(Select::class);
+        $attributeMock = $this->createMock(AbstractAttribute::class);
+        $storeMock = $this->createMock(Store::class);
+
+        $this->adapterMock->expects($this->atLeastOnce())->method('select')
+            ->willReturn($selectMock);
+        $selectMock->expects($this->once())->method('joinInner')
+            ->with(['entities' => $tableName], 'main_table.entity_id  = entities.entity_id', []);
+        $attributeMock->expects($this->once())->method('getBackendType')
+            ->willReturn('decimal');
+        $this->scopeResolverMock->expects($this->once())->method('getScope')
+            ->with($scope)->willReturn($storeMock);
+        $storeMock->expects($this->once())->method('getId')->willReturn(1);
+        $this->resourceConnectionMock->expects($this->exactly(2))->method('getTableName')
+            ->withConsecutive(
+                ['catalog_product_index_eav_decimal'],
+                ['cataloginventory_stock_status']
+            )->willReturnOnConsecutiveCalls(
+                'catalog_product_index_eav_decimal',
+                'cataloginventory_stock_status'
+            );
+
+        $selectMock->expects($this->exactly(2))->method('from')
+            ->withConsecutive(
+                [
+                    ['main_table' => 'catalog_product_index_eav_decimal'],
+                    ['main_table.entity_id', 'main_table.value']
+                ],
+                [['main_table' => $selectMock], ['main_table.value']]
+            )
+            ->willReturn($selectMock);
+        $selectMock->expects($this->once())->method('distinct')->willReturn($selectMock);
+        $selectMock->expects($this->once())->method('joinLeft')
+            ->with(
+                ['stock_index' => 'cataloginventory_stock_status'],
+                'main_table.source_id = stock_index.product_id',
+                []
+            )->willReturn($selectMock);
+        $attributeMock->expects($this->once())->method('getAttributeId')->willReturn(3);
+        $selectMock->expects($this->exactly(3))->method('where')
+            ->withConsecutive(
+                ['main_table.attribute_id = ?', 3],
+                ['main_table.store_id = ? ', 1],
+                ['stock_index.stock_status = ?', Stock::STOCK_IN_STOCK]
+            )->willReturn($selectMock);
+        $this->inventoryConfigMock->expects($this->once())->method('isShowOutOfStock')->with(1)->willReturn(false);
+
+        $this->model->build($attributeMock, $tableName, $scope, 1);
+    }
+}
diff --git a/app/code/Magento/CatalogSearch/Test/Unit/Model/Adapter/Mysql/Aggregation/DataProviderTest.php b/app/code/Magento/CatalogSearch/Test/Unit/Model/Adapter/Mysql/Aggregation/DataProviderTest.php
index 4305bc5cb07..7c558f60b74 100644
--- a/app/code/Magento/CatalogSearch/Test/Unit/Model/Adapter/Mysql/Aggregation/DataProviderTest.php
+++ b/app/code/Magento/CatalogSearch/Test/Unit/Model/Adapter/Mysql/Aggregation/DataProviderTest.php
@@ -7,6 +7,7 @@
 namespace Magento\CatalogSearch\Test\Unit\Model\Adapter\Mysql\Aggregation;
 
 use Magento\CatalogSearch\Model\Adapter\Mysql\Aggregation\DataProvider;
+use Magento\CatalogSearch\Model\Adapter\Mysql\Aggregation\DataProvider\QueryBuilder;
 use Magento\Eav\Model\Config;
 use Magento\Customer\Model\Session;
 use Magento\Framework\App\ResourceConnection;
@@ -21,6 +22,8 @@ use Magento\Catalog\Model\Product;
 use Magento\Framework\DB\Ddl\Table;
 
 /**
+ * Test for Magento\CatalogSearch\Model\Adapter\Mysql\Aggregation\DataProvider.
+ *
  * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
  */
 class DataProviderTest extends \PHPUnit\Framework\TestCase
@@ -55,6 +58,11 @@ class DataProviderTest extends \PHPUnit\Framework\TestCase
      */
     private $adapterMock;
 
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    private $queryBuilderMock;
+
     protected function setUp()
     {
         $this->eavConfigMock = $this->createMock(Config::class);
@@ -63,72 +71,53 @@ class DataProviderTest extends \PHPUnit\Framework\TestCase
         $this->sessionMock = $this->createMock(Session::class);
         $this->adapterMock = $this->createMock(AdapterInterface::class);
         $this->resourceConnectionMock->expects($this->once())->method('getConnection')->willReturn($this->adapterMock);
+        $this->queryBuilderMock = $this->createMock(QueryBuilder::class);
 
         $this->model = new DataProvider(
             $this->eavConfigMock,
             $this->resourceConnectionMock,
             $this->scopeResolverMock,
-            $this->sessionMock
+            $this->sessionMock,
+            $this->queryBuilderMock
         );
     }
 
-    public function testGetDataSetUsesFrontendPriceIndexerTableIfAttributeIsPrice()
+    public function testGetDataSet()
     {
         $storeId = 1;
-        $attributeCode = 'price';
+        $attributeCode = 'my_decimal';
 
         $scopeMock = $this->createMock(Store::class);
         $scopeMock->expects($this->any())->method('getId')->willReturn($storeId);
+
         $dimensionMock = $this->createMock(Dimension::class);
         $dimensionMock->expects($this->any())->method('getValue')->willReturn($storeId);
+
         $this->scopeResolverMock->expects($this->any())->method('getScope')->with($storeId)->willReturn($scopeMock);
 
         $bucketMock = $this->createMock(BucketInterface::class);
         $bucketMock->expects($this->once())->method('getField')->willReturn($attributeCode);
+
         $attributeMock = $this->createMock(Attribute::class);
-        $attributeMock->expects($this->any())->method('getAttributeCode')->willReturn($attributeCode);
-        $this->eavConfigMock->expects($this->once())
-            ->method('getAttribute')->with(Product::ENTITY, $attributeCode)
-            ->willReturn($attributeMock);
+        $this->eavConfigMock->expects($this->once())->method('getAttribute')
+            ->with(Product::ENTITY, $attributeCode)->willReturn($attributeMock);
 
-        $selectMock = $this->createMock(Select::class);
-        $selectMock->expects($this->any())->method('from')->willReturnSelf();
-        $selectMock->expects($this->any())->method('where')->willReturnSelf();
-        $selectMock->expects($this->any())->method('columns')->willReturnSelf();
-        $this->adapterMock->expects($this->once())->method('select')->willReturn($selectMock);
         $tableMock = $this->createMock(Table::class);
+        $tableMock->expects($this->once())->method('getName')->willReturn('test');
+
+        $this->sessionMock->expects($this->once())->method('getCustomerGroupId')->willReturn(1);
+
+        $this->queryBuilderMock->expects($this->once())->method('build')
+            ->with($attributeMock, 'test', $storeId, 1);
 
         $this->model->getDataSet($bucketMock, ['scope' => $dimensionMock], $tableMock);
     }
 
-    public function testGetDataSetUsesFrontendPriceIndexerTableForDecimalAttributes()
+    public function testExecute()
     {
-        $storeId = 1;
-        $attributeCode = 'my_decimal';
-
-        $scopeMock = $this->createMock(Store::class);
-        $scopeMock->expects($this->any())->method('getId')->willReturn($storeId);
-        $dimensionMock = $this->createMock(Dimension::class);
-        $dimensionMock->expects($this->any())->method('getValue')->willReturn($storeId);
-        $this->scopeResolverMock->expects($this->any())->method('getScope')->with($storeId)->willReturn($scopeMock);
-
-        $bucketMock = $this->createMock(BucketInterface::class);
-        $bucketMock->expects($this->once())->method('getField')->willReturn($attributeCode);
-        $attributeMock = $this->createMock(Attribute::class);
-        $attributeMock->expects($this->any())->method('getAttributeCode')->willReturn($attributeCode);
-        $this->eavConfigMock->expects($this->once())
-            ->method('getAttribute')->with(Product::ENTITY, $attributeCode)
-            ->willReturn($attributeMock);
-
         $selectMock = $this->createMock(Select::class);
-        $selectMock->expects($this->any())->method('from')->willReturnSelf();
-        $selectMock->expects($this->any())->method('distinct')->willReturnSelf();
-        $selectMock->expects($this->any())->method('where')->willReturnSelf();
-        $selectMock->expects($this->any())->method('columns')->willReturnSelf();
-        $selectMock->expects($this->any())->method('joinLeft')->willReturnSelf();
-        $selectMock->expects($this->any())->method('group')->willReturnSelf();
-        $this->adapterMock->expects($this->any())->method('select')->willReturn($selectMock);
-        $tableMock = $this->createMock(Table::class);
-        $this->model->getDataSet($bucketMock, ['scope' => $dimensionMock], $tableMock);
+        $this->adapterMock->expects($this->once())->method('fetchAssoc')->with($selectMock);
+
+        $this->model->execute($selectMock);
     }
 }
-- 
GitLab


From 66677ae715a7899a1c3f88ccf6e02a902757bfca Mon Sep 17 00:00:00 2001
From: RomanKis <romaikiss@gmail.com>
Date: Wed, 8 Nov 2017 14:44:34 +0200
Subject: [PATCH 086/380] 12064: Database Rollback not working with magento
 2.1.9?

---
 .../Framework/Setup/BackupRollback.php        | 25 +++++++++++++++++++
 .../Setup/Test/Unit/BackupRollbackTest.php    | 16 ++++++++----
 2 files changed, 36 insertions(+), 5 deletions(-)

diff --git a/lib/internal/Magento/Framework/Setup/BackupRollback.php b/lib/internal/Magento/Framework/Setup/BackupRollback.php
index c19b78101db..a3746112710 100644
--- a/lib/internal/Magento/Framework/Setup/BackupRollback.php
+++ b/lib/internal/Magento/Framework/Setup/BackupRollback.php
@@ -242,6 +242,10 @@ class BackupRollback
         $dbRollback->setTime($time[0]);
         $this->log->log('DB rollback is starting...');
         $dbRollback->setResourceModel($this->objectManager->create(\Magento\Backup\Model\ResourceModel\Db::class));
+        if ($dbRollback->getBackupFilename() !== $rollbackFile) {
+            $correctName = $this->getCorrectFileNameWithoutPrefix($dbRollback, $rollbackFile);
+            $dbRollback->setName($correctName);
+        }
         $dbRollback->rollback();
         $this->log->log('DB rollback filename: ' . $dbRollback->getBackupFilename());
         $this->log->log('DB rollback path: ' . $dbRollback->getBackupPath());
@@ -329,4 +333,25 @@ class BackupRollback
         $dbBackup = $this->objectManager->create(\Magento\Framework\Backup\Db::class);
         return $dbBackup->getDBSize();
     }
+
+    /**
+     * Get correct file name without prefix.
+     *
+     * @param \Magento\Framework\Backup\Db $dbRollback
+     * @param string $rollbackFile
+     *
+     * @return string
+     */
+    private function getCorrectFileNameWithoutPrefix(\Magento\Framework\Backup\Db $dbRollback, $rollbackFile)
+    {
+        $namePrefix = $dbRollback->getTime() . '_' . $dbRollback->getType();
+        //delete prefix.
+        $fileNameWithoutPrefix = str_replace($namePrefix, '', $rollbackFile);
+        //change '_' to ' '.
+        $fileNameWithoutPrefix = str_replace('_', ' ', $fileNameWithoutPrefix);
+        //delete file extension.
+        $fileNameWithoutPrefix = pathinfo($fileNameWithoutPrefix, PATHINFO_FILENAME);
+
+        return $fileNameWithoutPrefix;
+    }
 }
diff --git a/lib/internal/Magento/Framework/Setup/Test/Unit/BackupRollbackTest.php b/lib/internal/Magento/Framework/Setup/Test/Unit/BackupRollbackTest.php
index 1f9b776abab..5105b0dffde 100644
--- a/lib/internal/Magento/Framework/Setup/Test/Unit/BackupRollbackTest.php
+++ b/lib/internal/Magento/Framework/Setup/Test/Unit/BackupRollbackTest.php
@@ -181,6 +181,7 @@ class BackupRollbackTest extends \PHPUnit\Framework\TestCase
     public function testDbBackup()
     {
         $this->setupDbBackupRollback();
+        $this->database->expects($this->once())->method('getBackupFilename')->willReturn('RollbackFile_A.gz');
         $this->database->expects($this->once())->method('create');
         $this->file->expects($this->once())->method('isExists')->willReturn(false);
         $this->file->expects($this->once())->method('createDirectory');
@@ -190,12 +191,20 @@ class BackupRollbackTest extends \PHPUnit\Framework\TestCase
     public function testDbRollback()
     {
         $this->setupDbBackupRollback();
+
         $this->database->expects($this->once())->method('rollback');
+        $this->database->expects($this->exactly(2))->method('getBackupFilename')
+            ->willReturnOnConsecutiveCalls('test', '1510140748_db_test_backup');
+        $this->database->expects($this->once())->method('getTime')->willReturn(1510140748);
+        $this->database->expects($this->once())->method('getType')->willReturn('db');
+        $this->database->expects($this->once())->method('setName')->with(' test backup');
+
         $this->file->expects($this->once())
             ->method('isExists')
-            ->with($this->path . '/backups/12345_db.sql')
+            ->with($this->path . '/backups/1510140748_db_test_backup.sql')
             ->willReturn(true);
-        $this->model->dbRollback('12345_db.sql');
+
+        $this->model->dbRollback('1510140748_db_test_backup.sql');
     }
 
     private function setupCodeBackupRollback()
@@ -226,9 +235,6 @@ class BackupRollbackTest extends \PHPUnit\Framework\TestCase
             ->method('setBackupExtension');
         $this->database->expects($this->once())
             ->method('setTime');
-        $this->database->expects($this->once())
-            ->method('getBackupFilename')
-            ->willReturn('RollbackFile_A.gz');
         $this->database->expects($this->atLeastOnce())
             ->method('getBackupPath')
             ->willReturn('pathToFile/12345_db.sql');
-- 
GitLab


From 279b0c8e9f3a6ce90a71da3ce2642e122558d1aa Mon Sep 17 00:00:00 2001
From: RomanKis <romaikiss@gmail.com>
Date: Wed, 8 Nov 2017 17:55:18 +0200
Subject: [PATCH 087/380] 10210: Transport variable can not be altered in
 email_invoice_set_template_vars_before Event (backport MAGETWO-69482)

---
 .../Model/Order/Creditmemo/Sender/EmailSender.php     | 11 +++++++++--
 .../Order/Email/Sender/CreditmemoCommentSender.php    |  9 +++++++--
 .../Model/Order/Email/Sender/CreditmemoSender.php     | 11 ++++++++---
 .../Model/Order/Email/Sender/InvoiceCommentSender.php |  9 +++++++--
 .../Sales/Model/Order/Email/Sender/InvoiceSender.php  |  9 +++++++--
 .../Model/Order/Email/Sender/OrderCommentSender.php   |  9 +++++++--
 .../Order/Email/Sender/ShipmentCommentSender.php      |  9 +++++++--
 .../Sales/Model/Order/Email/Sender/ShipmentSender.php | 11 ++++++++---
 .../Sales/Model/Order/Invoice/Sender/EmailSender.php  | 11 +++++++++--
 .../Sales/Model/Order/Shipment/Sender/EmailSender.php | 11 +++++++++--
 .../Model/Order/Creditmemo/Sender/EmailSenderTest.php |  6 ++++--
 .../Model/Order/Invoice/Sender/EmailSenderTest.php    |  6 ++++--
 .../Model/Order/Shipment/Sender/EmailSenderTest.php   |  6 ++++--
 13 files changed, 90 insertions(+), 28 deletions(-)

diff --git a/app/code/Magento/Sales/Model/Order/Creditmemo/Sender/EmailSender.php b/app/code/Magento/Sales/Model/Order/Creditmemo/Sender/EmailSender.php
index 435b3aee4d6..ecd5670a319 100644
--- a/app/code/Magento/Sales/Model/Order/Creditmemo/Sender/EmailSender.php
+++ b/app/code/Magento/Sales/Model/Order/Creditmemo/Sender/EmailSender.php
@@ -7,9 +7,12 @@ namespace Magento\Sales\Model\Order\Creditmemo\Sender;
 
 use Magento\Sales\Model\Order\Email\Sender;
 use Magento\Sales\Model\Order\Creditmemo\SenderInterface;
+use Magento\Framework\DataObject;
 
 /**
  * Email notification sender for Creditmemo.
+ *
+ * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
  */
 class EmailSender extends Sender implements SenderInterface
 {
@@ -106,13 +109,17 @@ class EmailSender extends Sender implements SenderInterface
                 'formattedShippingAddress' => $this->getFormattedShippingAddress($order),
                 'formattedBillingAddress' => $this->getFormattedBillingAddress($order),
             ];
+            $transportObject = new DataObject($transport);
 
+            /**
+             * Event argument `transport` is @deprecated. Use `transportObject` instead.
+             */
             $this->eventManager->dispatch(
                 'email_creditmemo_set_template_vars_before',
-                ['sender' => $this, 'transport' => $transport]
+                ['sender' => $this, 'transport' => $transportObject->getData(), 'transportObject' => $transportObject]
             );
 
-            $this->templateContainer->setTemplateVars($transport);
+            $this->templateContainer->setTemplateVars($transportObject->getData());
 
             if ($this->checkAndSend($order)) {
                 $creditmemo->setEmailSent(true);
diff --git a/app/code/Magento/Sales/Model/Order/Email/Sender/CreditmemoCommentSender.php b/app/code/Magento/Sales/Model/Order/Email/Sender/CreditmemoCommentSender.php
index 510bc54dc05..ce72f0fee77 100644
--- a/app/code/Magento/Sales/Model/Order/Email/Sender/CreditmemoCommentSender.php
+++ b/app/code/Magento/Sales/Model/Order/Email/Sender/CreditmemoCommentSender.php
@@ -12,6 +12,7 @@ use Magento\Sales\Model\Order\Email\Container\Template;
 use Magento\Sales\Model\Order\Email\NotifySender;
 use Magento\Sales\Model\Order\Address\Renderer;
 use Magento\Framework\Event\ManagerInterface;
+use Magento\Framework\DataObject;
 
 /**
  * Class CreditmemoCommentSender
@@ -71,13 +72,17 @@ class CreditmemoCommentSender extends NotifySender
             'formattedShippingAddress' => $this->getFormattedShippingAddress($order),
             'formattedBillingAddress' => $this->getFormattedBillingAddress($order),
         ];
+        $transportObject = new DataObject($transport);
 
+        /**
+         * Event argument `transport` is @deprecated. Use `transportObject` instead.
+         */
         $this->eventManager->dispatch(
             'email_creditmemo_comment_set_template_vars_before',
-            ['sender' => $this, 'transport' => $transport]
+            ['sender' => $this, 'transport' => $transportObject->getData(), 'transportObject' => $transportObject]
         );
 
-        $this->templateContainer->setTemplateVars($transport);
+        $this->templateContainer->setTemplateVars($transportObject->getData());
 
         return $this->checkAndSend($order, $notify);
     }
diff --git a/app/code/Magento/Sales/Model/Order/Email/Sender/CreditmemoSender.php b/app/code/Magento/Sales/Model/Order/Email/Sender/CreditmemoSender.php
index a4ecd2aa7d0..80044835831 100644
--- a/app/code/Magento/Sales/Model/Order/Email/Sender/CreditmemoSender.php
+++ b/app/code/Magento/Sales/Model/Order/Email/Sender/CreditmemoSender.php
@@ -14,6 +14,7 @@ use Magento\Sales\Model\Order\Email\Sender;
 use Magento\Sales\Model\ResourceModel\Order\Creditmemo as CreditmemoResource;
 use Magento\Sales\Model\Order\Address\Renderer;
 use Magento\Framework\Event\ManagerInterface;
+use Magento\Framework\DataObject;
 
 /**
  * Class CreditmemoSender
@@ -102,7 +103,7 @@ class CreditmemoSender extends Sender
 
         if (!$this->globalConfig->getValue('sales_email/general/async_sending') || $forceSyncMode) {
             $order = $creditmemo->getOrder();
-            
+
             $transport = [
                 'order' => $order,
                 'creditmemo' => $creditmemo,
@@ -113,13 +114,17 @@ class CreditmemoSender extends Sender
                 'formattedShippingAddress' => $this->getFormattedShippingAddress($order),
                 'formattedBillingAddress' => $this->getFormattedBillingAddress($order),
             ];
+            $transportObject = new DataObject($transport);
 
+            /**
+             * Event argument `transport` is @deprecated. Use `transportObject` instead.
+             */
             $this->eventManager->dispatch(
                 'email_creditmemo_set_template_vars_before',
-                ['sender' => $this, 'transport' => $transport]
+                ['sender' => $this, 'transport' => $transportObject->getData(), 'transportObject' => $transportObject]
             );
 
-            $this->templateContainer->setTemplateVars($transport);
+            $this->templateContainer->setTemplateVars($transportObject->getData());
 
             if ($this->checkAndSend($order)) {
                 $creditmemo->setEmailSent(true);
diff --git a/app/code/Magento/Sales/Model/Order/Email/Sender/InvoiceCommentSender.php b/app/code/Magento/Sales/Model/Order/Email/Sender/InvoiceCommentSender.php
index 8f6401ff1cb..62d13eb8ce6 100644
--- a/app/code/Magento/Sales/Model/Order/Email/Sender/InvoiceCommentSender.php
+++ b/app/code/Magento/Sales/Model/Order/Email/Sender/InvoiceCommentSender.php
@@ -12,6 +12,7 @@ use Magento\Sales\Model\Order\Email\NotifySender;
 use Magento\Sales\Model\Order\Invoice;
 use Magento\Sales\Model\Order\Address\Renderer;
 use Magento\Framework\Event\ManagerInterface;
+use Magento\Framework\DataObject;
 
 /**
  * Class InvoiceCommentSender
@@ -71,13 +72,17 @@ class InvoiceCommentSender extends NotifySender
             'formattedShippingAddress' => $this->getFormattedShippingAddress($order),
             'formattedBillingAddress' => $this->getFormattedBillingAddress($order),
         ];
+        $transportObject = new DataObject($transport);
 
+        /**
+         * Event argument `transport` is @deprecated. Use `transportObject` instead.
+         */
         $this->eventManager->dispatch(
             'email_invoice_comment_set_template_vars_before',
-            ['sender' => $this, 'transport' => $transport]
+            ['sender' => $this, 'transport' => $transportObject->getData(), 'transportObject' => $transportObject]
         );
 
-        $this->templateContainer->setTemplateVars($transport);
+        $this->templateContainer->setTemplateVars($transportObject->getData());
 
         return $this->checkAndSend($order, $notify);
     }
diff --git a/app/code/Magento/Sales/Model/Order/Email/Sender/InvoiceSender.php b/app/code/Magento/Sales/Model/Order/Email/Sender/InvoiceSender.php
index c3083ddae2d..994fd79945c 100644
--- a/app/code/Magento/Sales/Model/Order/Email/Sender/InvoiceSender.php
+++ b/app/code/Magento/Sales/Model/Order/Email/Sender/InvoiceSender.php
@@ -14,6 +14,7 @@ use Magento\Sales\Model\Order\Invoice;
 use Magento\Sales\Model\ResourceModel\Order\Invoice as InvoiceResource;
 use Magento\Sales\Model\Order\Address\Renderer;
 use Magento\Framework\Event\ManagerInterface;
+use Magento\Framework\DataObject;
 
 /**
  * Class InvoiceSender
@@ -113,13 +114,17 @@ class InvoiceSender extends Sender
                 'formattedShippingAddress' => $this->getFormattedShippingAddress($order),
                 'formattedBillingAddress' => $this->getFormattedBillingAddress($order)
             ];
+            $transportObject = new DataObject($transport);
 
+            /**
+             * Event argument `transport` is @deprecated. Use `transportObject` instead.
+             */
             $this->eventManager->dispatch(
                 'email_invoice_set_template_vars_before',
-                ['sender' => $this, 'transport' => $transport]
+                ['sender' => $this, 'transport' => $transportObject->getData(), 'transportObject' => $transportObject]
             );
 
-            $this->templateContainer->setTemplateVars($transport);
+            $this->templateContainer->setTemplateVars($transportObject->getData());
 
             if ($this->checkAndSend($order)) {
                 $invoice->setEmailSent(true);
diff --git a/app/code/Magento/Sales/Model/Order/Email/Sender/OrderCommentSender.php b/app/code/Magento/Sales/Model/Order/Email/Sender/OrderCommentSender.php
index c8c1eb10d48..98cb9304a49 100644
--- a/app/code/Magento/Sales/Model/Order/Email/Sender/OrderCommentSender.php
+++ b/app/code/Magento/Sales/Model/Order/Email/Sender/OrderCommentSender.php
@@ -11,6 +11,7 @@ use Magento\Sales\Model\Order\Email\Container\Template;
 use Magento\Sales\Model\Order\Email\NotifySender;
 use Magento\Sales\Model\Order\Address\Renderer;
 use Magento\Framework\Event\ManagerInterface;
+use Magento\Framework\DataObject;
 
 /**
  * Class OrderCommentSender
@@ -68,13 +69,17 @@ class OrderCommentSender extends NotifySender
             'formattedShippingAddress' => $this->getFormattedShippingAddress($order),
             'formattedBillingAddress' => $this->getFormattedBillingAddress($order),
         ];
+        $transportObject = new DataObject($transport);
 
+        /**
+         * Event argument `transport` is @deprecated. Use `transportObject` instead.
+         */
         $this->eventManager->dispatch(
             'email_order_comment_set_template_vars_before',
-            ['sender' => $this, 'transport' => $transport]
+            ['sender' => $this, 'transport' => $transportObject->getData(), 'transportObject' => $transportObject]
         );
 
-        $this->templateContainer->setTemplateVars($transport);
+        $this->templateContainer->setTemplateVars($transportObject->getData());
 
         return $this->checkAndSend($order, $notify);
     }
diff --git a/app/code/Magento/Sales/Model/Order/Email/Sender/ShipmentCommentSender.php b/app/code/Magento/Sales/Model/Order/Email/Sender/ShipmentCommentSender.php
index 80c2ed35606..664f8ec9fc7 100644
--- a/app/code/Magento/Sales/Model/Order/Email/Sender/ShipmentCommentSender.php
+++ b/app/code/Magento/Sales/Model/Order/Email/Sender/ShipmentCommentSender.php
@@ -12,6 +12,7 @@ use Magento\Sales\Model\Order\Email\NotifySender;
 use Magento\Sales\Model\Order\Shipment;
 use Magento\Sales\Model\Order\Address\Renderer;
 use Magento\Framework\Event\ManagerInterface;
+use Magento\Framework\DataObject;
 
 /**
  * Class ShipmentCommentSender
@@ -71,13 +72,17 @@ class ShipmentCommentSender extends NotifySender
             'formattedShippingAddress' => $this->getFormattedShippingAddress($order),
             'formattedBillingAddress' => $this->getFormattedBillingAddress($order),
         ];
+        $transportObject = new DataObject($transport);
 
+        /**
+         * Event argument `transport` is @deprecated. Use `transportObject` instead.
+         */
         $this->eventManager->dispatch(
             'email_shipment_comment_set_template_vars_before',
-            ['sender' => $this, 'transport' => $transport]
+            ['sender' => $this, 'transport' => $transportObject->getData(), 'transportObject' => $transportObject]
         );
 
-        $this->templateContainer->setTemplateVars($transport);
+        $this->templateContainer->setTemplateVars($transportObject->getData());
 
         return $this->checkAndSend($order, $notify);
     }
diff --git a/app/code/Magento/Sales/Model/Order/Email/Sender/ShipmentSender.php b/app/code/Magento/Sales/Model/Order/Email/Sender/ShipmentSender.php
index ff2311067ba..6729c746f55 100644
--- a/app/code/Magento/Sales/Model/Order/Email/Sender/ShipmentSender.php
+++ b/app/code/Magento/Sales/Model/Order/Email/Sender/ShipmentSender.php
@@ -14,6 +14,7 @@ use Magento\Sales\Model\Order\Shipment;
 use Magento\Sales\Model\ResourceModel\Order\Shipment as ShipmentResource;
 use Magento\Sales\Model\Order\Address\Renderer;
 use Magento\Framework\Event\ManagerInterface;
+use Magento\Framework\DataObject;
 
 /**
  * Class ShipmentSender
@@ -102,7 +103,7 @@ class ShipmentSender extends Sender
 
         if (!$this->globalConfig->getValue('sales_email/general/async_sending') || $forceSyncMode) {
             $order = $shipment->getOrder();
-            
+
             $transport = [
                 'order' => $order,
                 'shipment' => $shipment,
@@ -113,13 +114,17 @@ class ShipmentSender extends Sender
                 'formattedShippingAddress' => $this->getFormattedShippingAddress($order),
                 'formattedBillingAddress' => $this->getFormattedBillingAddress($order)
             ];
+            $transportObject = new DataObject($transport);
 
+            /**
+             * Event argument `transport` is @deprecated. Use `transportObject` instead.
+             */
             $this->eventManager->dispatch(
                 'email_shipment_set_template_vars_before',
-                ['sender' => $this, 'transport' => $transport]
+                ['sender' => $this, 'transport' => $transportObject->getData(), 'transportObject' => $transportObject]
             );
 
-            $this->templateContainer->setTemplateVars($transport);
+            $this->templateContainer->setTemplateVars($transportObject->getData());
 
             if ($this->checkAndSend($order)) {
                 $shipment->setEmailSent(true);
diff --git a/app/code/Magento/Sales/Model/Order/Invoice/Sender/EmailSender.php b/app/code/Magento/Sales/Model/Order/Invoice/Sender/EmailSender.php
index 5daab1f4d9b..aa0687bee50 100644
--- a/app/code/Magento/Sales/Model/Order/Invoice/Sender/EmailSender.php
+++ b/app/code/Magento/Sales/Model/Order/Invoice/Sender/EmailSender.php
@@ -7,9 +7,12 @@ namespace Magento\Sales\Model\Order\Invoice\Sender;
 
 use Magento\Sales\Model\Order\Email\Sender;
 use Magento\Sales\Model\Order\Invoice\SenderInterface;
+use Magento\Framework\DataObject;
 
 /**
  * Email notification sender for Invoice.
+ *
+ * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
  */
 class EmailSender extends Sender implements SenderInterface
 {
@@ -106,13 +109,17 @@ class EmailSender extends Sender implements SenderInterface
                 'formattedShippingAddress' => $this->getFormattedShippingAddress($order),
                 'formattedBillingAddress' => $this->getFormattedBillingAddress($order),
             ];
+            $transportObject = new DataObject($transport);
 
+            /**
+             * Event argument `transport` is @deprecated. Use `transportObject` instead.
+             */
             $this->eventManager->dispatch(
                 'email_invoice_set_template_vars_before',
-                ['sender' => $this, 'transport' => $transport]
+                ['sender' => $this, 'transport' => $transportObject->getData(), 'transportObject' => $transportObject]
             );
 
-            $this->templateContainer->setTemplateVars($transport);
+            $this->templateContainer->setTemplateVars($transportObject->getData());
 
             if ($this->checkAndSend($order)) {
                 $invoice->setEmailSent(true);
diff --git a/app/code/Magento/Sales/Model/Order/Shipment/Sender/EmailSender.php b/app/code/Magento/Sales/Model/Order/Shipment/Sender/EmailSender.php
index 7c17a2d2d2f..0a393548069 100644
--- a/app/code/Magento/Sales/Model/Order/Shipment/Sender/EmailSender.php
+++ b/app/code/Magento/Sales/Model/Order/Shipment/Sender/EmailSender.php
@@ -7,9 +7,12 @@ namespace Magento\Sales\Model\Order\Shipment\Sender;
 
 use Magento\Sales\Model\Order\Email\Sender;
 use Magento\Sales\Model\Order\Shipment\SenderInterface;
+use Magento\Framework\DataObject;
 
 /**
  * Email notification sender for Shipment.
+ *
+ * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
  */
 class EmailSender extends Sender implements SenderInterface
 {
@@ -106,13 +109,17 @@ class EmailSender extends Sender implements SenderInterface
                 'formattedShippingAddress' => $this->getFormattedShippingAddress($order),
                 'formattedBillingAddress' => $this->getFormattedBillingAddress($order)
             ];
+            $transportObject = new DataObject($transport);
 
+            /**
+             * Event argument `transport` is @deprecated. Use `transportObject` instead.
+             */
             $this->eventManager->dispatch(
                 'email_shipment_set_template_vars_before',
-                ['sender' => $this, 'transport' => $transport]
+                ['sender' => $this, 'transport' => $transportObject->getData(), 'transportObject' => $transportObject]
             );
 
-            $this->templateContainer->setTemplateVars($transport);
+            $this->templateContainer->setTemplateVars($transportObject->getData());
 
             if ($this->checkAndSend($order)) {
                 $shipment->setEmailSent(true);
diff --git a/app/code/Magento/Sales/Test/Unit/Model/Order/Creditmemo/Sender/EmailSenderTest.php b/app/code/Magento/Sales/Test/Unit/Model/Order/Creditmemo/Sender/EmailSenderTest.php
index fa155cfd1d4..9fd2a8b0d92 100644
--- a/app/code/Magento/Sales/Test/Unit/Model/Order/Creditmemo/Sender/EmailSenderTest.php
+++ b/app/code/Magento/Sales/Test/Unit/Model/Order/Creditmemo/Sender/EmailSenderTest.php
@@ -262,6 +262,7 @@ class EmailSenderTest extends \PHPUnit\Framework\TestCase
                 'formattedShippingAddress' => 'Formatted address',
                 'formattedBillingAddress' => 'Formatted address',
             ];
+            $transport = new \Magento\Framework\DataObject($transport);
 
             $this->eventManagerMock->expects($this->once())
                 ->method('dispatch')
@@ -269,13 +270,14 @@ class EmailSenderTest extends \PHPUnit\Framework\TestCase
                     'email_creditmemo_set_template_vars_before',
                     [
                         'sender' => $this->subject,
-                        'transport' => $transport,
+                        'transport' => $transport->getData(),
+                        'transportObject' => $transport
                     ]
                 );
 
             $this->templateContainerMock->expects($this->once())
                 ->method('setTemplateVars')
-                ->with($transport);
+                ->with($transport->getData());
 
             $this->identityContainerMock->expects($this->once())
                 ->method('isEnabled')
diff --git a/app/code/Magento/Sales/Test/Unit/Model/Order/Invoice/Sender/EmailSenderTest.php b/app/code/Magento/Sales/Test/Unit/Model/Order/Invoice/Sender/EmailSenderTest.php
index f470b097dd7..8a4e2920ba2 100644
--- a/app/code/Magento/Sales/Test/Unit/Model/Order/Invoice/Sender/EmailSenderTest.php
+++ b/app/code/Magento/Sales/Test/Unit/Model/Order/Invoice/Sender/EmailSenderTest.php
@@ -260,6 +260,7 @@ class EmailSenderTest extends \PHPUnit\Framework\TestCase
                 'formattedShippingAddress' => 'Formatted address',
                 'formattedBillingAddress' => 'Formatted address',
             ];
+            $transport = new \Magento\Framework\DataObject($transport);
 
             $this->eventManagerMock->expects($this->once())
                 ->method('dispatch')
@@ -267,13 +268,14 @@ class EmailSenderTest extends \PHPUnit\Framework\TestCase
                     'email_invoice_set_template_vars_before',
                     [
                         'sender' => $this->subject,
-                        'transport' => $transport,
+                        'transport' => $transport->getData(),
+                        'transportObject' => $transport,
                     ]
                 );
 
             $this->templateContainerMock->expects($this->once())
                 ->method('setTemplateVars')
-                ->with($transport);
+                ->with($transport->getData());
 
             $this->identityContainerMock->expects($this->once())
                 ->method('isEnabled')
diff --git a/app/code/Magento/Sales/Test/Unit/Model/Order/Shipment/Sender/EmailSenderTest.php b/app/code/Magento/Sales/Test/Unit/Model/Order/Shipment/Sender/EmailSenderTest.php
index 3d37018a61b..94347e8b32d 100644
--- a/app/code/Magento/Sales/Test/Unit/Model/Order/Shipment/Sender/EmailSenderTest.php
+++ b/app/code/Magento/Sales/Test/Unit/Model/Order/Shipment/Sender/EmailSenderTest.php
@@ -262,6 +262,7 @@ class EmailSenderTest extends \PHPUnit\Framework\TestCase
                 'formattedShippingAddress' => 'Formatted address',
                 'formattedBillingAddress' => 'Formatted address',
             ];
+            $transport = new \Magento\Framework\DataObject($transport);
 
             $this->eventManagerMock->expects($this->once())
                 ->method('dispatch')
@@ -269,13 +270,14 @@ class EmailSenderTest extends \PHPUnit\Framework\TestCase
                     'email_shipment_set_template_vars_before',
                     [
                         'sender' => $this->subject,
-                        'transport' => $transport,
+                        'transport' => $transport->getData(),
+                        'transportObject' => $transport,
                     ]
                 );
 
             $this->templateContainerMock->expects($this->once())
                 ->method('setTemplateVars')
-                ->with($transport);
+                ->with($transport->getData());
 
             $this->identityContainerMock->expects($this->once())
                 ->method('isEnabled')
-- 
GitLab


From dd40f2b799381aa8475815774344eb4771920bef Mon Sep 17 00:00:00 2001
From: Hewerson Freitas <hewerson.freitas@gmail.com>
Date: Wed, 8 Nov 2017 16:33:12 -0300
Subject: [PATCH 088/380] Update AbstractBackend.php

Hello guys, when the validation message is returned, the attribute code is displayed.

That prevents a better translation for other languages, has been adjusted to return the label instead of the attribute code.

Adjustments on lines 234, 241, 254.
---
 .../Eav/Model/Entity/Attribute/Backend/AbstractBackend.php  | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/app/code/Magento/Eav/Model/Entity/Attribute/Backend/AbstractBackend.php b/app/code/Magento/Eav/Model/Entity/Attribute/Backend/AbstractBackend.php
index fab2ed182f3..206bff163f2 100644
--- a/app/code/Magento/Eav/Model/Entity/Attribute/Backend/AbstractBackend.php
+++ b/app/code/Magento/Eav/Model/Entity/Attribute/Backend/AbstractBackend.php
@@ -231,13 +231,14 @@ abstract class AbstractBackend implements \Magento\Eav\Model\Entity\Attribute\Ba
         $attribute = $this->getAttribute();
         $attrCode = $attribute->getAttributeCode();
         $value = $object->getData($attrCode);
+        $label = $attribute->getFrontend()->getLabel();
 
         if ($attribute->getIsVisible()
             && $attribute->getIsRequired()
             && $attribute->isValueEmpty($value)
             && $attribute->isValueEmpty($attribute->getDefaultValue())
         ) {
-            throw new LocalizedException(__('The value of attribute "%1" must be set', $attrCode));
+            throw new LocalizedException(__('The value of attribute "%1" must be set', $label));
         }
 
         if ($attribute->getIsUnique()
@@ -248,8 +249,7 @@ abstract class AbstractBackend implements \Magento\Eav\Model\Entity\Attribute\Ba
         }
 
         if ($attribute->getIsUnique()) {
-            if (!$attribute->getEntity()->checkAttributeUniqueValue($attribute, $object)) {
-                $label = $attribute->getFrontend()->getLabel();
+            if (!$attribute->getEntity()->checkAttributeUniqueValue($attribute, $object)) {               
                 throw new LocalizedException(__('The value of attribute "%1" must be unique', $label));
             }
         }
-- 
GitLab


From 90215616b1d6c3679729dd5a92de5c245b2f15aa Mon Sep 17 00:00:00 2001
From: Luke Rodgers <lukerodgers90@gmail.com>
Date: Sun, 5 Nov 2017 20:51:31 +0000
Subject: [PATCH 089/380] Add command to view mview state and queue

This is similar to the magerun1 command here: https://github.com/netz98/n98-magerun/pull/891

I like the ability to view the mview queue in realtime as its being processed, it can be quite helpful when debugging indexing issues.

This command will actually show how many items are in the list pending processing, as well information from the `mview_state` table.

```
php bin/magento indexer:status:mview
+---------------------------+----------+--------+---------------------+------------+---------+
| ID                        | Mode     | Status | Updated             | Version ID | Backlog |
+---------------------------+----------+--------+---------------------+------------+---------+
| catalog_category_product  | enabled  | idle   | 2017-11-02 10:00:00 | 1          | 0       |
| catalog_product_attribute | enabled  | idle   | 2017-11-02 10:00:00 | 1          | 1       |
| catalog_product_category  | disabled | idle   | 2017-11-02 10:00:00 | 1          | 0       |
| catalog_product_price     | enabled  | idle   | 2017-11-02 10:00:00 | 1          | 0       |
+---------------------------+----------+--------+---------------------+------------+---------+
```

I'll point this PR into 2.1.x and raise a separate PR to pop it into 2.2.x.
---
 .../Command/IndexerStatusMviewCommand.php     |  95 +++++++
 .../Command/IndexerStatusMviewCommandTest.php | 233 ++++++++++++++++++
 app/code/Magento/Indexer/etc/di.xml           |   1 +
 3 files changed, 329 insertions(+)
 create mode 100644 app/code/Magento/Indexer/Console/Command/IndexerStatusMviewCommand.php
 create mode 100644 app/code/Magento/Indexer/Test/Unit/Console/Command/IndexerStatusMviewCommandTest.php

diff --git a/app/code/Magento/Indexer/Console/Command/IndexerStatusMviewCommand.php b/app/code/Magento/Indexer/Console/Command/IndexerStatusMviewCommand.php
new file mode 100644
index 00000000000..4fb0c0bcb56
--- /dev/null
+++ b/app/code/Magento/Indexer/Console/Command/IndexerStatusMviewCommand.php
@@ -0,0 +1,95 @@
+<?php
+/**
+ * Copyright © 2013-2017 Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Indexer\Console\Command;
+
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Output\OutputInterface;
+use Symfony\Component\Console\Command\Command;
+use Magento\Framework\Mview\View;
+
+/**
+ * Command for displaying status of mview indexers.
+ */
+class IndexerStatusMviewCommand extends Command
+{
+    /** @var \Magento\Framework\Mview\View\CollectionInterface $mviewIndexersCollection */
+    private $mviewIndexersCollection;
+
+    public function __construct(
+        \Magento\Framework\Mview\View\CollectionInterface $collection
+    ) {
+        $this->mviewIndexersCollection = $collection;
+        parent::__construct();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function configure()
+    {
+        $this->setName('indexer:status:mview')
+            ->setDescription('Shows status of Mview Indexers and their queue status');
+
+        parent::configure();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function execute(InputInterface $input, OutputInterface $output)
+    {
+        try {
+            $table = $this->getHelperSet()->get('table');
+            $table->setHeaders(['ID', 'Mode', 'Status', 'Updated', 'Version ID', 'Backlog']);
+
+            $rows = [];
+
+            /** @var \Magento\Framework\Mview\View $indexer */
+            foreach ($this->mviewIndexersCollection as $indexer) {
+                $state = $indexer->getState();
+                $changelog = $indexer->getChangelog();
+
+                try {
+                    $currentVersionId = $changelog->getVersion();
+                } catch (View\ChangelogTableNotExistsException $e) {
+                    continue;
+                }
+
+                $pendingCount = count($changelog->getList($state->getVersionId(), $currentVersionId));
+
+                $pendingString = "<error>$pendingCount</error>";
+                if ($pendingCount <= 0) {
+                    $pendingString = "<info>$pendingCount</info>";
+                }
+
+                $rows[] = [
+                    $indexer->getData('view_id'),
+                    $state->getData('mode'),
+                    $state->getData('status'),
+                    $state->getData('updated'),
+                    $state->getData('version_id'),
+                    $pendingString,
+                ];
+            }
+
+            usort($rows, function($a, $b) {
+                return $a[0] <=> $b[0];
+            });
+
+            $table->addRows($rows);
+            $table->render($output);
+
+            return \Magento\Framework\Console\Cli::RETURN_SUCCESS;
+        } catch (\Exception $e) {
+            $output->writeln('<error>' . $e->getMessage() . '</error>');
+            if ($output->getVerbosity() >= OutputInterface::VERBOSITY_VERBOSE) {
+                $output->writeln($e->getTraceAsString());
+            }
+
+            return \Magento\Framework\Console\Cli::RETURN_FAILURE;
+        }
+    }
+}
diff --git a/app/code/Magento/Indexer/Test/Unit/Console/Command/IndexerStatusMviewCommandTest.php b/app/code/Magento/Indexer/Test/Unit/Console/Command/IndexerStatusMviewCommandTest.php
new file mode 100644
index 00000000000..7266d009a5e
--- /dev/null
+++ b/app/code/Magento/Indexer/Test/Unit/Console/Command/IndexerStatusMviewCommandTest.php
@@ -0,0 +1,233 @@
+<?php
+/**
+ * Copyright © 2013-2017 Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Indexer\Test\Unit\Console\Command;
+
+use \Magento\Framework\Mview;
+use Magento\Indexer\Console\Command\IndexerStatusMviewCommand;
+use Symfony\Component\Console\Tester\CommandTester;
+use Symfony\Component\Console\Helper\HelperSet;
+use Symfony\Component\Console\Helper\TableHelper;
+use Magento\Store\Model\Website;
+use Magento\Framework\Console\Cli;
+
+class IndexerStatusMviewCommandTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var IndexerStatusMviewCommand
+     */
+    private $command;
+
+    /**
+     * @var \Magento\Framework\TestFramework\Unit\Helper\ObjectManager
+     */
+    private $objectManager;
+
+    /**
+     * @var \Magento\Framework\Mview\View\Collection
+     */
+    private $collection;
+
+    protected function setUp()
+    {
+        $this->objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
+
+        /** @var \Magento\Framework\Mview\View\Collection $collection */
+        $this->collection = $this->objectManager->getObject(Mview\View\Collection::class);
+
+        $reflectedCollection = new \ReflectionObject($this->collection);
+        $isLoadedProperty = $reflectedCollection->getProperty('_isCollectionLoaded');
+        $isLoadedProperty->setAccessible(true);
+        $isLoadedProperty->setValue($this->collection, true);
+
+        $this->command = $this->objectManager->getObject(
+            IndexerStatusMviewCommand::class,
+            ['collection' => $this->collection]
+        );
+
+        /** @var HelperSet $helperSet */
+        $helperSet = $this->objectManager->getObject(
+            HelperSet::class,
+            ['helpers' => [$this->objectManager->getObject(TableHelper::class)]]
+        );
+
+        //Inject table helper for output
+        $this->command->setHelperSet($helperSet);
+    }
+
+    public function testExecute()
+    {
+        $mviews = [
+            [
+                'view' => [
+                    'view_id' => 'catalog_category_product',
+                    'mode' => 'enabled',
+                    'status' => 'idle',
+                    'updated' => '2017-01-01 11:11:11',
+                    'version_id' => 100,
+                ],
+                'changelog' => [
+                    'version_id' => 110
+                ],
+            ],
+            [
+                'view' => [
+                    'view_id' => 'catalog_product_category',
+                    'mode' => 'disabled',
+                    'status' => 'idle',
+                    'updated' => '2017-01-01 11:11:11',
+                    'version_id' => 100,
+                ],
+                'changelog' => [
+                    'version_id' => 200
+                ],
+            ],
+            [
+                'view' => [
+                    'view_id' => 'catalog_product_attribute',
+                    'mode' => 'enabled',
+                    'status' => 'idle',
+                    'updated' => '2017-01-01 11:11:11',
+                    'version_id' => 100,
+                ],
+                'changelog' => [
+                    'version_id' => 100
+                ],
+            ],
+        ];
+
+        foreach ($mviews as $data) {
+            $this->collection->addItem($this->generateMviewStub($data['view'], $data['changelog']));
+        }
+
+        /** @var Mview\View\Changelog|\PHPUnit_Framework_MockObject_MockObject $stub */
+        $changelog = $this->getMockBuilder(\Magento\Framework\Mview\View\Changelog::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $changelog->expects($this->any())
+            ->method('getVersion')
+            ->willThrowException(
+                new Mview\View\ChangelogTableNotExistsException(new \Magento\Framework\Phrase("Do not render"))
+            );
+
+        /** @var Mview\View|\PHPUnit_Framework_MockObject_MockObject $notInitiatedMview */
+        $notInitiatedMview = $this->getMockBuilder(\Magento\Framework\Mview\View::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $notInitiatedMview->expects($this->any())
+            ->method('getChangelog')
+            ->willReturn($changelog);
+
+        $this->collection->addItem($notInitiatedMview);
+
+        $tester = new CommandTester($this->command);
+        $this->assertEquals(Cli::RETURN_SUCCESS, $tester->execute([]));
+
+        $linesOutput = array_filter(explode(PHP_EOL, $tester->getDisplay()));
+        $this->assertCount(7, $linesOutput, 'There should be 7 lines output. 3 Spacers, 1 header, 3 content.');
+        $this->assertEquals($linesOutput[0], $linesOutput[2], "Lines 0, 2, 7 should be spacer lines");
+        $this->assertEquals($linesOutput[2], $linesOutput[6], "Lines 0, 2, 6 should be spacer lines");
+
+        $headerValues = array_values(array_filter(explode('|', $linesOutput[1])));
+        $this->assertEquals('ID', trim($headerValues[0]));
+        $this->assertEquals('Mode', trim($headerValues[1]));
+        $this->assertEquals('Status', trim($headerValues[2]));
+        $this->assertEquals('Updated', trim($headerValues[3]));
+        $this->assertEquals('Version ID', trim($headerValues[4]));
+        $this->assertEquals('Backlog', trim($headerValues[5]));
+
+        $catalogCategoryProductMviewData = array_values(array_filter(explode('|', $linesOutput[3])));
+        $this->assertEquals('catalog_category_product', trim($catalogCategoryProductMviewData[0]));
+        $this->assertEquals('enabled', trim($catalogCategoryProductMviewData[1]));
+        $this->assertEquals('idle', trim($catalogCategoryProductMviewData[2]));
+        $this->assertEquals('2017-01-01 11:11:11', trim($catalogCategoryProductMviewData[3]));
+        $this->assertEquals('100', trim($catalogCategoryProductMviewData[4]));
+        $this->assertEquals('10', trim($catalogCategoryProductMviewData[5]));
+        unset($catalogCategoryProductMviewData);
+
+        $catalogProductAttributeMviewData = array_values(array_filter(explode('|', $linesOutput[4])));
+        $this->assertEquals('catalog_product_attribute', trim($catalogProductAttributeMviewData[0]));
+        $this->assertEquals('enabled', trim($catalogProductAttributeMviewData[1]));
+        $this->assertEquals('idle', trim($catalogProductAttributeMviewData[2]));
+        $this->assertEquals('2017-01-01 11:11:11', trim($catalogProductAttributeMviewData[3]));
+        $this->assertEquals('100', trim($catalogProductAttributeMviewData[4]));
+        $this->assertEquals('0', trim($catalogProductAttributeMviewData[5]));
+        unset($catalogProductAttributeMviewData);
+
+        $catalogCategoryProductMviewData = array_values(array_filter(explode('|', $linesOutput[5])));
+        $this->assertEquals('catalog_product_category', trim($catalogCategoryProductMviewData[0]));
+        $this->assertEquals('disabled', trim($catalogCategoryProductMviewData[1]));
+        $this->assertEquals('idle', trim($catalogCategoryProductMviewData[2]));
+        $this->assertEquals('2017-01-01 11:11:11', trim($catalogCategoryProductMviewData[3]));
+        $this->assertEquals('100', trim($catalogCategoryProductMviewData[4]));
+        $this->assertEquals('100', trim($catalogCategoryProductMviewData[5]));
+        unset($catalogCategoryProductMviewData);
+    }
+
+    /**
+     * @param array $viewData
+     * @param array $changelogData
+     * @return Mview\View|Mview\View\Changelog|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected function generateMviewStub(array $viewData, array $changelogData)
+    {
+        /** @var Mview\View\Changelog|\PHPUnit_Framework_MockObject_MockObject $stub */
+        $changelog = $this->getMockBuilder(\Magento\Framework\Mview\View\Changelog::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $list = [];
+        if ($changelogData['version_id'] !== $viewData['version_id']) {
+            $list = range($viewData['version_id']+1, $changelogData['version_id']);
+        }
+
+        $changelog->expects($this->any())
+            ->method('getList')
+            ->willReturn($list);
+
+        $changelog->expects($this->any())
+            ->method('getVersion')
+            ->willReturn($changelogData['version_id']);
+
+        /** @var Mview\View|\PHPUnit_Framework_MockObject_MockObject $stub */
+        $stub = $this->getMockBuilder(\Magento\Framework\Mview\View::class)
+            ->disableOriginalConstructor()
+            ->setMethods(['getChangelog', 'getState'])
+            ->getMock();
+
+        $stub->expects($this->any())
+            ->method('getChangelog')
+            ->willReturn($changelog);
+
+        $stub->expects($this->any())
+            ->method('getState')
+            ->willReturnSelf();
+
+        $stub->setData($viewData);
+
+        return $stub;
+    }
+
+    public function testExecuteExceptionNoVerbosity()
+    {
+        /** @var \Magento\Framework\Mview\View|\PHPUnit_Framework_MockObject_MockObject $stub */
+        $stub = $this->getMockBuilder(Mview\View::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $stub->expects($this->any())
+            ->method('getChangelog')
+            ->willThrowException(new \Exception("Dummy test exception"));
+
+        $this->collection->addItem($stub);
+
+        $tester = new CommandTester($this->command);
+        $this->assertEquals(Cli::RETURN_FAILURE, $tester->execute([]));
+        $linesOutput = array_filter(explode(PHP_EOL, $tester->getDisplay()));
+        $this->assertEquals('Dummy test exception', $linesOutput[0]);
+    }
+}
diff --git a/app/code/Magento/Indexer/etc/di.xml b/app/code/Magento/Indexer/etc/di.xml
index 610f08fac3a..266cf72c50d 100644
--- a/app/code/Magento/Indexer/etc/di.xml
+++ b/app/code/Magento/Indexer/etc/di.xml
@@ -51,6 +51,7 @@
                 <item name="set-mode" xsi:type="object">Magento\Indexer\Console\Command\IndexerSetModeCommand</item>
                 <item name="show-mode" xsi:type="object">Magento\Indexer\Console\Command\IndexerShowModeCommand</item>
                 <item name="status" xsi:type="object">Magento\Indexer\Console\Command\IndexerStatusCommand</item>
+                <item name="status-mview" xsi:type="object">Magento\Indexer\Console\Command\IndexerStatusMviewCommand</item>
                 <item name="reset" xsi:type="object">Magento\Indexer\Console\Command\IndexerResetStateCommand</item>
             </argument>
         </arguments>
-- 
GitLab


From 1e34fde22bf5ceba0ddedf425de9edfb9f50b3b0 Mon Sep 17 00:00:00 2001
From: Luke Rodgers <lukerodgers90@gmail.com>
Date: Sun, 5 Nov 2017 21:23:23 +0000
Subject: [PATCH 090/380] Make indexer status mview 5.5 compatible

---
 .../Command/IndexerStatusMviewCommand.php     |  4 +-
 .../Command/IndexerStatusMviewCommandTest.php | 54 +++++++++++--------
 2 files changed, 34 insertions(+), 24 deletions(-)

diff --git a/app/code/Magento/Indexer/Console/Command/IndexerStatusMviewCommand.php b/app/code/Magento/Indexer/Console/Command/IndexerStatusMviewCommand.php
index 4fb0c0bcb56..61461a0ba61 100644
--- a/app/code/Magento/Indexer/Console/Command/IndexerStatusMviewCommand.php
+++ b/app/code/Magento/Indexer/Console/Command/IndexerStatusMviewCommand.php
@@ -75,8 +75,8 @@ class IndexerStatusMviewCommand extends Command
                 ];
             }
 
-            usort($rows, function($a, $b) {
-                return $a[0] <=> $b[0];
+            usort($rows, function ($a, $b) {
+                return strcmp($a[0], $b[0]);
             });
 
             $table->addRows($rows);
diff --git a/app/code/Magento/Indexer/Test/Unit/Console/Command/IndexerStatusMviewCommandTest.php b/app/code/Magento/Indexer/Test/Unit/Console/Command/IndexerStatusMviewCommandTest.php
index 7266d009a5e..e6a782cba92 100644
--- a/app/code/Magento/Indexer/Test/Unit/Console/Command/IndexerStatusMviewCommandTest.php
+++ b/app/code/Magento/Indexer/Test/Unit/Console/Command/IndexerStatusMviewCommandTest.php
@@ -13,6 +13,9 @@ use Symfony\Component\Console\Helper\TableHelper;
 use Magento\Store\Model\Website;
 use Magento\Framework\Console\Cli;
 
+/**
+ * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
+ */
 class IndexerStatusMviewCommandTest extends \PHPUnit_Framework_TestCase
 {
     /**
@@ -101,28 +104,7 @@ class IndexerStatusMviewCommandTest extends \PHPUnit_Framework_TestCase
         foreach ($mviews as $data) {
             $this->collection->addItem($this->generateMviewStub($data['view'], $data['changelog']));
         }
-
-        /** @var Mview\View\Changelog|\PHPUnit_Framework_MockObject_MockObject $stub */
-        $changelog = $this->getMockBuilder(\Magento\Framework\Mview\View\Changelog::class)
-            ->disableOriginalConstructor()
-            ->getMock();
-
-        $changelog->expects($this->any())
-            ->method('getVersion')
-            ->willThrowException(
-                new Mview\View\ChangelogTableNotExistsException(new \Magento\Framework\Phrase("Do not render"))
-            );
-
-        /** @var Mview\View|\PHPUnit_Framework_MockObject_MockObject $notInitiatedMview */
-        $notInitiatedMview = $this->getMockBuilder(\Magento\Framework\Mview\View::class)
-            ->disableOriginalConstructor()
-            ->getMock();
-
-        $notInitiatedMview->expects($this->any())
-            ->method('getChangelog')
-            ->willReturn($changelog);
-
-        $this->collection->addItem($notInitiatedMview);
+        $this->collection->addItem($this->getNeverEnabledMviewIndexerWithNoTable());
 
         $tester = new CommandTester($this->command);
         $this->assertEquals(Cli::RETURN_SUCCESS, $tester->execute([]));
@@ -212,6 +194,34 @@ class IndexerStatusMviewCommandTest extends \PHPUnit_Framework_TestCase
         return $stub;
     }
 
+    /**
+     * @return Mview\View|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected function getNeverEnabledMviewIndexerWithNoTable()
+    {
+        /** @var Mview\View\Changelog|\PHPUnit_Framework_MockObject_MockObject $stub */
+        $changelog = $this->getMockBuilder(\Magento\Framework\Mview\View\Changelog::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $changelog->expects($this->any())
+            ->method('getVersion')
+            ->willThrowException(
+                new Mview\View\ChangelogTableNotExistsException(new \Magento\Framework\Phrase("Do not render"))
+            );
+
+        /** @var Mview\View|\PHPUnit_Framework_MockObject_MockObject $notInitiatedMview */
+        $notInitiatedMview = $this->getMockBuilder(\Magento\Framework\Mview\View::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $notInitiatedMview->expects($this->any())
+            ->method('getChangelog')
+            ->willReturn($changelog);
+
+        return $notInitiatedMview;
+    }
+
     public function testExecuteExceptionNoVerbosity()
     {
         /** @var \Magento\Framework\Mview\View|\PHPUnit_Framework_MockObject_MockObject $stub */
-- 
GitLab


From 6d3bffa4a4487c1ffd5b0e859c61aec13e10bbd4 Mon Sep 17 00:00:00 2001
From: Luke Rodgers <lukerodgers90@gmail.com>
Date: Mon, 6 Nov 2017 17:55:45 +0000
Subject: [PATCH 091/380] Use factories/interfaces correctly

---
 .../Command/IndexerStatusMviewCommand.php     | 33 ++++++++++--------
 .../Command/IndexerStatusMviewCommandTest.php | 34 +++++++++++++++----
 2 files changed, 46 insertions(+), 21 deletions(-)

diff --git a/app/code/Magento/Indexer/Console/Command/IndexerStatusMviewCommand.php b/app/code/Magento/Indexer/Console/Command/IndexerStatusMviewCommand.php
index 61461a0ba61..cb60d4f31da 100644
--- a/app/code/Magento/Indexer/Console/Command/IndexerStatusMviewCommand.php
+++ b/app/code/Magento/Indexer/Console/Command/IndexerStatusMviewCommand.php
@@ -9,19 +9,22 @@ use Symfony\Component\Console\Input\InputInterface;
 use Symfony\Component\Console\Output\OutputInterface;
 use Symfony\Component\Console\Command\Command;
 use Magento\Framework\Mview\View;
+use Magento\Framework\Mview\View\CollectionFactory;
+use Magento\Framework\Console\Cli;
 
 /**
  * Command for displaying status of mview indexers.
  */
 class IndexerStatusMviewCommand extends Command
 {
-    /** @var \Magento\Framework\Mview\View\CollectionInterface $mviewIndexersCollection */
-    private $mviewIndexersCollection;
+    /** @var \Magento\Framework\Mview\View\CollectionInterface $mviewCollection */
+    private $mviewCollection;
 
     public function __construct(
-        \Magento\Framework\Mview\View\CollectionInterface $collection
+        CollectionFactory $collectionFactory
     ) {
-        $this->mviewIndexersCollection = $collection;
+        $this->mviewCollection = $collectionFactory->create();
+
         parent::__construct();
     }
 
@@ -47,10 +50,10 @@ class IndexerStatusMviewCommand extends Command
 
             $rows = [];
 
-            /** @var \Magento\Framework\Mview\View $indexer */
-            foreach ($this->mviewIndexersCollection as $indexer) {
-                $state = $indexer->getState();
-                $changelog = $indexer->getChangelog();
+            /** @var \Magento\Framework\Mview\View $view */
+            foreach ($this->mviewCollection as $view) {
+                $state = $view->getState();
+                $changelog = $view->getChangelog();
 
                 try {
                     $currentVersionId = $changelog->getVersion();
@@ -66,11 +69,11 @@ class IndexerStatusMviewCommand extends Command
                 }
 
                 $rows[] = [
-                    $indexer->getData('view_id'),
-                    $state->getData('mode'),
-                    $state->getData('status'),
-                    $state->getData('updated'),
-                    $state->getData('version_id'),
+                    $view->getId(),
+                    $state->getMode(),
+                    $state->getStatus(),
+                    $state->getUpdated(),
+                    $state->getVersionId(),
                     $pendingString,
                 ];
             }
@@ -82,14 +85,14 @@ class IndexerStatusMviewCommand extends Command
             $table->addRows($rows);
             $table->render($output);
 
-            return \Magento\Framework\Console\Cli::RETURN_SUCCESS;
+            return Cli::RETURN_SUCCESS;
         } catch (\Exception $e) {
             $output->writeln('<error>' . $e->getMessage() . '</error>');
             if ($output->getVerbosity() >= OutputInterface::VERBOSITY_VERBOSE) {
                 $output->writeln($e->getTraceAsString());
             }
 
-            return \Magento\Framework\Console\Cli::RETURN_FAILURE;
+            return Cli::RETURN_FAILURE;
         }
     }
 }
diff --git a/app/code/Magento/Indexer/Test/Unit/Console/Command/IndexerStatusMviewCommandTest.php b/app/code/Magento/Indexer/Test/Unit/Console/Command/IndexerStatusMviewCommandTest.php
index e6a782cba92..43ffed3fd1e 100644
--- a/app/code/Magento/Indexer/Test/Unit/Console/Command/IndexerStatusMviewCommandTest.php
+++ b/app/code/Magento/Indexer/Test/Unit/Console/Command/IndexerStatusMviewCommandTest.php
@@ -12,6 +12,7 @@ use Symfony\Component\Console\Helper\HelperSet;
 use Symfony\Component\Console\Helper\TableHelper;
 use Magento\Store\Model\Website;
 use Magento\Framework\Console\Cli;
+use Magento\Framework\Mview\View\CollectionFactory;
 
 /**
  * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
@@ -45,9 +46,15 @@ class IndexerStatusMviewCommandTest extends \PHPUnit_Framework_TestCase
         $isLoadedProperty->setAccessible(true);
         $isLoadedProperty->setValue($this->collection, true);
 
+        $collectionFactory = $this->getMockBuilder(CollectionFactory::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $collectionFactory->method('create')
+            ->willReturn($this->collection);
+
         $this->command = $this->objectManager->getObject(
             IndexerStatusMviewCommand::class,
-            ['collection' => $this->collection]
+            ['collectionFactory' => $collectionFactory]
         );
 
         /** @var HelperSet $helperSet */
@@ -66,6 +73,8 @@ class IndexerStatusMviewCommandTest extends \PHPUnit_Framework_TestCase
             [
                 'view' => [
                     'view_id' => 'catalog_category_product',
+                ],
+                'state' => [
                     'mode' => 'enabled',
                     'status' => 'idle',
                     'updated' => '2017-01-01 11:11:11',
@@ -78,6 +87,8 @@ class IndexerStatusMviewCommandTest extends \PHPUnit_Framework_TestCase
             [
                 'view' => [
                     'view_id' => 'catalog_product_category',
+                ],
+                'state' => [
                     'mode' => 'disabled',
                     'status' => 'idle',
                     'updated' => '2017-01-01 11:11:11',
@@ -90,6 +101,8 @@ class IndexerStatusMviewCommandTest extends \PHPUnit_Framework_TestCase
             [
                 'view' => [
                     'view_id' => 'catalog_product_attribute',
+                ],
+                'state' => [
                     'mode' => 'enabled',
                     'status' => 'idle',
                     'updated' => '2017-01-01 11:11:11',
@@ -102,7 +115,7 @@ class IndexerStatusMviewCommandTest extends \PHPUnit_Framework_TestCase
         ];
 
         foreach ($mviews as $data) {
-            $this->collection->addItem($this->generateMviewStub($data['view'], $data['changelog']));
+            $this->collection->addItem($this->generateMviewStub($data['view'], $data['changelog'], $data['state']));
         }
         $this->collection->addItem($this->getNeverEnabledMviewIndexerWithNoTable());
 
@@ -153,9 +166,10 @@ class IndexerStatusMviewCommandTest extends \PHPUnit_Framework_TestCase
     /**
      * @param array $viewData
      * @param array $changelogData
+     * @param array $stateData
      * @return Mview\View|Mview\View\Changelog|\PHPUnit_Framework_MockObject_MockObject
      */
-    protected function generateMviewStub(array $viewData, array $changelogData)
+    protected function generateMviewStub(array $viewData, array $changelogData, array $stateData)
     {
         /** @var Mview\View\Changelog|\PHPUnit_Framework_MockObject_MockObject $stub */
         $changelog = $this->getMockBuilder(\Magento\Framework\Mview\View\Changelog::class)
@@ -163,8 +177,8 @@ class IndexerStatusMviewCommandTest extends \PHPUnit_Framework_TestCase
             ->getMock();
 
         $list = [];
-        if ($changelogData['version_id'] !== $viewData['version_id']) {
-            $list = range($viewData['version_id']+1, $changelogData['version_id']);
+        if ($changelogData['version_id'] !== $stateData['version_id']) {
+            $list = range($stateData['version_id']+1, $changelogData['version_id']);
         }
 
         $changelog->expects($this->any())
@@ -175,6 +189,14 @@ class IndexerStatusMviewCommandTest extends \PHPUnit_Framework_TestCase
             ->method('getVersion')
             ->willReturn($changelogData['version_id']);
 
+        /** @var \Magento\Indexer\Model\Mview\View\State|\PHPUnit_Framework_MockObject_MockObject $stub */
+        $state = $this->getMockBuilder(\Magento\Indexer\Model\Mview\View\State::class)
+            ->disableOriginalConstructor()
+            ->setMethods(['loadByView'])
+            ->getMock();
+
+        $state->setData($stateData);
+
         /** @var Mview\View|\PHPUnit_Framework_MockObject_MockObject $stub */
         $stub = $this->getMockBuilder(\Magento\Framework\Mview\View::class)
             ->disableOriginalConstructor()
@@ -187,7 +209,7 @@ class IndexerStatusMviewCommandTest extends \PHPUnit_Framework_TestCase
 
         $stub->expects($this->any())
             ->method('getState')
-            ->willReturnSelf();
+            ->willReturn($state);
 
         $stub->setData($viewData);
 
-- 
GitLab


From dede2d1f42f64875e63d5a410f0934781be9414c Mon Sep 17 00:00:00 2001
From: Luke Rodgers <lukerodgers90@gmail.com>
Date: Tue, 7 Nov 2017 17:32:41 +0000
Subject: [PATCH 092/380] Update code style

---
 .../Command/IndexerStatusMviewCommand.php     |  4 +-
 .../Command/IndexerStatusMviewCommandTest.php | 52 +++++++++----------
 2 files changed, 28 insertions(+), 28 deletions(-)

diff --git a/app/code/Magento/Indexer/Console/Command/IndexerStatusMviewCommand.php b/app/code/Magento/Indexer/Console/Command/IndexerStatusMviewCommand.php
index cb60d4f31da..5451df34645 100644
--- a/app/code/Magento/Indexer/Console/Command/IndexerStatusMviewCommand.php
+++ b/app/code/Magento/Indexer/Console/Command/IndexerStatusMviewCommand.php
@@ -78,8 +78,8 @@ class IndexerStatusMviewCommand extends Command
                 ];
             }
 
-            usort($rows, function ($a, $b) {
-                return strcmp($a[0], $b[0]);
+            usort($rows, function ($comp1, $comp2) {
+                return strcmp($comp1[0], $comp2[0]);
             });
 
             $table->addRows($rows);
diff --git a/app/code/Magento/Indexer/Test/Unit/Console/Command/IndexerStatusMviewCommandTest.php b/app/code/Magento/Indexer/Test/Unit/Console/Command/IndexerStatusMviewCommandTest.php
index 43ffed3fd1e..b58596be70c 100644
--- a/app/code/Magento/Indexer/Test/Unit/Console/Command/IndexerStatusMviewCommandTest.php
+++ b/app/code/Magento/Indexer/Test/Unit/Console/Command/IndexerStatusMviewCommandTest.php
@@ -135,32 +135,32 @@ class IndexerStatusMviewCommandTest extends \PHPUnit_Framework_TestCase
         $this->assertEquals('Version ID', trim($headerValues[4]));
         $this->assertEquals('Backlog', trim($headerValues[5]));
 
-        $catalogCategoryProductMviewData = array_values(array_filter(explode('|', $linesOutput[3])));
-        $this->assertEquals('catalog_category_product', trim($catalogCategoryProductMviewData[0]));
-        $this->assertEquals('enabled', trim($catalogCategoryProductMviewData[1]));
-        $this->assertEquals('idle', trim($catalogCategoryProductMviewData[2]));
-        $this->assertEquals('2017-01-01 11:11:11', trim($catalogCategoryProductMviewData[3]));
-        $this->assertEquals('100', trim($catalogCategoryProductMviewData[4]));
-        $this->assertEquals('10', trim($catalogCategoryProductMviewData[5]));
-        unset($catalogCategoryProductMviewData);
-
-        $catalogProductAttributeMviewData = array_values(array_filter(explode('|', $linesOutput[4])));
-        $this->assertEquals('catalog_product_attribute', trim($catalogProductAttributeMviewData[0]));
-        $this->assertEquals('enabled', trim($catalogProductAttributeMviewData[1]));
-        $this->assertEquals('idle', trim($catalogProductAttributeMviewData[2]));
-        $this->assertEquals('2017-01-01 11:11:11', trim($catalogProductAttributeMviewData[3]));
-        $this->assertEquals('100', trim($catalogProductAttributeMviewData[4]));
-        $this->assertEquals('0', trim($catalogProductAttributeMviewData[5]));
-        unset($catalogProductAttributeMviewData);
-
-        $catalogCategoryProductMviewData = array_values(array_filter(explode('|', $linesOutput[5])));
-        $this->assertEquals('catalog_product_category', trim($catalogCategoryProductMviewData[0]));
-        $this->assertEquals('disabled', trim($catalogCategoryProductMviewData[1]));
-        $this->assertEquals('idle', trim($catalogCategoryProductMviewData[2]));
-        $this->assertEquals('2017-01-01 11:11:11', trim($catalogCategoryProductMviewData[3]));
-        $this->assertEquals('100', trim($catalogCategoryProductMviewData[4]));
-        $this->assertEquals('100', trim($catalogCategoryProductMviewData[5]));
-        unset($catalogCategoryProductMviewData);
+        $categoryProduct = array_values(array_filter(explode('|', $linesOutput[3])));
+        $this->assertEquals('catalog_category_product', trim($categoryProduct[0]));
+        $this->assertEquals('enabled', trim($categoryProduct[1]));
+        $this->assertEquals('idle', trim($categoryProduct[2]));
+        $this->assertEquals('2017-01-01 11:11:11', trim($categoryProduct[3]));
+        $this->assertEquals('100', trim($categoryProduct[4]));
+        $this->assertEquals('10', trim($categoryProduct[5]));
+        unset($categoryProduct);
+
+        $productAttribute = array_values(array_filter(explode('|', $linesOutput[4])));
+        $this->assertEquals('catalog_product_attribute', trim($productAttribute[0]));
+        $this->assertEquals('enabled', trim($productAttribute[1]));
+        $this->assertEquals('idle', trim($productAttribute[2]));
+        $this->assertEquals('2017-01-01 11:11:11', trim($productAttribute[3]));
+        $this->assertEquals('100', trim($productAttribute[4]));
+        $this->assertEquals('0', trim($productAttribute[5]));
+        unset($productAttribute);
+
+        $productCategory = array_values(array_filter(explode('|', $linesOutput[5])));
+        $this->assertEquals('catalog_product_category', trim($productCategory[0]));
+        $this->assertEquals('disabled', trim($productCategory[1]));
+        $this->assertEquals('idle', trim($productCategory[2]));
+        $this->assertEquals('2017-01-01 11:11:11', trim($productCategory[3]));
+        $this->assertEquals('100', trim($productCategory[4]));
+        $this->assertEquals('100', trim($productCategory[5]));
+        unset($productCategory);
     }
 
     /**
-- 
GitLab


From fa1b31087f22f5a4f593bb3ee18a154c71fc8965 Mon Sep 17 00:00:00 2001
From: Luke Rodgers <lukerodgers90@gmail.com>
Date: Wed, 8 Nov 2017 20:45:21 +0000
Subject: [PATCH 093/380] Remove the copyright year from file headers

---
 .../Indexer/Console/Command/IndexerStatusMviewCommand.php       | 2 +-
 .../Test/Unit/Console/Command/IndexerStatusMviewCommandTest.php | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/app/code/Magento/Indexer/Console/Command/IndexerStatusMviewCommand.php b/app/code/Magento/Indexer/Console/Command/IndexerStatusMviewCommand.php
index 5451df34645..0efeef4a71b 100644
--- a/app/code/Magento/Indexer/Console/Command/IndexerStatusMviewCommand.php
+++ b/app/code/Magento/Indexer/Console/Command/IndexerStatusMviewCommand.php
@@ -1,6 +1,6 @@
 <?php
 /**
- * Copyright © 2013-2017 Magento, Inc. All rights reserved.
+ * Copyright © Magento, Inc. All rights reserved.
  * See COPYING.txt for license details.
  */
 namespace Magento\Indexer\Console\Command;
diff --git a/app/code/Magento/Indexer/Test/Unit/Console/Command/IndexerStatusMviewCommandTest.php b/app/code/Magento/Indexer/Test/Unit/Console/Command/IndexerStatusMviewCommandTest.php
index b58596be70c..6a2f215144f 100644
--- a/app/code/Magento/Indexer/Test/Unit/Console/Command/IndexerStatusMviewCommandTest.php
+++ b/app/code/Magento/Indexer/Test/Unit/Console/Command/IndexerStatusMviewCommandTest.php
@@ -1,6 +1,6 @@
 <?php
 /**
- * Copyright © 2013-2017 Magento, Inc. All rights reserved.
+ * Copyright © Magento, Inc. All rights reserved.
  * See COPYING.txt for license details.
  */
 namespace Magento\Indexer\Test\Unit\Console\Command;
-- 
GitLab


From cfab448cc75e36a1bbfe4af5eab476b495e33ae3 Mon Sep 17 00:00:00 2001
From: Erfan <erfanimani@gmail.com>
Date: Thu, 9 Nov 2017 16:22:58 +0800
Subject: [PATCH 094/380] Fix for issue 12127: Single quotation marks are now
 decoded properly in admin attribute option input fields.

---
 .../templates/catalog/product/attribute/options.phtml         | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/app/code/Magento/Catalog/view/adminhtml/templates/catalog/product/attribute/options.phtml b/app/code/Magento/Catalog/view/adminhtml/templates/catalog/product/attribute/options.phtml
index a0041d2e029..6ff0e193a77 100644
--- a/app/code/Magento/Catalog/view/adminhtml/templates/catalog/product/attribute/options.phtml
+++ b/app/code/Magento/Catalog/view/adminhtml/templates/catalog/product/attribute/options.phtml
@@ -88,7 +88,9 @@ $stores = $block->getStoresSortedBySortOrder();
     $values = [];
     foreach($block->getOptionValues() as $value) {
         $value = $value->getData();
-        $values[] = is_array($value) ? array_map("htmlspecialchars_decode", $value) : $value;
+        $values[] = is_array($value) ? array_map(function($str) {
+            return htmlspecialchars_decode($str, ENT_QUOTES);
+        }, $value) : $value;
     }
     ?>
     <script type="text/x-magento-init">
-- 
GitLab


From 817bc5fb91dff7249b706c06239d2808ddc17558 Mon Sep 17 00:00:00 2001
From: magento-engcom-team <mikola.malevanec@transoftgroup.com>
Date: Thu, 9 Nov 2017 16:09:57 +0200
Subject: [PATCH 095/380] 12110: Missing cascade into attribute set deletion.

---
 .../RemoveProductUrlRewrite.php               |  83 +++++++++++++
 .../RemoveProductUrlRewriteTest.php           | 113 ++++++++++++++++++
 .../CatalogUrlRewrite/etc/adminhtml/di.xml    |   3 +
 .../RemoveProductUrlRewriteTest.php           |  62 ++++++++++
 .../_files/attribute_set_with_product.php     |  11 ++
 5 files changed, 272 insertions(+)
 create mode 100644 app/code/Magento/CatalogUrlRewrite/Plugin/Eav/AttributeSetRepository/RemoveProductUrlRewrite.php
 create mode 100644 app/code/Magento/CatalogUrlRewrite/Test/Unit/Plugin/Eav/AttributeSetRepository/RemoveProductUrlRewriteTest.php
 create mode 100644 dev/tests/integration/testsuite/Magento/CatalogUrlRewrite/Plugin/Eav/AttributeSetRepository/RemoveProductUrlRewriteTest.php
 create mode 100644 dev/tests/integration/testsuite/Magento/CatalogUrlRewrite/_files/attribute_set_with_product.php

diff --git a/app/code/Magento/CatalogUrlRewrite/Plugin/Eav/AttributeSetRepository/RemoveProductUrlRewrite.php b/app/code/Magento/CatalogUrlRewrite/Plugin/Eav/AttributeSetRepository/RemoveProductUrlRewrite.php
new file mode 100644
index 00000000000..82a25531757
--- /dev/null
+++ b/app/code/Magento/CatalogUrlRewrite/Plugin/Eav/AttributeSetRepository/RemoveProductUrlRewrite.php
@@ -0,0 +1,83 @@
+<?php
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\CatalogUrlRewrite\Plugin\Eav\AttributeSetRepository;
+
+use Magento\Catalog\Model\ResourceModel\Product\Collection;
+use Magento\Catalog\Model\ResourceModel\Product\CollectionFactory;
+use Magento\CatalogUrlRewrite\Model\ProductUrlRewriteGenerator;
+use Magento\Eav\Api\AttributeSetRepositoryInterface;
+use Magento\Eav\Api\Data\AttributeSetInterface;
+use Magento\UrlRewrite\Model\UrlPersistInterface;
+use Magento\UrlRewrite\Service\V1\Data\UrlRewrite;
+
+/**
+ * Remove url rewrites for products with given attribute set.
+ */
+class RemoveProductUrlRewrite
+{
+    /**
+     * @var int
+     */
+    private $chunkSize = 1000;
+
+    /**
+     * @var UrlPersistInterface
+     */
+    private $urlPersist;
+
+    /**
+     * @var CollectionFactory
+     */
+    private $collectionFactory;
+
+    /**
+     * ProductUrlRewriteProcessor constructor.
+     *
+     * @param UrlPersistInterface $urlPersist
+     * @param CollectionFactory $collectionFactory
+     */
+    public function __construct(UrlPersistInterface $urlPersist, CollectionFactory $collectionFactory)
+    {
+        $this->urlPersist = $urlPersist;
+        $this->collectionFactory = $collectionFactory;
+    }
+
+    /**
+     * Remove url rewrites for products with given attribute set.
+     *
+     * @param AttributeSetRepositoryInterface $subject
+     * @param \Closure $proceed
+     * @param AttributeSetInterface $attributeSet
+     * @return bool
+     *
+     * @SuppressWarnings(PHPMD.UnusedFormalParameter)
+     */
+    public function aroundDelete(
+        AttributeSetRepositoryInterface $subject,
+        \Closure $proceed,
+        AttributeSetInterface $attributeSet
+    ) {
+        /** @var Collection $productCollection */
+        $productCollection = $this->collectionFactory->create();
+        $productCollection->addFieldToFilter('attribute_set_id', ['eq' => $attributeSet->getId()]);
+        $productIds = $productCollection->getAllIds();
+        $result = $proceed($attributeSet);
+        if (!empty($productIds)) {
+            $productIds = array_chunk($productIds, $this->chunkSize);
+            foreach ($productIds as $ids) {
+                $this->urlPersist->deleteByData(
+                    [
+                        UrlRewrite::ENTITY_ID => $ids,
+                        UrlRewrite::ENTITY_TYPE => ProductUrlRewriteGenerator::ENTITY_TYPE,
+                    ]
+                );
+            }
+        }
+
+        return $result;
+    }
+}
diff --git a/app/code/Magento/CatalogUrlRewrite/Test/Unit/Plugin/Eav/AttributeSetRepository/RemoveProductUrlRewriteTest.php b/app/code/Magento/CatalogUrlRewrite/Test/Unit/Plugin/Eav/AttributeSetRepository/RemoveProductUrlRewriteTest.php
new file mode 100644
index 00000000000..cf2337bf7c7
--- /dev/null
+++ b/app/code/Magento/CatalogUrlRewrite/Test/Unit/Plugin/Eav/AttributeSetRepository/RemoveProductUrlRewriteTest.php
@@ -0,0 +1,113 @@
+<?php
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\CatalogUrlRewrite\Test\Unit\Plugin\Eav\AttributeSetRepository;
+
+use Magento\Catalog\Model\ResourceModel\Product\Collection;
+use Magento\Catalog\Model\ResourceModel\Product\CollectionFactory;
+use Magento\CatalogUrlRewrite\Model\ProductUrlRewriteGenerator;
+use Magento\CatalogUrlRewrite\Plugin\Eav\AttributeSetRepository\RemoveProductUrlRewrite;
+use Magento\Eav\Api\AttributeSetRepositoryInterface;
+use Magento\Eav\Api\Data\AttributeSetInterface;
+use Magento\Framework\TestFramework\Unit\Helper\ObjectManager;
+use Magento\UrlRewrite\Model\UrlPersistInterface;
+use Magento\UrlRewrite\Service\V1\Data\UrlRewrite;
+use PHPUnit\Framework\TestCase;
+
+/**
+ * Provide tests for RemoveProductUrlRewrite plugin.
+ */
+class RemoveProductUrlRewriteTest extends TestCase
+{
+    /**
+     * @var RemoveProductUrlRewrite
+     */
+    private $testSubject;
+
+    /**
+     * @var CollectionFactory|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $collectionFactory;
+
+    /**
+     * @var UrlPersistInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $urlPersist;
+
+    /**
+     * @inheritdoc
+     */
+    protected function setUp()
+    {
+        $objectManager = new ObjectManager($this);
+        $this->collectionFactory = $this->getMockBuilder(CollectionFactory::class)
+            ->disableOriginalConstructor()
+            ->setMethods(['create'])
+            ->getMock();
+        $this->urlPersist = $this->getMockBuilder(UrlPersistInterface::class)
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $this->testSubject = $objectManager->getObject(
+            RemoveProductUrlRewrite::class,
+            [
+                'collectionFactory' => $this->collectionFactory,
+                'urlPersist' => $this->urlPersist,
+            ]
+        );
+    }
+
+    /**
+     * Test plugin will delete all url rewrites for products with given attribute set.
+     */
+    public function testAroundDelete()
+    {
+        $attributeSetId = '1';
+        $productId = '1';
+
+        /** @var Collection|\PHPUnit_Framework_MockObject_MockObject $collection */
+        $collection = $this->getMockBuilder(Collection::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $collection->expects(self::once())
+            ->method('addFieldToFilter')
+            ->with(self::identicalTo('attribute_set_id'), self::identicalTo(['eq' => $attributeSetId]));
+        $collection->expects(self::once())
+            ->method('getAllIds')
+            ->willReturn([$productId]);
+
+        $this->collectionFactory->expects(self::once())
+            ->method('create')
+            ->willReturn($collection);
+
+        $this->urlPersist->expects(self::once())
+            ->method('deleteByData')
+            ->with(self::identicalTo(
+                [
+                    UrlRewrite::ENTITY_ID => [$productId],
+                    UrlRewrite::ENTITY_TYPE => ProductUrlRewriteGenerator::ENTITY_TYPE,
+                ]
+            ));
+        /** @var AttributeSetRepositoryInterface|\PHPUnit_Framework_MockObject_MockObject $attributeSetRepository */
+        $attributeSetRepository = $this->getMockBuilder(AttributeSetRepositoryInterface::class)
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+
+        $proceed = function () {
+            return true;
+        };
+
+        /** @var AttributeSetInterface|\PHPUnit_Framework_MockObject_MockObject $attributeSet */
+        $attributeSet = $this->getMockBuilder(AttributeSetInterface::class)
+            ->setMethods(['getId'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $attributeSet->expects(self::once())
+            ->method('getId')
+            ->willReturn($attributeSetId);
+
+        $this->testSubject->aroundDelete($attributeSetRepository, $proceed, $attributeSet);
+    }
+}
diff --git a/app/code/Magento/CatalogUrlRewrite/etc/adminhtml/di.xml b/app/code/Magento/CatalogUrlRewrite/etc/adminhtml/di.xml
index 32ecc97d0f8..ebac217df5f 100644
--- a/app/code/Magento/CatalogUrlRewrite/etc/adminhtml/di.xml
+++ b/app/code/Magento/CatalogUrlRewrite/etc/adminhtml/di.xml
@@ -25,6 +25,9 @@
     <type name="Magento\Catalog\Model\Category\DataProvider">
         <plugin name="category_ui_form_url_key_plugin" type="Magento\CatalogUrlRewrite\Plugin\Catalog\Block\Adminhtml\Category\Tab\Attributes"/>
     </type>
+    <type name="Magento\Eav\Api\AttributeSetRepositoryInterface">
+        <plugin name="attribute_set_delete_plugin" type="Magento\CatalogUrlRewrite\Plugin\Eav\AttributeSetRepository\RemoveProductUrlRewrite"/>
+    </type>
     <virtualType name="Magento\Catalog\Ui\DataProvider\Product\Form\Modifier\Pool">
         <arguments>
             <argument name="modifiers" xsi:type="array">
diff --git a/dev/tests/integration/testsuite/Magento/CatalogUrlRewrite/Plugin/Eav/AttributeSetRepository/RemoveProductUrlRewriteTest.php b/dev/tests/integration/testsuite/Magento/CatalogUrlRewrite/Plugin/Eav/AttributeSetRepository/RemoveProductUrlRewriteTest.php
new file mode 100644
index 00000000000..3791bb7894e
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/CatalogUrlRewrite/Plugin/Eav/AttributeSetRepository/RemoveProductUrlRewriteTest.php
@@ -0,0 +1,62 @@
+<?php
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\CatalogUrlRewrite\Plugin\Eav\AttributeSetRepository;
+
+use Magento\Catalog\Api\ProductRepositoryInterface;
+use Magento\Eav\Api\AttributeSetRepositoryInterface;
+use Magento\Eav\Model\Entity\Attribute\Set;
+use Magento\TestFramework\Helper\Bootstrap;
+use Magento\TestFramework\Interception\PluginList;
+use Magento\UrlRewrite\Model\ResourceModel\UrlRewriteCollectionFactory;
+use PHPUnit\Framework\TestCase;
+
+/**
+ * Provide tests for RemoveProductUrlRewrite plugin.
+ * @magentoAppArea adminhtml
+ */
+class RemoveProductUrlRewriteTest extends TestCase
+{
+    /**
+     * @return void
+     */
+    public function testRemoveProductUrlRewriteIsRegistered()
+    {
+        $pluginInfo = Bootstrap::getObjectManager()->get(PluginList::class)
+            ->get(AttributeSetRepositoryInterface::class, []);
+        self::assertSame(RemoveProductUrlRewrite::class, $pluginInfo['attribute_set_delete_plugin']['instance']);
+    }
+
+    /**
+     * Test url rewrite will be removed for product with given attribute set, if one will be deleted.
+     *
+     * @magentoDataFixture Magento/CatalogUrlRewrite/_files/attribute_set_with_product.php
+     * @magentoDbIsolation disabled
+     */
+    public function testAroundDelete()
+    {
+        $attributeSet = Bootstrap::getObjectManager()->get(Set::class);
+        $attributeSet->load('empty_attribute_set', 'attribute_set_name');
+
+        $productRepository = Bootstrap::getObjectManager()->get(ProductRepositoryInterface::class);
+        $product = $productRepository->get('simple');
+
+        $urlRewriteCollection = Bootstrap::getObjectManager()->get(UrlRewriteCollectionFactory::class)->create();
+        $urlRewriteCollection->addFieldToFilter('entity_type', 'product');
+        $urlRewriteCollection->addFieldToFilter('entity_id', $product->getId());
+
+        self::assertSame(1, $urlRewriteCollection->getSize());
+
+        $attributeSetRepository = Bootstrap::getObjectManager()->get(AttributeSetRepositoryInterface::class);
+        $attributeSetRepository->deleteById($attributeSet->getAttributeSetId());
+
+        $urlRewriteCollection = Bootstrap::getObjectManager()->get(UrlRewriteCollectionFactory::class)->create();
+        $urlRewriteCollection->addFieldToFilter('entity_type', 'product');
+        $urlRewriteCollection->addFieldToFilter('entity_id', $product->getId());
+
+        self::assertSame(0, $urlRewriteCollection->getSize());
+    }
+}
diff --git a/dev/tests/integration/testsuite/Magento/CatalogUrlRewrite/_files/attribute_set_with_product.php b/dev/tests/integration/testsuite/Magento/CatalogUrlRewrite/_files/attribute_set_with_product.php
new file mode 100644
index 00000000000..95f277c7124
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/CatalogUrlRewrite/_files/attribute_set_with_product.php
@@ -0,0 +1,11 @@
+<?php
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+require __DIR__ . '/../../Eav/_files/empty_attribute_set.php';
+require __DIR__ . '/../../Catalog/_files/product_simple.php';
+
+$product->setAttributeSetId($attributeSet->getId());
+$product->save();
-- 
GitLab


From 5cd2757494e5d685e685e12449f7047f56143e60 Mon Sep 17 00:00:00 2001
From: magento-engcom-team <mikola.malevanec@transoftgroup.com>
Date: Thu, 9 Nov 2017 18:21:24 +0200
Subject: [PATCH 096/380] 12110: Missing cascade into attribute set deletion.

---
 .../_files/attribute_set_with_product_rollback.php       | 9 +++++++++
 1 file changed, 9 insertions(+)
 create mode 100644 dev/tests/integration/testsuite/Magento/CatalogUrlRewrite/_files/attribute_set_with_product_rollback.php

diff --git a/dev/tests/integration/testsuite/Magento/CatalogUrlRewrite/_files/attribute_set_with_product_rollback.php b/dev/tests/integration/testsuite/Magento/CatalogUrlRewrite/_files/attribute_set_with_product_rollback.php
new file mode 100644
index 00000000000..53d35463f1a
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/CatalogUrlRewrite/_files/attribute_set_with_product_rollback.php
@@ -0,0 +1,9 @@
+<?php
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+require __DIR__ . '/../../Catalog/_files/product_simple_rollback.php';
+require __DIR__ . '/../../Eav/_files/empty_attribute_set_rollback.php';
+
-- 
GitLab


From ff249e1dfbe355dbe3d55e050fefe2dc6b63dfb5 Mon Sep 17 00:00:00 2001
From: David Manners <dmanners87@gmail.com>
Date: Thu, 9 Nov 2017 17:07:00 +0000
Subject: [PATCH 097/380] Add link to issue gates wiki page in the labels
 section of the readme

---
 README.md | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/README.md b/README.md
index 9b1aa1b7b3e..1dd81a7eed2 100644
--- a/README.md
+++ b/README.md
@@ -38,8 +38,10 @@ To suggest documentation improvements, click [here][4].
 | ![reject](http://devdocs.magento.com/common/images/github_reject.png) | The pull request has been rejected and will not be merged into mainline code. Possible reasons can include but are not limited to: issue has already been fixed in another code contribution, or there is an issue with the code contribution. |
 | ![bug report](http://devdocs.magento.com/common/images/github_bug.png) | The Magento Team has confirmed that this issue contains the minimum required information to reproduce. |
 | ![acknowledged](http://devdocs.magento.com/common/images/gitHub_acknowledged.png) | The Magento Team has validated the issue and an internal ticket has been created. |
-| ![acknowledged](http://devdocs.magento.com/common/images/github_inProgress.png) | The internal ticket is currently in progress, fix is scheduled to be delivered. |
-| ![acknowledged](http://devdocs.magento.com/common/images/github_needsUpdate.png) | The Magento Team needs additional information from the reporter to properly prioritize and process the issue or pull request. |
+| ![in progress](http://devdocs.magento.com/common/images/github_inProgress.png) | The internal ticket is currently in progress, fix is scheduled to be delivered. |
+| ![needs update](http://devdocs.magento.com/common/images/github_needsUpdate.png) | The Magento Team needs additional information from the reporter to properly prioritize and process the issue or pull request. |
+
+To learn more about issue gate labels click [here](https://github.com/magento/magento2/wiki/Magento-Issue-Gates)
 
 <h2>Reporting security issues</h2>
 
-- 
GitLab


From 661f8fa39c55b579457ca375f8b76d92a8504641 Mon Sep 17 00:00:00 2001
From: Patrick McLain <pmclain@somethingdigital.com>
Date: Thu, 9 Nov 2017 16:51:01 -0500
Subject: [PATCH 098/380] Clear `mage-cache-sessid` on Ajax Login

This commit adds code based on
`Magento\Customer\Controller\Account\LoginPost::execute` that clears the
`mage-cache-sessid` cookie on login. This triggers a refresh of the
customer data in localStorage. The primary purpose is to make sure the
customer cart is properly loaded after login.
---
 .../Customer/Controller/Ajax/Login.php        | 25 ++++++++++++++++++-
 1 file changed, 24 insertions(+), 1 deletion(-)

diff --git a/app/code/Magento/Customer/Controller/Ajax/Login.php b/app/code/Magento/Customer/Controller/Ajax/Login.php
index f1384ba188a..7d6ddc7316a 100644
--- a/app/code/Magento/Customer/Controller/Ajax/Login.php
+++ b/app/code/Magento/Customer/Controller/Ajax/Login.php
@@ -13,6 +13,8 @@ use Magento\Framework\App\ObjectManager;
 use Magento\Customer\Model\Account\Redirect as AccountRedirect;
 use Magento\Framework\App\Config\ScopeConfigInterface;
 use Magento\Framework\Exception\LocalizedException;
+use Magento\Framework\Stdlib\CookieManagerInterface;
+use Magento\Framework\Stdlib\Cookie\CookieMetadataFactory;
 
 /**
  * Login controller
@@ -58,6 +60,16 @@ class Login extends \Magento\Framework\App\Action\Action
      */
     protected $scopeConfig;
 
+    /**
+     * @var CookieManagerInterface
+     */
+    protected $cookieManager;
+
+    /**
+     * @var CookieMetadataFactory
+     */
+    protected $cookieMetadataFactory;
+
     /**
      * Initialize Login controller
      *
@@ -67,6 +79,8 @@ class Login extends \Magento\Framework\App\Action\Action
      * @param AccountManagementInterface $customerAccountManagement
      * @param \Magento\Framework\Controller\Result\JsonFactory $resultJsonFactory
      * @param \Magento\Framework\Controller\Result\RawFactory $resultRawFactory
+     * @param CookieManagerInterface $cookieManager
+     * @param CookieMetadataFactory $cookieMetadataFactory
      */
     public function __construct(
         \Magento\Framework\App\Action\Context $context,
@@ -74,7 +88,9 @@ class Login extends \Magento\Framework\App\Action\Action
         \Magento\Framework\Json\Helper\Data $helper,
         AccountManagementInterface $customerAccountManagement,
         \Magento\Framework\Controller\Result\JsonFactory $resultJsonFactory,
-        \Magento\Framework\Controller\Result\RawFactory $resultRawFactory
+        \Magento\Framework\Controller\Result\RawFactory $resultRawFactory,
+        CookieManagerInterface $cookieManager,
+        CookieMetadataFactory $cookieMetadataFactory
     ) {
         parent::__construct($context);
         $this->customerSession = $customerSession;
@@ -82,6 +98,8 @@ class Login extends \Magento\Framework\App\Action\Action
         $this->customerAccountManagement = $customerAccountManagement;
         $this->resultJsonFactory = $resultJsonFactory;
         $this->resultRawFactory = $resultRawFactory;
+        $this->cookieManager = $cookieManager;
+        $this->cookieMetadataFactory = $cookieMetadataFactory;
     }
 
     /**
@@ -169,6 +187,11 @@ class Login extends \Magento\Framework\App\Action\Action
             $this->customerSession->setCustomerDataAsLoggedIn($customer);
             $this->customerSession->regenerateId();
             $redirectRoute = $this->getAccountRedirect()->getRedirectCookie();
+            if ($this->cookieManager->getCookie('mage-cache-sessid')) {
+                $metadata = $this->cookieMetadataFactory->createCookieMetadata();
+                $metadata->setPath('/');
+                $this->cookieManager->deleteCookie('mage-cache-sessid', $metadata);
+            }
             if (!$this->getScopeConfig()->getValue('customer/startup/redirect_dashboard') && $redirectRoute) {
                 $response['redirectUrl'] = $this->_redirect->success($redirectRoute);
                 $this->getAccountRedirect()->clearRedirectCookie();
-- 
GitLab


From 87152219a878c6e8566de68f93909bda0d511064 Mon Sep 17 00:00:00 2001
From: Patrick McLain <pmclain@somethingdigital.com>
Date: Thu, 9 Nov 2017 17:12:05 -0500
Subject: [PATCH 099/380] Update Ajax LoginTest

---
 .../Test/Unit/Controller/Ajax/LoginTest.php   | 43 +++++++++++++++++++
 1 file changed, 43 insertions(+)

diff --git a/app/code/Magento/Customer/Test/Unit/Controller/Ajax/LoginTest.php b/app/code/Magento/Customer/Test/Unit/Controller/Ajax/LoginTest.php
index b759b1a6257..6ab20c13acf 100644
--- a/app/code/Magento/Customer/Test/Unit/Controller/Ajax/LoginTest.php
+++ b/app/code/Magento/Customer/Test/Unit/Controller/Ajax/LoginTest.php
@@ -73,6 +73,21 @@ class LoginTest extends \PHPUnit\Framework\TestCase
      */
     protected $redirectMock;
 
+    /**
+     * @var \Magento\Framework\Stdlib\CookieManagerInterface| \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $cookieManager;
+
+    /**
+     * @var \Magento\Framework\Stdlib\Cookie\CookieMetadataFactory| \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $cookieMetadataFactory;
+
+    /**
+     * @var \Magento\Framework\Stdlib\Cookie\CookieMetadata| \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $cookieMetadata;
+
     protected function setUp()
     {
         $this->request = $this->getMockBuilder(\Magento\Framework\App\Request\Http::class)
@@ -100,6 +115,16 @@ class LoginTest extends \PHPUnit\Framework\TestCase
             ->setMethods(['create'])
             ->getMock();
 
+        $this->cookieManager = $this->getMockBuilder(\Magento\Framework\Stdlib\CookieManagerInterface::class)
+            ->setMethods(['getCookie', 'deleteCookie'])
+            ->getMockForAbstractClass();
+        $this->cookieMetadataFactory = $this->getMockBuilder(\Magento\Framework\Stdlib\Cookie\CookieMetadataFactory::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $this->cookieMetadata = $this->getMockBuilder(\Magento\Framework\Stdlib\Cookie\CookieMetadata::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+
         $this->resultRaw = $this->getMockBuilder(\Magento\Framework\Controller\Result\Raw::class)
             ->disableOriginalConstructor()
             ->getMock();
@@ -128,6 +153,8 @@ class LoginTest extends \PHPUnit\Framework\TestCase
                 'resultJsonFactory' => $this->resultJsonFactory,
                 'objectManager' => $this->objectManager,
                 'customerAccountManagement' => $this->customerAccountManagementMock,
+                'cookieManager' => $this->cookieManager,
+                'cookieMetadataFactory' => $this->cookieMetadataFactory
             ]
         );
     }
@@ -179,6 +206,22 @@ class LoginTest extends \PHPUnit\Framework\TestCase
         $this->object->setAccountRedirect($redirectMock);
         $redirectMock->expects($this->once())->method('getRedirectCookie')->willReturn('some_url1');
 
+        $this->cookieManager->expects($this->once())
+            ->method('getCookie')
+            ->with('mage-cache-sessid')
+            ->willReturn(true);
+        $this->cookieMetadataFactory->expects($this->once())
+            ->method('createCookieMetadata')
+            ->willReturn($this->cookieMetadata);
+        $this->cookieMetadata->expects($this->once())
+            ->method('setPath')
+            ->with('/')
+            ->willReturnSelf();
+        $this->cookieManager->expects($this->once())
+            ->method('deleteCookie')
+            ->with('mage-cache-sessid', $this->cookieMetadata)
+            ->willReturnSelf();
+
         $scopeConfigMock = $this->createMock(\Magento\Framework\App\Config\ScopeConfigInterface::class);
         $this->object->setScopeConfig($scopeConfigMock);
         $scopeConfigMock->expects($this->once())->method('getValue')
-- 
GitLab


From 95f11ae29365f3f7e3d72a33c22ce4859c9b16fd Mon Sep 17 00:00:00 2001
From: magento-engcom-team <mikola.malevanec@transoftgroup.com>
Date: Fri, 10 Nov 2017 10:27:55 +0200
Subject: [PATCH 100/380] 12110: Missing cascade into attribute set deletion.

---
 .../Eav/AttributeSetRepository/RemoveProductUrlRewriteTest.php  | 2 +-
 .../_files/attribute_set_with_product_rollback.php              | 1 -
 2 files changed, 1 insertion(+), 2 deletions(-)

diff --git a/dev/tests/integration/testsuite/Magento/CatalogUrlRewrite/Plugin/Eav/AttributeSetRepository/RemoveProductUrlRewriteTest.php b/dev/tests/integration/testsuite/Magento/CatalogUrlRewrite/Plugin/Eav/AttributeSetRepository/RemoveProductUrlRewriteTest.php
index 3791bb7894e..da189b85932 100644
--- a/dev/tests/integration/testsuite/Magento/CatalogUrlRewrite/Plugin/Eav/AttributeSetRepository/RemoveProductUrlRewriteTest.php
+++ b/dev/tests/integration/testsuite/Magento/CatalogUrlRewrite/Plugin/Eav/AttributeSetRepository/RemoveProductUrlRewriteTest.php
@@ -34,7 +34,7 @@ class RemoveProductUrlRewriteTest extends TestCase
      * Test url rewrite will be removed for product with given attribute set, if one will be deleted.
      *
      * @magentoDataFixture Magento/CatalogUrlRewrite/_files/attribute_set_with_product.php
-     * @magentoDbIsolation disabled
+     * @magentoDbIsolation enabled
      */
     public function testAroundDelete()
     {
diff --git a/dev/tests/integration/testsuite/Magento/CatalogUrlRewrite/_files/attribute_set_with_product_rollback.php b/dev/tests/integration/testsuite/Magento/CatalogUrlRewrite/_files/attribute_set_with_product_rollback.php
index 53d35463f1a..cd579bdb76f 100644
--- a/dev/tests/integration/testsuite/Magento/CatalogUrlRewrite/_files/attribute_set_with_product_rollback.php
+++ b/dev/tests/integration/testsuite/Magento/CatalogUrlRewrite/_files/attribute_set_with_product_rollback.php
@@ -6,4 +6,3 @@
 
 require __DIR__ . '/../../Catalog/_files/product_simple_rollback.php';
 require __DIR__ . '/../../Eav/_files/empty_attribute_set_rollback.php';
-
-- 
GitLab


From f4857ec271a8a5dc9944fb9b6f664dbaf7c62e27 Mon Sep 17 00:00:00 2001
From: Luke Rodgers <lukerodgers90@gmail.com>
Date: Sat, 11 Nov 2017 12:58:43 +0000
Subject: [PATCH 101/380] Fix extends phpunit class

---
 .../Test/Unit/Console/Command/IndexerStatusMviewCommandTest.php | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/app/code/Magento/Indexer/Test/Unit/Console/Command/IndexerStatusMviewCommandTest.php b/app/code/Magento/Indexer/Test/Unit/Console/Command/IndexerStatusMviewCommandTest.php
index 6a2f215144f..292adb55c55 100644
--- a/app/code/Magento/Indexer/Test/Unit/Console/Command/IndexerStatusMviewCommandTest.php
+++ b/app/code/Magento/Indexer/Test/Unit/Console/Command/IndexerStatusMviewCommandTest.php
@@ -17,7 +17,7 @@ use Magento\Framework\Mview\View\CollectionFactory;
 /**
  * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
  */
-class IndexerStatusMviewCommandTest extends \PHPUnit_Framework_TestCase
+class IndexerStatusMviewCommandTest extends \PHPUnit\Framework\TestCase
 {
     /**
      * @var IndexerStatusMviewCommand
-- 
GitLab


From c80710a023a1ff6ca3c13f2cc3ba2a867e482638 Mon Sep 17 00:00:00 2001
From: Luke Rodgers <lukerodgers90@gmail.com>
Date: Sat, 11 Nov 2017 13:03:32 +0000
Subject: [PATCH 102/380] Add mview getListSize command

---
 .../Command/IndexerStatusMviewCommand.php     |  2 +-
 .../Command/IndexerStatusMviewCommandTest.php |  9 ++---
 .../Framework/Mview/View/Changelog.php        | 36 ++++++++++++++++---
 .../Mview/View/ChangelogInterface.php         |  9 +++++
 4 files changed, 45 insertions(+), 11 deletions(-)

diff --git a/app/code/Magento/Indexer/Console/Command/IndexerStatusMviewCommand.php b/app/code/Magento/Indexer/Console/Command/IndexerStatusMviewCommand.php
index 0efeef4a71b..37caabc613e 100644
--- a/app/code/Magento/Indexer/Console/Command/IndexerStatusMviewCommand.php
+++ b/app/code/Magento/Indexer/Console/Command/IndexerStatusMviewCommand.php
@@ -61,7 +61,7 @@ class IndexerStatusMviewCommand extends Command
                     continue;
                 }
 
-                $pendingCount = count($changelog->getList($state->getVersionId(), $currentVersionId));
+                $pendingCount = $changelog->getListSize($state->getVersionId(), $currentVersionId);
 
                 $pendingString = "<error>$pendingCount</error>";
                 if ($pendingCount <= 0) {
diff --git a/app/code/Magento/Indexer/Test/Unit/Console/Command/IndexerStatusMviewCommandTest.php b/app/code/Magento/Indexer/Test/Unit/Console/Command/IndexerStatusMviewCommandTest.php
index 292adb55c55..4ae3ca83870 100644
--- a/app/code/Magento/Indexer/Test/Unit/Console/Command/IndexerStatusMviewCommandTest.php
+++ b/app/code/Magento/Indexer/Test/Unit/Console/Command/IndexerStatusMviewCommandTest.php
@@ -176,14 +176,11 @@ class IndexerStatusMviewCommandTest extends \PHPUnit\Framework\TestCase
             ->disableOriginalConstructor()
             ->getMock();
 
-        $list = [];
-        if ($changelogData['version_id'] !== $stateData['version_id']) {
-            $list = range($stateData['version_id']+1, $changelogData['version_id']);
-        }
+        $listSize = $changelogData['version_id'] - $stateData['version_id'];
 
         $changelog->expects($this->any())
-            ->method('getList')
-            ->willReturn($list);
+            ->method('getListSize')
+            ->willReturn($listSize);
 
         $changelog->expects($this->any())
             ->method('getVersion')
diff --git a/lib/internal/Magento/Framework/Mview/View/Changelog.php b/lib/internal/Magento/Framework/Mview/View/Changelog.php
index 91caf662283..4f648d6b7d6 100644
--- a/lib/internal/Magento/Framework/Mview/View/Changelog.php
+++ b/lib/internal/Magento/Framework/Mview/View/Changelog.php
@@ -127,14 +127,12 @@ class Changelog implements ChangelogInterface
     }
 
     /**
-     * Retrieve entity ids by range [$fromVersionId..$toVersionId]
-     *
      * @param int $fromVersionId
      * @param int $toVersionId
-     * @return int[]
+     * @return \Magento\Framework\DB\Select
      * @throws ChangelogTableNotExistsException
      */
-    public function getList($fromVersionId, $toVersionId)
+    protected function getListSelect($fromVersionId, $toVersionId)
     {
         $changelogTableName = $this->resource->getTableName($this->getName());
         if (!$this->connection->isTableExists($changelogTableName)) {
@@ -154,9 +152,39 @@ class Changelog implements ChangelogInterface
             (int)$toVersionId
         );
 
+        return $select;
+    }
+
+    /**
+     * Retrieve entity ids by range [$fromVersionId..$toVersionId]
+     *
+     * @param int $fromVersionId
+     * @param int $toVersionId
+     * @return int[]
+     * @throws ChangelogTableNotExistsException
+     */
+    public function getList($fromVersionId, $toVersionId)
+    {
+        $select = $this->getListSelect($fromVersionId, $toVersionId);
         return $this->connection->fetchCol($select);
     }
 
+    /**
+     * Retrieve the count of entity ids in the range [$fromVersionId..$toVersionId]
+     *
+     * @param int $fromVersionId
+     * @param int $toVersionId
+     * @return int[]
+     * @throws ChangelogTableNotExistsException
+     */
+    public function getListSize($fromVersionId, $toVersionId)
+    {
+        $countSelect = $this->getListSelect($fromVersionId, $toVersionId);
+        $countSelect->reset(\Magento\Framework\DB\Select::COLUMNS);
+        $countSelect->columns(new \Zend_Db_Expr(("COUNT(DISTINCT " . $this->getColumnName() . ")")));
+        return $this->connection->fetchOne($countSelect);
+    }
+
     /**
      * Get maximum version_id from changelog
      * @return int
diff --git a/lib/internal/Magento/Framework/Mview/View/ChangelogInterface.php b/lib/internal/Magento/Framework/Mview/View/ChangelogInterface.php
index b00c1ca3a2e..da115ecdb83 100644
--- a/lib/internal/Magento/Framework/Mview/View/ChangelogInterface.php
+++ b/lib/internal/Magento/Framework/Mview/View/ChangelogInterface.php
@@ -42,6 +42,15 @@ interface ChangelogInterface
      */
     public function getList($fromVersionId, $toVersionId);
 
+    /**
+     * Retrieve the count of entity ids in the range [$fromVersionId..$toVersionId]
+     *
+     * @param $fromVersionId
+     * @param $toVersionId
+     * @return mixed
+     */
+    public function getListSize($fromVersionId, $toVersionId);
+
     /**
      * Get maximum version_id from changelog
      *
-- 
GitLab


From 149268c5c30267a04d50f8cc63f2ea3df0b8708e Mon Sep 17 00:00:00 2001
From: Andrew Garside <andrew.garside@temando.com>
Date: Sun, 12 Nov 2017 14:24:12 +1000
Subject: [PATCH 103/380] Update the fixture and tests to reflect the
 functionality of getShippingMethod

---
 .../testsuite/Magento/Sales/Service/V1/OrderCreateTest.php | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/OrderCreateTest.php b/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/OrderCreateTest.php
index b61bfdabe25..a907faac98b 100755
--- a/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/OrderCreateTest.php
+++ b/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/OrderCreateTest.php
@@ -140,7 +140,7 @@ class OrderCreateTest extends WebapiAbstract
                 [
                     'shipping' => [
                         'address' => $address,
-                        'method' => 'Flat Rate - Fixed'
+                        'method' => 'flatrate_flatrate'
                     ],
                     'items' => [$orderItem->getData()],
                     'stock_id' => null,
@@ -232,6 +232,9 @@ class OrderCreateTest extends WebapiAbstract
         $this->assertEquals($order['grand_total'], $model->getGrandTotal());
         $this->assertNotNull($model->getShippingAddress());
         $this->assertTrue((bool)$model->getShippingAddress()->getId());
-        $this->assertEquals('Flat Rate - Fixed', $model->getShippingMethod());
+        $this->assertEquals('Flat Rate - Fixed', $model->getShippingDescription());
+        $shippingMethod = $model->getShippingMethod(true);
+        $this->assertEquals('flatrate', $shippingMethod['carrier_code']);
+        $this->assertEquals('flatrate', $shippingMethod['method']);
     }
 }
-- 
GitLab


From b75399cd9045dc2ef111e300ee962f4158b0d471 Mon Sep 17 00:00:00 2001
From: magento-engcom-team <mikola.malevanec@transoftgroup.com>
Date: Mon, 13 Nov 2017 10:30:26 +0200
Subject: [PATCH 104/380] 11882: It's not possible to enable "log to file"
 (debugging) in production mode. Psr logger debug method does not work by the
 default in developer mode

---
 app/code/Magento/Backend/etc/adminhtml/di.xml | 13 ++++++++++++-
 .../Deploy/App/Mode/ConfigProvider.php        |  4 ++--
 app/code/Magento/Deploy/Model/Mode.php        | 10 +++++-----
 .../Deploy/Test/Unit/Model/ModeTest.php       |  4 ++--
 app/code/Magento/Deploy/etc/di.xml            | 19 ++++++++++++++++++-
 .../Developer/etc/adminhtml/system.xml        |  1 -
 .../Model/Logger/Handler/DebugTest.php        |  1 -
 7 files changed, 39 insertions(+), 13 deletions(-)

diff --git a/app/code/Magento/Backend/etc/adminhtml/di.xml b/app/code/Magento/Backend/etc/adminhtml/di.xml
index 97a39139411..f3d2e9accc9 100644
--- a/app/code/Magento/Backend/etc/adminhtml/di.xml
+++ b/app/code/Magento/Backend/etc/adminhtml/di.xml
@@ -142,7 +142,18 @@
     <type name="Magento\Config\Model\Config\Structure\ConcealInProductionConfigList">
         <arguments>
             <argument name="configs" xsi:type="array">
-                <item name="dev" xsi:type="const">Magento\Config\Model\Config\Structure\ElementVisibilityInterface::HIDDEN</item>
+                <item name="dev/restrict" xsi:type="const">Magento\Config\Model\Config\Structure\ElementVisibilityInterface::HIDDEN</item>
+                <item name="dev/front_end_development_workflow" xsi:type="const">Magento\Config\Model\Config\Structure\ElementVisibilityInterface::HIDDEN</item>
+                <item name="dev/template" xsi:type="const">Magento\Config\Model\Config\Structure\ElementVisibilityInterface::HIDDEN</item>
+                <item name="dev/translate_inline" xsi:type="const">Magento\Config\Model\Config\Structure\ElementVisibilityInterface::HIDDEN</item>
+                <item name="dev/js" xsi:type="const">Magento\Config\Model\Config\Structure\ElementVisibilityInterface::HIDDEN</item>
+                <item name="dev/css" xsi:type="const">Magento\Config\Model\Config\Structure\ElementVisibilityInterface::HIDDEN</item>
+                <item name="dev/image" xsi:type="const">Magento\Config\Model\Config\Structure\ElementVisibilityInterface::HIDDEN</item>
+                <item name="dev/static" xsi:type="const">Magento\Config\Model\Config\Structure\ElementVisibilityInterface::HIDDEN</item>
+                <item name="dev/grid" xsi:type="const">Magento\Config\Model\Config\Structure\ElementVisibilityInterface::HIDDEN</item>
+                <item name="dev/debug/template_hints_storefront" xsi:type="const">Magento\Config\Model\Config\Structure\ElementVisibilityInterface::HIDDEN</item>
+                <item name="dev/debug/template_hints_admin" xsi:type="const">Magento\Config\Model\Config\Structure\ElementVisibilityInterface::HIDDEN</item>
+                <item name="dev/debug/template_hints_blocks" xsi:type="const">Magento\Config\Model\Config\Structure\ElementVisibilityInterface::HIDDEN</item>
                 <item name="general/locale/code" xsi:type="const">Magento\Config\Model\Config\Structure\ElementVisibilityInterface::DISABLED</item>
             </argument>
         </arguments>
diff --git a/app/code/Magento/Deploy/App/Mode/ConfigProvider.php b/app/code/Magento/Deploy/App/Mode/ConfigProvider.php
index 142e3fe8194..900908a1f15 100644
--- a/app/code/Magento/Deploy/App/Mode/ConfigProvider.php
+++ b/app/code/Magento/Deploy/App/Mode/ConfigProvider.php
@@ -16,7 +16,7 @@ class ConfigProvider
      * [
      *      'developer' => [
      *          'production' => [
-     *              {{setting_path}} => {{setting_value}}
+     *              {{setting_path}} => ['value' => {{setting_value}}, 'lock' => {{lock_value}}]
      *          ]
      *      ]
      * ]
@@ -41,7 +41,7 @@ class ConfigProvider
      * need to turn off 'dev/debug/debug_logging' setting in this case method
      * will return array
      * [
-     *      {{setting_path}} => {{setting_value}}
+     *      {{setting_path}} => ['value' => {{setting_value}}, 'lock' => {{lock_value}}]
      * ]
      *
      * @param string $currentMode
diff --git a/app/code/Magento/Deploy/Model/Mode.php b/app/code/Magento/Deploy/Model/Mode.php
index ba3e8652fd4..c20a459561d 100644
--- a/app/code/Magento/Deploy/Model/Mode.php
+++ b/app/code/Magento/Deploy/Model/Mode.php
@@ -205,17 +205,17 @@ class Mode
     private function saveAppConfigs($mode)
     {
         $configs = $this->configProvider->getConfigs($this->getMode(), $mode);
-        foreach ($configs as $path => $value) {
-            $this->emulatedAreaProcessor->process(function () use ($path, $value) {
+        foreach ($configs as $path => $item) {
+            $this->emulatedAreaProcessor->process(function () use ($path, $item) {
                 $this->processorFacadeFactory->create()->process(
                     $path,
-                    $value,
+                    $item['value'],
                     ScopeConfigInterface::SCOPE_TYPE_DEFAULT,
                     null,
-                    true
+                    $item['lock']
                 );
             });
-            $this->output->writeln('Config "' . $path . ' = ' . $value . '" has been saved.');
+            $this->output->writeln('Config "' . $path . ' = ' . $item['value'] . '" has been saved.');
         }
     }
 
diff --git a/app/code/Magento/Deploy/Test/Unit/Model/ModeTest.php b/app/code/Magento/Deploy/Test/Unit/Model/ModeTest.php
index f80c6cb69f1..3db2023e12f 100644
--- a/app/code/Magento/Deploy/Test/Unit/Model/ModeTest.php
+++ b/app/code/Magento/Deploy/Test/Unit/Model/ModeTest.php
@@ -226,7 +226,7 @@ class ModeTest extends \PHPUnit\Framework\TestCase
             ->method('getConfigs')
             ->with('developer', 'production')
             ->willReturn([
-                'dev/debug/debug_logging' => 0
+                'dev/debug/debug_logging' => ['value' => 0, 'lock' => false]
             ]);
         $this->emulatedAreaProcessor->expects($this->once())
             ->method('process')
@@ -245,7 +245,7 @@ class ModeTest extends \PHPUnit\Framework\TestCase
                 0,
                 ScopeConfigInterface::SCOPE_TYPE_DEFAULT,
                 null,
-                true
+                false
             );
         $this->outputMock->expects($this->once())
             ->method('writeln')
diff --git a/app/code/Magento/Deploy/etc/di.xml b/app/code/Magento/Deploy/etc/di.xml
index e47fca3a6b9..e59ad7e39fc 100644
--- a/app/code/Magento/Deploy/etc/di.xml
+++ b/app/code/Magento/Deploy/etc/di.xml
@@ -75,7 +75,24 @@
             <argument name="config" xsi:type="array">
                 <item name="developer" xsi:type="array">
                     <item name="production" xsi:type="array">
-                        <item name="dev/debug/debug_logging" xsi:type="string">0</item>
+                        <item name="dev/debug/debug_logging" xsi:type="array">
+                            <item name="value" xsi:type="string">0</item>
+                            <item name="lock" xsi:type="boolean">false</item>
+                        </item>
+                    </item>
+                    <item name="developer" xsi:type="array">
+                        <item name="dev/debug/debug_logging" xsi:type="array">
+                            <item name="value" xsi:type="string">1</item>
+                            <item name="lock" xsi:type="boolean">false</item>
+                        </item>
+                    </item>
+                </item>
+                <item name="production" xsi:type="array">
+                    <item name="developer" xsi:type="array">
+                        <item name="dev/debug/debug_logging" xsi:type="array">
+                            <item name="value" xsi:type="string">1</item>
+                            <item name="lock" xsi:type="boolean">false</item>
+                        </item>
                     </item>
                 </item>
             </argument>
diff --git a/app/code/Magento/Developer/etc/adminhtml/system.xml b/app/code/Magento/Developer/etc/adminhtml/system.xml
index 9663cff72bc..0166814d889 100644
--- a/app/code/Magento/Developer/etc/adminhtml/system.xml
+++ b/app/code/Magento/Developer/etc/adminhtml/system.xml
@@ -28,7 +28,6 @@
             <group id="debug" translate="label" type="text" sortOrder="30" showInDefault="1" showInWebsite="1" showInStore="1">
                 <field id="debug_logging" translate="label comment" type="select" sortOrder="30" showInDefault="1" showInWebsite="0" showInStore="0">
                     <label>Log to File</label>
-                    <comment>Not available in production mode.</comment>
                     <source_model>Magento\Config\Model\Config\Source\Yesno</source_model>
                 </field>
             </group>
diff --git a/dev/tests/integration/testsuite/Magento/Developer/Model/Logger/Handler/DebugTest.php b/dev/tests/integration/testsuite/Magento/Developer/Model/Logger/Handler/DebugTest.php
index 71e61162d29..a40a7c8ad29 100644
--- a/dev/tests/integration/testsuite/Magento/Developer/Model/Logger/Handler/DebugTest.php
+++ b/dev/tests/integration/testsuite/Magento/Developer/Model/Logger/Handler/DebugTest.php
@@ -95,7 +95,6 @@ class DebugTest extends \PHPUnit\Framework\TestCase
 
         // Preconditions
         $this->mode->enableDeveloperMode();
-        $this->enableDebugging();
         if (file_exists($this->getDebuggerLogPath())) {
             unlink($this->getDebuggerLogPath());
         }
-- 
GitLab


From 1afffb3d475c12ca291acb7ccf52123ca5ec1fe5 Mon Sep 17 00:00:00 2001
From: Chris Pook <chris.pook@absolutecommerce.co.uk>
Date: Mon, 13 Nov 2017 07:23:30 -0800
Subject: [PATCH 105/380] 12180 Remove unnecessary use operator for Context,
 causes 503 error in account address book.

---
 app/code/Magento/Customer/Model/AttributeChecker.php | 1 -
 1 file changed, 1 deletion(-)

diff --git a/app/code/Magento/Customer/Model/AttributeChecker.php b/app/code/Magento/Customer/Model/AttributeChecker.php
index 6cc27697ccf..dcdd4769138 100644
--- a/app/code/Magento/Customer/Model/AttributeChecker.php
+++ b/app/code/Magento/Customer/Model/AttributeChecker.php
@@ -8,7 +8,6 @@ namespace Magento\Customer\Model;
 use Magento\Customer\Api\AddressMetadataInterface;
 use Magento\Customer\Api\AddressMetadataManagementInterface;
 use Magento\Customer\Model\Metadata\AttributeResolver;
-use Magento\Framework\App\Helper\Context;
 
 /**
  * Customer attribute checker.
-- 
GitLab


From f2bfdd941c0c8c6c7c745156d1ce206e38c76820 Mon Sep 17 00:00:00 2001
From: RomanKis <romaikiss@gmail.com>
Date: Mon, 13 Nov 2017 17:43:17 +0200
Subject: [PATCH 106/380] 11740: Sending emails from Admin in Multi-Store
 Environment defaults to Primary Store

---
 .../Sales/Model/Order/Email/SenderBuilder.php | 16 ++++-
 .../Model/Order/Email/SenderBuilderTest.php   | 14 +++-
 .../Mail/Template/TransportBuilder.php        | 14 ----
 .../Mail/Template/TransportBuilderByStore.php | 54 ++++++++++++++++
 .../Template/TransportBuilderByStoreTest.php  | 64 +++++++++++++++++++
 .../Unit/Template/TransportBuilderTest.php    | 19 ------
 6 files changed, 143 insertions(+), 38 deletions(-)
 create mode 100644 lib/internal/Magento/Framework/Mail/Template/TransportBuilderByStore.php
 create mode 100644 lib/internal/Magento/Framework/Mail/Test/Unit/Template/TransportBuilderByStoreTest.php

diff --git a/app/code/Magento/Sales/Model/Order/Email/SenderBuilder.php b/app/code/Magento/Sales/Model/Order/Email/SenderBuilder.php
index af3ace90908..7ec089b8829 100644
--- a/app/code/Magento/Sales/Model/Order/Email/SenderBuilder.php
+++ b/app/code/Magento/Sales/Model/Order/Email/SenderBuilder.php
@@ -5,7 +5,9 @@
  */
 namespace Magento\Sales\Model\Order\Email;
 
+use Magento\Framework\App\ObjectManager;
 use Magento\Framework\Mail\Template\TransportBuilder;
+use Magento\Framework\Mail\Template\TransportBuilderByStore;
 use Magento\Sales\Model\Order\Email\Container\IdentityInterface;
 use Magento\Sales\Model\Order\Email\Container\Template;
 
@@ -26,19 +28,29 @@ class SenderBuilder
      */
     protected $transportBuilder;
 
+    /**
+     * @var TransportBuilderByStore
+     */
+    private $transportBuilderByStore;
+
     /**
      * @param Template $templateContainer
      * @param IdentityInterface $identityContainer
      * @param TransportBuilder $transportBuilder
+     * @param TransportBuilderByStore $transportBuilderByStore
      */
     public function __construct(
         Template $templateContainer,
         IdentityInterface $identityContainer,
-        TransportBuilder $transportBuilder
+        TransportBuilder $transportBuilder,
+        TransportBuilderByStore $transportBuilderByStore = null
     ) {
         $this->templateContainer = $templateContainer;
         $this->identityContainer = $identityContainer;
         $this->transportBuilder = $transportBuilder;
+        $this->transportBuilderByStore = $transportBuilderByStore ?: ObjectManager::getInstance()->get(
+            TransportBuilderByStore::class
+        );
     }
 
     /**
@@ -98,7 +110,7 @@ class SenderBuilder
         $this->transportBuilder->setTemplateIdentifier($this->templateContainer->getTemplateId());
         $this->transportBuilder->setTemplateOptions($this->templateContainer->getTemplateOptions());
         $this->transportBuilder->setTemplateVars($this->templateContainer->getTemplateVars());
-        $this->transportBuilder->setFromByStore(
+        $this->transportBuilderByStore->setFromByStore(
             $this->identityContainer->getEmailIdentity(),
             $this->identityContainer->getStore()->getId()
         );
diff --git a/app/code/Magento/Sales/Test/Unit/Model/Order/Email/SenderBuilderTest.php b/app/code/Magento/Sales/Test/Unit/Model/Order/Email/SenderBuilderTest.php
index 00be3c10d64..38209bb22ae 100644
--- a/app/code/Magento/Sales/Test/Unit/Model/Order/Email/SenderBuilderTest.php
+++ b/app/code/Magento/Sales/Test/Unit/Model/Order/Email/SenderBuilderTest.php
@@ -6,6 +6,7 @@
 
 namespace Magento\Sales\Test\Unit\Model\Order\Email;
 
+use Magento\Framework\Mail\Template\TransportBuilderByStore;
 use Magento\Sales\Model\Order\Email\SenderBuilder;
 
 class SenderBuilderTest extends \PHPUnit\Framework\TestCase
@@ -35,6 +36,11 @@ class SenderBuilderTest extends \PHPUnit\Framework\TestCase
      */
     private $storeMock;
 
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    private $transportBuilderByStore;
+
     protected function setUp()
     {
         $templateId = 'test_template_id';
@@ -76,10 +82,11 @@ class SenderBuilderTest extends \PHPUnit\Framework\TestCase
                 'setTemplateIdentifier',
                 'setTemplateOptions',
                 'setTemplateVars',
-                'setFromByStore',
             ]
         );
 
+        $this->transportBuilderByStore = $this->createMock(TransportBuilderByStore::class);
+
         $this->templateContainerMock->expects($this->once())
             ->method('getTemplateId')
             ->will($this->returnValue($templateId));
@@ -102,7 +109,7 @@ class SenderBuilderTest extends \PHPUnit\Framework\TestCase
         $this->identityContainerMock->expects($this->once())
             ->method('getEmailIdentity')
             ->will($this->returnValue($emailIdentity));
-        $this->transportBuilder->expects($this->once())
+        $this->transportBuilderByStore->expects($this->once())
             ->method('setFromByStore')
             ->with($this->equalTo($emailIdentity));
 
@@ -113,7 +120,8 @@ class SenderBuilderTest extends \PHPUnit\Framework\TestCase
         $this->senderBuilder = new SenderBuilder(
             $this->templateContainerMock,
             $this->identityContainerMock,
-            $this->transportBuilder
+            $this->transportBuilder,
+            $this->transportBuilderByStore
         );
     }
 
diff --git a/lib/internal/Magento/Framework/Mail/Template/TransportBuilder.php b/lib/internal/Magento/Framework/Mail/Template/TransportBuilder.php
index 8e474a58cda..18b241d77a4 100644
--- a/lib/internal/Magento/Framework/Mail/Template/TransportBuilder.php
+++ b/lib/internal/Magento/Framework/Mail/Template/TransportBuilder.php
@@ -171,20 +171,6 @@ class TransportBuilder
         return $this;
     }
 
-    /**
-     * Set mail from address by store.
-     *
-     * @param string|array $from
-     * @param string|int $store
-     * @return $this
-     */
-    public function setFromByStore($from, $store)
-    {
-        $result = $this->_senderResolver->resolve($from, $store);
-        $this->message->setFrom($result['email'], $result['name']);
-        return $this;
-    }
-
     /**
      * Set template identifier
      *
diff --git a/lib/internal/Magento/Framework/Mail/Template/TransportBuilderByStore.php b/lib/internal/Magento/Framework/Mail/Template/TransportBuilderByStore.php
new file mode 100644
index 00000000000..785c93824a5
--- /dev/null
+++ b/lib/internal/Magento/Framework/Mail/Template/TransportBuilderByStore.php
@@ -0,0 +1,54 @@
+<?php
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Framework\Mail\Template;
+
+use Magento\Framework\Mail\MessageInterface;
+
+class TransportBuilderByStore
+{
+    /**
+     * Message.
+     *
+     * @var \Magento\Framework\Mail\Message
+     */
+    protected $message;
+
+    /**
+     * Sender resolver.
+     *
+     * @var \Magento\Framework\Mail\Template\SenderResolverInterface
+     */
+    private $senderResolver;
+
+    /**
+     * @param MessageInterface $message
+     * @param SenderResolverInterface $senderResolver
+     */
+    public function __construct(
+        MessageInterface $message,
+        SenderResolverInterface $senderResolver
+    ) {
+        $this->message = $message;
+        $this->senderResolver = $senderResolver;
+    }
+
+    /**
+     * Set mail from address by store.
+     *
+     * @param string|array $from
+     * @param string|int $store
+     *
+     * @return $this
+     */
+    public function setFromByStore($from, $store)
+    {
+        $result = $this->senderResolver->resolve($from, $store);
+        $this->message->setFrom($result['email'], $result['name']);
+
+        return $this;
+    }
+}
diff --git a/lib/internal/Magento/Framework/Mail/Test/Unit/Template/TransportBuilderByStoreTest.php b/lib/internal/Magento/Framework/Mail/Test/Unit/Template/TransportBuilderByStoreTest.php
new file mode 100644
index 00000000000..d49cbfb1e20
--- /dev/null
+++ b/lib/internal/Magento/Framework/Mail/Test/Unit/Template/TransportBuilderByStoreTest.php
@@ -0,0 +1,64 @@
+<?php
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Framework\Mail\Test\Unit\Template;
+
+use Magento\Framework\Mail\Template\TransportBuilderByStore;
+
+class TransportBuilderByStoreTest extends \PHPUnit\Framework\TestCase
+{
+    /**
+     * @var \Magento\Framework\Mail\Template\TransportBuilderByStore
+     */
+    protected $model;
+
+    /**
+     * @var \Magento\Framework\Mail\Message | \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $messageMock;
+
+    /**
+     * @var \Magento\Framework\Mail\Template\SenderResolverInterface | \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $senderResolverMock;
+
+    /**
+     * @return void
+     */
+    protected function setUp()
+    {
+        $objectManagerHelper = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
+        $this->messageMock = $this->createMock(\Magento\Framework\Mail\Message::class);
+        $this->senderResolverMock = $this->createMock(\Magento\Framework\Mail\Template\SenderResolverInterface::class);
+
+        $this->model = $objectManagerHelper->getObject(
+            TransportBuilderByStore::class,
+            [
+                'message' => $this->messageMock,
+                'senderResolver' => $this->senderResolverMock,
+            ]
+        );
+    }
+
+    /**
+     * @return void
+     */
+    public function setFromByStore()
+    {
+        $sender = ['email' => 'from@example.com', 'name' => 'name'];
+        $store = 1;
+        $this->senderResolverMock->expects($this->once())
+            ->method('resolve')
+            ->with($sender, $store)
+            ->willReturn($sender);
+        $this->messageMock->expects($this->once())
+            ->method('setFrom')
+            ->with('from@example.com', 'name')
+            ->willReturnSelf();
+
+        $this->model->setFromByStore($sender, $store);
+    }
+}
diff --git a/lib/internal/Magento/Framework/Mail/Test/Unit/Template/TransportBuilderTest.php b/lib/internal/Magento/Framework/Mail/Test/Unit/Template/TransportBuilderTest.php
index ab03be5ee84..927e17c824e 100644
--- a/lib/internal/Magento/Framework/Mail/Test/Unit/Template/TransportBuilderTest.php
+++ b/lib/internal/Magento/Framework/Mail/Test/Unit/Template/TransportBuilderTest.php
@@ -168,25 +168,6 @@ class TransportBuilderTest extends \PHPUnit\Framework\TestCase
         $this->builder->setFrom($sender);
     }
 
-    /**
-     * @return void
-     */
-    public function setFromByStore()
-    {
-        $sender = ['email' => 'from@example.com', 'name' => 'name'];
-        $store = 1;
-        $this->senderResolverMock->expects($this->once())
-            ->method('resolve')
-            ->with($sender, $store)
-            ->willReturn($sender);
-        $this->messageMock->expects($this->once())
-            ->method('setFrom')
-            ->with('from@example.com', 'name')
-            ->willReturnSelf();
-
-        $this->builder->setFromByStore($sender);
-    }
-
     /**
      * @return void
      */
-- 
GitLab


From b3227183b97f6ba993e2ee64b504f0ab98262e8b Mon Sep 17 00:00:00 2001
From: RomanKis <romaikiss@gmail.com>
Date: Mon, 13 Nov 2017 17:51:04 +0200
Subject: [PATCH 107/380] 11740: Sending emails from Admin in Multi-Store
 Environment defaults to Primary Store

---
 .../Mail/Test/Unit/Template/TransportBuilderByStoreTest.php     | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/lib/internal/Magento/Framework/Mail/Test/Unit/Template/TransportBuilderByStoreTest.php b/lib/internal/Magento/Framework/Mail/Test/Unit/Template/TransportBuilderByStoreTest.php
index d49cbfb1e20..80df2887a3a 100644
--- a/lib/internal/Magento/Framework/Mail/Test/Unit/Template/TransportBuilderByStoreTest.php
+++ b/lib/internal/Magento/Framework/Mail/Test/Unit/Template/TransportBuilderByStoreTest.php
@@ -46,7 +46,7 @@ class TransportBuilderByStoreTest extends \PHPUnit\Framework\TestCase
     /**
      * @return void
      */
-    public function setFromByStore()
+    public function testSetFromByStore()
     {
         $sender = ['email' => 'from@example.com', 'name' => 'name'];
         $store = 1;
-- 
GitLab


From 1d341efa8875779b266c00bee84c9d88f2037c59 Mon Sep 17 00:00:00 2001
From: Anton Evers <anton@eve.rs>
Date: Tue, 14 Nov 2017 09:22:10 +0100
Subject: [PATCH 108/380] use InvoiceInterface instead of Invoice model to
 check if an invoice is set on the credit memo

---
 app/code/Magento/Sales/Model/Order/Creditmemo.php | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/app/code/Magento/Sales/Model/Order/Creditmemo.php b/app/code/Magento/Sales/Model/Order/Creditmemo.php
index 3cf4d017273..64b903fe5b5 100644
--- a/app/code/Magento/Sales/Model/Order/Creditmemo.php
+++ b/app/code/Magento/Sales/Model/Order/Creditmemo.php
@@ -389,7 +389,7 @@ class Creditmemo extends AbstractModel implements EntityInterface, CreditmemoInt
      */
     public function getInvoice()
     {
-        if (!$this->getData('invoice') instanceof \Magento\Sales\Model\Order\Invoice && $this->getInvoiceId()) {
+        if (!$this->getData('invoice') instanceof \Magento\Sales\Api\Data\InvoiceInterface && $this->getInvoiceId()) {
             $this->setInvoice($this->invoiceFactory->create()->load($this->getInvoiceId()));
         }
         return $this->getData('invoice');
-- 
GitLab


From 64ddd51bb43a4bc1b3501672a6b2f3cbac34dc0e Mon Sep 17 00:00:00 2001
From: magento-engcom-team <mikola.malevanec@transoftgroup.com>
Date: Tue, 14 Nov 2017 10:30:01 +0200
Subject: [PATCH 109/380] 8255: Export Products action doesn't consider
 hide_for_product_page value.

---
 .../Model/Export/Product.php                  |   1 +
 .../Model/Import/Product.php                  | 235 +---------
 .../Import/Product/MediaGalleryProcessor.php  | 407 ++++++++++++++++++
 .../Model/Export/ProductTest.php              |  13 +-
 4 files changed, 431 insertions(+), 225 deletions(-)
 create mode 100644 app/code/Magento/CatalogImportExport/Model/Import/Product/MediaGalleryProcessor.php

diff --git a/app/code/Magento/CatalogImportExport/Model/Export/Product.php b/app/code/Magento/CatalogImportExport/Model/Export/Product.php
index c5618ef482e..4174fbefd90 100644
--- a/app/code/Magento/CatalogImportExport/Model/Export/Product.php
+++ b/app/code/Magento/CatalogImportExport/Model/Export/Product.php
@@ -1104,6 +1104,7 @@ class Product extends \Magento\ImportExport\Model\Export\Entity\AbstractEntity
      * @param \Magento\Catalog\Model\Product $item
      * @param int $storeId
      * @return bool
+     * @deprecated
      */
     protected function hasMultiselectData($item, $storeId)
     {
diff --git a/app/code/Magento/CatalogImportExport/Model/Import/Product.php b/app/code/Magento/CatalogImportExport/Model/Import/Product.php
index 477493cdbd0..80ef6305e5b 100644
--- a/app/code/Magento/CatalogImportExport/Model/Import/Product.php
+++ b/app/code/Magento/CatalogImportExport/Model/Import/Product.php
@@ -7,6 +7,7 @@ namespace Magento\CatalogImportExport\Model\Import;
 
 use Magento\Catalog\Model\Config as CatalogConfig;
 use Magento\Catalog\Model\Product\Visibility;
+use Magento\CatalogImportExport\Model\Import\Product\MediaGalleryProcessor;
 use Magento\CatalogImportExport\Model\Import\Product\RowValidatorInterface as ValidatorInterface;
 use Magento\Framework\App\Filesystem\DirectoryList;
 use Magento\Framework\Filesystem;
@@ -698,6 +699,13 @@ class Product extends \Magento\ImportExport\Model\Import\Entity\AbstractEntity
      */
     private $catalogConfig;
 
+    /**
+     * Provide ability to process and save images during import.
+     *
+     * @var MediaGalleryProcessor
+     */
+    private $mediaProcessor;
+
     /**
      * @param \Magento\Framework\Json\Helper\Data $jsonHelper
      * @param \Magento\ImportExport\Helper\Data $importExportData
@@ -737,6 +745,7 @@ class Product extends \Magento\ImportExport\Model\Import\Entity\AbstractEntity
      * @param array $data
      * @param array $dateAttrCodes
      * @param CatalogConfig $catalogConfig
+     * @param MediaGalleryProcessor $mediaProcessor
      * @throws \Magento\Framework\Exception\LocalizedException
      *
      * @SuppressWarnings(PHPMD.ExcessiveParameterList)
@@ -780,7 +789,8 @@ class Product extends \Magento\ImportExport\Model\Import\Entity\AbstractEntity
         \Magento\Catalog\Model\Product\Url $productUrl,
         array $data = [],
         array $dateAttrCodes = [],
-        CatalogConfig $catalogConfig = null
+        CatalogConfig $catalogConfig = null,
+        MediaGalleryProcessor $mediaProcessor = null
     ) {
         $this->_eventManager = $eventManager;
         $this->stockRegistry = $stockRegistry;
@@ -813,7 +823,8 @@ class Product extends \Magento\ImportExport\Model\Import\Entity\AbstractEntity
         $this->dateAttrCodes = array_merge($this->dateAttrCodes, $dateAttrCodes);
         $this->catalogConfig = $catalogConfig ?: \Magento\Framework\App\ObjectManager::getInstance()
             ->get(CatalogConfig::class);
-
+        $this->mediaProcessor = $mediaProcessor ?: \Magento\Framework\App\ObjectManager::getInstance()
+            ->get(MediaGalleryProcessor::class);
         parent::__construct(
             $jsonHelper,
             $importExportData,
@@ -1447,6 +1458,7 @@ class Product extends \Magento\ImportExport\Model\Import\Entity\AbstractEntity
      * Init media gallery resources
      * @return void
      * @since 100.0.4
+     * @deprecated
      */
     protected function initMediaGalleryResources()
     {
@@ -1470,48 +1482,7 @@ class Product extends \Magento\ImportExport\Model\Import\Entity\AbstractEntity
      */
     protected function getExistingImages($bunch)
     {
-        $result = [];
-        if ($this->getErrorAggregator()->hasToBeTerminated()) {
-            return $result;
-        }
-
-        $this->initMediaGalleryResources();
-        $productSKUs = array_map('strval', array_column($bunch, self::COL_SKU));
-        $select = $this->_connection->select()->from(
-            ['mg' => $this->mediaGalleryTableName],
-            ['value' => 'mg.value']
-        )->joinInner(
-            ['mgvte' => $this->mediaGalleryEntityToValueTableName],
-            '(mg.value_id = mgvte.value_id)',
-            [
-                $this->getProductEntityLinkField() => 'mgvte.' . $this->getProductEntityLinkField(),
-                'value_id' => 'mgvte.value_id'
-            ]
-        )->joinLeft(
-            ['mgv' => $this->mediaGalleryValueTableName],
-            sprintf(
-                '(mg.value_id = mgv.value_id AND mgv.%s = mgvte.%s AND mgv.store_id = %d)',
-                $this->getProductEntityLinkField(),
-                $this->getProductEntityLinkField(),
-                \Magento\Store\Model\Store::DEFAULT_STORE_ID
-            ),
-            [
-                'label' => 'mgv.label'
-            ]
-        )->joinInner(
-            ['pe' => $this->productEntityTableName],
-            "(mgvte.{$this->getProductEntityLinkField()} = pe.{$this->getProductEntityLinkField()})",
-            ['sku' => 'pe.sku']
-        )->where(
-            'pe.sku IN (?)',
-            $productSKUs
-        );
-
-        foreach ($this->_connection->fetchAll($select) as $image) {
-            $result[$image['sku']][$image['value']] = $image;
-        }
-
-        return $result;
+        return $this->mediaProcessor->getExistingImages($bunch);
     }
 
     /**
@@ -2082,93 +2053,13 @@ class Product extends \Magento\ImportExport\Model\Import\Entity\AbstractEntity
      *
      * @param array $mediaGalleryData
      * @return $this
-     * @SuppressWarnings(PHPMD.CyclomaticComplexity)
-     * @SuppressWarnings(PHPMD.NPathComplexity)
      */
     protected function _saveMediaGallery(array $mediaGalleryData)
     {
         if (empty($mediaGalleryData)) {
             return $this;
         }
-        $this->initMediaGalleryResources();
-        $imageNames = [];
-        $multiInsertData = [];
-        $valueToProductId = [];
-        $mediaGalleryData = $this->restoreDisableImage($mediaGalleryData);
-        foreach (array_keys($mediaGalleryData) as $storeId) {
-            foreach ($mediaGalleryData[$storeId] as $productSku => $mediaGalleryRows) {
-                $productId = $this->skuProcessor->getNewSku($productSku)[$this->getProductEntityLinkField()];
-
-                $insertedGalleryImgs = [];
-                foreach ($mediaGalleryRows as $insertValue) {
-                    if (!in_array($insertValue['value'], $insertedGalleryImgs)) {
-                        $valueArr = [
-                            'attribute_id' => $insertValue['attribute_id'],
-                            'value' => $insertValue['value'],
-                        ];
-                        $valueToProductId[$insertValue['value']][] = $productId;
-                        $imageNames[] = $insertValue['value'];
-                        $multiInsertData[] = $valueArr;
-                        $insertedGalleryImgs[] = $insertValue['value'];
-                    }
-                }
-            }
-        }
-        $multiInsertData = $this->filterImageInsertData($multiInsertData, $imageNames);
-        if ($multiInsertData) {
-            $this->_connection->insertOnDuplicate($this->mediaGalleryTableName, $multiInsertData);
-        }
-        $newMediaSelect = $this->_connection->select()->from($this->mediaGalleryTableName, ['value_id', 'value'])
-            ->where('value IN (?)', $imageNames);
-        $dataForSkinnyTable = [];
-        $multiInsertData = [];
-        $newMediaValues = $this->_connection->fetchAssoc($newMediaSelect);
-        foreach (array_keys($mediaGalleryData) as $storeId) {
-            foreach ($mediaGalleryData[$storeId] as $productSku => $mediaGalleryRows) {
-                foreach ($mediaGalleryRows as $insertValue) {
-                    foreach ($newMediaValues as $value_id => $values) {
-                        if ($values['value'] == $insertValue['value']) {
-                            $insertValue['value_id'] = $value_id;
-                            $insertValue[$this->getProductEntityLinkField()]
-                                = array_shift($valueToProductId[$values['value']]);
-                            break;
-                        }
-                    }
-                    if (isset($insertValue['value_id'])) {
-                        $valueArr = [
-                            'value_id' => $insertValue['value_id'],
-                            'store_id' => $storeId,
-                            $this->getProductEntityLinkField() => $insertValue[$this->getProductEntityLinkField()],
-                            'label' => $insertValue['label'],
-                            'position' => $insertValue['position'],
-                            'disabled' => $insertValue['disabled'],
-                        ];
-                        $multiInsertData[] = $valueArr;
-                        $dataForSkinnyTable[] = [
-                            'value_id' => $insertValue['value_id'],
-                            $this->getProductEntityLinkField() => $insertValue[$this->getProductEntityLinkField()],
-                        ];
-                    }
-                }
-            }
-        }
-        try {
-            $this->_connection->insertOnDuplicate(
-                $this->mediaGalleryValueTableName,
-                $multiInsertData,
-                ['value_id', 'store_id', $this->getProductEntityLinkField(), 'label', 'position', 'disabled']
-            );
-            $this->_connection->insertOnDuplicate(
-                $this->mediaGalleryEntityToValueTableName,
-                $dataForSkinnyTable,
-                ['value_id']
-            );
-        } catch (\Exception $e) {
-            $this->_connection->delete(
-                $this->mediaGalleryTableName,
-                $this->_connection->quoteInto('value_id IN (?)', $newMediaValues)
-            );
-        }
+        $this->mediaProcessor->saveMediaGallery($mediaGalleryData);
 
         return $this;
     }
@@ -2920,39 +2811,7 @@ class Product extends \Magento\ImportExport\Model\Import\Entity\AbstractEntity
         if (empty($labels)) {
             return;
         }
-
-        $insertData = [];
-        foreach ($labels as $label) {
-            $imageData = $label['imageData'];
-
-            if ($imageData['label'] === null) {
-                $insertData[] = [
-                    'label' => $label['label'],
-                    $this->getProductEntityLinkField() => $imageData[$this->getProductEntityLinkField()],
-                    'value_id' => $imageData['value_id'],
-                    'store_id' => \Magento\Store\Model\Store::DEFAULT_STORE_ID
-                ];
-            } else {
-                $this->_connection->update(
-                    $this->mediaGalleryValueTableName,
-                    [
-                        'label' => $label['label']
-                    ],
-                    [
-                        $this->getProductEntityLinkField() . ' = ?' => $imageData[$this->getProductEntityLinkField()],
-                        'value_id = ?' => $imageData['value_id'],
-                        'store_id = ?' => \Magento\Store\Model\Store::DEFAULT_STORE_ID
-                    ]
-                );
-            }
-        }
-
-        if (!empty($insertData)) {
-            $this->_connection->insertMultiple(
-                $this->mediaGalleryValueTableName,
-                $insertData
-            );
-        }
+        $this->mediaProcessor->updateMediaGalleryLabels($labels);
     }
 
     /**
@@ -2991,64 +2850,4 @@ class Product extends \Magento\ImportExport\Model\Import\Entity\AbstractEntity
     {
         return $this->_oldSku[strtolower($sku)];
     }
-
-    /**
-     * Set product images 'disable' = 0 for specified store.
-     *
-     * @param array $mediaGalleryData
-     * @return array
-     */
-    private function restoreDisableImage(array $mediaGalleryData)
-    {
-        $restoreData = [];
-        foreach (array_keys($mediaGalleryData) as $storeId) {
-            foreach ($mediaGalleryData[$storeId] as $productSku => $mediaGalleryRows) {
-                $productId = $this->skuProcessor->getNewSku($productSku)[$this->getProductEntityLinkField()];
-                $restoreData[] = sprintf(
-                    'store_id = %s and %s = %s',
-                    $storeId,
-                    $this->getProductEntityLinkField(),
-                    $productId
-                );
-                if (isset($mediaGalleryRows['all']['restore'])) {
-                    unset($mediaGalleryData[$storeId][$productSku]);
-                }
-            }
-        }
-
-        $this->_connection->update(
-            $this->mediaGalleryValueTableName,
-            ['disabled' => 0],
-            new \Zend_Db_Expr(implode(' or ', $restoreData))
-        );
-
-        return $mediaGalleryData;
-    }
-
-    /**
-     * Remove existed images from insert data.
-     *
-     * @param array $multiInsertData
-     * @param array $imageNames
-     * @return array
-     */
-    private function filterImageInsertData(array $multiInsertData, array $imageNames)
-    {
-        //Remove image duplicates for stores.
-        $multiInsertData = array_map("unserialize", array_unique(array_map("serialize", $multiInsertData)));
-        $oldMediaValues = $this->_connection->fetchAssoc(
-            $this->_connection->select()->from($this->mediaGalleryTableName, ['value_id', 'value', 'attribute_id'])
-                ->where('value IN (?)', $imageNames)
-        );
-        foreach ($multiInsertData as $key => $data) {
-            foreach ($oldMediaValues as $mediaValue) {
-                if ($data['value'] == $mediaValue['value'] && $data['attribute_id'] == $mediaValue['attribute_id']) {
-                    unset($multiInsertData[$key]);
-                    break;
-                }
-            }
-        }
-
-        return $multiInsertData;
-    }
 }
diff --git a/app/code/Magento/CatalogImportExport/Model/Import/Product/MediaGalleryProcessor.php b/app/code/Magento/CatalogImportExport/Model/Import/Product/MediaGalleryProcessor.php
new file mode 100644
index 00000000000..bced070ae56
--- /dev/null
+++ b/app/code/Magento/CatalogImportExport/Model/Import/Product/MediaGalleryProcessor.php
@@ -0,0 +1,407 @@
+<?php
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\CatalogImportExport\Model\Import\Product;
+
+use Magento\Catalog\Api\Data\ProductInterface;
+use Magento\CatalogImportExport\Model\Import\Product;
+use Magento\CatalogImportExport\Model\Import\Proxy\Product\ResourceModelFactory;
+use Magento\Framework\App\ResourceConnection;
+use Magento\Framework\EntityManager\MetadataPool;
+use Magento\ImportExport\Model\Import\ErrorProcessing\ProcessingErrorAggregatorInterface;
+use Magento\Store\Model\Store;
+
+/**
+ * Process and saves images during import.
+ * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
+ */
+class MediaGalleryProcessor
+{
+    /**
+     * @var SkuProcessor
+     */
+    private $skuProcessor;
+
+    /**
+     * @var MetadataPool
+     */
+    private $metadataPool;
+
+    /**
+     * DB connection.
+     *
+     * @var \Magento\Framework\DB\Adapter\AdapterInterface
+     */
+    private $connection;
+
+    /**
+     * @var ResourceModelFactory
+     */
+    private $resourceFactory;
+
+    /**
+     * @var \Magento\CatalogImportExport\Model\Import\Proxy\Product\ResourceModel
+     */
+    private $resourceModel;
+
+    /**
+     * @var ProcessingErrorAggregatorInterface
+     */
+    private $errorAggregator;
+
+    /**
+     * @var string
+     */
+    private $productEntityLinkField;
+
+    /**
+     * @var string
+     */
+    private $mediaGalleryTableName;
+
+    /**
+     * @var string
+     */
+    private $mediaGalleryValueTableName;
+
+    /**
+     * @var string
+     */
+    private $mediaGalleryEntityToValueTableName;
+
+    /**
+     * @var string
+     */
+    private $productEntityTableName;
+
+    /**
+     * MediaProcessor constructor.
+     *
+     * @param SkuProcessor $skuProcessor
+     * @param MetadataPool $metadataPool
+     * @param ResourceConnection $resourceConnection
+     * @param ResourceModelFactory $resourceModelFactory
+     * @param ProcessingErrorAggregatorInterface $errorAggregator
+     */
+    public function __construct(
+        SkuProcessor $skuProcessor,
+        MetadataPool $metadataPool,
+        ResourceConnection $resourceConnection,
+        ResourceModelFactory $resourceModelFactory,
+        ProcessingErrorAggregatorInterface $errorAggregator
+    ) {
+        $this->skuProcessor = $skuProcessor;
+        $this->metadataPool = $metadataPool;
+        $this->connection = $resourceConnection->getConnection();
+        $this->resourceFactory = $resourceModelFactory;
+        $this->errorAggregator = $errorAggregator;
+    }
+
+    /**
+     * Save product media gallery.
+     *
+     * @param $mediaGalleryData
+     * @return void
+     */
+    public function saveMediaGallery(array $mediaGalleryData)
+    {
+        $this->initMediaGalleryResources();
+        $imageNames = [];
+        $multiInsertData = [];
+        $valueToProductId = [];
+        $mediaGalleryData = $this->restoreDisableImage($mediaGalleryData);
+        foreach (array_keys($mediaGalleryData) as $storeId) {
+            foreach ($mediaGalleryData[$storeId] as $productSku => $mediaGalleryRows) {
+                $productId = $this->skuProcessor->getNewSku($productSku)[$this->getProductEntityLinkField()];
+
+                $insertedGalleryImgs = [];
+                foreach ($mediaGalleryRows as $insertValue) {
+                    if (!in_array($insertValue['value'], $insertedGalleryImgs)) {
+                        $valueArr = [
+                            'attribute_id' => $insertValue['attribute_id'],
+                            'value' => $insertValue['value'],
+                        ];
+                        $valueToProductId[$insertValue['value']][] = $productId;
+                        $imageNames[] = $insertValue['value'];
+                        $multiInsertData[] = $valueArr;
+                        $insertedGalleryImgs[] = $insertValue['value'];
+                    }
+                }
+            }
+        }
+        $multiInsertData = $this->filterImageInsertData($multiInsertData, $imageNames);
+        if ($multiInsertData) {
+            $this->connection->insertOnDuplicate($this->mediaGalleryTableName, $multiInsertData);
+        }
+        $newMediaSelect = $this->connection->select()->from($this->mediaGalleryTableName, ['value_id', 'value'])
+            ->where('value IN (?)', $imageNames);
+
+        $newMediaValues = $this->connection->fetchAssoc($newMediaSelect);
+        list($multiInsertData, $dataForSkinnyTable) = $this->prepareInsertData(
+            $mediaGalleryData,
+            $newMediaValues,
+            $valueToProductId
+        );
+        try {
+            $this->connection->insertOnDuplicate(
+                $this->mediaGalleryValueTableName,
+                $multiInsertData,
+                ['value_id', 'store_id', $this->getProductEntityLinkField(), 'label', 'position', 'disabled']
+            );
+            $this->connection->insertOnDuplicate(
+                $this->mediaGalleryEntityToValueTableName,
+                $dataForSkinnyTable,
+                ['value_id']
+            );
+        } catch (\Exception $e) {
+            $this->connection->delete(
+                $this->mediaGalleryTableName,
+                $this->connection->quoteInto('value_id IN (?)', $newMediaValues)
+            );
+        }
+    }
+
+    /**
+     * Update media gallery labels.
+     *
+     * @param array $labels
+     * @return void
+     */
+    public function updateMediaGalleryLabels(array $labels)
+    {
+        $insertData = [];
+        foreach ($labels as $label) {
+            $imageData = $label['imageData'];
+
+            if ($imageData['label'] === null) {
+                $insertData[] = [
+                    'label' => $label['label'],
+                    $this->getProductEntityLinkField() => $imageData[$this->getProductEntityLinkField()],
+                    'value_id' => $imageData['value_id'],
+                    'store_id' => Store::DEFAULT_STORE_ID,
+                ];
+            } else {
+                $this->connection->update(
+                    $this->mediaGalleryValueTableName,
+                    [
+                        'label' => $label['label'],
+                    ],
+                    [
+                        $this->getProductEntityLinkField() . ' = ?' => $imageData[$this->getProductEntityLinkField()],
+                        'value_id = ?' => $imageData['value_id'],
+                        'store_id = ?' => Store::DEFAULT_STORE_ID,
+                    ]
+                );
+            }
+        }
+
+        if (!empty($insertData)) {
+            $this->connection->insertMultiple(
+                $this->mediaGalleryValueTableName,
+                $insertData
+            );
+        }
+    }
+
+    /**
+     * Get existing images for current bunch.
+     *
+     * @param array $bunch
+     * @return array
+     */
+    public function getExistingImages(array $bunch)
+    {
+        $result = [];
+        if ($this->errorAggregator->hasToBeTerminated()) {
+            return $result;
+        }
+        $this->initMediaGalleryResources();
+        $productSKUs = array_map(
+            'strval',
+            array_column($bunch, Product::COL_SKU)
+        );
+        $select = $this->connection->select()->from(
+            ['mg' => $this->mediaGalleryTableName],
+            ['value' => 'mg.value']
+        )->joinInner(
+            ['mgvte' => $this->mediaGalleryEntityToValueTableName],
+            '(mg.value_id = mgvte.value_id)',
+            [
+                $this->getProductEntityLinkField() => 'mgvte.' . $this->getProductEntityLinkField(),
+                'value_id' => 'mgvte.value_id',
+            ]
+        )->joinLeft(
+            ['mgv' => $this->mediaGalleryValueTableName],
+            sprintf(
+                '(mg.value_id = mgv.value_id AND mgv.%s = mgvte.%s AND mgv.store_id = %d)',
+                $this->getProductEntityLinkField(),
+                $this->getProductEntityLinkField(),
+                Store::DEFAULT_STORE_ID
+            ),
+            [
+                'label' => 'mgv.label',
+            ]
+        )->joinInner(
+            ['pe' => $this->productEntityTableName],
+            "(mgvte.{$this->getProductEntityLinkField()} = pe.{$this->getProductEntityLinkField()})",
+            ['sku' => 'pe.sku']
+        )->where(
+            'pe.sku IN (?)',
+            $productSKUs
+        );
+
+        foreach ($this->connection->fetchAll($select) as $image) {
+            $result[$image['sku']][$image['value']] = $image;
+        }
+
+        return $result;
+    }
+
+    /**
+     * Init media gallery resources.
+     *
+     * @return void
+     */
+    private function initMediaGalleryResources()
+    {
+        if (null == $this->mediaGalleryTableName) {
+            $this->productEntityTableName = $this->getResource()->getTable('catalog_product_entity');
+            $this->mediaGalleryTableName = $this->getResource()->getTable('catalog_product_entity_media_gallery');
+            $this->mediaGalleryValueTableName = $this->getResource()->getTable(
+                'catalog_product_entity_media_gallery_value'
+            );
+            $this->mediaGalleryEntityToValueTableName = $this->getResource()->getTable(
+                'catalog_product_entity_media_gallery_value_to_entity'
+            );
+        }
+    }
+
+    /**
+     * Remove existed images from insert data.
+     *
+     * @param array $multiInsertData
+     * @param array $imageNames
+     * @return array
+     */
+    private function filterImageInsertData(array $multiInsertData, array $imageNames)
+    {
+        $oldMediaValues = $this->connection->fetchAssoc(
+            $this->connection->select()->from($this->mediaGalleryTableName, ['value_id', 'value', 'attribute_id'])
+                ->where('value IN (?)', $imageNames)
+        );
+        foreach ($multiInsertData as $key => $data) {
+            foreach ($oldMediaValues as $mediaValue) {
+                if ($data['value'] === $mediaValue['value'] && $data['attribute_id'] === $mediaValue['attribute_id']) {
+                    unset($multiInsertData[$key]);
+                }
+            }
+        }
+
+        return $multiInsertData;
+    }
+
+    /**
+     * Set product images 'disable' = 0 for specified store.
+     *
+     * @param array $mediaGalleryData
+     * @return array
+     */
+    private function restoreDisableImage(array $mediaGalleryData)
+    {
+        $restoreData = [];
+        foreach (array_keys($mediaGalleryData) as $storeId) {
+            foreach ($mediaGalleryData[$storeId] as $productSku => $mediaGalleryRows) {
+                $productId = $this->skuProcessor->getNewSku($productSku)[$this->getProductEntityLinkField()];
+                $restoreData[] = sprintf(
+                    'store_id = %s and %s = %s',
+                    $storeId,
+                    $this->getProductEntityLinkField(),
+                    $productId
+                );
+                if (isset($mediaGalleryRows['all']['restore'])) {
+                    unset($mediaGalleryData[$storeId][$productSku]);
+                }
+            }
+        }
+
+        $this->connection->update(
+            $this->mediaGalleryValueTableName,
+            ['disabled' => 0],
+            new \Zend_Db_Expr(implode(' or ', $restoreData))
+        );
+
+        return $mediaGalleryData;
+    }
+
+    /**
+     * Get product entity link field.
+     *
+     * @return string
+     */
+    private function getProductEntityLinkField()
+    {
+        if (!$this->productEntityLinkField) {
+            $this->productEntityLinkField = $this->metadataPool->getMetadata(ProductInterface::class)->getLinkField();
+        }
+
+        return $this->productEntityLinkField;
+    }
+
+    /**
+     * @return \Magento\CatalogImportExport\Model\Import\Proxy\Product\ResourceModel
+     */
+    private function getResource()
+    {
+        if (!$this->resourceModel) {
+            $this->resourceModel = $this->resourceFactory->create();
+        }
+
+        return $this->resourceModel;
+    }
+
+    /**
+     * @param array $mediaGalleryData
+     * @param array $newMediaValues
+     * @param array $valueToProductId
+     * @return array
+     */
+    private function prepareInsertData(array $mediaGalleryData, array $newMediaValues, array $valueToProductId)
+    {
+        $dataForSkinnyTable = [];
+        $multiInsertData = [];
+        foreach (array_keys($mediaGalleryData) as $storeId) {
+            foreach ($mediaGalleryData[$storeId] as $mediaGalleryRows) {
+                foreach ($mediaGalleryRows as $insertValue) {
+                    foreach ($newMediaValues as $value_id => $values) {
+                        if ($values['value'] == $insertValue['value']) {
+                            $insertValue['value_id'] = $value_id;
+                            $insertValue[$this->getProductEntityLinkField()]
+                                = array_shift($valueToProductId[$values['value']]);
+                            break;
+                        }
+                    }
+                    if (isset($insertValue['value_id'])) {
+                        $valueArr = [
+                            'value_id' => $insertValue['value_id'],
+                            'store_id' => $storeId,
+                            $this->getProductEntityLinkField() => $insertValue[$this->getProductEntityLinkField()],
+                            'label' => $insertValue['label'],
+                            'position' => $insertValue['position'],
+                            'disabled' => $insertValue['disabled'],
+                        ];
+                        $multiInsertData[] = $valueArr;
+                        $dataForSkinnyTable[] = [
+                            'value_id' => $insertValue['value_id'],
+                            $this->getProductEntityLinkField() => $insertValue[$this->getProductEntityLinkField()],
+                        ];
+                    }
+                }
+            }
+        }
+
+        return [$multiInsertData, $dataForSkinnyTable];
+    }
+}
diff --git a/dev/tests/integration/testsuite/Magento/CatalogImportExport/Model/Export/ProductTest.php b/dev/tests/integration/testsuite/Magento/CatalogImportExport/Model/Export/ProductTest.php
index 269572ebcc2..66dc304388a 100644
--- a/dev/tests/integration/testsuite/Magento/CatalogImportExport/Model/Export/ProductTest.php
+++ b/dev/tests/integration/testsuite/Magento/CatalogImportExport/Model/Export/ProductTest.php
@@ -303,11 +303,6 @@ class ProductTest extends \PHPUnit\Framework\TestCase
         $product = $productRepository->get('simple', 1);
         $mediaGallery = $product->getData('media_gallery');
         $image = array_shift($mediaGallery['images']);
-        $expected = [
-            'hide_from_product_page' => 'hide_from_product_page',
-            '' => '',
-            $image['file'] => $image['file'],
-        ];
         $this->model->setWriter(
             $this->objectManager->create(
                 \Magento\ImportExport\Model\Export\Adapter\Csv::class
@@ -320,7 +315,11 @@ class ProductTest extends \PHPUnit\Framework\TestCase
         $varDirectory->writeFile('test_product_with_image.csv', $exportData);
         /** @var \Magento\Framework\File\Csv $csv */
         $csv = $this->objectManager->get(\Magento\Framework\File\Csv::class);
-        $data = $csv->getDataPairs($varDirectory->getAbsolutePath('test_product_with_image.csv'), 76, 76);
-        self::assertSame($expected, $data);
+        $data = $csv->getData($varDirectory->getAbsolutePath('test_product_with_image.csv'));
+        foreach ($data[0] as $columnNumber => $columnName) {
+            if ($columnName === 'hide_from_product_page') {
+                self::assertSame($image['file'], $data[2][$columnNumber]);
+            }
+        }
     }
 }
-- 
GitLab


From 2a1b0418485c59a0711e88f6674137f97fa672de Mon Sep 17 00:00:00 2001
From: magento-engcom-team <mikola.malevanec@transoftgroup.com>
Date: Tue, 14 Nov 2017 11:44:17 +0200
Subject: [PATCH 110/380] 8255: Export Products action doesn't consider
 hide_for_product_page value.

---
 .../_files/product_export_with_images.php              | 10 +++++-----
 .../_files/product_export_with_images_rollback.php     |  8 ++++++++
 2 files changed, 13 insertions(+), 5 deletions(-)
 create mode 100644 dev/tests/integration/testsuite/Magento/CatalogImportExport/_files/product_export_with_images_rollback.php

diff --git a/dev/tests/integration/testsuite/Magento/CatalogImportExport/_files/product_export_with_images.php b/dev/tests/integration/testsuite/Magento/CatalogImportExport/_files/product_export_with_images.php
index 1c9dbbb5553..da456767257 100644
--- a/dev/tests/integration/testsuite/Magento/CatalogImportExport/_files/product_export_with_images.php
+++ b/dev/tests/integration/testsuite/Magento/CatalogImportExport/_files/product_export_with_images.php
@@ -30,18 +30,18 @@ $product->setStoreId(0)
         ]
     )->save();
 $image = array_shift($product->getData('media_gallery')['images']);
-$product->setStoreId(1)->setData(
+$product = $productRepository->get('simple', false, 1, true);
+$product->setData(
     'media_gallery',
     [
         'images' => [
             [
-                'file' => $image['file'],
                 'value_id' => $image['value_id'],
-                'position' => 1,
-                'label' => 'Image Alt Text',
+                'file' => $image['file'],
                 'disabled' => 1,
                 'media_type' => 'image',
             ],
         ],
     ]
-)->save();
+);
+$productRepository->save($product);
diff --git a/dev/tests/integration/testsuite/Magento/CatalogImportExport/_files/product_export_with_images_rollback.php b/dev/tests/integration/testsuite/Magento/CatalogImportExport/_files/product_export_with_images_rollback.php
new file mode 100644
index 00000000000..d7a52465ead
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/CatalogImportExport/_files/product_export_with_images_rollback.php
@@ -0,0 +1,8 @@
+<?php
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+require dirname(__DIR__, 2) . '/Catalog/_files/product_image_rollback.php';
+require dirname(__DIR__, 2) . '/Catalog/_files/product_simple_rollback.php';
-- 
GitLab


From ef165a2d3666d92a109252541c399e55695c830b Mon Sep 17 00:00:00 2001
From: RomanKis <romaikiss@gmail.com>
Date: Tue, 14 Nov 2017 14:42:29 +0200
Subject: [PATCH 111/380] 10128: New Orders not being saved to order grid

---
 .../Backend/Block/Dashboard/Orders/Grid.php   |  2 +-
 .../Block/Dashboard/Orders/GridTest.php       | 40 +++++++++++++++++++
 2 files changed, 41 insertions(+), 1 deletion(-)
 create mode 100644 dev/tests/integration/testsuite/Magento/Backend/Block/Dashboard/Orders/GridTest.php

diff --git a/app/code/Magento/Backend/Block/Dashboard/Orders/Grid.php b/app/code/Magento/Backend/Block/Dashboard/Orders/Grid.php
index 9d9409fba09..50279786c0a 100644
--- a/app/code/Magento/Backend/Block/Dashboard/Orders/Grid.php
+++ b/app/code/Magento/Backend/Block/Dashboard/Orders/Grid.php
@@ -92,7 +92,7 @@ class Grid extends \Magento\Backend\Block\Dashboard\Grid
     protected function _afterLoadCollection()
     {
         foreach ($this->getCollection() as $item) {
-            $item->getCustomer() ?: $item->setCustomer('Guest');
+            $item->getCustomer() ?: $item->setCustomer($item->getBillingAddress()->getName());
         }
         return $this;
     }
diff --git a/dev/tests/integration/testsuite/Magento/Backend/Block/Dashboard/Orders/GridTest.php b/dev/tests/integration/testsuite/Magento/Backend/Block/Dashboard/Orders/GridTest.php
new file mode 100644
index 00000000000..859837d4af1
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Backend/Block/Dashboard/Orders/GridTest.php
@@ -0,0 +1,40 @@
+<?php
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Backend\Block\Dashboard\Orders;
+
+use Magento\Backend\Block\Template\Context;
+
+class GridTest extends \PHPUnit\Framework\TestCase
+{
+    /**
+     * @var Grid
+     */
+    private $block;
+
+    protected function setUp()
+    {
+        parent::setUp();
+
+        $objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
+        $block = $this->createMock(\Magento\Backend\Block\Dashboard\Orders\Grid::class);
+        $layout = $this->createMock(\Magento\Framework\View\LayoutInterface::class);
+        $layout->expects($this->atLeastOnce())->method('getChildName')->willReturn('test');
+        $layout->expects($this->atLeastOnce())->method('getBlock')->willReturn($block);
+        $context = $objectManager->create(Context::class, ['layout' => $layout]);
+
+        $this->block = $objectManager->create(Grid::class, ['context' => $context]);
+    }
+
+    /**
+     * @magentoDataFixture Magento/Sales/_files/order.php
+     */
+    public function testGetPreparedCollection()
+    {
+        $collection = $this->block->getPreparedCollection();
+        $this->assertEquals('firstname lastname', $collection->getItems()[1]->getCustomer());
+    }
+}
-- 
GitLab


From 60ae06727d43948962e892e936f59009040f32e2 Mon Sep 17 00:00:00 2001
From: Patrick McLain <pmclain@somethingdigital.com>
Date: Tue, 14 Nov 2017 08:16:43 -0500
Subject: [PATCH 112/380] Backward compatible constructor updates

* Make new properties `private`
* Update new constructor arguments to follow Backward compatible
development guide
---
 app/code/Magento/Customer/Controller/Ajax/Login.php | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/app/code/Magento/Customer/Controller/Ajax/Login.php b/app/code/Magento/Customer/Controller/Ajax/Login.php
index 7d6ddc7316a..d275b563553 100644
--- a/app/code/Magento/Customer/Controller/Ajax/Login.php
+++ b/app/code/Magento/Customer/Controller/Ajax/Login.php
@@ -63,12 +63,12 @@ class Login extends \Magento\Framework\App\Action\Action
     /**
      * @var CookieManagerInterface
      */
-    protected $cookieManager;
+    private $cookieManager;
 
     /**
      * @var CookieMetadataFactory
      */
-    protected $cookieMetadataFactory;
+    private $cookieMetadataFactory;
 
     /**
      * Initialize Login controller
@@ -89,8 +89,8 @@ class Login extends \Magento\Framework\App\Action\Action
         AccountManagementInterface $customerAccountManagement,
         \Magento\Framework\Controller\Result\JsonFactory $resultJsonFactory,
         \Magento\Framework\Controller\Result\RawFactory $resultRawFactory,
-        CookieManagerInterface $cookieManager,
-        CookieMetadataFactory $cookieMetadataFactory
+        CookieManagerInterface $cookieManager = null,
+        CookieMetadataFactory $cookieMetadataFactory = null
     ) {
         parent::__construct($context);
         $this->customerSession = $customerSession;
@@ -98,8 +98,8 @@ class Login extends \Magento\Framework\App\Action\Action
         $this->customerAccountManagement = $customerAccountManagement;
         $this->resultJsonFactory = $resultJsonFactory;
         $this->resultRawFactory = $resultRawFactory;
-        $this->cookieManager = $cookieManager;
-        $this->cookieMetadataFactory = $cookieMetadataFactory;
+        $this->cookieManager = $cookieManager ?: ObjectManager::getInstance()->get(CookieManagerInterface::class);
+        $this->cookieMetadataFactory = $cookieMetadataFactory ?: ObjectManager::getInstance()->get(CookieMetadataFactory::class);
     }
 
     /**
-- 
GitLab


From 1ebcd7add6e6bcb2f8deb62ba5754e3110b59f12 Mon Sep 17 00:00:00 2001
From: RomanKis <romaikiss@gmail.com>
Date: Tue, 14 Nov 2017 15:19:44 +0200
Subject: [PATCH 113/380] 10128: New Orders not being saved to order grid

---
 .../Magento/Backend/Block/Dashboard/Orders/GridTest.php       | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/dev/tests/integration/testsuite/Magento/Backend/Block/Dashboard/Orders/GridTest.php b/dev/tests/integration/testsuite/Magento/Backend/Block/Dashboard/Orders/GridTest.php
index 859837d4af1..9572bf10618 100644
--- a/dev/tests/integration/testsuite/Magento/Backend/Block/Dashboard/Orders/GridTest.php
+++ b/dev/tests/integration/testsuite/Magento/Backend/Block/Dashboard/Orders/GridTest.php
@@ -8,6 +8,10 @@ namespace Magento\Backend\Block\Dashboard\Orders;
 
 use Magento\Backend\Block\Template\Context;
 
+/**
+ * @magentoAppIsolation enabled
+ * @magentoDbIsolation enabled
+ */
 class GridTest extends \PHPUnit\Framework\TestCase
 {
     /**
-- 
GitLab


From 2149833868eef9a89e2c3d11e99246d78e5a670b Mon Sep 17 00:00:00 2001
From: Patrick McLain <pmclain@somethingdigital.com>
Date: Tue, 14 Nov 2017 08:19:55 -0500
Subject: [PATCH 114/380] Make new test class properties `private`

---
 .../Customer/Test/Unit/Controller/Ajax/LoginTest.php        | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/app/code/Magento/Customer/Test/Unit/Controller/Ajax/LoginTest.php b/app/code/Magento/Customer/Test/Unit/Controller/Ajax/LoginTest.php
index 6ab20c13acf..2fca6c99be3 100644
--- a/app/code/Magento/Customer/Test/Unit/Controller/Ajax/LoginTest.php
+++ b/app/code/Magento/Customer/Test/Unit/Controller/Ajax/LoginTest.php
@@ -76,17 +76,17 @@ class LoginTest extends \PHPUnit\Framework\TestCase
     /**
      * @var \Magento\Framework\Stdlib\CookieManagerInterface| \PHPUnit_Framework_MockObject_MockObject
      */
-    protected $cookieManager;
+    private $cookieManager;
 
     /**
      * @var \Magento\Framework\Stdlib\Cookie\CookieMetadataFactory| \PHPUnit_Framework_MockObject_MockObject
      */
-    protected $cookieMetadataFactory;
+    private $cookieMetadataFactory;
 
     /**
      * @var \Magento\Framework\Stdlib\Cookie\CookieMetadata| \PHPUnit_Framework_MockObject_MockObject
      */
-    protected $cookieMetadata;
+    private $cookieMetadata;
 
     protected function setUp()
     {
-- 
GitLab


From a933cf745b4e6cc82d07cefb00cd4af9874e034f Mon Sep 17 00:00:00 2001
From: RomanKis <romaikiss@gmail.com>
Date: Tue, 14 Nov 2017 15:46:34 +0200
Subject: [PATCH 115/380] 10128: New Orders not being saved to order grid

---
 .../Backend/Block/Dashboard/Orders/GridTest.php        | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/dev/tests/integration/testsuite/Magento/Backend/Block/Dashboard/Orders/GridTest.php b/dev/tests/integration/testsuite/Magento/Backend/Block/Dashboard/Orders/GridTest.php
index 9572bf10618..6c91afb80fd 100644
--- a/dev/tests/integration/testsuite/Magento/Backend/Block/Dashboard/Orders/GridTest.php
+++ b/dev/tests/integration/testsuite/Magento/Backend/Block/Dashboard/Orders/GridTest.php
@@ -8,10 +8,6 @@ namespace Magento\Backend\Block\Dashboard\Orders;
 
 use Magento\Backend\Block\Template\Context;
 
-/**
- * @magentoAppIsolation enabled
- * @magentoDbIsolation enabled
- */
 class GridTest extends \PHPUnit\Framework\TestCase
 {
     /**
@@ -39,6 +35,10 @@ class GridTest extends \PHPUnit\Framework\TestCase
     public function testGetPreparedCollection()
     {
         $collection = $this->block->getPreparedCollection();
-        $this->assertEquals('firstname lastname', $collection->getItems()[1]->getCustomer());
+        foreach ($collection->getItems() as $item) {
+            if ($item->getIncrementId() == '100000001') {
+                $this->assertEquals('firstname lastname', $item->getCustomer());
+            }
+        }
     }
 }
-- 
GitLab


From 6330103f3092db7414f2118588d9ffcee3a03e8a Mon Sep 17 00:00:00 2001
From: Sam Carr <samcarr4@googlemail.com>
Date: Fri, 10 Nov 2017 01:16:29 +0000
Subject: [PATCH 116/380] Fix delay initialization options for customized
 JQuery UI menu widget

---
 lib/web/mage/menu.js | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/lib/web/mage/menu.js b/lib/web/mage/menu.js
index 05d32174148..6ad60333d2e 100644
--- a/lib/web/mage/menu.js
+++ b/lib/web/mage/menu.js
@@ -21,6 +21,7 @@ define([
             expanded: false,
             showDelay: 42,
             hideDelay: 300,
+            delay: 300,
             mediaBreakpoint: '(max-width: 768px)'
         },
 
@@ -30,6 +31,8 @@ define([
         _create: function () {
             var self = this;
 
+            this.delay = this.options.delay;
+
             this._super();
             $(window).on('resize', function () {
                 self.element.find('.submenu-reverse').removeClass('submenu-reverse');
@@ -583,7 +586,7 @@ define([
                 html.removeClass('nav-open');
                 setTimeout(function () {
                     html.removeClass('nav-before-open');
-                }, 300);
+                }, this.options.hideDelay);
             }
         },
 
-- 
GitLab


From 94422cb5ad76281be8eb22a6492d13db6fcf2566 Mon Sep 17 00:00:00 2001
From: Todd Christensen <tchristensen@somethingdigital.com>
Date: Tue, 14 Nov 2017 18:33:37 -0800
Subject: [PATCH 117/380] Always use linkIds for category flat EAV indexing.

This keeps full and rows indexing consistent.
---
 .../Model/Indexer/Category/Flat/AbstractAction.php |  5 +++--
 .../Model/Indexer/Category/Flat/Action/Full.php    |  8 ++++++--
 .../Model/Indexer/Category/Flat/Action/Rows.php    | 14 ++++++++------
 3 files changed, 17 insertions(+), 10 deletions(-)

diff --git a/app/code/Magento/Catalog/Model/Indexer/Category/Flat/AbstractAction.php b/app/code/Magento/Catalog/Model/Indexer/Category/Flat/AbstractAction.php
index c5efbc61969..8f0e6e9c0cd 100644
--- a/app/code/Magento/Catalog/Model/Indexer/Category/Flat/AbstractAction.php
+++ b/app/code/Magento/Catalog/Model/Indexer/Category/Flat/AbstractAction.php
@@ -376,13 +376,14 @@ class AbstractAction
 
         $attributes = $this->getAttributes();
         $attributesType = ['varchar', 'int', 'decimal', 'text', 'datetime'];
+        $linkField = $this->getCategoryMetadata()->getLinkField();
         foreach ($attributesType as $type) {
             foreach ($this->getAttributeTypeValues($type, $entityIds, $storeId) as $row) {
-                if (isset($row[$this->getCategoryMetadata()->getLinkField()]) && isset($row['attribute_id'])) {
+                if (isset($row[$linkField]) && isset($row['attribute_id'])) {
                     $attributeId = $row['attribute_id'];
                     if (isset($attributes[$attributeId])) {
                         $attributeCode = $attributes[$attributeId]['attribute_code'];
-                        $values[$row[$this->getCategoryMetadata()->getLinkField()]][$attributeCode] = $row['value'];
+                        $values[$row[$linkField]][$attributeCode] = $row['value'];
                     }
                 }
             }
diff --git a/app/code/Magento/Catalog/Model/Indexer/Category/Flat/Action/Full.php b/app/code/Magento/Catalog/Model/Indexer/Category/Flat/Action/Full.php
index eeac2e80af9..64a8f930d83 100644
--- a/app/code/Magento/Catalog/Model/Indexer/Category/Flat/Action/Full.php
+++ b/app/code/Magento/Catalog/Model/Indexer/Category/Flat/Action/Full.php
@@ -64,18 +64,22 @@ class Full extends \Magento\Catalog\Model\Indexer\Category\Flat\AbstractAction
             }
             /** @TODO Do something with chunks */
             $categoriesIdsChunks = array_chunk($categoriesIds[$store->getRootCategoryId()], 500);
+
             foreach ($categoriesIdsChunks as $categoriesIdsChunk) {
                 $attributesData = $this->getAttributeValues($categoriesIdsChunk, $store->getId());
+                $linkField = $this->categoryMetadata->getLinkField();
+
                 $data = [];
                 foreach ($categories[$store->getRootCategoryId()] as $category) {
-                    if (!isset($attributesData[$category[$this->categoryMetadata->getLinkField()]])) {
+                    if (!isset($attributesData[$category[$linkField]])) {
                         continue;
                     }
                     $category['store_id'] = $store->getId();
                     $data[] = $this->prepareValuesToInsert(
-                        array_merge($category, $attributesData[$category[$this->categoryMetadata->getLinkField()]])
+                        array_merge($category, $attributesData[$category[$linkField]])
                     );
                 }
+
                 $this->connection->insertMultiple(
                     $this->addTemporaryTableSuffix($this->getMainStoreTable($store->getId())),
                     $data
diff --git a/app/code/Magento/Catalog/Model/Indexer/Category/Flat/Action/Rows.php b/app/code/Magento/Catalog/Model/Indexer/Category/Flat/Action/Rows.php
index 2368c27e02d..bc17d731f04 100644
--- a/app/code/Magento/Catalog/Model/Indexer/Category/Flat/Action/Rows.php
+++ b/app/code/Magento/Catalog/Model/Indexer/Category/Flat/Action/Rows.php
@@ -69,22 +69,24 @@ class Rows extends \Magento\Catalog\Model\Indexer\Category\Flat\AbstractAction
                 $categoriesIdsChunk = $this->filterIdsByStore($categoriesIdsChunk, $store);
 
                 $attributesData = $this->getAttributeValues($categoriesIdsChunk, $store->getId());
+                $linkField = $this->categoryMetadata->getLinkField();
                 $data = [];
                 foreach ($categoriesIdsChunk as $categoryId) {
-                    if (!isset($attributesData[$categoryId])) {
-                        continue;
-                    }
-
                     try {
                         $category = $this->categoryRepository->get($categoryId);
                     } catch (NoSuchEntityException $e) {
                         continue;
                     }
 
+                    $categoryData = $category->getData();
+                    if (!isset($attributesData[$categoryData[$linkField]])) {
+                        continue;
+                    }
+
                     $data[] = $this->prepareValuesToInsert(
                         array_merge(
-                            $category->getData(),
-                            $attributesData[$categoryId],
+                            $categoryData,
+                            $attributesData[$categoryData[$linkField]],
                             ['store_id' => $store->getId()]
                         )
                     );
-- 
GitLab


From 574f032d7facd5d9f16d647a5c6d9392a60dd83b Mon Sep 17 00:00:00 2001
From: Oleksandr Gorkun <ogorkun@magento.com>
Date: Thu, 16 Nov 2017 11:56:41 +0200
Subject: [PATCH 118/380] MAGETWO-75217: SKU parameter in capital letters on
 CSV ignored by database in Import but OK'd by validator

---
 .../Import/Product/Type/Configurable.php      | 45 ++++++++++++++++---
 .../Import/Product/Type/ConfigurableTest.php  | 41 +++++++++++++++++
 2 files changed, 79 insertions(+), 7 deletions(-)

diff --git a/app/code/Magento/ConfigurableImportExport/Model/Import/Product/Type/Configurable.php b/app/code/Magento/ConfigurableImportExport/Model/Import/Product/Type/Configurable.php
index 718a7dba73e..2e37c7dfd61 100644
--- a/app/code/Magento/ConfigurableImportExport/Model/Import/Product/Type/Configurable.php
+++ b/app/code/Magento/ConfigurableImportExport/Model/Import/Product/Type/Configurable.php
@@ -13,6 +13,7 @@ namespace Magento\ConfigurableImportExport\Model\Import\Product\Type;
 use Magento\Catalog\Api\Data\ProductInterface;
 use Magento\CatalogImportExport\Model\Import\Product as ImportProduct;
 use Magento\Framework\EntityManager\MetadataPool;
+use Magento\Framework\Exception\LocalizedException;
 
 /**
  * Importing configurable products
@@ -34,16 +35,24 @@ class Configurable extends \Magento\CatalogImportExport\Model\Import\Product\Typ
 
     const ERROR_DUPLICATED_VARIATIONS = 'duplicatedVariations';
 
+    const ERROR_UNIDENTIFIABLE_VARIATION = 'unidentifiableVariation';
+
     /**
      * Validation failure message template definitions
      *
      * @var array
      */
     protected $_messageTemplates = [
-        self::ERROR_ATTRIBUTE_CODE_IS_NOT_SUPER => 'Attribute with code "%s" is not super',
-        self::ERROR_INVALID_OPTION_VALUE => 'Invalid option value for attribute "%s"',
-        self::ERROR_INVALID_WEBSITE => 'Invalid website code for super attribute',
-        self::ERROR_DUPLICATED_VARIATIONS => 'SKU %s contains duplicated variations',
+        self::ERROR_ATTRIBUTE_CODE_IS_NOT_SUPER =>
+            'Attribute with code "%s" is not super',
+        self::ERROR_INVALID_OPTION_VALUE =>
+            'Invalid option value for attribute "%s"',
+        self::ERROR_INVALID_WEBSITE =>
+            'Invalid website code for super attribute',
+        self::ERROR_DUPLICATED_VARIATIONS =>
+            'SKU %s contains duplicated variations',
+        self::ERROR_UNIDENTIFIABLE_VARIATION =>
+            'Configurable variation "%s" is unidentifiable',
     ];
 
     /**
@@ -471,6 +480,7 @@ class Configurable extends \Magento\CatalogImportExport\Model\Import\Product\Typ
      * @param array $rowData
      *
      * @return array
+     * @throws LocalizedException
      * @SuppressWarnings(PHPMD.CyclomaticComplexity)
      * @SuppressWarnings(PHPMD.NPathComplexity)
      */
@@ -489,8 +499,10 @@ class Configurable extends \Magento\CatalogImportExport\Model\Import\Product\Typ
             foreach ($fieldAndValuePairsText as $nameAndValue) {
                 $nameAndValue = explode(ImportProduct::PAIR_NAME_VALUE_SEPARATOR, $nameAndValue);
                 if (!empty($nameAndValue)) {
-                    $value = isset($nameAndValue[1]) ? trim($nameAndValue[1]) : '';
-                    $fieldName  = trim($nameAndValue[0]);
+                    $value = isset($nameAndValue[1]) ?
+                        trim($nameAndValue[1]) : '';
+                    //Ignoring field names' case.
+                    $fieldName  = mb_strtolower(trim($nameAndValue[0]));
                     if ($fieldName) {
                         $fieldAndValuePairs[$fieldName] = $value;
                     }
@@ -511,8 +523,19 @@ class Configurable extends \Magento\CatalogImportExport\Model\Import\Product\Typ
                     $additionalRow = [];
                     $position += 1;
                 }
+            } else {
+                $errorCode = self::ERROR_UNIDENTIFIABLE_VARIATION;
+                throw new LocalizedException(
+                    __(
+                        sprintf(
+                            $this->_messageTemplates[$errorCode],
+                            $variation
+                        )
+                    )
+                );
             }
         }
+
         return $additionalRows;
     }
 
@@ -823,7 +846,14 @@ class Configurable extends \Magento\CatalogImportExport\Model\Import\Product\Typ
     public function isRowValid(array $rowData, $rowNum, $isNewProduct = true)
     {
         $error = false;
-        $dataWithExtraVirtualRows = $this->_parseVariations($rowData);
+        try {
+            $dataWithExtraVirtualRows = $this->_parseVariations($rowData);
+        } catch (LocalizedException $exception) {
+            $this->_entityModel->addRowError($exception->getMessage(), $rowNum);
+
+            return false;
+        }
+
         $skus = [];
         $rowData['price'] = isset($rowData['price']) && $rowData['price'] ? $rowData['price'] : '0.00';
         if (!empty($dataWithExtraVirtualRows)) {
@@ -841,6 +871,7 @@ class Configurable extends \Magento\CatalogImportExport\Model\Import\Product\Typ
             }
             $error |= !parent::isRowValid($option, $rowNum, $isNewProduct);
         }
+
         return !$error;
     }
 
diff --git a/app/code/Magento/ConfigurableImportExport/Test/Unit/Model/Import/Product/Type/ConfigurableTest.php b/app/code/Magento/ConfigurableImportExport/Test/Unit/Model/Import/Product/Type/ConfigurableTest.php
index f6912fe8b6d..54552364de1 100644
--- a/app/code/Magento/ConfigurableImportExport/Test/Unit/Model/Import/Product/Type/ConfigurableTest.php
+++ b/app/code/Magento/ConfigurableImportExport/Test/Unit/Model/Import/Product/Type/ConfigurableTest.php
@@ -560,15 +560,56 @@ class ConfigurableTest extends \Magento\ImportExport\Test\Unit\Model\Import\Abst
             '_type' => 'configurable',
             '_product_websites' => 'website_1',
         ];
+        //Checking that variations' field names are case-insensitive with this
+        //product.
+        $caseInsensitiveSKU = 'configurableskuI22CaseInsensitive';
+        $caseInsensitiveProduct = [
+            'sku' => $caseInsensitiveSKU,
+            'store_view_code' => null,
+            'attribute_set_code' => 'Default',
+            'product_type' => 'configurable',
+            'name' => 'Configurable Product 21',
+            'product_websites' => 'website_1',
+            'configurable_variation_labels' => 'testattr2=Select Color, testattr3=Select Size',
+            'configurable_variations' => 'SKU=testconf2-attr2val1-testattr3v1,'
+                . 'testattr2=attr2val1,'
+                . 'testattr3=testattr3v1,'
+                . 'display=1|sku=testconf2-attr2val1-testattr3v2,'
+                . 'testattr2=attr2val1,'
+                . 'testattr3=testattr3v2,'
+                . 'display=0',
+            '_store' => null,
+            '_attribute_set' => 'Default',
+            '_type' => 'configurable',
+            '_product_websites' => 'website_1',
+        ];
         $bunch[] = $badProduct;
+        $bunch[] = $caseInsensitiveProduct;
         // Set _attributes to avoid error in Magento\CatalogImportExport\Model\Import\Product\Type\AbstractType.
         $this->setPropertyValue($this->configurable, '_attributes', [
             $badProduct[\Magento\CatalogImportExport\Model\Import\Product::COL_ATTR_SET] => [],
         ]);
+        //Avoiding errors about attributes not being super
+        $this->setPropertyValue(
+            $this->configurable,
+            '_superAttributes',
+            [
+                'testattr2' => ['options' => ['attr2val1' => 1]],
+                'testattr3' => [
+                    'options' => [
+                        'testattr3v2' => 1,
+                        'testattr3v1' => 1,
+                    ],
+                ],
+            ]
+        );
 
         foreach ($bunch as $rowData) {
             $result = $this->configurable->isRowValid($rowData, 0, !isset($this->_oldSku[$rowData['sku']]));
             $this->assertNotNull($result);
+            if ($rowData['sku'] === $caseInsensitiveSKU) {
+                $this->assertTrue($result);
+            }
         }
     }
 
-- 
GitLab


From 799199e149b749890a8ed15b27d751cc7c57dade Mon Sep 17 00:00:00 2001
From: Vova Yatsyuk <vova.yatsyuk@gmail.com>
Date: Thu, 16 Nov 2017 12:16:29 +0200
Subject: [PATCH 119/380] Fix errors when DOB field is visible. #12146

 - Fix customer create page rendering
 - Fix customer save in backend and frontend
---
 lib/internal/Magento/Framework/Data/Form/Filter/Date.php | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/lib/internal/Magento/Framework/Data/Form/Filter/Date.php b/lib/internal/Magento/Framework/Data/Form/Filter/Date.php
index 8765e136e28..864c0f3e27e 100644
--- a/lib/internal/Magento/Framework/Data/Form/Filter/Date.php
+++ b/lib/internal/Magento/Framework/Data/Form/Filter/Date.php
@@ -54,6 +54,10 @@ class Date implements \Magento\Framework\Data\Form\Filter\FilterInterface
      */
     public function inputFilter($value)
     {
+        if (!$value) {
+            return $value;
+        }
+
         $filterInput = new \Zend_Filter_LocalizedToNormalized(
             ['date_format' => $this->_dateFormat, 'locale' => $this->localeResolver->getLocale()]
         );
@@ -74,6 +78,10 @@ class Date implements \Magento\Framework\Data\Form\Filter\FilterInterface
      */
     public function outputFilter($value)
     {
+        if (!$value) {
+            return $value;
+        }
+
         $filterInput = new \Zend_Filter_LocalizedToNormalized(
             ['date_format' => DateTime::DATE_INTERNAL_FORMAT, 'locale' => $this->localeResolver->getLocale()]
         );
-- 
GitLab


From a796fe6e73ab03eedad571916ff128471fcf1eaa Mon Sep 17 00:00:00 2001
From: Oleksandr Gorkun <ogorkun@magento.com>
Date: Thu, 16 Nov 2017 12:50:00 +0200
Subject: [PATCH 120/380] MAGETWO-75217: SKU parameter in capital letters on
 CSV ignored by database in Import but OK'd by validator

---
 .../Model/Import/Product/Type/Configurable.php                  | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/app/code/Magento/ConfigurableImportExport/Model/Import/Product/Type/Configurable.php b/app/code/Magento/ConfigurableImportExport/Model/Import/Product/Type/Configurable.php
index 2e37c7dfd61..0e7a026c526 100644
--- a/app/code/Magento/ConfigurableImportExport/Model/Import/Product/Type/Configurable.php
+++ b/app/code/Magento/ConfigurableImportExport/Model/Import/Product/Type/Configurable.php
@@ -487,7 +487,7 @@ class Configurable extends \Magento\CatalogImportExport\Model\Import\Product\Typ
     protected function _parseVariations($rowData)
     {
         $additionalRows = [];
-        if (!isset($rowData['configurable_variations'])) {
+        if (empty($rowData['configurable_variations'])) {
             return $additionalRows;
         }
         $variations = explode(ImportProduct::PSEUDO_MULTI_LINE_SEPARATOR, $rowData['configurable_variations']);
-- 
GitLab


From 24eee6414605d1b2ec0640fbfd9e8c660fbd960d Mon Sep 17 00:00:00 2001
From: RomanKis <romaikiss@gmail.com>
Date: Thu, 16 Nov 2017 15:57:56 +0200
Subject: [PATCH 121/380] 12261: Order confirmation email contains non
 functioning links #12261

---
 .../Magento/luma/Magento_Email/email/footer.html     | 12 ++++++++++--
 1 file changed, 10 insertions(+), 2 deletions(-)

diff --git a/app/design/frontend/Magento/luma/Magento_Email/email/footer.html b/app/design/frontend/Magento/luma/Magento_Email/email/footer.html
index 994f9e6bffe..ba67e5ef08b 100644
--- a/app/design/frontend/Magento/luma/Magento_Email/email/footer.html
+++ b/app/design/frontend/Magento/luma/Magento_Email/email/footer.html
@@ -17,8 +17,16 @@
                         <table>
                             <tr>
                                 <td>
-                                    <p><a href="#">{{trans "About Us"}}</a></p>
-                                    <p><a href="#">{{trans "Customer Service"}}</a></p>
+                                    {{depend url_about_us}}
+                                    <p>
+                                        {{trans '<a href=%url_about>About Us</a>' url_about_us=$url_about_us |raw}}
+                                    </p>
+                                    {{/depend}}
+                                    {{depend url_customer_service}}
+                                    <p>
+                                        {{trans '<a href=url_customer_service>Customer Service</a>' url_customer_service=$url_customer_service |raw}}
+                                    </p>
+                                    {{/depend}}
                                 </td>
                                 <td>
                                     {{depend store_phone}}
-- 
GitLab


From ec33cc50bbe9be7559b179f4a0d75b4ca062ecb8 Mon Sep 17 00:00:00 2001
From: RomanKis <romaikiss@gmail.com>
Date: Thu, 16 Nov 2017 16:37:19 +0200
Subject: [PATCH 122/380] 12261: Order confirmation email contains non
 functioning links #12261

---
 .../frontend/Magento/luma/Magento_Email/email/footer.html       | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/app/design/frontend/Magento/luma/Magento_Email/email/footer.html b/app/design/frontend/Magento/luma/Magento_Email/email/footer.html
index ba67e5ef08b..0fc8e36a820 100644
--- a/app/design/frontend/Magento/luma/Magento_Email/email/footer.html
+++ b/app/design/frontend/Magento/luma/Magento_Email/email/footer.html
@@ -19,7 +19,7 @@
                                 <td>
                                     {{depend url_about_us}}
                                     <p>
-                                        {{trans '<a href=%url_about>About Us</a>' url_about_us=$url_about_us |raw}}
+                                        {{trans '<a href=%url_about_us>About Us</a>' url_about_us=$url_about_us |raw}}
                                     </p>
                                     {{/depend}}
                                     {{depend url_customer_service}}
-- 
GitLab


From 6f70d065a415157a57716e8629b523de0ec6f291 Mon Sep 17 00:00:00 2001
From: Oleksandr Miroshnichenko <omiroshnichenko@magento.com>
Date: Thu, 16 Nov 2017 16:45:38 +0200
Subject: [PATCH 123/380] MAGETWO-83993: Fixed a js bug where ui_component
 labels have the wrong sort order. #11846

---
 .../js/components/dynamic-rows-tier-price.js  |  4 ++
 .../base/web/js/dynamic-rows/dynamic-rows.js  | 31 ++-------------
 .../base/js/dynamic-rows/dynamic-rows.test.js | 38 +++++++++++++++++++
 3 files changed, 46 insertions(+), 27 deletions(-)

diff --git a/app/code/Magento/Catalog/view/adminhtml/web/js/components/dynamic-rows-tier-price.js b/app/code/Magento/Catalog/view/adminhtml/web/js/components/dynamic-rows-tier-price.js
index 9201c1c8e0f..b5c0e7a95d4 100644
--- a/app/code/Magento/Catalog/view/adminhtml/web/js/components/dynamic-rows-tier-price.js
+++ b/app/code/Magento/Catalog/view/adminhtml/web/js/components/dynamic-rows-tier-price.js
@@ -9,6 +9,10 @@ define([
 ], function (_, DynamicRows) {
     'use strict';
 
+    /**
+     * @deprecated Parent method contains labels sorting.
+     * @see Magento_Ui/js/dynamic-rows/dynamic-rows
+     */
     return DynamicRows.extend({
 
         /**
diff --git a/app/code/Magento/Ui/view/base/web/js/dynamic-rows/dynamic-rows.js b/app/code/Magento/Ui/view/base/web/js/dynamic-rows/dynamic-rows.js
index bcd15880a81..01fa03d1b4b 100644
--- a/app/code/Magento/Ui/view/base/web/js/dynamic-rows/dynamic-rows.js
+++ b/app/code/Magento/Ui/view/base/web/js/dynamic-rows/dynamic-rows.js
@@ -533,7 +533,8 @@ define([
          * Init header elements
          */
         initHeader: function () {
-            var data;
+            var labels = [],
+                data;
 
             if (!this.labels().length) {
                 _.each(this.childTemplate.children, function (cell) {
@@ -547,15 +548,9 @@ define([
                         sortOrder: cell.config.sortOrder
                     });
 
-                    this.labels.push(data);
-
-                    /**
-                     * Sort the array after an element was added to fix an bug where
-                     * additional added field labels in ui_components haven't the right
-                     * sort order.
-                     */
-                    this.labels.sort(this._compare);
+                    labels.push(data);
                 }, this);
+                this.labels(_.sortBy(labels, 'sortOrder'));
             }
         },
 
@@ -921,24 +916,6 @@ define([
             }));
         },
 
-        /**
-         * Compare two objects by the sortOrder property.
-         *
-         * @param {Object} $object1
-         * @param {Object} $object2
-         * @returns {Number}
-         * @private
-         */
-        _compare: function ($object1, $object2) {
-            if ($object1.sortOrder > $object2.sortOrder) {
-                return 1;
-            } else if ($object1.sortOrder < $object2.sortOrder) {
-                return -1;
-            }
-
-            return 0;
-        },
-
         /**
          * Set new data to dataSource,
          * delete element
diff --git a/dev/tests/js/jasmine/tests/app/code/Magento/Ui/base/js/dynamic-rows/dynamic-rows.test.js b/dev/tests/js/jasmine/tests/app/code/Magento/Ui/base/js/dynamic-rows/dynamic-rows.test.js
index 2eacea247d0..2e238eb9930 100644
--- a/dev/tests/js/jasmine/tests/app/code/Magento/Ui/base/js/dynamic-rows/dynamic-rows.test.js
+++ b/dev/tests/js/jasmine/tests/app/code/Magento/Ui/base/js/dynamic-rows/dynamic-rows.test.js
@@ -131,5 +131,43 @@ define([
             model.deleteRecord(1, 1);
             expect(model.recordData()).toEqual([]);
         });
+
+        it('"initHeader" sortOrder', function () {
+            var labels = [{
+                    name: 'Name 1',
+                    config: {
+                        label: 'Label 1',
+                        validation: false,
+                        columnsHeaderClasses: '',
+                        sortOrder: 10
+                    }
+                }, {
+                    name: 'Name 2',
+                    config: {
+                        label: 'Label 2',
+                        validation: false,
+                        columnsHeaderClasses: '',
+                        sortOrder: 5
+                    }
+                }],
+                result = [{
+                    label: 'Label 2',
+                    name: 'Name 2',
+                    required: false,
+                    columnsHeaderClasses: '',
+                    sortOrder: 5
+                }, {
+                    label: 'Label 1',
+                    name: 'Name 1',
+                    required: false,
+                    columnsHeaderClasses: '',
+                    sortOrder: 10
+                }];
+
+            model.childTemplate = {
+                children: labels
+            };
+            expect(JSON.stringify(model.labels())).toEqual(JSON.stringify(result));
+        });
     });
 });
-- 
GitLab


From 38735ac4b3200e81c5e7f28beb4ec7f4b76916b8 Mon Sep 17 00:00:00 2001
From: magento-engcom-team <mikola.malevanec@transoftgroup.com>
Date: Fri, 10 Nov 2017 13:08:36 +0200
Subject: [PATCH 124/380] 8003: Using System Value for Base Currency Results in
 Config Error.

---
 app/code/Magento/Directory/Model/Currency.php |  21 ++-
 .../Directory/Model/CurrencySystemConfig.php  | 123 +++++++++++++++++
 .../Test/Unit/Model/CurrencyConfigTest.php    | 116 ++++++++++++++++
 .../Model/CurrencySystemConfigTest.php        | 130 ++++++++++++++++++
 4 files changed, 386 insertions(+), 4 deletions(-)
 create mode 100644 app/code/Magento/Directory/Model/CurrencySystemConfig.php
 create mode 100644 app/code/Magento/Directory/Test/Unit/Model/CurrencyConfigTest.php
 create mode 100644 dev/tests/integration/testsuite/Magento/Directory/Model/CurrencySystemConfigTest.php

diff --git a/app/code/Magento/Directory/Model/Currency.php b/app/code/Magento/Directory/Model/Currency.php
index a8df4936b8f..700f6b24f86 100644
--- a/app/code/Magento/Directory/Model/Currency.php
+++ b/app/code/Magento/Directory/Model/Currency.php
@@ -6,6 +6,7 @@
 
 namespace Magento\Directory\Model;
 
+use Magento\Framework\App\ObjectManager;
 use Magento\Framework\Exception\InputException;
 use Magento\Directory\Model\Currency\Filter;
 
@@ -65,6 +66,11 @@ class Currency extends \Magento\Framework\Model\AbstractModel
      */
     protected $_localeCurrency;
 
+    /**
+     * @var CurrencySystemConfig
+     */
+    private $currencyConfig;
+
     /**
      * @param \Magento\Framework\Model\Context $context
      * @param \Magento\Framework\Registry $registry
@@ -76,6 +82,7 @@ class Currency extends \Magento\Framework\Model\AbstractModel
      * @param \Magento\Framework\Model\ResourceModel\AbstractResource $resource
      * @param \Magento\Framework\Data\Collection\AbstractDb $resourceCollection
      * @param array $data
+     * @param CurrencySystemConfig|null $currencyConfig
      * @SuppressWarnings(PHPMD.ExcessiveParameterList)
      */
     public function __construct(
@@ -88,7 +95,8 @@ class Currency extends \Magento\Framework\Model\AbstractModel
         \Magento\Framework\Locale\CurrencyInterface $localeCurrency,
         \Magento\Framework\Model\ResourceModel\AbstractResource $resource = null,
         \Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null,
-        array $data = []
+        array $data = [],
+        CurrencySystemConfig $currencyConfig = null
     ) {
         parent::__construct(
             $context,
@@ -102,6 +110,7 @@ class Currency extends \Magento\Framework\Model\AbstractModel
         $this->_directoryHelper = $directoryHelper;
         $this->_currencyFilterFactory = $currencyFilterFactory;
         $this->_localeCurrency = $localeCurrency;
+        $this->currencyConfig = $currencyConfig ?: ObjectManager::getInstance()->get(CurrencySystemConfig::class);
     }
 
     /**
@@ -347,7 +356,8 @@ class Currency extends \Magento\Framework\Model\AbstractModel
      */
     public function getConfigAllowCurrencies()
     {
-        $allowedCurrencies = $this->_getResource()->getConfigCurrencies($this, self::XML_PATH_CURRENCY_ALLOW);
+        $allowedCurrencies = $this->_getResource()->getConfigCurrencies($this, self::XML_PATH_CURRENCY_ALLOW) ?:
+            $this->currencyConfig->getConfigCurrencies(self::XML_PATH_CURRENCY_ALLOW);
         $appBaseCurrencyCode = $this->_directoryHelper->getBaseCurrencyCode();
         if (!in_array($appBaseCurrencyCode, $allowedCurrencies)) {
             $allowedCurrencies[] = $appBaseCurrencyCode;
@@ -369,7 +379,9 @@ class Currency extends \Magento\Framework\Model\AbstractModel
      */
     public function getConfigDefaultCurrencies()
     {
-        $defaultCurrencies = $this->_getResource()->getConfigCurrencies($this, self::XML_PATH_CURRENCY_DEFAULT);
+        $defaultCurrencies = $this->_getResource()->getConfigCurrencies($this, self::XML_PATH_CURRENCY_DEFAULT) ?:
+            $this->currencyConfig->getConfigCurrencies(self::XML_PATH_CURRENCY_DEFAULT);
+
         return $defaultCurrencies;
     }
 
@@ -378,7 +390,8 @@ class Currency extends \Magento\Framework\Model\AbstractModel
      */
     public function getConfigBaseCurrencies()
     {
-        $defaultCurrencies = $this->_getResource()->getConfigCurrencies($this, self::XML_PATH_CURRENCY_BASE);
+        $defaultCurrencies = $this->_getResource()->getConfigCurrencies($this, self::XML_PATH_CURRENCY_BASE) ?:
+            $this->currencyConfig->getConfigCurrencies(self::XML_PATH_CURRENCY_BASE);
         return $defaultCurrencies;
     }
 
diff --git a/app/code/Magento/Directory/Model/CurrencySystemConfig.php b/app/code/Magento/Directory/Model/CurrencySystemConfig.php
new file mode 100644
index 00000000000..ce2829a489b
--- /dev/null
+++ b/app/code/Magento/Directory/Model/CurrencySystemConfig.php
@@ -0,0 +1,123 @@
+<?php
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Directory\Model;
+
+use Magento\Config\App\Config\Type\System;
+use Magento\Framework\App\ResourceConnection;
+use Magento\Store\Model\StoreManagerInterface;
+
+/**
+ * Provide system config values for allowed, base and default currencies.
+ */
+class CurrencySystemConfig
+{
+    /**
+     * @var System
+     */
+    private $systemConfig;
+
+    /**
+     * @var StoreManagerInterface
+     */
+    private $storeManager;
+
+    /**
+     * @var string
+     */
+    private $path;
+
+    /**
+     * Currency constructor.
+     *
+     * @param System $systemConfig
+     * @param StoreManagerInterface $storeManager
+     */
+    public function __construct(
+        System $systemConfig,
+        StoreManagerInterface $storeManager,
+        ResourceConnection $resources
+    ) {
+        $this->systemConfig = $systemConfig;
+        $this->storeManager = $storeManager;
+    }
+
+    /**
+     * Retrieve config currency data by config path.
+     *
+     * @param string $path
+     * @return array
+     */
+    public function getConfigCurrencies(string $path)
+    {
+        $this->path = $path;
+        $result = array_merge(
+            $this->getDefaultConfigCurrencies(),
+            $this->getWebsiteConfigCurrencies(),
+            $this->getStoreConfigCurrencies()
+        );
+        sort($result);
+
+        return array_unique($result);
+    }
+
+    /**
+     * Get system config values as array for default scope.
+     *
+     * @return array
+     */
+    private function getDefaultConfigCurrencies()
+    {
+        return $this->getConfig($this->path, 'default');
+    }
+
+    /**
+     * Get system config values as array for website scope.
+     *
+     * @return array
+     */
+    private function getWebsiteConfigCurrencies()
+    {
+        $websiteResult = [[]];
+        foreach ($this->storeManager->getWebsites() as $website) {
+            $websiteResult[] = $this->getConfig($this->path, 'websites', $website->getId());
+        }
+        $websiteResult = array_merge(...$websiteResult);
+
+        return $websiteResult;
+    }
+
+    /**
+     * Get system config values as array for store scope.
+     *
+     * @return array
+     */
+    private function getStoreConfigCurrencies()
+    {
+        $storeResult = [[]];
+        foreach ($this->storeManager->getStores() as $store) {
+            $storeResult[] = $this->getConfig($this->path, 'stores', $store->getId());
+        }
+        $storeResult = array_merge(...$storeResult);
+
+        return $storeResult;
+    }
+
+    /**
+     * Get system config values as array for specified scope.
+     *
+     * @param string $scope
+     * @param string $scopeId
+     * @param string $path
+     * @return array
+     */
+    private function getConfig(string $path, string $scope, string $scopeId = null)
+    {
+        $configPath = $scopeId ? sprintf('%s/%s/%s', $scope, $scopeId, $path) : sprintf('%s/%s', $scope, $path);
+
+        return explode(',', $this->systemConfig->get($configPath));
+    }
+}
diff --git a/app/code/Magento/Directory/Test/Unit/Model/CurrencyConfigTest.php b/app/code/Magento/Directory/Test/Unit/Model/CurrencyConfigTest.php
new file mode 100644
index 00000000000..2a81cc23b7a
--- /dev/null
+++ b/app/code/Magento/Directory/Test/Unit/Model/CurrencyConfigTest.php
@@ -0,0 +1,116 @@
+<?php
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Directory\Test\Unit\Model;
+
+use Magento\Config\App\Config\Type\System;
+use Magento\Directory\Model\CurrencySystemConfig;
+use Magento\Framework\TestFramework\Unit\Helper\ObjectManager;
+use Magento\Store\Api\Data\StoreInterface;
+use Magento\Store\Api\Data\WebsiteInterface;
+use Magento\Store\Model\StoreManagerInterface;
+use PHPUnit\Framework\TestCase;
+
+/**
+ * Provide tests for CurrencySystemConfig model.
+ */
+class CurrencyConfigTest extends TestCase
+{
+    /**
+     * @var CurrencySystemConfig
+     */
+    private $testSubject;
+
+    /**
+     * @var System|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $systemConfig;
+
+    /**
+     * @var StoreManagerInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $storeManager;
+
+    /**
+     * @inheritdoc
+     */
+    protected function setUp()
+    {
+        $this->systemConfig = $this->getMockBuilder(System::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $this->storeManager = $this->getMockBuilder(StoreManagerInterface::class)
+            ->setMethods(['getStores', 'getWebsites'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $objectManager = new ObjectManager($this);
+        $this->testSubject = $objectManager->getObject(
+            CurrencySystemConfig::class,
+            [
+                'systemConfig' => $this->systemConfig,
+                'storeManager' => $this->storeManager,
+            ]
+        );
+    }
+
+    /**
+     * @return void
+     */
+    public function testGetConfigCurrencies()
+    {
+        $path = 'test/path';
+        $expected = [
+            0 => 'ARS',
+            1 => 'AUD',
+            3 => 'BZD',
+            4 => 'CAD',
+            5 => 'CLP',
+            6 => 'EUR',
+            7 => 'USD',
+        ];
+
+        /** @var StoreInterface|\PHPUnit_Framework_MockObject_MockObject $store */
+        $store = $this->getMockBuilder(StoreInterface::class)
+            ->setMethods(['getId'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $store->expects(self::once())
+            ->method('getId')
+            ->willReturn(1);
+
+        /** @var WebsiteInterface|\PHPUnit_Framework_MockObject_MockObject $website */
+        $website = $this->getMockBuilder(WebsiteInterface::class)
+            ->setMethods(['getId'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $website->expects(self::once())
+            ->method('getId')
+            ->willReturn(1);
+
+        $this->systemConfig->expects(self::exactly(3))
+            ->method('get')
+            ->withConsecutive(
+                self::identicalTo('default/test/path'),
+                self::identicalTo('websites/1/test/path'),
+                self::identicalTo('stores/1/test/path')
+            )->willReturnOnConsecutiveCalls(
+                'USD,EUR',
+                'AUD,ARS',
+                'BZD,CAD,AUD,CLP'
+            );
+
+        $this->storeManager->expects(self::once())
+            ->method('getStores')
+            ->willReturn([$store]);
+        $this->storeManager->expects(self::once())
+            ->method('getWebsites')
+            ->willReturn([$website]);
+
+        $result = $this->testSubject->getConfigCurrencies($path);
+
+        self::assertEquals($expected, $result);
+    }
+}
diff --git a/dev/tests/integration/testsuite/Magento/Directory/Model/CurrencySystemConfigTest.php b/dev/tests/integration/testsuite/Magento/Directory/Model/CurrencySystemConfigTest.php
new file mode 100644
index 00000000000..e01fd1f5def
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Directory/Model/CurrencySystemConfigTest.php
@@ -0,0 +1,130 @@
+<?php
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Directory\Model;
+
+use Magento\Directory\Model\Currency as CurrencyModel;
+use Magento\Framework\App\Config\ConfigResource\ConfigInterface;
+use Magento\Store\Model\ScopeInterface;
+use Magento\TestFramework\Helper\Bootstrap;
+use PHPUnit\Framework\TestCase;
+
+/**
+ * Provide tests for CurrencySystemConfig model.
+ */
+class CurrencySystemConfigTest extends TestCase
+{
+    /**
+     * @var string
+     */
+    private $baseCurrencyPath = 'currency/options/base';
+
+    /**
+     * @var string
+     */
+    private $defaultCurrencyPath = 'currency/options/default';
+
+    /**
+     * @var string
+     */
+    private $allowedCurrenciesPath = 'currency/options/allow';
+
+    /**
+     * @var ConfigInterface
+     */
+    private $configResource;
+
+    /**
+     * @var CurrencyModel
+     */
+    private $currency;
+
+    /**
+     * @inheritdoc
+     */
+    protected function setUp()
+    {
+        $this->currency = Bootstrap::getObjectManager()->get(CurrencyModel::class);
+        $this->configResource = Bootstrap::getObjectManager()->get(ConfigInterface::class);
+    }
+
+    /**
+     * Test CurrencySystemConfig won't read system config, if values present in DB.
+     */
+    public function testGetConfigCurrenciesWithDbValues()
+    {
+        $this->clearCurrencyConfig();
+        $allowedCurrencies = 'BDT,BNS,BTD,USD';
+        $baseCurrency = 'BDT';
+        $this->configResource->saveConfig(
+            $this->baseCurrencyPath,
+            $baseCurrency,
+            ScopeInterface::SCOPE_STORE,
+            0
+        );
+        $this->configResource->saveConfig(
+            $this->defaultCurrencyPath,
+            $baseCurrency,
+            ScopeInterface::SCOPE_STORE,
+            0
+        );
+        $this->configResource->saveConfig(
+            $this->allowedCurrenciesPath,
+            $allowedCurrencies,
+            ScopeInterface::SCOPE_STORE,
+            0
+        );
+
+        $expected = [
+            'allowed' => explode(',', $allowedCurrencies),
+            'base' => [$baseCurrency],
+            'default' => [$baseCurrency],
+        ];
+        self::assertEquals($expected['allowed'], $this->currency->getConfigAllowCurrencies());
+        self::assertEquals($expected['base'], $this->currency->getConfigBaseCurrencies());
+        self::assertEquals($expected['default'], $this->currency->getConfigDefaultCurrencies());
+    }
+
+    /**
+     * Test CurrencySystemConfig will read system config, if values don't present in DB.
+     */
+    public function testGetConfigCurrenciesWithNoDbValues()
+    {
+        $this->clearCurrencyConfig();
+        $expected = [
+            'allowed' => [0 => 'EUR',3 => 'USD'],
+            'base' => ['USD'],
+            'default' => ['USD'],
+        ];
+        self::assertEquals($expected['allowed'], $this->currency->getConfigAllowCurrencies());
+        self::assertEquals($expected['base'], $this->currency->getConfigBaseCurrencies());
+        self::assertEquals($expected['default'], $this->currency->getConfigDefaultCurrencies());
+    }
+
+    /**
+     * Remove currency config form Db.
+     *
+     * @return void
+     */
+    private function clearCurrencyConfig()
+    {
+        $this->configResource->deleteConfig(
+            $this->allowedCurrenciesPath,
+            ScopeInterface::SCOPE_STORE,
+            0
+        );
+        $this->configResource->deleteConfig(
+            $this->baseCurrencyPath,
+            ScopeInterface::SCOPE_STORE,
+            0
+        );
+        $this->configResource->deleteConfig(
+            $this->defaultCurrencyPath,
+            ScopeInterface::SCOPE_STORE,
+            0
+        );
+    }
+}
-- 
GitLab


From b63ceb99d650e23d62c6a03230f01ff7f85b6920 Mon Sep 17 00:00:00 2001
From: magento-engcom-team <mikola.malevanec@transoftgroup.com>
Date: Mon, 13 Nov 2017 16:06:20 +0200
Subject: [PATCH 125/380] 8003: Using System Value for Base Currency Results in
 Config Error.

---
 app/code/Magento/Directory/Model/Currency.php |  20 +-
 .../Directory/Model/CurrencyConfig.php        |  99 +++++++++
 .../Directory/Model/CurrencySystemConfig.php  | 123 -----------
 .../Model/ResourceModel/Currency.php          |   2 +
 .../Test/Unit/Model/CurrencyConfigTest.php    | 105 +++++----
 .../Directory/Model/CurrencyConfigTest.php    | 202 ++++++++++++++++++
 .../Model/CurrencySystemConfigTest.php        | 130 -----------
 7 files changed, 368 insertions(+), 313 deletions(-)
 create mode 100644 app/code/Magento/Directory/Model/CurrencyConfig.php
 delete mode 100644 app/code/Magento/Directory/Model/CurrencySystemConfig.php
 create mode 100644 dev/tests/integration/testsuite/Magento/Directory/Model/CurrencyConfigTest.php
 delete mode 100644 dev/tests/integration/testsuite/Magento/Directory/Model/CurrencySystemConfigTest.php

diff --git a/app/code/Magento/Directory/Model/Currency.php b/app/code/Magento/Directory/Model/Currency.php
index 700f6b24f86..356b3db639b 100644
--- a/app/code/Magento/Directory/Model/Currency.php
+++ b/app/code/Magento/Directory/Model/Currency.php
@@ -67,7 +67,7 @@ class Currency extends \Magento\Framework\Model\AbstractModel
     protected $_localeCurrency;
 
     /**
-     * @var CurrencySystemConfig
+     * @var CurrencyConfig
      */
     private $currencyConfig;
 
@@ -82,7 +82,7 @@ class Currency extends \Magento\Framework\Model\AbstractModel
      * @param \Magento\Framework\Model\ResourceModel\AbstractResource $resource
      * @param \Magento\Framework\Data\Collection\AbstractDb $resourceCollection
      * @param array $data
-     * @param CurrencySystemConfig|null $currencyConfig
+     * @param CurrencyConfig|null $currencyConfig
      * @SuppressWarnings(PHPMD.ExcessiveParameterList)
      */
     public function __construct(
@@ -96,7 +96,7 @@ class Currency extends \Magento\Framework\Model\AbstractModel
         \Magento\Framework\Model\ResourceModel\AbstractResource $resource = null,
         \Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null,
         array $data = [],
-        CurrencySystemConfig $currencyConfig = null
+        CurrencyConfig $currencyConfig = null
     ) {
         parent::__construct(
             $context,
@@ -110,7 +110,7 @@ class Currency extends \Magento\Framework\Model\AbstractModel
         $this->_directoryHelper = $directoryHelper;
         $this->_currencyFilterFactory = $currencyFilterFactory;
         $this->_localeCurrency = $localeCurrency;
-        $this->currencyConfig = $currencyConfig ?: ObjectManager::getInstance()->get(CurrencySystemConfig::class);
+        $this->currencyConfig = $currencyConfig ?: ObjectManager::getInstance()->get(CurrencyConfig::class);
     }
 
     /**
@@ -356,8 +356,7 @@ class Currency extends \Magento\Framework\Model\AbstractModel
      */
     public function getConfigAllowCurrencies()
     {
-        $allowedCurrencies = $this->_getResource()->getConfigCurrencies($this, self::XML_PATH_CURRENCY_ALLOW) ?:
-            $this->currencyConfig->getConfigCurrencies(self::XML_PATH_CURRENCY_ALLOW);
+        $allowedCurrencies = $this->currencyConfig->getConfigCurrencies(self::XML_PATH_CURRENCY_ALLOW);
         $appBaseCurrencyCode = $this->_directoryHelper->getBaseCurrencyCode();
         if (!in_array($appBaseCurrencyCode, $allowedCurrencies)) {
             $allowedCurrencies[] = $appBaseCurrencyCode;
@@ -379,10 +378,7 @@ class Currency extends \Magento\Framework\Model\AbstractModel
      */
     public function getConfigDefaultCurrencies()
     {
-        $defaultCurrencies = $this->_getResource()->getConfigCurrencies($this, self::XML_PATH_CURRENCY_DEFAULT) ?:
-            $this->currencyConfig->getConfigCurrencies(self::XML_PATH_CURRENCY_DEFAULT);
-
-        return $defaultCurrencies;
+        return $this->currencyConfig->getConfigCurrencies(self::XML_PATH_CURRENCY_DEFAULT);
     }
 
     /**
@@ -390,9 +386,7 @@ class Currency extends \Magento\Framework\Model\AbstractModel
      */
     public function getConfigBaseCurrencies()
     {
-        $defaultCurrencies = $this->_getResource()->getConfigCurrencies($this, self::XML_PATH_CURRENCY_BASE) ?:
-            $this->currencyConfig->getConfigCurrencies(self::XML_PATH_CURRENCY_BASE);
-        return $defaultCurrencies;
+        return $this->currencyConfig->getConfigCurrencies(self::XML_PATH_CURRENCY_BASE);
     }
 
     /**
diff --git a/app/code/Magento/Directory/Model/CurrencyConfig.php b/app/code/Magento/Directory/Model/CurrencyConfig.php
new file mode 100644
index 00000000000..fdb561c2241
--- /dev/null
+++ b/app/code/Magento/Directory/Model/CurrencyConfig.php
@@ -0,0 +1,99 @@
+<?php
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Directory\Model;
+
+use Magento\Framework\App\Area;
+use Magento\Framework\App\Config\ScopeConfigInterface;
+use Magento\Framework\App\State;
+use Magento\Store\Model\ScopeInterface;
+use Magento\Store\Model\StoreManagerInterface;
+
+/**
+ * Provide config values for allowed, base and default currencies.
+ */
+class CurrencyConfig
+{
+    /**
+     * @var State
+     */
+    private $appState;
+
+    /**
+     * @var ScopeConfigInterface
+     */
+    private $config;
+
+    /**
+     * @var StoreManagerInterface
+     */
+    private $storeManager;
+
+    /**
+     * CurrencyConfig constructor.
+     *
+     * @param State $appState
+     * @param ScopeConfigInterface $config
+     * @param StoreManagerInterface $storeManager
+     */
+    public function __construct(
+        State $appState,
+        ScopeConfigInterface $config,
+        StoreManagerInterface $storeManager
+    ) {
+        $this->appState = $appState;
+        $this->config = $config;
+        $this->storeManager = $storeManager;
+    }
+
+    /**
+     * Retrieve config currency data by config path.
+     *
+     * @param string $path
+     * @return array
+     */
+    public function getConfigCurrencies(string $path)
+    {
+        $result = $this->appState->getAreaCode() === Area::AREA_ADMINHTML
+            ? $this->getConfigForAllStores($path)
+            : $this->getConfigForCurrentStore($path);
+        sort($result);
+
+        return array_unique($result);
+    }
+
+    /**
+     * Get allowed, base and default currency codes for all stores.
+     *
+     * @param string $path
+     * @return array
+     */
+    private function getConfigForAllStores(string $path)
+    {
+        $storesResult = [[]];
+        foreach ($this->storeManager->getStores() as $store) {
+            $storesResult[] = explode(
+                ',',
+                $this->config->getValue($path, ScopeInterface::SCOPE_STORE, $store->getCode())
+            );
+        }
+
+        return array_merge(...$storesResult);
+    }
+
+    /**
+     * Get allowed, base and default currency codes for current store.
+     *
+     * @param string $path
+     * @return mixed
+     */
+    private function getConfigForCurrentStore(string $path)
+    {
+        $store = $this->storeManager->getStore();
+
+        return explode(',', $this->config->getValue($path, ScopeInterface::SCOPE_STORE, $store->getCode()));
+    }
+}
diff --git a/app/code/Magento/Directory/Model/CurrencySystemConfig.php b/app/code/Magento/Directory/Model/CurrencySystemConfig.php
deleted file mode 100644
index ce2829a489b..00000000000
--- a/app/code/Magento/Directory/Model/CurrencySystemConfig.php
+++ /dev/null
@@ -1,123 +0,0 @@
-<?php
-/**
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
- */
-
-namespace Magento\Directory\Model;
-
-use Magento\Config\App\Config\Type\System;
-use Magento\Framework\App\ResourceConnection;
-use Magento\Store\Model\StoreManagerInterface;
-
-/**
- * Provide system config values for allowed, base and default currencies.
- */
-class CurrencySystemConfig
-{
-    /**
-     * @var System
-     */
-    private $systemConfig;
-
-    /**
-     * @var StoreManagerInterface
-     */
-    private $storeManager;
-
-    /**
-     * @var string
-     */
-    private $path;
-
-    /**
-     * Currency constructor.
-     *
-     * @param System $systemConfig
-     * @param StoreManagerInterface $storeManager
-     */
-    public function __construct(
-        System $systemConfig,
-        StoreManagerInterface $storeManager,
-        ResourceConnection $resources
-    ) {
-        $this->systemConfig = $systemConfig;
-        $this->storeManager = $storeManager;
-    }
-
-    /**
-     * Retrieve config currency data by config path.
-     *
-     * @param string $path
-     * @return array
-     */
-    public function getConfigCurrencies(string $path)
-    {
-        $this->path = $path;
-        $result = array_merge(
-            $this->getDefaultConfigCurrencies(),
-            $this->getWebsiteConfigCurrencies(),
-            $this->getStoreConfigCurrencies()
-        );
-        sort($result);
-
-        return array_unique($result);
-    }
-
-    /**
-     * Get system config values as array for default scope.
-     *
-     * @return array
-     */
-    private function getDefaultConfigCurrencies()
-    {
-        return $this->getConfig($this->path, 'default');
-    }
-
-    /**
-     * Get system config values as array for website scope.
-     *
-     * @return array
-     */
-    private function getWebsiteConfigCurrencies()
-    {
-        $websiteResult = [[]];
-        foreach ($this->storeManager->getWebsites() as $website) {
-            $websiteResult[] = $this->getConfig($this->path, 'websites', $website->getId());
-        }
-        $websiteResult = array_merge(...$websiteResult);
-
-        return $websiteResult;
-    }
-
-    /**
-     * Get system config values as array for store scope.
-     *
-     * @return array
-     */
-    private function getStoreConfigCurrencies()
-    {
-        $storeResult = [[]];
-        foreach ($this->storeManager->getStores() as $store) {
-            $storeResult[] = $this->getConfig($this->path, 'stores', $store->getId());
-        }
-        $storeResult = array_merge(...$storeResult);
-
-        return $storeResult;
-    }
-
-    /**
-     * Get system config values as array for specified scope.
-     *
-     * @param string $scope
-     * @param string $scopeId
-     * @param string $path
-     * @return array
-     */
-    private function getConfig(string $path, string $scope, string $scopeId = null)
-    {
-        $configPath = $scopeId ? sprintf('%s/%s/%s', $scope, $scopeId, $path) : sprintf('%s/%s', $scope, $path);
-
-        return explode(',', $this->systemConfig->get($configPath));
-    }
-}
diff --git a/app/code/Magento/Directory/Model/ResourceModel/Currency.php b/app/code/Magento/Directory/Model/ResourceModel/Currency.php
index ac0716fc4e6..ffbcce11cb4 100644
--- a/app/code/Magento/Directory/Model/ResourceModel/Currency.php
+++ b/app/code/Magento/Directory/Model/ResourceModel/Currency.php
@@ -165,6 +165,8 @@ class Currency extends \Magento\Framework\Model\ResourceModel\Db\AbstractDb
      * @param string $path
      * @return array
      * @SuppressWarnings(PHPMD.UnusedFormalParameter)
+     * @deprecated because doesn't take into consideration scopes and system config values.
+     * @see \Magento\Directory\Model\CurrencyConfig::getConfigCurrencies()
      */
     public function getConfigCurrencies($model, $path)
     {
diff --git a/app/code/Magento/Directory/Test/Unit/Model/CurrencyConfigTest.php b/app/code/Magento/Directory/Test/Unit/Model/CurrencyConfigTest.php
index 2a81cc23b7a..9b52bae26f9 100644
--- a/app/code/Magento/Directory/Test/Unit/Model/CurrencyConfigTest.php
+++ b/app/code/Magento/Directory/Test/Unit/Model/CurrencyConfigTest.php
@@ -7,110 +7,121 @@
 namespace Magento\Directory\Test\Unit\Model;
 
 use Magento\Config\App\Config\Type\System;
-use Magento\Directory\Model\CurrencySystemConfig;
+use Magento\Directory\Model\CurrencyConfig;
+use Magento\Framework\App\Area;
+use Magento\Framework\App\Config\ScopeConfigInterface;
+use Magento\Framework\App\State;
 use Magento\Framework\TestFramework\Unit\Helper\ObjectManager;
 use Magento\Store\Api\Data\StoreInterface;
-use Magento\Store\Api\Data\WebsiteInterface;
 use Magento\Store\Model\StoreManagerInterface;
 use PHPUnit\Framework\TestCase;
 
 /**
- * Provide tests for CurrencySystemConfig model.
+ * Provide tests for CurrencyConfig model.
  */
 class CurrencyConfigTest extends TestCase
 {
     /**
-     * @var CurrencySystemConfig
+     * @var CurrencyConfig
      */
     private $testSubject;
 
     /**
      * @var System|\PHPUnit_Framework_MockObject_MockObject
      */
-    private $systemConfig;
+    private $config;
 
     /**
      * @var StoreManagerInterface|\PHPUnit_Framework_MockObject_MockObject
      */
     private $storeManager;
 
+    /**
+     * @var State|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $appState;
+
     /**
      * @inheritdoc
      */
     protected function setUp()
     {
-        $this->systemConfig = $this->getMockBuilder(System::class)
+        $this->config = $this->getMockBuilder(ScopeConfigInterface::class)
             ->disableOriginalConstructor()
             ->getMock();
         $this->storeManager = $this->getMockBuilder(StoreManagerInterface::class)
             ->setMethods(['getStores', 'getWebsites'])
             ->disableOriginalConstructor()
             ->getMockForAbstractClass();
+        $this->appState = $this->getMockBuilder(State::class)
+            ->disableOriginalConstructor()
+            ->getMock();
         $objectManager = new ObjectManager($this);
         $this->testSubject = $objectManager->getObject(
-            CurrencySystemConfig::class,
+            CurrencyConfig::class,
             [
-                'systemConfig' => $this->systemConfig,
                 'storeManager' => $this->storeManager,
+                'appState' => $this->appState,
+                'config' => $this->config,
             ]
         );
     }
 
     /**
+     * Test get currency config for admin and storefront areas.
+     *
+     * @dataProvider getConfigCurrenciesDataProvider
      * @return void
      */
-    public function testGetConfigCurrencies()
+    public function testGetConfigCurrencies(string $areCode)
     {
         $path = 'test/path';
-        $expected = [
-            0 => 'ARS',
-            1 => 'AUD',
-            3 => 'BZD',
-            4 => 'CAD',
-            5 => 'CLP',
-            6 => 'EUR',
-            7 => 'USD',
-        ];
+        $expected = ['ARS', 'AUD', 'BZD'];
+
+        $this->appState->expects(self::once())
+            ->method('getAreaCode')
+            ->willReturn($areCode);
 
         /** @var StoreInterface|\PHPUnit_Framework_MockObject_MockObject $store */
         $store = $this->getMockBuilder(StoreInterface::class)
-            ->setMethods(['getId'])
+            ->setMethods(['getCode'])
             ->disableOriginalConstructor()
             ->getMockForAbstractClass();
         $store->expects(self::once())
-            ->method('getId')
-            ->willReturn(1);
-
-        /** @var WebsiteInterface|\PHPUnit_Framework_MockObject_MockObject $website */
-        $website = $this->getMockBuilder(WebsiteInterface::class)
-            ->setMethods(['getId'])
-            ->disableOriginalConstructor()
-            ->getMockForAbstractClass();
-        $website->expects(self::once())
-            ->method('getId')
-            ->willReturn(1);
+            ->method('getCode')
+            ->willReturn('testCode');
 
-        $this->systemConfig->expects(self::exactly(3))
-            ->method('get')
-            ->withConsecutive(
-                self::identicalTo('default/test/path'),
-                self::identicalTo('websites/1/test/path'),
-                self::identicalTo('stores/1/test/path')
-            )->willReturnOnConsecutiveCalls(
-                'USD,EUR',
-                'AUD,ARS',
-                'BZD,CAD,AUD,CLP'
-            );
+        if ($areCode === Area::AREA_ADMINHTML) {
+            $this->storeManager->expects(self::once())
+                ->method('getStores')
+                ->willReturn([$store]);
+        } else {
+            $this->storeManager->expects(self::once())
+                ->method('getStore')
+                ->willReturn($store);
+        }
 
-        $this->storeManager->expects(self::once())
-            ->method('getStores')
-            ->willReturn([$store]);
-        $this->storeManager->expects(self::once())
-            ->method('getWebsites')
-            ->willReturn([$website]);
+        $this->config->expects(self::once())
+            ->method('getValue')
+            ->with(
+                self::identicalTo($path)
+            )->willReturn('ARS,AUD,BZD');
 
         $result = $this->testSubject->getConfigCurrencies($path);
 
         self::assertEquals($expected, $result);
     }
+
+    /**
+     * Provide test data for getConfigCurrencies test.
+     *
+     * @return array
+     */
+    public function getConfigCurrenciesDataProvider()
+    {
+        return [
+            ['areaCode' => Area::AREA_ADMINHTML],
+            ['areaCode' => Area::AREA_FRONTEND],
+        ];
+    }
 }
diff --git a/dev/tests/integration/testsuite/Magento/Directory/Model/CurrencyConfigTest.php b/dev/tests/integration/testsuite/Magento/Directory/Model/CurrencyConfigTest.php
new file mode 100644
index 00000000000..b620d9097b4
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Directory/Model/CurrencyConfigTest.php
@@ -0,0 +1,202 @@
+<?php
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Directory\Model;
+
+use Magento\Directory\Model\Currency as CurrencyModel;
+use Magento\Framework\App\Area;
+use Magento\Framework\App\Config\ConfigResource\ConfigInterface;
+use Magento\Framework\App\Config\ReinitableConfigInterface;
+use Magento\Store\Model\Store;
+use Magento\Store\Model\StoreManagerInterface;
+use Magento\TestFramework\App\State;
+use Magento\TestFramework\Helper\Bootstrap;
+use PHPUnit\Framework\TestCase;
+
+/**
+ * Provide tests for CurrencyConfig model.
+ */
+class CurrencyConfigTest extends TestCase
+{
+    /**
+     * @var string
+     */
+    private $baseCurrencyPath = 'currency/options/base';
+
+    /**
+     * @var string
+     */
+    private $defaultCurrencyPath = 'currency/options/default';
+
+    /**
+     * @var string
+     */
+    private $allowedCurrenciesPath = 'currency/options/allow';
+
+    /**
+     * @var ConfigInterface
+     */
+    private $config;
+
+    /**
+     * @var CurrencyModel
+     */
+    private $currency;
+
+    /**
+     * @inheritdoc
+     */
+    protected function setUp()
+    {
+        $this->currency = Bootstrap::getObjectManager()->get(CurrencyModel::class);
+        $this->config = Bootstrap::getObjectManager()->get(ConfigInterface::class);
+    }
+
+    /**
+     * Test get currency config for admin and storefront areas.
+     *
+     * @dataProvider getConfigCurrenciesDataProvider
+     * @magentoDataFixture Magento/Store/_files/store.php
+     * @magentoDbIsolation disabled
+     * @param string $areaCode
+     * @param array $expected
+     * @return void
+     */
+    public function testGetConfigCurrencies(string $areaCode, array $expected)
+    {
+        /** @var State $appState */
+        $appState = Bootstrap::getObjectManager()->get(State::class);
+        $appState->setAreaCode($areaCode);
+        $store = Bootstrap::getObjectManager()->get(Store::class);
+        $store->load('test', 'code');
+        $this->clearCurrencyConfig();
+        $this->setStoreConfig($store->getId());
+        $storeManager = Bootstrap::getObjectManager()->get(StoreManagerInterface::class);
+        $storeManager->setCurrentStore($store->getId());
+
+        if ($areaCode === Area::AREA_ADMINHTML) {
+            self::assertEquals($expected['allowed'], $this->currency->getConfigAllowCurrencies());
+            self::assertEquals($expected['base'], $this->currency->getConfigBaseCurrencies());
+            self::assertEquals($expected['default'], $this->currency->getConfigDefaultCurrencies());
+        } else {
+            /** @var StoreManagerInterface $storeManager */
+            $storeManager = Bootstrap::getObjectManager()->get(StoreManagerInterface::class);
+            foreach ($storeManager->getStores() as $store) {
+                $storeManager->setCurrentStore($store->getId());
+                self::assertEquals(
+                    $expected[$store->getCode()]['allowed'],
+                    $this->currency->getConfigAllowCurrencies()
+                );
+                self::assertEquals(
+                    $expected[$store->getCode()]['base'],
+                    $this->currency->getConfigBaseCurrencies()
+                );
+                self::assertEquals(
+                    $expected[$store->getCode()]['default'],
+                    $this->currency->getConfigDefaultCurrencies()
+                );
+            }
+        }
+    }
+
+    /**
+     * Provide test data for getConfigCurrencies test.
+     *
+     * @return array
+     */
+    public function getConfigCurrenciesDataProvider()
+    {
+        return [
+            [
+                'areaCode' => Area::AREA_ADMINHTML,
+                'expected' => [
+                    'allowed' => ['BDT', 'BNS', 'BTD', 'EUR', 'USD'],
+                    'base' => ['BDT', 'USD'],
+                    'default' => ['BDT', 'USD'],
+                ],
+            ],
+            [
+                'areaCode' => Area::AREA_FRONTEND,
+                'expected' => [
+                    'default' => [
+                        'allowed' => ['EUR', 'USD'],
+                        'base' => ['USD'],
+                        'default' => ['USD'],
+                    ],
+                    'test' => [
+                        'allowed' => ['BDT', 'BNS', 'BTD', 'USD'],
+                        'base' => ['BDT'],
+                        'default' => ['BDT'],
+                    ],
+                ],
+            ],
+        ];
+    }
+
+    /**
+     * Remove currency config form Db.
+     *
+     * @return void
+     */
+    private function clearCurrencyConfig()
+    {
+        $storeManager = Bootstrap::getObjectManager()->get(StoreManagerInterface::class);
+        foreach ($storeManager->getStores() as $store) {
+            $this->config->deleteConfig(
+                $this->allowedCurrenciesPath,
+                'stores',
+                $store->getId()
+            );
+            $this->config->deleteConfig(
+                $this->baseCurrencyPath,
+                'stores',
+                $store->getId()
+            );
+            $this->config->deleteConfig(
+                $this->defaultCurrencyPath,
+                'stores',
+                $store->getId()
+            );
+        }
+    }
+
+    /**
+     * Set allowed, base and default currency config values for given store.
+     *
+     * @param string $storeId
+     * @return void
+     */
+    private function setStoreConfig(string $storeId)
+    {
+        $allowedCurrencies = 'BDT,BNS,BTD';
+        $baseCurrency = 'BDT';
+        $this->config->saveConfig(
+            $this->baseCurrencyPath,
+            $baseCurrency,
+            'stores',
+            $storeId
+        );
+        $this->config->saveConfig(
+            $this->defaultCurrencyPath,
+            $baseCurrency,
+            'stores',
+            $storeId
+        );
+        $this->config->saveConfig(
+            $this->allowedCurrenciesPath,
+            $allowedCurrencies,
+            'stores',
+            $storeId
+        );
+        Bootstrap::getObjectManager()->get(ReinitableConfigInterface::class)->reinit();
+        Bootstrap::getObjectManager()->create(StoreManagerInterface::class)->reinitStores();
+    }
+
+    protected function tearDown()
+    {
+        $this->clearCurrencyConfig();
+    }
+}
diff --git a/dev/tests/integration/testsuite/Magento/Directory/Model/CurrencySystemConfigTest.php b/dev/tests/integration/testsuite/Magento/Directory/Model/CurrencySystemConfigTest.php
deleted file mode 100644
index e01fd1f5def..00000000000
--- a/dev/tests/integration/testsuite/Magento/Directory/Model/CurrencySystemConfigTest.php
+++ /dev/null
@@ -1,130 +0,0 @@
-<?php
-/**
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
- */
-
-namespace Magento\Directory\Model;
-
-use Magento\Directory\Model\Currency as CurrencyModel;
-use Magento\Framework\App\Config\ConfigResource\ConfigInterface;
-use Magento\Store\Model\ScopeInterface;
-use Magento\TestFramework\Helper\Bootstrap;
-use PHPUnit\Framework\TestCase;
-
-/**
- * Provide tests for CurrencySystemConfig model.
- */
-class CurrencySystemConfigTest extends TestCase
-{
-    /**
-     * @var string
-     */
-    private $baseCurrencyPath = 'currency/options/base';
-
-    /**
-     * @var string
-     */
-    private $defaultCurrencyPath = 'currency/options/default';
-
-    /**
-     * @var string
-     */
-    private $allowedCurrenciesPath = 'currency/options/allow';
-
-    /**
-     * @var ConfigInterface
-     */
-    private $configResource;
-
-    /**
-     * @var CurrencyModel
-     */
-    private $currency;
-
-    /**
-     * @inheritdoc
-     */
-    protected function setUp()
-    {
-        $this->currency = Bootstrap::getObjectManager()->get(CurrencyModel::class);
-        $this->configResource = Bootstrap::getObjectManager()->get(ConfigInterface::class);
-    }
-
-    /**
-     * Test CurrencySystemConfig won't read system config, if values present in DB.
-     */
-    public function testGetConfigCurrenciesWithDbValues()
-    {
-        $this->clearCurrencyConfig();
-        $allowedCurrencies = 'BDT,BNS,BTD,USD';
-        $baseCurrency = 'BDT';
-        $this->configResource->saveConfig(
-            $this->baseCurrencyPath,
-            $baseCurrency,
-            ScopeInterface::SCOPE_STORE,
-            0
-        );
-        $this->configResource->saveConfig(
-            $this->defaultCurrencyPath,
-            $baseCurrency,
-            ScopeInterface::SCOPE_STORE,
-            0
-        );
-        $this->configResource->saveConfig(
-            $this->allowedCurrenciesPath,
-            $allowedCurrencies,
-            ScopeInterface::SCOPE_STORE,
-            0
-        );
-
-        $expected = [
-            'allowed' => explode(',', $allowedCurrencies),
-            'base' => [$baseCurrency],
-            'default' => [$baseCurrency],
-        ];
-        self::assertEquals($expected['allowed'], $this->currency->getConfigAllowCurrencies());
-        self::assertEquals($expected['base'], $this->currency->getConfigBaseCurrencies());
-        self::assertEquals($expected['default'], $this->currency->getConfigDefaultCurrencies());
-    }
-
-    /**
-     * Test CurrencySystemConfig will read system config, if values don't present in DB.
-     */
-    public function testGetConfigCurrenciesWithNoDbValues()
-    {
-        $this->clearCurrencyConfig();
-        $expected = [
-            'allowed' => [0 => 'EUR',3 => 'USD'],
-            'base' => ['USD'],
-            'default' => ['USD'],
-        ];
-        self::assertEquals($expected['allowed'], $this->currency->getConfigAllowCurrencies());
-        self::assertEquals($expected['base'], $this->currency->getConfigBaseCurrencies());
-        self::assertEquals($expected['default'], $this->currency->getConfigDefaultCurrencies());
-    }
-
-    /**
-     * Remove currency config form Db.
-     *
-     * @return void
-     */
-    private function clearCurrencyConfig()
-    {
-        $this->configResource->deleteConfig(
-            $this->allowedCurrenciesPath,
-            ScopeInterface::SCOPE_STORE,
-            0
-        );
-        $this->configResource->deleteConfig(
-            $this->baseCurrencyPath,
-            ScopeInterface::SCOPE_STORE,
-            0
-        );
-        $this->configResource->deleteConfig(
-            $this->defaultCurrencyPath,
-            ScopeInterface::SCOPE_STORE,
-            0
-        );
-    }
-}
-- 
GitLab


From 3e0c785820acd4bcae6f0b2c3ff1bc706bc10499 Mon Sep 17 00:00:00 2001
From: magento-engcom-team <mikola.malevanec@transoftgroup.com>
Date: Tue, 14 Nov 2017 10:23:34 +0200
Subject: [PATCH 126/380] 8003: Using System Value for Base Currency Results in
 Config Error.

---
 app/code/Magento/Directory/Model/Currency.php | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/app/code/Magento/Directory/Model/Currency.php b/app/code/Magento/Directory/Model/Currency.php
index 356b3db639b..0b5b836b4ac 100644
--- a/app/code/Magento/Directory/Model/Currency.php
+++ b/app/code/Magento/Directory/Model/Currency.php
@@ -82,7 +82,7 @@ class Currency extends \Magento\Framework\Model\AbstractModel
      * @param \Magento\Framework\Model\ResourceModel\AbstractResource $resource
      * @param \Magento\Framework\Data\Collection\AbstractDb $resourceCollection
      * @param array $data
-     * @param CurrencyConfig|null $currencyConfig
+     * @param CurrencyConfig $currencyConfig
      * @SuppressWarnings(PHPMD.ExcessiveParameterList)
      */
     public function __construct(
-- 
GitLab


From ff422002cd2d977c3b10ac512c557f58e1cba5c6 Mon Sep 17 00:00:00 2001
From: bartlubbersen <bartlubbersen@users.noreply.github.com>
Date: Fri, 17 Nov 2017 13:06:25 +0100
Subject: [PATCH 127/380] [BUGFIX] All option values were deleted if one was
 deleted earlier

The problem occurs if you delete one custom option value was deleted. This occurred because the same value object is used for saving all values, and if one value is deleted the _isDeleted flag is set tot true on that object. So all values after that value will also be deleted.
---
 app/code/Magento/Catalog/Model/Product/Option/Value.php | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/app/code/Magento/Catalog/Model/Product/Option/Value.php b/app/code/Magento/Catalog/Model/Product/Option/Value.php
index 0e86510ebce..f1700f380fd 100644
--- a/app/code/Magento/Catalog/Model/Product/Option/Value.php
+++ b/app/code/Magento/Catalog/Model/Product/Option/Value.php
@@ -189,7 +189,8 @@ class Value extends AbstractModel implements \Magento\Catalog\Api\Data\ProductCu
      */
     public function saveValues()
     {
-        foreach ($this->getValues() as $value) {
+        foreach ($this->getValues() as $value) 
+            $this->isDeleted(false);
             $this->setData(
                 $value
             )->setData(
-- 
GitLab


From 21d31537c14a63d91cb3ad53b1f40a43c32a6bff Mon Sep 17 00:00:00 2001
From: Oleksandr Gorkun <ogorkun@magento.com>
Date: Fri, 17 Nov 2017 15:57:13 +0200
Subject: [PATCH 128/380] MAGETWO-75217: SKU parameter in capital letters on
 CSV ignored by database in Import but OK'd by validator

---
 .../Model/Import/Product/Type/Configurable.php                  | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/app/code/Magento/ConfigurableImportExport/Model/Import/Product/Type/Configurable.php b/app/code/Magento/ConfigurableImportExport/Model/Import/Product/Type/Configurable.php
index 0e7a026c526..4ca21d554cc 100644
--- a/app/code/Magento/ConfigurableImportExport/Model/Import/Product/Type/Configurable.php
+++ b/app/code/Magento/ConfigurableImportExport/Model/Import/Product/Type/Configurable.php
@@ -502,7 +502,7 @@ class Configurable extends \Magento\CatalogImportExport\Model\Import\Product\Typ
                     $value = isset($nameAndValue[1]) ?
                         trim($nameAndValue[1]) : '';
                     //Ignoring field names' case.
-                    $fieldName  = mb_strtolower(trim($nameAndValue[0]));
+                    $fieldName  = strtolower(trim($nameAndValue[0]));
                     if ($fieldName) {
                         $fieldAndValuePairs[$fieldName] = $value;
                     }
-- 
GitLab


From aa7da3084d17f27b4f44c8b816a1ffa4c3666682 Mon Sep 17 00:00:00 2001
From: Volodymyr Kublytskyi <vkublytskyi@magento.com>
Date: Fri, 17 Nov 2017 20:52:00 +0200
Subject: [PATCH 129/380] Stabilization magento-partners/magento2ce#83

---
 app/code/Magento/Catalog/Model/Product/Option/Value.php | 2 +-
 app/code/Magento/Customer/Controller/Ajax/Login.php     | 8 ++++++--
 2 files changed, 7 insertions(+), 3 deletions(-)

diff --git a/app/code/Magento/Catalog/Model/Product/Option/Value.php b/app/code/Magento/Catalog/Model/Product/Option/Value.php
index f1700f380fd..d4c78772e7c 100644
--- a/app/code/Magento/Catalog/Model/Product/Option/Value.php
+++ b/app/code/Magento/Catalog/Model/Product/Option/Value.php
@@ -189,7 +189,7 @@ class Value extends AbstractModel implements \Magento\Catalog\Api\Data\ProductCu
      */
     public function saveValues()
     {
-        foreach ($this->getValues() as $value) 
+        foreach ($this->getValues() as $value) {
             $this->isDeleted(false);
             $this->setData(
                 $value
diff --git a/app/code/Magento/Customer/Controller/Ajax/Login.php b/app/code/Magento/Customer/Controller/Ajax/Login.php
index d275b563553..8664e0cbf87 100644
--- a/app/code/Magento/Customer/Controller/Ajax/Login.php
+++ b/app/code/Magento/Customer/Controller/Ajax/Login.php
@@ -98,8 +98,12 @@ class Login extends \Magento\Framework\App\Action\Action
         $this->customerAccountManagement = $customerAccountManagement;
         $this->resultJsonFactory = $resultJsonFactory;
         $this->resultRawFactory = $resultRawFactory;
-        $this->cookieManager = $cookieManager ?: ObjectManager::getInstance()->get(CookieManagerInterface::class);
-        $this->cookieMetadataFactory = $cookieMetadataFactory ?: ObjectManager::getInstance()->get(CookieMetadataFactory::class);
+        $this->cookieManager = $cookieManager ?: ObjectManager::getInstance()->get(
+            CookieManagerInterface::class
+        );
+        $this->cookieMetadataFactory = $cookieMetadataFactory ?: ObjectManager::getInstance()->get(
+            CookieMetadataFactory::class
+        );
     }
 
     /**
-- 
GitLab


From 2f0898a6fb8f619640b4dbc84fd5ab2a376dc0fa Mon Sep 17 00:00:00 2001
From: Ievgen Sentiabov <isentiabov@magento.com>
Date: Thu, 26 Oct 2017 17:27:58 +0300
Subject: [PATCH 130/380] Potential error on order edit page when address has
 extension attributes

 - Changed shipping and billing address comparision
 - Refactored related tests
---
 .../Magento/Sales/Model/AdminOrder/Create.php |  40 +-
 .../Test/Unit/Model/AdminOrder/CreateTest.php | 324 +++++-------
 .../Sales/Model/AdminOrder/CreateTest.php     | 465 +++++++++---------
 3 files changed, 383 insertions(+), 446 deletions(-)

diff --git a/app/code/Magento/Sales/Model/AdminOrder/Create.php b/app/code/Magento/Sales/Model/AdminOrder/Create.php
index c2f03ff5d9a..69f4d19e4dd 100644
--- a/app/code/Magento/Sales/Model/AdminOrder/Create.php
+++ b/app/code/Magento/Sales/Model/AdminOrder/Create.php
@@ -10,9 +10,12 @@ namespace Magento\Sales\Model\AdminOrder;
 
 use Magento\Customer\Api\AddressMetadataInterface;
 use Magento\Customer\Model\Metadata\Form as CustomerForm;
+use Magento\Framework\Api\ExtensibleDataObjectConverter;
 use Magento\Framework\App\ObjectManager;
 use Magento\Quote\Model\Quote\Address;
 use Magento\Quote\Model\Quote\Item;
+use Magento\Sales\Api\Data\OrderAddressInterface;
+use Magento\Sales\Model\Order;
 
 /**
  * Order create model
@@ -235,6 +238,11 @@ class Create extends \Magento\Framework\DataObject implements \Magento\Checkout\
      */
     private $serializer;
 
+    /**
+     * @var ExtensibleDataObjectConverter
+     */
+    private $dataObjectConverter;
+
     /**
      * @param \Magento\Framework\ObjectManagerInterface $objectManager
      * @param \Magento\Framework\Event\ManagerInterface $eventManager
@@ -265,6 +273,7 @@ class Create extends \Magento\Framework\DataObject implements \Magento\Checkout\
      * @param \Magento\Quote\Model\QuoteFactory $quoteFactory
      * @param array $data
      * @param \Magento\Framework\Serialize\Serializer\Json|null $serializer
+     * @param ExtensibleDataObjectConverter|null $dataObjectConverter
      * @SuppressWarnings(PHPMD.ExcessiveParameterList)
      */
     public function __construct(
@@ -296,7 +305,8 @@ class Create extends \Magento\Framework\DataObject implements \Magento\Checkout\
         \Magento\Sales\Api\OrderManagementInterface $orderManagement,
         \Magento\Quote\Model\QuoteFactory $quoteFactory,
         array $data = [],
-        \Magento\Framework\Serialize\Serializer\Json $serializer = null
+        \Magento\Framework\Serialize\Serializer\Json $serializer = null,
+        ExtensibleDataObjectConverter $dataObjectConverter = null
     ) {
         $this->_objectManager = $objectManager;
         $this->_eventManager = $eventManager;
@@ -328,6 +338,8 @@ class Create extends \Magento\Framework\DataObject implements \Magento\Checkout\
         $this->serializer = $serializer ?: ObjectManager::getInstance()
             ->get(\Magento\Framework\Serialize\Serializer\Json::class);
         parent::__construct($data);
+        $this->dataObjectConverter = $dataObjectConverter ?: ObjectManager::getInstance()
+            ->get(ExtensibleDataObjectConverter::class);
     }
 
     /**
@@ -514,9 +526,7 @@ class Create extends \Magento\Framework\DataObject implements \Magento\Checkout\
 
         $shippingAddress = $order->getShippingAddress();
         if ($shippingAddress) {
-            $addressDiff = array_diff_assoc($shippingAddress->getData(), $order->getBillingAddress()->getData());
-            unset($addressDiff['address_type'], $addressDiff['entity_id']);
-            $shippingAddress->setSameAsBilling(empty($addressDiff));
+            $shippingAddress->setSameAsBilling($this->isAddressesAreEqual($order));
         }
 
         $this->_initBillingAddressFromOrder($order);
@@ -2010,4 +2020,26 @@ class Create extends \Magento\Framework\DataObject implements \Magento\Checkout\
 
         return $email;
     }
+
+    /**
+     * Checks id shipping and billing addresses are equal.
+     *
+     * @param Order $order
+     * @return bool
+     */
+    private function isAddressesAreEqual(Order $order)
+    {
+        $shippingAddress = $order->getShippingAddress();
+        $billingAddress = $order->getBillingAddress();
+        $shippingData = $this->dataObjectConverter->toFlatArray($shippingAddress, [], OrderAddressInterface::class);
+        $billingData = $this->dataObjectConverter->toFlatArray($billingAddress, [], OrderAddressInterface::class);
+        unset(
+            $shippingData['address_type'],
+            $shippingData['entity_id'],
+            $billingData['address_type'],
+            $billingData['entity_id']
+        );
+
+        return $shippingData == $billingData;
+    }
 }
diff --git a/app/code/Magento/Sales/Test/Unit/Model/AdminOrder/CreateTest.php b/app/code/Magento/Sales/Test/Unit/Model/AdminOrder/CreateTest.php
index a265d39bafd..b284a529d2a 100644
--- a/app/code/Magento/Sales/Test/Unit/Model/AdminOrder/CreateTest.php
+++ b/app/code/Magento/Sales/Test/Unit/Model/AdminOrder/CreateTest.php
@@ -8,8 +8,25 @@
 
 namespace Magento\Sales\Test\Unit\Model\AdminOrder;
 
+use Magento\Backend\Model\Session\Quote as SessionQuote;
+use Magento\Customer\Api\Data\AttributeMetadataInterface;
+use Magento\Customer\Api\Data\CustomerInterface;
+use Magento\Customer\Api\Data\CustomerInterfaceFactory;
+use Magento\Customer\Api\Data\GroupInterface;
+use Magento\Customer\Api\GroupRepositoryInterface;
+use Magento\Customer\Model\Customer\Mapper;
+use Magento\Customer\Model\Metadata\Form;
+use Magento\Customer\Model\Metadata\FormFactory;
+use Magento\Framework\Api\DataObjectHelper;
+use Magento\Framework\App\RequestInterface;
 use Magento\Framework\TestFramework\Unit\Helper\ObjectManager as ObjectManagerHelper;
+use Magento\Quote\Model\Quote;
+use Magento\Quote\Model\Quote\Address;
+use Magento\Quote\Model\Quote\Item;
+use Magento\Quote\Model\Quote\Item\Updater;
+use Magento\Sales\Model\AdminOrder\Create;
 use Magento\Sales\Model\AdminOrder\Product;
+use PHPUnit_Framework_MockObject_MockObject as MockObject;
 
 /**
  * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
@@ -19,161 +36,74 @@ class CreateTest extends \PHPUnit\Framework\TestCase
 {
     const CUSTOMER_ID = 1;
 
-    /** @var \Magento\Sales\Model\AdminOrder\Create */
-    protected $adminOrderCreate;
-
-    /** @var \Magento\Backend\Model\Session\Quote|\PHPUnit_Framework_MockObject_MockObject */
-    protected $sessionQuoteMock;
-
-    /** @var \Magento\Customer\Model\Metadata\FormFactory|\PHPUnit_Framework_MockObject_MockObject */
-    protected $formFactoryMock;
-
-    /** @var \Magento\Customer\Api\Data\CustomerInterfaceFactory|\PHPUnit_Framework_MockObject_MockObject */
-    protected $customerFactoryMock;
-
-    /** @var \Magento\Quote\Model\Quote\Item\Updater|\PHPUnit_Framework_MockObject_MockObject */
-    protected $itemUpdater;
-
-    /** @var \Magento\Customer\Model\Customer\Mapper|\PHPUnit_Framework_MockObject_MockObject */
-    protected $customerMapper;
-
     /**
-     * @var Product\Quote\Initializer|\PHPUnit_Framework_MockObject_MockObject
+     * @var Create
      */
-    protected $quoteInitializerMock;
+    private $adminOrderCreate;
 
     /**
-     * @var \Magento\Customer\Api\CustomerRepositoryInterface|\PHPUnit_Framework_MockObject_MockObject
+     * @var SessionQuote|MockObject
      */
-    protected $customerRepositoryMock;
+    private $sessionQuote;
 
     /**
-     * @var \Magento\Customer\Api\AddressRepositoryInterface|\PHPUnit_Framework_MockObject_MockObject
+     * @var FormFactory|MockObject
      */
-    protected $addressRepositoryMock;
+    private $formFactory;
 
     /**
-     * @var \Magento\Customer\Api\Data\AddressInterfaceFactory|\PHPUnit_Framework_MockObject_MockObject
+     * @var CustomerInterfaceFactory|MockObject
      */
-    protected $addressFactoryMock;
+    private $customerFactory;
 
     /**
-     * @var \Magento\Customer\Api\GroupRepositoryInterface|\PHPUnit_Framework_MockObject_MockObject
+     * @var Updater|MockObject
      */
-    protected $groupRepositoryMock;
+    private $itemUpdater;
 
     /**
-     * @var \Magento\Framework\App\Config\ScopeConfigInterface|\PHPUnit_Framework_MockObject_MockObject
+     * @var Mapper|MockObject
      */
-    protected $scopeConfigMock;
+    private $customerMapper;
 
     /**
-     * @var \Magento\Sales\Model\AdminOrder\EmailSender|\PHPUnit_Framework_MockObject_MockObject
+     * @var GroupRepositoryInterface|MockObject
      */
-    protected $emailSenderMock;
+    private $groupRepository;
 
     /**
-     * @var \Magento\Customer\Api\AccountManagementInterface|\PHPUnit_Framework_MockObject_MockObject
+     * @var DataObjectHelper|MockObject
      */
-    protected $accountManagementMock;
+    private $dataObjectHelper;
 
-    /**
-     * @var \Magento\Framework\Api\DataObjectHelper|\PHPUnit_Framework_MockObject_MockObject
-     */
-    protected $dataObjectHelper;
-
-    /**
-     * @var \PHPUnit_Framework_MockObject_MockObject
-     */
-    protected $objectFactory;
-
-    /**
-     * @SuppressWarnings(PHPMD.ExcessiveMethodLength)
-     */
     protected function setUp()
     {
-        $objectManagerMock = $this->createMock(\Magento\Framework\ObjectManagerInterface::class);
-        $eventManagerMock = $this->createMock(\Magento\Framework\Event\ManagerInterface::class);
-        $registryMock = $this->createMock(\Magento\Framework\Registry::class);
-        $configMock = $this->createMock(\Magento\Sales\Model\Config::class);
-        $this->sessionQuoteMock = $this->createMock(\Magento\Backend\Model\Session\Quote::class);
-        $loggerMock = $this->createMock(\Psr\Log\LoggerInterface::class);
-        $copyMock = $this->createMock(\Magento\Framework\DataObject\Copy::class);
-        $messageManagerMock = $this->createMock(\Magento\Framework\Message\ManagerInterface::class);
-        $this->formFactoryMock = $this->createPartialMock(\Magento\Customer\Model\Metadata\FormFactory::class, ['create']);
-        $this->customerFactoryMock = $this->createPartialMock(\Magento\Customer\Api\Data\CustomerInterfaceFactory::class, ['create']);
-
-        $this->itemUpdater = $this->createMock(\Magento\Quote\Model\Quote\Item\Updater::class);
-
-        $this->objectFactory = $this->getMockBuilder(\Magento\Framework\DataObject\Factory::class)
+        $this->sessionQuote = $this->createMock(SessionQuote::class);
+        $this->formFactory = $this->createPartialMock(FormFactory::class, ['create']);
+        $this->customerFactory = $this->createPartialMock(CustomerInterfaceFactory::class, ['create']);
+
+        $this->itemUpdater = $this->createMock(Updater::class);
+
+        $this->customerMapper = $this->getMockBuilder(Mapper::class)
+            ->setMethods(['toFlatArray'])
             ->disableOriginalConstructor()
-            ->setMethods(['create'])
             ->getMock();
 
-        $this->customerMapper = $this->getMockBuilder(
-            \Magento\Customer\Model\Customer\Mapper::class
-        )->setMethods(['toFlatArray'])->disableOriginalConstructor()->getMock();
-
-        $this->quoteInitializerMock = $this->createMock(\Magento\Sales\Model\AdminOrder\Product\Quote\Initializer::class);
-        $this->customerRepositoryMock = $this->getMockForAbstractClass(
-            \Magento\Customer\Api\CustomerRepositoryInterface::class,
-            [],
-            '',
-            false
-        );
-        $this->addressRepositoryMock = $this->getMockForAbstractClass(
-            \Magento\Customer\Api\AddressRepositoryInterface::class,
-            [],
-            '',
-            false
-        );
-        $this->addressFactoryMock = $this->createMock(\Magento\Customer\Api\Data\AddressInterfaceFactory::class);
-        $this->groupRepositoryMock = $this->getMockForAbstractClass(
-            \Magento\Customer\Api\GroupRepositoryInterface::class,
-            [],
-            '',
-            false
-        );
-        $this->scopeConfigMock = $this->getMockForAbstractClass(
-            \Magento\Framework\App\Config\ScopeConfigInterface::class,
-            [],
-            '',
-            false
-        );
-        $this->emailSenderMock = $this->createMock(\Magento\Sales\Model\AdminOrder\EmailSender::class);
-        $this->accountManagementMock = $this->getMockForAbstractClass(
-            \Magento\Customer\Api\AccountManagementInterface::class,
-            [],
-            '',
-            false
-        );
-        $this->dataObjectHelper = $this->getMockBuilder(\Magento\Framework\Api\DataObjectHelper::class)
+        $this->groupRepository = $this->getMockForAbstractClass(GroupRepositoryInterface::class);
+        $this->dataObjectHelper = $this->getMockBuilder(DataObjectHelper::class)
             ->disableOriginalConstructor()
             ->getMock();
 
         $objectManagerHelper = new ObjectManagerHelper($this);
         $this->adminOrderCreate = $objectManagerHelper->getObject(
-            \Magento\Sales\Model\AdminOrder\Create::class,
+            Create::class,
             [
-                'objectManager' => $objectManagerMock,
-                'eventManager' => $eventManagerMock,
-                'coreRegistry' => $registryMock,
-                'salesConfig' => $configMock,
-                'quoteSession' => $this->sessionQuoteMock,
-                'logger' => $loggerMock,
-                'objectCopyService' => $copyMock,
-                'messageManager' => $messageManagerMock,
-                'quoteInitializer' => $this->quoteInitializerMock,
-                'customerRepository' => $this->customerRepositoryMock,
-                'addressRepository' => $this->addressRepositoryMock,
-                'addressFactory' => $this->addressFactoryMock,
-                'metadataFormFactory' => $this->formFactoryMock,
-                'customerFactory' => $this->customerFactoryMock,
-                'groupRepository' => $this->groupRepositoryMock,
+                'quoteSession' => $this->sessionQuote,
+                'metadataFormFactory' => $this->formFactory,
+                'customerFactory' => $this->customerFactory,
+                'groupRepository' => $this->groupRepository,
                 'quoteItemUpdater' => $this->itemUpdater,
                 'customerMapper' => $this->customerMapper,
-                'objectFactory' => $this->objectFactory,
-                'accountManagement' => $this->accountManagementMock,
                 'dataObjectHelper' => $this->dataObjectHelper,
             ]
         );
@@ -188,64 +118,60 @@ class CreateTest extends \PHPUnit\Framework\TestCase
         ];
         $attributeMocks = [];
 
-        foreach ($attributes as $attribute) {
-            $attributeMock = $this->createMock(\Magento\Customer\Api\Data\AttributeMetadataInterface::class);
+        foreach ($attributes as $value) {
+            $attribute = $this->createMock(AttributeMetadataInterface::class);
+            $attribute->method('getAttributeCode')
+                ->willReturn($value[0]);
 
-            $attributeMock->expects($this->any())->method('getAttributeCode')->will($this->returnValue($attribute[0]));
-
-            $attributeMocks[] = $attributeMock;
+            $attributeMocks[] = $attribute;
         }
 
-        $customerGroupMock = $this->getMockForAbstractClass(
-            \Magento\Customer\Api\Data\GroupInterface::class,
-            [],
-            '',
-            false,
-            true,
-            true,
-            ['getTaxClassId']
-        );
-        $customerGroupMock->expects($this->once())->method('getTaxClassId')->will($this->returnValue($taxClassId));
-        $customerFormMock = $this->createMock(\Magento\Customer\Model\Metadata\Form::class);
-        $customerFormMock->expects($this->any())
-            ->method('getAttributes')
-            ->will($this->returnValue([$attributeMocks[1]]));
-        $customerFormMock->expects($this->any())->method('extractData')->will($this->returnValue([]));
-        $customerFormMock->expects($this->any())->method('restoreData')->will($this->returnValue(['group_id' => 1]));
-
-        $customerFormMock->expects($this->any())
-            ->method('prepareRequest')
-            ->will($this->returnValue($this->createMock(\Magento\Framework\App\RequestInterface::class)));
-
-        $customerMock = $this->createMock(\Magento\Customer\Api\Data\CustomerInterface::class);
-        $this->customerMapper->expects($this->atLeastOnce())
+        $customerGroup = $this->getMockForAbstractClass(GroupInterface::class);
+        $customerGroup->method('getTaxClassId')
+            ->willReturn($taxClassId);
+        $customerForm = $this->createMock(Form::class);
+        $customerForm->method('getAttributes')
+            ->willReturn([$attributeMocks[1]]);
+        $customerForm
+            ->method('extractData')
+            ->willReturn([]);
+        $customerForm
+            ->method('restoreData')
+            ->willReturn(['group_id' => 1]);
+
+        $customerForm->method('prepareRequest')
+            ->willReturn($this->createMock(RequestInterface::class));
+
+        $customer = $this->createMock(CustomerInterface::class);
+        $this->customerMapper->expects(self::atLeastOnce())
             ->method('toFlatArray')
             ->willReturn(['group_id' => 1]);
 
-        $quoteMock = $this->createMock(\Magento\Quote\Model\Quote::class);
-        $quoteMock->expects($this->any())->method('getCustomer')->will($this->returnValue($customerMock));
-        $quoteMock->expects($this->once())
-            ->method('addData')
+        $quote = $this->createMock(Quote::class);
+        $quote->method('getCustomer')->willReturn($customer);
+        $quote->method('addData')
             ->with(
             [
                 'customer_group_id' => $attributes[1][1],
                 'customer_tax_class_id' => $taxClassId
             ]
         );
-        $this->dataObjectHelper->expects($this->once())
-            ->method('populateWithArray')
+        $this->dataObjectHelper->method('populateWithArray')
             ->with(
-                $customerMock,
-                ['group_id' => 1], \Magento\Customer\Api\Data\CustomerInterface::class
+                $customer,
+                ['group_id' => 1], CustomerInterface::class
             );
 
-        $this->formFactoryMock->expects($this->any())->method('create')->will($this->returnValue($customerFormMock));
-        $this->sessionQuoteMock->expects($this->any())->method('getQuote')->will($this->returnValue($quoteMock));
-        $this->customerFactoryMock->expects($this->any())->method('create')->will($this->returnValue($customerMock));
+        $this->formFactory->method('create')
+            ->willReturn($customerForm);
+        $this->sessionQuote
+            ->method('getQuote')
+            ->willReturn($quote);
+        $this->customerFactory->method('create')
+            ->willReturn($customer);
 
-        $this->groupRepositoryMock->expects($this->once())
-            ->method('getById')
-            ->will($this->returnValue($customerGroupMock));
+        $this->groupRepository->method('getById')
+            ->willReturn($customerGroup);
 
         $this->adminOrderCreate->setAccountData(['group_id' => 1]);
     }
@@ -253,7 +179,7 @@ class CreateTest extends \PHPUnit\Framework\TestCase
     public function testUpdateQuoteItemsNotArray()
     {
         $object = $this->adminOrderCreate->updateQuoteItems('string');
-        $this->assertEquals($this->adminOrderCreate, $object);
+        self::assertEquals($this->adminOrderCreate, $object);
     }
 
     public function testUpdateQuoteItemsEmptyConfiguredOption()
@@ -266,22 +192,21 @@ class CreateTest extends \PHPUnit\Framework\TestCase
             ]
         ];
 
-        $itemMock = $this->createMock(\Magento\Quote\Model\Quote\Item::class);
+        $item = $this->createMock(Item::class);
 
-        $quoteMock = $this->createMock(\Magento\Quote\Model\Quote::class);
-        $quoteMock->expects($this->once())
-            ->method('getItemById')
-            ->will($this->returnValue($itemMock));
+        $quote = $this->createMock(Quote::class);
+        $quote->method('getItemById')
+            ->willReturn($item);
 
-        $this->sessionQuoteMock->expects($this->any())->method('getQuote')->will($this->returnValue($quoteMock));
-        $this->itemUpdater->expects($this->once())
-            ->method('update')
-            ->with($this->equalTo($itemMock), $this->equalTo($items[1]))
-            ->will($this->returnSelf());
+        $this->sessionQuote->method('getQuote')
+            ->willReturn($quote);
+        $this->itemUpdater->method('update')
+            ->with(self::equalTo($item), self::equalTo($items[1]))
+            ->willReturnSelf();
 
         $this->adminOrderCreate->setRecollect(false);
         $object = $this->adminOrderCreate->updateQuoteItems($items);
-        $this->assertEquals($this->adminOrderCreate, $object);
+        self::assertEquals($this->adminOrderCreate, $object);
     }
 
     public function testUpdateQuoteItemsWithConfiguredOption()
@@ -295,43 +220,50 @@ class CreateTest extends \PHPUnit\Framework\TestCase
             ]
         ];
 
-        $itemMock = $this->createMock(\Magento\Quote\Model\Quote\Item::class);
-        $itemMock->expects($this->once())
-            ->method('getQty')
-            ->will($this->returnValue($qty));
+        $item = $this->createMock(Item::class);
+        $item->method('getQty')
+            ->willReturn($qty);
 
-        $quoteMock = $this->createMock(\Magento\Quote\Model\Quote::class);
-        $quoteMock->expects($this->once())
-            ->method('updateItem')
-            ->will($this->returnValue($itemMock));
+        $quote = $this->createMock(Quote::class);
+        $quote->method('updateItem')
+            ->willReturn($item);
 
-        $this->sessionQuoteMock->expects($this->any())->method('getQuote')->will($this->returnValue($quoteMock));
+        $this->sessionQuote
+            ->method('getQuote')
+            ->willReturn($quote);
 
         $expectedInfo = $items[1];
         $expectedInfo['qty'] = $qty;
-        $this->itemUpdater->expects($this->once())
-            ->method('update')
-            ->with($this->equalTo($itemMock), $this->equalTo($expectedInfo));
+        $this->itemUpdater->method('update')
+            ->with(self::equalTo($item), self::equalTo($expectedInfo));
 
         $this->adminOrderCreate->setRecollect(false);
         $object = $this->adminOrderCreate->updateQuoteItems($items);
-        $this->assertEquals($this->adminOrderCreate, $object);
+        self::assertEquals($this->adminOrderCreate, $object);
     }
 
     public function testApplyCoupon()
     {
-        $couponCode = '';
-        $quoteMock = $this->createPartialMock(\Magento\Quote\Model\Quote::class, ['getShippingAddress', 'setCouponCode']);
-        $this->sessionQuoteMock->expects($this->once())->method('getQuote')->willReturn($quoteMock);
-
-        $addressMock = $this->createPartialMock(\Magento\Quote\Model\Quote\Address::class, ['setCollectShippingRates', 'setFreeShipping']);
-        $quoteMock->expects($this->exactly(2))->method('getShippingAddress')->willReturn($addressMock);
-        $quoteMock->expects($this->once())->method('setCouponCode')->with($couponCode)->willReturnSelf();
-
-        $addressMock->expects($this->once())->method('setCollectShippingRates')->with(true)->willReturnSelf();
-        $addressMock->expects($this->once())->method('setFreeShipping')->with(0)->willReturnSelf();
+        $couponCode = '123';
+        $quote = $this->createPartialMock(Quote::class, ['getShippingAddress', 'setCouponCode']);
+        $this->sessionQuote->method('getQuote')
+            ->willReturn($quote);
+
+        $address = $this->createPartialMock(Address::class, ['setCollectShippingRates', 'setFreeShipping']);
+        $quote->method('getShippingAddress')
+            ->willReturn($address);
+        $quote->method('setCouponCode')
+            ->with($couponCode)
+            ->willReturnSelf();
+
+        $address->method('setCollectShippingRates')
+            ->with(true)
+            ->willReturnSelf();
+        $address->method('setFreeShipping')
+            ->with(0)
+            ->willReturnSelf();
 
         $object = $this->adminOrderCreate->applyCoupon($couponCode);
-        $this->assertEquals($this->adminOrderCreate, $object);
+        self::assertEquals($this->adminOrderCreate, $object);
     }
 }
diff --git a/dev/tests/integration/testsuite/Magento/Sales/Model/AdminOrder/CreateTest.php b/dev/tests/integration/testsuite/Magento/Sales/Model/AdminOrder/CreateTest.php
index ee7ddc1ba1a..408cc8d192e 100644
--- a/dev/tests/integration/testsuite/Magento/Sales/Model/AdminOrder/CreateTest.php
+++ b/dev/tests/integration/testsuite/Magento/Sales/Model/AdminOrder/CreateTest.php
@@ -5,10 +5,20 @@
  */
 namespace Magento\Sales\Model\AdminOrder;
 
+use Magento\Backend\Model\Session\Quote as SessionQuote;
+use Magento\Customer\Api\AddressRepositoryInterface;
+use Magento\Customer\Api\CustomerRepositoryInterface;
+use Magento\Customer\Model\Customer;
+use Magento\Customer\Model\CustomerRegistry;
+use Magento\Framework\Message\ManagerInterface;
+use Magento\Framework\Registry;
+use Magento\Quote\Model\Quote;
+use Magento\Sales\Api\Data\OrderAddressExtensionInterface;
+use Magento\Sales\Api\Data\OrderAddressExtensionInterfaceFactory;
 use Magento\Sales\Api\OrderManagementInterface;
-use Magento\TestFramework\Helper\Bootstrap;
 use Magento\Sales\Model\Order;
-use Magento\Framework\Registry;
+use Magento\TestFramework\Helper\Bootstrap;
+use Magento\TestFramework\ObjectManager;
 
 /**
  * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
@@ -18,21 +28,25 @@ use Magento\Framework\Registry;
 class CreateTest extends \PHPUnit\Framework\TestCase
 {
     /**
-     * @var \Magento\Sales\Model\AdminOrder\Create
+     * @var Create
      */
-    protected $_model;
+    private $model;
 
-    /** @var \Magento\Framework\Message\ManagerInterface */
-    protected $_messageManager;
+    /**
+     * @var ManagerInterface
+     */
+    private $messageManager;
+
+    /**
+     * @var ObjectManager
+     */
+    private $objectManager;
 
     protected function setUp()
     {
-        parent::setUp();
-        $this->_messageManager = Bootstrap::getObjectManager()->get(\Magento\Framework\Message\ManagerInterface::class);
-        $this->_model = Bootstrap::getObjectManager()->create(
-            \Magento\Sales\Model\AdminOrder\Create::class,
-            ['messageManager' => $this->_messageManager]
-        );
+        $this->objectManager = Bootstrap::getObjectManager();
+        $this->messageManager = $this->objectManager->get(ManagerInterface::class);
+        $this->model =$this->objectManager->create(Create::class, ['messageManager' => $this->messageManager]);
     }
 
     /**
@@ -41,17 +55,15 @@ class CreateTest extends \PHPUnit\Framework\TestCase
      */
     public function testInitFromOrderShippingAddressSameAsBillingWhenEmpty()
     {
-        /** @var $order \Magento\Sales\Model\Order */
-        $order = Bootstrap::getObjectManager()->create(\Magento\Sales\Model\Order::class);
+        /** @var $order Order */
+        $order = $this->objectManager->create(Order::class);
         $order->loadByIncrementId('100000001');
-        $this->assertNull($order->getShippingAddress());
+        self::assertNull($order->getShippingAddress());
 
-        /** @var $objectManager \Magento\TestFramework\ObjectManager */
-        $objectManager = Bootstrap::getObjectManager();
-        $objectManager->get(\Magento\Framework\Registry::class)->unregister('rule_data');
-        $this->_model->initFromOrder($order);
+        $this->objectManager->get(Registry::class)->unregister('rule_data');
+        $this->model->initFromOrder($order);
 
-        $this->assertNull($order->getShippingAddress());
+        self::assertNull($order->getShippingAddress());
     }
 
     /**
@@ -64,45 +76,45 @@ class CreateTest extends \PHPUnit\Framework\TestCase
     public function testInitFromOrderAndCreateOrderFromQuoteWithAdditionalOptions()
     {
         /** @var $serializer \Magento\Framework\Serialize\Serializer\Json */
-        $serializer = Bootstrap::getObjectManager()->create(\Magento\Framework\Serialize\Serializer\Json::class);
+        $serializer = $this->objectManager->create(\Magento\Framework\Serialize\Serializer\Json::class);
 
-        /** @var $order \Magento\Sales\Model\Order */
-        $order = Bootstrap::getObjectManager()->create(\Magento\Sales\Model\Order::class);
+        /** @var $order Order */
+        $order = $this->objectManager->create(Order::class);
         $order->loadByIncrementId('100000001');
 
         /** @var $orderCreate \Magento\Sales\Model\AdminOrder\Create */
-        $orderCreate = $this->_model->initFromOrder($order);
+        $orderCreate = $this->model->initFromOrder($order);
 
         $quoteItems = $orderCreate->getQuote()->getItemsCollection();
 
-        $this->assertEquals(1, $quoteItems->count());
+        self::assertEquals(1, $quoteItems->count());
 
         $quoteItem = $quoteItems->getFirstItem();
         $quoteItemOptions = $quoteItem->getOptionsByCode();
 
-        $this->assertEquals(
+        self::assertEquals(
             $serializer->serialize(['additional_option_key' => 'additional_option_value']),
             $quoteItemOptions['additional_options']->getValue()
         );
 
-        $session = Bootstrap::getObjectManager()->get(\Magento\Backend\Model\Session\Quote::class);
+        $session = $this->objectManager->get(SessionQuote::class);
         $session->setCustomerId(1);
 
-        $customer = Bootstrap::getObjectManager()->create(\Magento\Customer\Model\Customer::class);
+        $customer = $this->objectManager->create(Customer::class);
         $customer->load(1)->setDefaultBilling(null)->setDefaultShipping(null)->save();
 
-        $rate = Bootstrap::getObjectManager()->create(\Magento\Quote\Model\Quote\Address\Rate::class);
+        $rate = $this->objectManager->create(Quote\Address\Rate::class);
         $rate->setCode('freeshipping_freeshipping');
 
-        $this->_model->getQuote()->getShippingAddress()->addShippingRate($rate);
-        $this->_model->getQuote()->getShippingAddress()->setCountryId('EE');
-        $this->_model->setShippingAsBilling(0);
-        $this->_model->setPaymentData(['method' => 'checkmo']);
+        $this->model->getQuote()->getShippingAddress()->addShippingRate($rate);
+        $this->model->getQuote()->getShippingAddress()->setCountryId('EE');
+        $this->model->setShippingAsBilling(0);
+        $this->model->setPaymentData(['method' => 'checkmo']);
 
-        $newOrder = $this->_model->createOrder();
+        $newOrder = $this->model->createOrder();
         $newOrderItems = $newOrder->getItemsCollection();
 
-        $this->assertEquals(1, $newOrderItems->count());
+        self::assertEquals(1, $newOrderItems->count());
 
         $order->loadByIncrementId('100000001');
         $this->assertEquals($newOrder->getRealOrderId(), $order->getRelationChildRealId());
@@ -110,7 +122,7 @@ class CreateTest extends \PHPUnit\Framework\TestCase
 
         $newOrderItem = $newOrderItems->getFirstItem();
 
-        $this->assertEquals(
+        self::assertEquals(
             ['additional_option_key' => 'additional_option_value'],
             $newOrderItem->getProductOptionByCode('additional_options')
         );
@@ -123,18 +135,28 @@ class CreateTest extends \PHPUnit\Framework\TestCase
      */
     public function testInitFromOrderShippingAddressSameAsBillingWhenSame()
     {
-        /** @var $order \Magento\Sales\Model\Order */
-        $order = Bootstrap::getObjectManager()->create(\Magento\Sales\Model\Order::class);
+        /** @var $order Order */
+        $order = $this->objectManager->create(Order::class);
         $order->loadByIncrementId('100000001');
 
-        $this->assertNull($order->getShippingAddress()->getSameAsBilling());
+        self::assertNull($order->getShippingAddress()->getSameAsBilling());
+
+        /** @var OrderAddressExtensionInterface $shippingExtAttributes */
+        $shippingExtAttributes = $this->objectManager->get(OrderAddressExtensionInterfaceFactory::class)
+            ->create();
 
-        /** @var $objectManager \Magento\TestFramework\ObjectManager */
-        $objectManager = Bootstrap::getObjectManager();
-        $objectManager->get(\Magento\Framework\Registry::class)->unregister('rule_data');
-        $this->_model->initFromOrder($order);
+        $billingExtAttributes = clone $shippingExtAttributes;
 
-        $this->assertTrue($order->getShippingAddress()->getSameAsBilling());
+        $shippingExtAttributes->setData('tmp', false);
+        $billingExtAttributes->setData('tmp', true);
+
+        $order->getShippingAddress()->setExtensionAttributes($shippingExtAttributes);
+        $order->getBillingAddress()->setExtensionAttributes($billingExtAttributes);
+
+        $this->objectManager->get(Registry::class)->unregister('rule_data');
+        $this->model->initFromOrder($order);
+
+        self::assertTrue($order->getShippingAddress()->getSameAsBilling());
     }
 
     /**
@@ -144,19 +166,16 @@ class CreateTest extends \PHPUnit\Framework\TestCase
      */
     public function testInitFromOrderShippingAddressSameAsBillingWhenDifferent()
     {
-        /** @var $objectManager \Magento\TestFramework\ObjectManager */
-        $objectManager = Bootstrap::getObjectManager();
-
-        /** @var $order \Magento\Sales\Model\Order */
-        $order = $objectManager->create(\Magento\Sales\Model\Order::class);
+        /** @var $order Order */
+        $order = $this->objectManager->create(Order::class);
         $order->loadByIncrementId('100000002');
 
-        $this->assertNull($order->getShippingAddress()->getSameAsBilling());
+        self::assertNull($order->getShippingAddress()->getSameAsBilling());
 
-        $objectManager->get(\Magento\Framework\Registry::class)->unregister('rule_data');
-        $this->_model->initFromOrder($order);
+        $this->objectManager->get(Registry::class)->unregister('rule_data');
+        $this->model->initFromOrder($order);
 
-        $this->assertFalse($order->getShippingAddress()->getSameAsBilling());
+        self::assertFalse($order->getShippingAddress()->getSameAsBilling());
     }
 
     /**
@@ -164,26 +183,23 @@ class CreateTest extends \PHPUnit\Framework\TestCase
      */
     public function testInitFromOrderCcInformationDeleted()
     {
-        /** @var $objectManager \Magento\TestFramework\ObjectManager */
-        $objectManager = Bootstrap::getObjectManager();
-
-        /** @var $order \Magento\Sales\Model\Order */
-        $order = $objectManager->create(\Magento\Sales\Model\Order::class);
+        /** @var $order Order */
+        $order = $this->objectManager->create(Order::class);
         $order->loadByIncrementId('100000001');
 
         $payment = $order->getPayment();
-        $this->assertEquals('5', $payment->getCcExpMonth());
-        $this->assertEquals('2016', $payment->getCcExpYear());
-        $this->assertEquals('AE', $payment->getCcType());
-        $this->assertEquals('0005', $payment->getCcLast4());
-
-        $objectManager->get(\Magento\Framework\Registry::class)->unregister('rule_data');
-        $payment = $this->_model->initFromOrder($order)->getQuote()->getPayment();
-
-        $this->assertNull($payment->getCcExpMonth());
-        $this->assertNull($payment->getCcExpYear());
-        $this->assertNull($payment->getCcType());
-        $this->assertNull($payment->getCcLast4());
+        self::assertEquals('5', $payment->getCcExpMonth());
+        self::assertEquals('2016', $payment->getCcExpYear());
+        self::assertEquals('AE', $payment->getCcType());
+        self::assertEquals('0005', $payment->getCcLast4());
+
+        $this->objectManager->get(Registry::class)->unregister('rule_data');
+        $payment = $this->model->initFromOrder($order)->getQuote()->getPayment();
+
+        self::assertNull($payment->getCcExpMonth());
+        self::assertNull($payment->getCcExpYear());
+        self::assertNull($payment->getCcType());
+        self::assertNull($payment->getCcLast4());
     }
 
     /**
@@ -191,25 +207,23 @@ class CreateTest extends \PHPUnit\Framework\TestCase
      */
     public function testInitFromOrderWithEmptyPaymentDetails()
     {
-        /** @var $objectManager \Magento\TestFramework\ObjectManager */
-        $objectManager = Bootstrap::getObjectManager();
-        /** @var $order \Magento\Sales\Model\Order */
-        $order = $objectManager->create(Order::class);
+        /** @var $order Order */
+        $order = $this->objectManager->create(Order::class);
         $order->loadByIncrementId('100000001');
 
-        $objectManager->get(Registry::class)
+        $this->objectManager->get(Registry::class)
             ->unregister('rule_data');
 
-        $initOrder = $this->_model->initFromOrder($order);
+        $initOrder = $this->model->initFromOrder($order);
         $payment = $initOrder->getQuote()->getPayment();
 
-        static::assertEquals($initOrder->getQuote()->getId(), $payment->getData('quote_id'));
+        self::assertEquals($initOrder->getQuote()->getId(), $payment->getData('quote_id'));
         $payment->unsetData('quote_id');
 
-        static::assertEmpty($payment->getMethod());
-        static::assertEmpty($payment->getAdditionalInformation());
-        static::assertEmpty($payment->getAdditionalData());
-        static::assertEmpty($payment->getData());
+        self::assertEmpty($payment->getMethod());
+        self::assertEmpty($payment->getAdditionalInformation());
+        self::assertEmpty($payment->getAdditionalData());
+        self::assertEmpty($payment->getData());
     }
 
     /**
@@ -217,11 +231,11 @@ class CreateTest extends \PHPUnit\Framework\TestCase
      */
     public function testGetCustomerWishlistNoCustomerId()
     {
-        /** @var \Magento\Backend\Model\Session\Quote $session */
-        $session = Bootstrap::getObjectManager()->create(\Magento\Backend\Model\Session\Quote::class);
+        /** @var SessionQuote $session */
+        $session = $this->objectManager->create(SessionQuote::class);
         $session->setCustomerId(null);
-        $this->assertFalse(
-            $this->_model->getCustomerWishlist(true),
+        self::assertFalse(
+            $this->model->getCustomerWishlist(true),
             'If customer ID is not set to session, false is expected to be returned.'
         );
     }
@@ -236,24 +250,24 @@ class CreateTest extends \PHPUnit\Framework\TestCase
     {
         $customerIdFromFixture = 1;
         $productIdFromFixture = 1;
-        /** @var \Magento\Backend\Model\Session\Quote $session */
-        $session = Bootstrap::getObjectManager()->create(\Magento\Backend\Model\Session\Quote::class);
+        /** @var SessionQuote $session */
+        $session = $this->objectManager->create(SessionQuote::class);
         $session->setCustomerId($customerIdFromFixture);
 
         /** Test new wishlist creation for the customer specified above */
         /** @var \Magento\Wishlist\Model\Wishlist $wishlist */
-        $wishlist = $this->_model->getCustomerWishlist(true);
-        $this->assertInstanceOf(
+        $wishlist = $this->model->getCustomerWishlist(true);
+        self::assertInstanceOf(
             \Magento\Wishlist\Model\Wishlist::class,
             $wishlist,
             'New Wish List is expected to be created if existing Customer does not have one yet.'
         );
-        $this->assertEquals(0, $wishlist->getItemsCount(), 'New Wish List must be empty just after creation.');
+        self::assertEquals(0, $wishlist->getItemsCount(), 'New Wish List must be empty just after creation.');
 
         /** Add new item to wishlist and try to get it using getCustomerWishlist once again */
         $wishlist->addNewItem($productIdFromFixture)->save();
-        $updatedWishlist = $this->_model->getCustomerWishlist(true);
-        $this->assertEquals(
+        $updatedWishlist = $this->model->getCustomerWishlist(true);
+        self::assertEquals(
             1,
             $updatedWishlist->getItemsCount(),
             'Wish List must contain a Product which was added to it earlier.'
@@ -261,14 +275,14 @@ class CreateTest extends \PHPUnit\Framework\TestCase
 
         /** Try to load wishlist from cache in the class after it is deleted from DB */
         $wishlist->delete();
-        $this->assertSame(
+        self::assertSame(
             $updatedWishlist,
-            $this->_model->getCustomerWishlist(false),
+            $this->model->getCustomerWishlist(false),
             'Wish List cached in class variable is expected to be returned.'
         );
-        $this->assertNotSame(
+        self::assertNotSame(
             $updatedWishlist,
-            $this->_model->getCustomerWishlist(true),
+            $this->model->getCustomerWishlist(true),
             'New Wish List is expected to be created when cache is forced to be refreshed.'
         );
     }
@@ -278,12 +292,12 @@ class CreateTest extends \PHPUnit\Framework\TestCase
      */
     public function testSetBillingAddress()
     {
-        $addressData = $this->_getValidAddressData();
+        $addressData = $this->getValidAddressData();
         /** Validate data before creating address object */
-        $this->_model->setIsValidate(true)->setBillingAddress($addressData);
-        $this->assertInstanceOf(
-            \Magento\Quote\Model\Quote\Address::class,
-            $this->_model->getBillingAddress(),
+        $this->model->setIsValidate(true)->setBillingAddress($addressData);
+        self::assertInstanceOf(
+            Quote\Address::class,
+            $this->model->getBillingAddress(),
             'Billing address object was not created.'
         );
 
@@ -291,7 +305,7 @@ class CreateTest extends \PHPUnit\Framework\TestCase
             $addressData,
             [
                 'address_type' => 'billing',
-                'quote_id' => $this->_model->getQuote()->getId(),
+                'quote_id' => $this->model->getQuote()->getId(),
                 'street' => "Line1\nLine2",
                 'save_in_address_book' => 0,
                 'region' => '',
@@ -299,10 +313,10 @@ class CreateTest extends \PHPUnit\Framework\TestCase
             ]
         );
 
-        $result = $this->_model->getBillingAddress()->getData();
+        $result = $this->model->getBillingAddress()->getData();
         foreach ($expectedAddressData as $key => $value) {
-            $this->assertArrayHasKey($key, $result);
-            $this->assertEquals($value, $result[$key]);
+            self::assertArrayHasKey($key, $result);
+            self::assertEquals($value, $result[$key]);
         }
     }
 
@@ -314,32 +328,32 @@ class CreateTest extends \PHPUnit\Framework\TestCase
     public function testSetBillingAddressValidationErrors()
     {
         $customerIdFromFixture = 1;
-        /** @var \Magento\Backend\Model\Session\Quote $session */
-        $session = Bootstrap::getObjectManager()->create(\Magento\Backend\Model\Session\Quote::class);
+        /** @var SessionQuote $session */
+        $session = $this->objectManager->create(SessionQuote::class);
         $session->setCustomerId($customerIdFromFixture);
-        $invalidAddressData = array_merge($this->_getValidAddressData(), ['firstname' => '', 'lastname' => '']);
+        $invalidAddressData = array_merge($this->getValidAddressData(), ['firstname' => '', 'lastname' => '']);
         /**
          * Note that validation errors are collected during setBillingAddress() call in the internal class variable,
          * but they are not set to message manager at this step.
          * They are set to message manager only during createOrder() call.
          */
-        $this->_model->setIsValidate(true)->setBillingAddress($invalidAddressData);
+        $this->model->setIsValidate(true)->setBillingAddress($invalidAddressData);
         try {
-            $this->_model->createOrder();
+            $this->model->createOrder();
             $this->fail('Validation errors are expected to lead to exception during createOrder() call.');
         } catch (\Magento\Framework\Exception\LocalizedException $e) {
             /** createOrder is expected to throw exception with empty message when validation error occurs */
         }
         $errorMessages = [];
         /** @var $validationError \Magento\Framework\Message\Error */
-        foreach ($this->_messageManager->getMessages()->getItems() as $validationError) {
+        foreach ($this->messageManager->getMessages()->getItems() as $validationError) {
             $errorMessages[] = $validationError->getText();
         }
-        $this->assertTrue(
+        self::assertTrue(
             in_array('Billing Address: "First Name" is a required value.', $errorMessages),
             'Expected validation message is absent.'
         );
-        $this->assertTrue(
+        self::assertTrue(
             in_array('Billing Address: "Last Name" is a required value.', $errorMessages),
             'Expected validation message is absent.'
         );
@@ -361,9 +375,9 @@ class CreateTest extends \PHPUnit\Framework\TestCase
         $orderData = [
             'currency' => 'USD',
             'account' => ['group_id' => '1', 'email' => $customerEmail],
-            'billing_address' => array_merge($this->_getValidAddressData(), ['save_in_address_book' => '1']),
+            'billing_address' => array_merge($this->getValidAddressData(), ['save_in_address_book' => '1']),
             'shipping_address' => array_merge(
-                $this->_getValidAddressData(),
+                $this->getValidAddressData(),
                 ['save_in_address_book' => '1', 'firstname' => $firstNameForShippingAddress]
             ),
             'shipping_method' => $shippingMethod,
@@ -372,7 +386,7 @@ class CreateTest extends \PHPUnit\Framework\TestCase
         ];
         $paymentData = ['method' => $paymentMethod];
 
-        $this->_preparePreconditionsForCreateOrder(
+        $this->preparePreconditionsForCreateOrder(
             $productIdFromFixture,
             $customerEmail,
             $shippingMethod,
@@ -381,12 +395,12 @@ class CreateTest extends \PHPUnit\Framework\TestCase
             $orderData,
             $paymentMethod
         );
-        $order = $this->_model->createOrder();
-        $this->_verifyCreatedOrder($order, $shippingMethod);
-        /** @var \Magento\Customer\Model\Customer $customer */
-        $customer = Bootstrap::getObjectManager()->create(\Magento\Customer\Model\Customer::class);
+        $order = $this->model->createOrder();
+        $this->verifyCreatedOrder($order, $shippingMethod);
+        /** @var Customer $customer */
+        $customer = $this->objectManager->create(Customer::class);
         $customer->load($order->getCustomerId());
-        $this->assertEquals(
+        self::assertEquals(
             $firstNameForShippingAddress,
             $customer->getPrimaryShippingAddress()->getFirstname(),
             'Shipping address is saved incorrectly.'
@@ -408,14 +422,14 @@ class CreateTest extends \PHPUnit\Framework\TestCase
         $orderData = [
             'currency' => 'USD',
             'account' => ['group_id' => '1', 'email' => $customerEmail],
-            'billing_address' => array_merge($this->_getValidAddressData(), ['save_in_address_book' => '1']),
+            'billing_address' => array_merge($this->getValidAddressData(), ['save_in_address_book' => '1']),
             'shipping_method' => $shippingMethod,
             'comment' => ['customer_note' => ''],
             'send_confirmation' => false,
         ];
         $paymentData = ['method' => $paymentMethod];
 
-        $this->_preparePreconditionsForCreateOrder(
+        $this->preparePreconditionsForCreateOrder(
             $productIdFromFixture,
             $customerEmail,
             $shippingMethod,
@@ -424,12 +438,12 @@ class CreateTest extends \PHPUnit\Framework\TestCase
             $orderData,
             $paymentMethod
         );
-        $order = $this->_model->createOrder();
+        $order = $this->model->createOrder();
         //Check, order considering decimal qty in product.
         foreach ($order->getItems() as $orderItem) {
             self::assertTrue($orderItem->getIsQtyDecimal());
         }
-        $this->_verifyCreatedOrder($order, $shippingMethod);
+        $this->verifyCreatedOrder($order, $shippingMethod);
     }
 
     /**
@@ -454,14 +468,14 @@ class CreateTest extends \PHPUnit\Framework\TestCase
         $orderData = [
             'currency' => 'USD',
             'account' => ['group_id' => '1', 'email' => $customerEmail],
-            'billing_address' => array_merge($this->_getValidAddressData(), ['save_in_address_book' => '1']),
+            'billing_address' => array_merge($this->getValidAddressData(), ['save_in_address_book' => '1']),
             'shipping_method' => $shippingMethod,
             'comment' => ['customer_note' => ''],
             'send_confirmation' => false,
         ];
         $paymentData = ['method' => $paymentMethod];
 
-        $this->_preparePreconditionsForCreateOrder(
+        $this->preparePreconditionsForCreateOrder(
             $productIdFromFixture,
             $customerEmail,
             $shippingMethod,
@@ -475,17 +489,17 @@ class CreateTest extends \PHPUnit\Framework\TestCase
         $orderManagement = $this->getMockForAbstractClass(OrderManagementInterface::class);
         $orderManagement->method('place')
             ->willThrowException(new \Exception('Can\'t place order'));
-        Bootstrap::getObjectManager()->addSharedInstance($orderManagement, OrderManagementInterface::class);
+        $this->objectManager->addSharedInstance($orderManagement, OrderManagementInterface::class);
         try {
-            $this->_model->createOrder();
+            $this->model->createOrder();
         } catch (\Exception $e) {
-            Bootstrap::getObjectManager()->removeSharedInstance(OrderManagementInterface::class);
+            $this->objectManager->removeSharedInstance(OrderManagementInterface::class);
         }
 
-        $customerEmail = $customerEmailSecondAttempt ? :$this->_model->getQuote()->getCustomer()->getEmail();
+        $customerEmail = $customerEmailSecondAttempt ? :$this->model->getQuote()->getCustomer()->getEmail();
         $orderData['account']['email'] = $customerEmailSecondAttempt;
 
-        $this->_preparePreconditionsForCreateOrder(
+        $this->preparePreconditionsForCreateOrder(
             $productIdFromFixture,
             $customerEmail,
             $shippingMethod,
@@ -495,8 +509,8 @@ class CreateTest extends \PHPUnit\Framework\TestCase
             $paymentMethod
         );
 
-        $order = $this->_model->createOrder();
-        $this->_verifyCreatedOrder($order, $shippingMethod);
+        $order = $this->model->createOrder();
+        $this->verifyCreatedOrder($order, $shippingMethod);
     }
 
     /**
@@ -537,9 +551,9 @@ class CreateTest extends \PHPUnit\Framework\TestCase
         $firstNameForShippingAddress = 'FirstNameForShipping';
         $orderData = [
             'currency' => 'USD',
-            'billing_address' => array_merge($this->_getValidAddressData(), ['save_in_address_book' => '1']),
+            'billing_address' => array_merge($this->getValidAddressData(), ['save_in_address_book' => '1']),
             'shipping_address' => array_merge(
-                $this->_getValidAddressData(),
+                $this->getValidAddressData(),
                 ['save_in_address_book' => '1', 'firstname' => $firstNameForShippingAddress]
             ),
             'shipping_method' => $shippingMethod,
@@ -548,7 +562,7 @@ class CreateTest extends \PHPUnit\Framework\TestCase
         ];
         $paymentData = ['method' => $paymentMethod];
 
-        $this->_preparePreconditionsForCreateOrder(
+        $this->preparePreconditionsForCreateOrder(
             $productIdFromFixture,
             $customerEmailFromFixture,
             $shippingMethod,
@@ -558,12 +572,15 @@ class CreateTest extends \PHPUnit\Framework\TestCase
             $paymentMethod,
             $customerIdFromFixture
         );
-        $order = $this->_model->createOrder();
-        $this->_verifyCreatedOrder($order, $shippingMethod);
-        $this->getCustomerRegistry()->remove($order->getCustomerId());
-        $customer = $this->getCustomerById($order->getCustomerId());
-        $address = $this->getAddressById($customer->getDefaultShipping());
-        $this->assertEquals(
+        $order = $this->model->createOrder();
+        $this->verifyCreatedOrder($order, $shippingMethod);
+        $this->objectManager->get(CustomerRegistry::class)
+            ->remove($order->getCustomerId());
+        $customer = $this->objectManager->get(CustomerRepositoryInterface::class)
+            ->getById($order->getCustomerId());
+        $address = $this->objectManager->get(AddressRepositoryInterface::class)
+            ->getById($customer->getDefaultShipping());
+        self::assertEquals(
             $firstNameForShippingAddress,
             $address->getFirstname(),
             'Shipping address is saved incorrectly.'
@@ -586,14 +603,14 @@ class CreateTest extends \PHPUnit\Framework\TestCase
         $shippingAddressAsBilling = 1;
         $orderData = [
             'currency' => 'USD',
-            'billing_address' => array_merge($this->_getValidAddressData(), ['save_in_address_book' => '1']),
+            'billing_address' => array_merge($this->getValidAddressData(), ['save_in_address_book' => '1']),
             'shipping_method' => $shippingMethod,
             'comment' => ['customer_note' => ''],
             'send_confirmation' => false,
         ];
         $paymentData = ['method' => $paymentMethod];
 
-        $this->_preparePreconditionsForCreateOrder(
+        $this->preparePreconditionsForCreateOrder(
             $productIdFromFixture,
             $customerEmailFromFixture,
             $shippingMethod,
@@ -603,8 +620,8 @@ class CreateTest extends \PHPUnit\Framework\TestCase
             $paymentMethod,
             $customerIdFromFixture
         );
-        $order = $this->_model->createOrder();
-        $this->_verifyCreatedOrder($order, $shippingMethod);
+        $order = $this->model->createOrder();
+        $this->verifyCreatedOrder($order, $shippingMethod);
     }
 
     /**
@@ -617,21 +634,21 @@ class CreateTest extends \PHPUnit\Framework\TestCase
         $fixtureCustomerId = 1;
 
         /** Preconditions */
-        /** @var \Magento\Backend\Model\Session\Quote $session */
-        $session = Bootstrap::getObjectManager()->create(\Magento\Backend\Model\Session\Quote::class);
+        /** @var SessionQuote $session */
+        $session = $this->objectManager->create(SessionQuote::class);
         $session->setCustomerId($fixtureCustomerId);
-        /** @var $quoteFixture \Magento\Quote\Model\Quote */
-        $quoteFixture = Bootstrap::getObjectManager()->create(\Magento\Quote\Model\Quote::class);
+        /** @var $quoteFixture Quote */
+        $quoteFixture = $this->objectManager->create(Quote::class);
         $quoteFixture->load('test01', 'reserved_order_id');
         $quoteFixture->setCustomerIsGuest(false)->setCustomerId($fixtureCustomerId)->save();
 
         /** SUT execution */
-        $customerQuote = $this->_model->getCustomerCart();
-        $this->assertEquals($quoteFixture->getId(), $customerQuote->getId(), 'Quote ID is invalid.');
+        $customerQuote = $this->model->getCustomerCart();
+        self::assertEquals($quoteFixture->getId(), $customerQuote->getId(), 'Quote ID is invalid.');
 
         /** Try to load quote once again to ensure that caching works correctly */
-        $customerQuoteFromCache = $this->_model->getCustomerCart();
-        $this->assertSame($customerQuote, $customerQuoteFromCache, 'Customer quote caching does not work correctly.');
+        $customerQuoteFromCache = $this->model->getCustomerCart();
+        self::assertSame($customerQuote, $customerQuoteFromCache, 'Customer quote caching does not work correctly.');
     }
 
     /**
@@ -644,20 +661,20 @@ class CreateTest extends \PHPUnit\Framework\TestCase
         $fixtureCustomerId = 1;
 
         /** Preconditions */
-        /** @var \Magento\Backend\Model\Session\Quote $session */
-        $session = Bootstrap::getObjectManager()->create(\Magento\Backend\Model\Session\Quote::class);
+        /** @var SessionQuote $session */
+        $session = $this->objectManager->create(SessionQuote::class);
         $session->setCustomerId($fixtureCustomerId);
-        /** @var $quoteFixture \Magento\Quote\Model\Quote */
-        $quoteFixture = Bootstrap::getObjectManager()->create(\Magento\Quote\Model\Quote::class);
+        /** @var $quoteFixture Quote */
+        $quoteFixture = $this->objectManager->create(Quote::class);
         $quoteFixture->load('test01', 'reserved_order_id');
         $quoteFixture->setCustomerIsGuest(false)->setCustomerId($fixtureCustomerId)->save();
 
-        $customerQuote = $this->_model->getCustomerCart();
+        $customerQuote = $this->model->getCustomerCart();
         $item = $customerQuote->getAllVisibleItems()[0];
 
-        $this->_model->moveQuoteItem($item, 'cart', 3);
-        $this->assertEquals(4, $item->getQty(), 'Number of Qty isn\'t correct for Quote item.');
-        $this->assertEquals(3, $item->getQtyToAdd(), 'Number of added qty isn\'t correct for Quote item.');
+        $this->model->moveQuoteItem($item, 'cart', 3);
+        self::assertEquals(4, $item->getQty(), 'Number of Qty isn\'t correct for Quote item.');
+        self::assertEquals(3, $item->getQtyToAdd(), 'Number of added qty isn\'t correct for Quote item.');
     }
 
     /**
@@ -671,14 +688,14 @@ class CreateTest extends \PHPUnit\Framework\TestCase
         $customerEmailFromFixture = 'customer@example.com';
 
         /** Preconditions */
-        /** @var \Magento\Backend\Model\Session\Quote $session */
-        $session = Bootstrap::getObjectManager()->create(\Magento\Backend\Model\Session\Quote::class);
+        /** @var SessionQuote $session */
+        $session = $this->objectManager->create(SessionQuote::class);
         $session->setCustomerId($customerIdFromFixture);
 
         /** SUT execution */
-        $customerQuote = $this->_model->getCustomerCart();
-        $this->assertNotEmpty($customerQuote->getId(), 'Quote ID is invalid.');
-        $this->assertEquals(
+        $customerQuote = $this->model->getCustomerCart();
+        self::assertNotEmpty($customerQuote->getId(), 'Quote ID is invalid.');
+        self::assertEquals(
             $customerEmailFromFixture,
             $customerQuote->getCustomerEmail(),
             'Customer data is preserved incorrectly in a newly quote.'
@@ -697,7 +714,7 @@ class CreateTest extends \PHPUnit\Framework\TestCase
      * @param string $paymentMethod
      * @param int|null $customerIdFromFixture
      */
-    protected function _preparePreconditionsForCreateOrder(
+    private function preparePreconditionsForCreateOrder(
         $productIdFromFixture,
         $customerEmail,
         $shippingMethod,
@@ -709,18 +726,18 @@ class CreateTest extends \PHPUnit\Framework\TestCase
     ) {
         /** Disable product options */
         /** @var \Magento\Catalog\Model\Product $product */
-        $product = Bootstrap::getObjectManager()->create(\Magento\Catalog\Model\Product::class);
+        $product = $this->objectManager->create(\Magento\Catalog\Model\Product::class);
         $product->load($productIdFromFixture)->setHasOptions(false)->save();
 
         /** Set current customer */
-        /** @var \Magento\Backend\Model\Session\Quote $session */
-        $session = Bootstrap::getObjectManager()->get(\Magento\Backend\Model\Session\Quote::class);
+        /** @var SessionQuote $session */
+        $session = $this->objectManager->get(SessionQuote::class);
         if ($customerIdFromFixture !== null) {
             $session->setCustomerId($customerIdFromFixture);
 
             /** Unset fake IDs for default billing and shipping customer addresses */
-            /** @var \Magento\Customer\Model\Customer $customer */
-            $customer = Bootstrap::getObjectManager()->create(\Magento\Customer\Model\Customer::class);
+            /** @var Customer $customer */
+            $customer = $this->objectManager->create(Customer::class);
             $customer->load($customerIdFromFixture)->setDefaultBilling(null)->setDefaultShipping(null)->save();
         } else {
             /**
@@ -731,48 +748,48 @@ class CreateTest extends \PHPUnit\Framework\TestCase
         }
 
         /** Emulate availability of shipping method (all are disabled by default) */
-        /** @var $rate \Magento\Quote\Model\Quote\Address\Rate */
-        $rate = Bootstrap::getObjectManager()->create(\Magento\Quote\Model\Quote\Address\Rate::class);
+        /** @var $rate Quote\Address\Rate */
+        $rate = $this->objectManager->create(Quote\Address\Rate::class);
         $rate->setCode($shippingMethod);
-        $this->_model->getQuote()->getShippingAddress()->addShippingRate($rate);
+        $this->model->getQuote()->getShippingAddress()->addShippingRate($rate);
 
-        $this->_model->setShippingAsBilling($shippingAddressAsBilling);
-        $this->_model->addProduct($productIdFromFixture, ['qty' => 1]);
-        $this->_model->setPaymentData($paymentData);
-        $this->_model->setIsValidate(true)->importPostData($orderData);
+        $this->model->setShippingAsBilling($shippingAddressAsBilling);
+        $this->model->addProduct($productIdFromFixture, ['qty' => 1]);
+        $this->model->setPaymentData($paymentData);
+        $this->model->setIsValidate(true)->importPostData($orderData);
 
         /** Check preconditions */
 
-        $this->assertEquals(
+        self::assertEquals(
             0,
-            $this->_messageManager->getMessages()->getCount(),
+            $this->messageManager->getMessages()->getCount(),
             "Precondition failed: Errors occurred before SUT execution."
         );
         /** Selectively check quote data */
-        $createOrderData = $this->_model->getData();
-        $this->assertEquals(
+        $createOrderData = $this->model->getData();
+        self::assertEquals(
             $shippingMethod,
             $createOrderData['shipping_method'],
             'Precondition failed: Shipping method specified in create order model is invalid'
         );
-        $this->assertEquals(
+        self::assertEquals(
             'FirstName',
             $createOrderData['billing_address']['firstname'],
             'Precondition failed: Address data is invalid in create order model'
         );
-        $this->assertEquals(
+        self::assertEquals(
             'Simple Product',
-            $this->_model->getQuote()->getItemByProduct($product)->getData('name'),
+            $this->model->getQuote()->getItemByProduct($product)->getData('name'),
             'Precondition failed: Quote items data is invalid in create order model'
         );
-        $this->assertEquals(
+        self::assertEquals(
             $customerEmail,
-            $this->_model->getQuote()->getCustomer()->getEmail(),
+            $this->model->getQuote()->getCustomer()->getEmail(),
             'Precondition failed: Customer data is invalid in create order model'
         );
-        $this->assertEquals(
+        self::assertEquals(
             $paymentMethod,
-            $this->_model->getQuote()->getPayment()->getData('method'),
+            $this->model->getQuote()->getPayment()->getData('method'),
             'Precondition failed: Payment method data is invalid in create order model'
         );
     }
@@ -780,26 +797,26 @@ class CreateTest extends \PHPUnit\Framework\TestCase
     /**
      * Ensure that order is created correctly via createOrder().
      *
-     * @param \Magento\Sales\Model\Order $order
+     * @param Order $order
      * @param string $shippingMethod
      */
-    protected function _verifyCreatedOrder($order, $shippingMethod)
+    private function verifyCreatedOrder($order, $shippingMethod)
     {
         /** Selectively check order data */
         $orderData = $order->getData();
-        $this->assertNotEmpty($orderData['increment_id'], 'Order increment ID is empty.');
-        $this->assertEquals($this->_model->getQuote()->getId(), $orderData['quote_id'], 'Quote ID is invalid.');
-        $this->assertEquals(
-            $this->_model->getQuote()->getCustomer()->getEmail(),
+        self::assertNotEmpty($orderData['increment_id'], 'Order increment ID is empty.');
+        self::assertEquals($this->model->getQuote()->getId(), $orderData['quote_id'], 'Quote ID is invalid.');
+        self::assertEquals(
+            $this->model->getQuote()->getCustomer()->getEmail(),
             $orderData['customer_email'],
             'Customer email is invalid.'
         );
-        $this->assertEquals(
-            $this->_model->getQuote()->getCustomer()->getFirstname(),
+        self::assertEquals(
+            $this->model->getQuote()->getCustomer()->getFirstname(),
             $orderData['customer_firstname'],
             'Customer first name is invalid.'
         );
-        $this->assertEquals($shippingMethod, $orderData['shipping_method'], 'Shipping method is invalid.');
+        self::assertEquals($shippingMethod, $orderData['shipping_method'], 'Shipping method is invalid.');
     }
 
     /**
@@ -807,7 +824,7 @@ class CreateTest extends \PHPUnit\Framework\TestCase
      *
      * @return array
      */
-    protected function _getValidAddressData()
+    private function getValidAddressData()
     {
         return [
             'prefix' => 'prefix',
@@ -829,48 +846,4 @@ class CreateTest extends \PHPUnit\Framework\TestCase
             'vat_id' => ''
         ];
     }
-
-    /**
-     * @param int $id
-     * @return \Magento\Customer\Api\Data\CustomerInterface
-     */
-    private function getCustomerById($id)
-    {
-        return $this->getCustomerRepository()->getById($id);
-    }
-
-    /**
-     * @return \Magento\Customer\Api\CustomerRepositoryInterface
-     */
-    private function getCustomerRepository()
-    {
-        return Bootstrap::getObjectManager()->create(\Magento\Customer\Api\CustomerRepositoryInterface::class);
-    }
-
-    /**
-     * @param int $id
-     * @return \Magento\Customer\Api\Data\AddressInterface
-     */
-    private function getAddressById($id)
-    {
-        return $this->getAddressRepository()->getById($id);
-    }
-
-    /**
-     * @return \Magento\Customer\Api\AddressRepositoryInterface
-     */
-    private function getAddressRepository()
-    {
-        /** @var \Magento\Customer\Api\AddressRepositoryInterface $addressRepository */
-        return Bootstrap::getObjectManager()->create(\Magento\Customer\Api\AddressRepositoryInterface::class);
-    }
-
-    /**
-     * @return \Magento\Customer\Model\CustomerRegistry
-     */
-    private function getCustomerRegistry()
-    {
-        /** @var \Magento\Customer\Model\CustomerRegistry $addressRepository */
-        return Bootstrap::getObjectManager()->get(\Magento\Customer\Model\CustomerRegistry::class);
-    }
 }
-- 
GitLab


From bd9054a4891bf9e78fdeac54e3136e28df4758a0 Mon Sep 17 00:00:00 2001
From: Pavel Bystritsky <p.bystritsky@yandex.ru>
Date: Mon, 20 Nov 2017 11:00:20 +0200
Subject: [PATCH 131/380] magento/magento2#11691: Wrong return type for
 getAttributeText($attributeCode)

---
 app/code/Magento/Catalog/Model/Product.php    |  2 +-
 .../Catalog/Model/ProductGettersTest.php      | 27 +++++++++++++++++++
 2 files changed, 28 insertions(+), 1 deletion(-)

diff --git a/app/code/Magento/Catalog/Model/Product.php b/app/code/Magento/Catalog/Model/Product.php
index cf1392a7e9e..cb5669a4bb4 100644
--- a/app/code/Magento/Catalog/Model/Product.php
+++ b/app/code/Magento/Catalog/Model/Product.php
@@ -1712,7 +1712,7 @@ class Product extends \Magento\Catalog\Model\AbstractModel implements
      * Get attribute text by its code
      *
      * @param string $attributeCode Code of the attribute
-     * @return string
+     * @return string|array|null
      */
     public function getAttributeText($attributeCode)
     {
diff --git a/dev/tests/integration/testsuite/Magento/Catalog/Model/ProductGettersTest.php b/dev/tests/integration/testsuite/Magento/Catalog/Model/ProductGettersTest.php
index 74f640a0212..1ed0057ca24 100644
--- a/dev/tests/integration/testsuite/Magento/Catalog/Model/ProductGettersTest.php
+++ b/dev/tests/integration/testsuite/Magento/Catalog/Model/ProductGettersTest.php
@@ -5,6 +5,7 @@
  */
 namespace Magento\Catalog\Model;
 
+use Magento\Catalog\Api\ProductRepositoryInterface;
 use Magento\Framework\App\Filesystem\DirectoryList;
 
 /**
@@ -25,11 +26,19 @@ class ProductGettersTest extends \PHPUnit\Framework\TestCase
      */
     protected $_model;
 
+    /**
+     * @var ProductRepositoryInterface
+     */
+    private $productRepository;
+
     protected function setUp()
     {
         $this->_model = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create(
             \Magento\Catalog\Model\Product::class
         );
+        $this->productRepository = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create(
+            ProductRepositoryInterface::class
+        );
     }
 
     public function testGetResourceCollection()
@@ -198,6 +207,24 @@ class ProductGettersTest extends \PHPUnit\Framework\TestCase
         $this->assertEquals('Enabled', $this->_model->getAttributeText('status'));
     }
 
+    /**
+     * @magentoDataFixture Magento/Catalog/_files/products_with_multiselect_attribute.php
+     */
+    public function testGetAttributeTextArray()
+    {
+        $product = $this->productRepository->get('simple_ms_2');
+        $product->getAttributeText('multiselect_attribute');
+        $expected = [
+            'Option 2',
+            'Option 3',
+            'Option 4 "!@#$%^&*'
+        ];
+        self::assertEquals(
+            $expected,
+            $product->getAttributeText('multiselect_attribute')
+        );
+    }
+
     public function testGetCustomDesignDate()
     {
         $this->assertEquals(['from' => null, 'to' => null], $this->_model->getCustomDesignDate());
-- 
GitLab


From 758373068064b519ce9be3103ede232fc7b2e056 Mon Sep 17 00:00:00 2001
From: Stanislav Lopukhov <slopukhov@magento.com>
Date: Mon, 20 Nov 2017 11:31:52 +0200
Subject: [PATCH 132/380] MAGETWO-83328: Run Nightly PAT on 2.2

---
 setup/performance-toolkit/benchmark.jmx | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/setup/performance-toolkit/benchmark.jmx b/setup/performance-toolkit/benchmark.jmx
index d228bf2cfef..655b19760b9 100644
--- a/setup/performance-toolkit/benchmark.jmx
+++ b/setup/performance-toolkit/benchmark.jmx
@@ -8006,14 +8006,15 @@ try {
 
     //Number of products for one thread
     productClusterLength = productCount / threadsNumber;
-    //Index of the current product from the cluster
-    i = productClusterLength * currentThreadNum + iterator;
 
     if (iterator &gt;= productClusterLength) {
     	vars.put("threadIterator_" + currentThreadNum.toString(), "0");
     	iterator = 0;
     }
 
+    //Index of the current product from the cluster
+    i = productClusterLength * currentThreadNum + iterator;
+
     //ids of simple and configurable products to edit
     vars.put("simple_product_id", props.get("simple_products_list").get(i).get("id"));
     vars.put("configurable_product_id", props.get("configurable_products_list").get(i).get("id"));
-- 
GitLab


From 6730e6927f30b3e75d3b5eb23be2588f704eba51 Mon Sep 17 00:00:00 2001
From: magento-engcom-team <mikola.malevanec@transoftgroup.com>
Date: Mon, 20 Nov 2017 13:45:28 +0200
Subject: [PATCH 133/380] 11882: It's not possible to enable "log to file"
 (debugging) in production mode. Psr logger debug method does not work by the
 default in developer mode.

---
 app/code/Magento/Backend/etc/adminhtml/di.xml | 16 ++-----
 .../ConcealInProductionConfigList.php         | 45 +++++++++++++++++--
 .../ConcealInProductionConfigListTest.php     | 10 ++++-
 3 files changed, 53 insertions(+), 18 deletions(-)

diff --git a/app/code/Magento/Backend/etc/adminhtml/di.xml b/app/code/Magento/Backend/etc/adminhtml/di.xml
index f3d2e9accc9..8b68cca4782 100644
--- a/app/code/Magento/Backend/etc/adminhtml/di.xml
+++ b/app/code/Magento/Backend/etc/adminhtml/di.xml
@@ -142,20 +142,12 @@
     <type name="Magento\Config\Model\Config\Structure\ConcealInProductionConfigList">
         <arguments>
             <argument name="configs" xsi:type="array">
-                <item name="dev/restrict" xsi:type="const">Magento\Config\Model\Config\Structure\ElementVisibilityInterface::HIDDEN</item>
-                <item name="dev/front_end_development_workflow" xsi:type="const">Magento\Config\Model\Config\Structure\ElementVisibilityInterface::HIDDEN</item>
-                <item name="dev/template" xsi:type="const">Magento\Config\Model\Config\Structure\ElementVisibilityInterface::HIDDEN</item>
-                <item name="dev/translate_inline" xsi:type="const">Magento\Config\Model\Config\Structure\ElementVisibilityInterface::HIDDEN</item>
-                <item name="dev/js" xsi:type="const">Magento\Config\Model\Config\Structure\ElementVisibilityInterface::HIDDEN</item>
-                <item name="dev/css" xsi:type="const">Magento\Config\Model\Config\Structure\ElementVisibilityInterface::HIDDEN</item>
-                <item name="dev/image" xsi:type="const">Magento\Config\Model\Config\Structure\ElementVisibilityInterface::HIDDEN</item>
-                <item name="dev/static" xsi:type="const">Magento\Config\Model\Config\Structure\ElementVisibilityInterface::HIDDEN</item>
-                <item name="dev/grid" xsi:type="const">Magento\Config\Model\Config\Structure\ElementVisibilityInterface::HIDDEN</item>
-                <item name="dev/debug/template_hints_storefront" xsi:type="const">Magento\Config\Model\Config\Structure\ElementVisibilityInterface::HIDDEN</item>
-                <item name="dev/debug/template_hints_admin" xsi:type="const">Magento\Config\Model\Config\Structure\ElementVisibilityInterface::HIDDEN</item>
-                <item name="dev/debug/template_hints_blocks" xsi:type="const">Magento\Config\Model\Config\Structure\ElementVisibilityInterface::HIDDEN</item>
+                <item name="dev" xsi:type="const">Magento\Config\Model\Config\Structure\ElementVisibilityInterface::HIDDEN</item>
                 <item name="general/locale/code" xsi:type="const">Magento\Config\Model\Config\Structure\ElementVisibilityInterface::DISABLED</item>
             </argument>
+            <argument name="exemptions" xsi:type="array">
+                <item name="dev/debug/debug_logging" xsi:type="string"/>
+            </argument>
         </arguments>
     </type>
     <type name="Magento\Framework\View\Layout\Generator\Block">
diff --git a/app/code/Magento/Config/Model/Config/Structure/ConcealInProductionConfigList.php b/app/code/Magento/Config/Model/Config/Structure/ConcealInProductionConfigList.php
index 115a372e615..c5ee2158115 100644
--- a/app/code/Magento/Config/Model/Config/Structure/ConcealInProductionConfigList.php
+++ b/app/code/Magento/Config/Model/Config/Structure/ConcealInProductionConfigList.php
@@ -42,14 +42,36 @@ class ConcealInProductionConfigList implements ElementVisibilityInterface
      */
     private $state;
 
+    /**
+     *
+     * The list of form element paths which ignore visibility status.
+     *
+     * E.g.
+     *
+     * ```php
+     * [
+     *      'general/country/default' => '',
+     * ];
+     * ```
+     *
+     * It means that:
+     *  - field 'default' in group Country Options (in section General) will be showed, even if all group(section)
+     *    will be hidden.
+     *
+     * @var array
+     */
+    private $exemptions = [];
+
     /**
      * @param State $state The object that has information about the state of the system
      * @param array $configs The list of form element paths with concrete visibility status.
+     * @param array $exemptions The list of form element paths which ignore visibility status.
      */
-    public function __construct(State $state, array $configs = [])
+    public function __construct(State $state, array $configs = [], array $exemptions = [])
     {
         $this->state = $state;
         $this->configs = $configs;
+        $this->exemptions = $exemptions;
     }
 
     /**
@@ -58,10 +80,25 @@ class ConcealInProductionConfigList implements ElementVisibilityInterface
      */
     public function isHidden($path)
     {
+        $result = false;
         $path = $this->normalizePath($path);
-        return $this->state->getMode() === State::MODE_PRODUCTION
-            && !empty($this->configs[$path])
-            && $this->configs[$path] === static::HIDDEN;
+        if ($this->state->getMode() === State::MODE_PRODUCTION
+            && preg_match('/.+?\/.+?\/.+?/', $path)) {
+            $exemptions = array_keys($this->exemptions);
+            foreach ($this->configs as $configPath => $value) {
+                if ($this->configs[$configPath] === static::HIDDEN && strpos($path, $configPath) !==false) {
+                    $result = true;
+                    foreach ($exemptions as $exemption) {
+                        if (strpos($path, $exemption) !== false) {
+                            $result = false;
+                        }
+                    }
+                }
+            }
+
+        }
+
+        return $result;
     }
 
     /**
diff --git a/app/code/Magento/Config/Test/Unit/Model/Config/Structure/ConcealInProductionConfigListTest.php b/app/code/Magento/Config/Test/Unit/Model/Config/Structure/ConcealInProductionConfigListTest.php
index 5cad923264e..fa78d5dde65 100644
--- a/app/code/Magento/Config/Test/Unit/Model/Config/Structure/ConcealInProductionConfigListTest.php
+++ b/app/code/Magento/Config/Test/Unit/Model/Config/Structure/ConcealInProductionConfigListTest.php
@@ -33,9 +33,13 @@ class ConcealInProductionConfigListTest extends \PHPUnit\Framework\TestCase
             'third/path' => 'no',
             'third/path/field' => ConcealInProductionConfigList::DISABLED,
             'first/path/field' => 'no',
+            'fourth' => ConcealInProductionConfigList::HIDDEN,
+        ];
+        $exemptions = [
+            'fourth/path/value' => '',
         ];
 
-        $this->model = new ConcealInProductionConfigList($this->stateMock, $configs);
+        $this->model = new ConcealInProductionConfigList($this->stateMock, $configs, $exemptions);
     }
 
     /**
@@ -96,8 +100,10 @@ class ConcealInProductionConfigListTest extends \PHPUnit\Framework\TestCase
             ['first/path', State::MODE_PRODUCTION, false],
             ['first/path', State::MODE_DEFAULT, false],
             ['some/path', State::MODE_PRODUCTION, false],
-            ['second/path', State::MODE_PRODUCTION, true],
+            ['second/path/field', State::MODE_PRODUCTION, true],
             ['second/path', State::MODE_DEVELOPER, false],
+            ['fourth/path/value', State::MODE_PRODUCTION, false],
+            ['fourth/path/test', State::MODE_PRODUCTION, true],
         ];
     }
 }
-- 
GitLab


From f3ed1221f18c3890b3b58e3fb4349bbf6669a192 Mon Sep 17 00:00:00 2001
From: magento-engcom-team <mikola.malevanec@transoftgroup.com>
Date: Mon, 20 Nov 2017 14:44:45 +0200
Subject: [PATCH 134/380] 11882: It's not possible to enable "log to file"
 (debugging) in production mode. Psr logger debug method does not work by the
 default in developer mode.

---
 .../Structure/ConcealInProductionConfigList.php      | 12 ++++--------
 1 file changed, 4 insertions(+), 8 deletions(-)

diff --git a/app/code/Magento/Config/Model/Config/Structure/ConcealInProductionConfigList.php b/app/code/Magento/Config/Model/Config/Structure/ConcealInProductionConfigList.php
index c5ee2158115..a4049046e29 100644
--- a/app/code/Magento/Config/Model/Config/Structure/ConcealInProductionConfigList.php
+++ b/app/code/Magento/Config/Model/Config/Structure/ConcealInProductionConfigList.php
@@ -83,19 +83,15 @@ class ConcealInProductionConfigList implements ElementVisibilityInterface
         $result = false;
         $path = $this->normalizePath($path);
         if ($this->state->getMode() === State::MODE_PRODUCTION
-            && preg_match('/.+?\/.+?\/.+?/', $path)) {
+            && preg_match('/(?<group>(?<section>.*?)\/.*?)\/.*?/', $path, $match)) {
+            $group = $match['group'];
+            $section = $match['section'];
             $exemptions = array_keys($this->exemptions);
             foreach ($this->configs as $configPath => $value) {
                 if ($this->configs[$configPath] === static::HIDDEN && strpos($path, $configPath) !==false) {
-                    $result = true;
-                    foreach ($exemptions as $exemption) {
-                        if (strpos($path, $exemption) !== false) {
-                            $result = false;
-                        }
-                    }
+                    $result = empty(array_intersect([$section, $group, $path], $exemptions));
                 }
             }
-
         }
 
         return $result;
-- 
GitLab


From 76940bd235c2423d67e100a016b49230712b9329 Mon Sep 17 00:00:00 2001
From: magento-engcom-team <mikola.malevanec@transoftgroup.com>
Date: Mon, 20 Nov 2017 15:52:20 +0200
Subject: [PATCH 135/380] 11882: It's not possible to enable "log to file"
 (debugging) in production mode. Psr logger debug method does not work by the
 default in developer mode.

---
 .../Model/Config/Structure/ConcealInProductionConfigList.php    | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/app/code/Magento/Config/Model/Config/Structure/ConcealInProductionConfigList.php b/app/code/Magento/Config/Model/Config/Structure/ConcealInProductionConfigList.php
index a4049046e29..92bc61b3d65 100644
--- a/app/code/Magento/Config/Model/Config/Structure/ConcealInProductionConfigList.php
+++ b/app/code/Magento/Config/Model/Config/Structure/ConcealInProductionConfigList.php
@@ -88,7 +88,7 @@ class ConcealInProductionConfigList implements ElementVisibilityInterface
             $section = $match['section'];
             $exemptions = array_keys($this->exemptions);
             foreach ($this->configs as $configPath => $value) {
-                if ($this->configs[$configPath] === static::HIDDEN && strpos($path, $configPath) !==false) {
+                if ($value === static::HIDDEN && strpos($path, $configPath) !==false) {
                     $result = empty(array_intersect([$section, $group, $path], $exemptions));
                 }
             }
-- 
GitLab


From 6eef1d043b1913f6157e54f13d7d2c0b7d056d47 Mon Sep 17 00:00:00 2001
From: Fabian Schmengler <fs@integer-net.de>
Date: Mon, 20 Nov 2017 11:32:17 +0100
Subject: [PATCH 136/380] Add --no-update option to sampledata:deploy and
 remove commands

Unit test has been refactored to be reused for new cases
---
 .../Command/SampleDataDeployCommand.php       |  12 ++
 .../Command/SampleDataRemoveCommand.php       |  12 ++
 .../Command/AbstractSampleDataCommandTest.php | 130 +++++++++++
 .../Command/SampleDataDeployCommandTest.php   | 202 ++++++++----------
 .../Command/SampleDataRemoveCommandTest.php   | 109 ++++++++++
 5 files changed, 347 insertions(+), 118 deletions(-)
 create mode 100644 app/code/Magento/SampleData/Test/Unit/Console/Command/AbstractSampleDataCommandTest.php
 create mode 100644 app/code/Magento/SampleData/Test/Unit/Console/Command/SampleDataRemoveCommandTest.php

diff --git a/app/code/Magento/SampleData/Console/Command/SampleDataDeployCommand.php b/app/code/Magento/SampleData/Console/Command/SampleDataDeployCommand.php
index 158c588d113..88df4728313 100644
--- a/app/code/Magento/SampleData/Console/Command/SampleDataDeployCommand.php
+++ b/app/code/Magento/SampleData/Console/Command/SampleDataDeployCommand.php
@@ -12,6 +12,7 @@ use Magento\Setup\Model\PackagesAuth;
 use Symfony\Component\Console\Command\Command;
 use Symfony\Component\Console\Input\ArrayInput;
 use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Input\InputOption;
 use Symfony\Component\Console\Output\OutputInterface;
 
 /**
@@ -19,6 +20,8 @@ use Symfony\Component\Console\Output\OutputInterface;
  */
 class SampleDataDeployCommand extends Command
 {
+    const OPTION_NO_UPDATE = 'no-update';
+
     /**
      * @var \Magento\Framework\Filesystem
      */
@@ -66,6 +69,12 @@ class SampleDataDeployCommand extends Command
     {
         $this->setName('sampledata:deploy')
             ->setDescription('Deploy sample data modules');
+        $this->addOption(
+            self::OPTION_NO_UPDATE,
+            null,
+            InputOption::VALUE_NONE,
+            'Update composer.json without executing composer update'
+        );
         parent::configure();
     }
 
@@ -80,6 +89,9 @@ class SampleDataDeployCommand extends Command
         if (!empty($sampleDataPackages)) {
             $baseDir = $this->filesystem->getDirectoryRead(DirectoryList::ROOT)->getAbsolutePath();
             $commonArgs = ['--working-dir' => $baseDir, '--no-progress' => 1];
+            if ($input->getOption(self::OPTION_NO_UPDATE)) {
+                $commonArgs['--no-update'] = 1;
+            }
             $packages = [];
             foreach ($sampleDataPackages as $name => $version) {
                 $packages[] = "$name:$version";
diff --git a/app/code/Magento/SampleData/Console/Command/SampleDataRemoveCommand.php b/app/code/Magento/SampleData/Console/Command/SampleDataRemoveCommand.php
index 36f5c591bed..5e10b6c6e59 100644
--- a/app/code/Magento/SampleData/Console/Command/SampleDataRemoveCommand.php
+++ b/app/code/Magento/SampleData/Console/Command/SampleDataRemoveCommand.php
@@ -8,6 +8,7 @@ namespace Magento\SampleData\Console\Command;
 
 use Symfony\Component\Console\Command\Command;
 use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Input\InputOption;
 use Symfony\Component\Console\Output\OutputInterface;
 use Magento\SampleData\Model\Dependency;
 use Symfony\Component\Console\Input\ArrayInput;
@@ -22,6 +23,8 @@ use Composer\Console\ApplicationFactory;
  */
 class SampleDataRemoveCommand extends Command
 {
+    const OPTION_NO_UPDATE = 'no-update';
+
     /**
      * @var Filesystem
      */
@@ -69,6 +72,12 @@ class SampleDataRemoveCommand extends Command
     {
         $this->setName('sampledata:remove')
             ->setDescription('Remove all sample data packages from composer.json');
+        $this->addOption(
+            self::OPTION_NO_UPDATE,
+            null,
+            InputOption::VALUE_NONE,
+            'Update composer.json without executing composer update'
+        );
         parent::configure();
     }
 
@@ -81,6 +90,9 @@ class SampleDataRemoveCommand extends Command
         if (!empty($sampleDataPackages)) {
             $baseDir = $this->filesystem->getDirectoryRead(DirectoryList::ROOT)->getAbsolutePath();
             $commonArgs = ['--working-dir' => $baseDir, '--no-interaction' => 1, '--no-progress' => 1];
+            if ($input->getOption(self::OPTION_NO_UPDATE)) {
+                $commonArgs['--no-update'] = 1;
+            }
             $packages = array_keys($sampleDataPackages);
             $arguments = array_merge(['command' => 'remove', 'packages' => $packages], $commonArgs);
             $commandInput = new ArrayInput($arguments);
diff --git a/app/code/Magento/SampleData/Test/Unit/Console/Command/AbstractSampleDataCommandTest.php b/app/code/Magento/SampleData/Test/Unit/Console/Command/AbstractSampleDataCommandTest.php
new file mode 100644
index 00000000000..090bb4256f8
--- /dev/null
+++ b/app/code/Magento/SampleData/Test/Unit/Console/Command/AbstractSampleDataCommandTest.php
@@ -0,0 +1,130 @@
+<?php
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\SampleData\Test\Unit\Console\Command;
+
+use Composer\Console\Application;
+use Composer\Console\ApplicationFactory;
+use Magento\Framework\App\Filesystem\DirectoryList;
+use Magento\Framework\Filesystem;
+use Magento\Framework\Filesystem\Directory\ReadInterface;
+use Magento\Framework\Filesystem\Directory\WriteInterface;
+use Magento\SampleData\Model\Dependency;
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\Console\Input\ArrayInput;
+use Symfony\Component\Console\Input\ArrayInputFactory;
+
+/**
+ * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
+ */
+abstract class AbstractSampleDataCommandTest extends TestCase
+{
+    /**
+     * @var ReadInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $directoryReadMock;
+
+    /**
+     * @var WriteInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $directoryWriteMock;
+
+    /**
+     * @var Filesystem|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $filesystemMock;
+
+    /**
+     * @var Dependency|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $sampleDataDependencyMock;
+
+    /**
+     * @var ArrayInputFactory|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $arrayInputFactoryMock;
+
+    /**
+     * @var Application|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $applicationMock;
+
+    /**
+     * @var ApplicationFactory|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $applicationFactoryMock;
+
+    /**
+     * @return void
+     */
+    protected function setUp()
+    {
+        $this->directoryReadMock = $this->createMock(ReadInterface::class);
+        $this->directoryWriteMock = $this->createMock(WriteInterface::class);
+        $this->filesystemMock = $this->createMock(Filesystem::class);
+        $this->sampleDataDependencyMock = $this->createMock(Dependency::class);
+        $this->arrayInputFactoryMock = $this->createMock(ArrayInputFactory::class);
+        $this->applicationMock = $this->createMock(Application::class);
+        $this->applicationFactoryMock = $this->createPartialMock(ApplicationFactory::class, ['create']);
+    }
+
+    /**
+     * @param array $sampleDataPackages     Array in form [package_name => version_constraint]
+     * @param string $pathToComposerJson    Fake path to composer.json
+     * @param int $appRunResult             Composer exit code
+     * @param array $additionalComposerArgs Additional arguments that composer expects
+     */
+    protected function setupMocks(
+        $sampleDataPackages,
+        $pathToComposerJson,
+        $appRunResult,
+        $additionalComposerArgs = []
+    ) {
+        $this->directoryReadMock->expects($this->any())->method('getAbsolutePath')->willReturn($pathToComposerJson);
+        $this->filesystemMock->expects($this->any())->method('getDirectoryRead')->with(DirectoryList::ROOT)->willReturn(
+            $this->directoryReadMock
+        );
+        $this->sampleDataDependencyMock->expects($this->any())->method('getSampleDataPackages')->willReturn(
+            $sampleDataPackages
+        );
+        $this->arrayInputFactoryMock->expects($this->never())->method('create');
+
+        $this->applicationMock->expects($this->any())
+            ->method('run')
+            ->with(
+                new ArrayInput(
+                    array_merge(
+                        $this->expectedComposerArguments(
+                            $sampleDataPackages,
+                            $pathToComposerJson
+                        ),
+                        $additionalComposerArgs
+                    )
+                ),
+                $this->anything()
+            )
+            ->willReturn($appRunResult);
+
+        if (($appRunResult !== 0) && !empty($sampleDataPackages)) {
+            $this->applicationMock->expects($this->once())->method('resetComposer')->willReturnSelf();
+        }
+
+        $this->applicationFactoryMock->expects($this->any())
+            ->method('create')
+            ->willReturn($this->applicationMock);
+    }
+
+    /**
+     * Expected arguments for composer based on sample data packages and composer.json path
+     *
+     * @param array $sampleDataPackages
+     * @param string $pathToComposerJson
+     * @return array
+     */
+    abstract protected function expectedComposerArguments(
+        array $sampleDataPackages,
+        string $pathToComposerJson
+    ) : array;
+}
diff --git a/app/code/Magento/SampleData/Test/Unit/Console/Command/SampleDataDeployCommandTest.php b/app/code/Magento/SampleData/Test/Unit/Console/Command/SampleDataDeployCommandTest.php
index 464a6c9ccd8..450b2d8798f 100644
--- a/app/code/Magento/SampleData/Test/Unit/Console/Command/SampleDataDeployCommandTest.php
+++ b/app/code/Magento/SampleData/Test/Unit/Console/Command/SampleDataDeployCommandTest.php
@@ -9,66 +9,26 @@ use Magento\Framework\App\Filesystem\DirectoryList;
 use Magento\SampleData\Console\Command\SampleDataDeployCommand;
 use Magento\Setup\Model\PackagesAuth;
 use Symfony\Component\Console\Tester\CommandTester;
-use Magento\Framework\Filesystem;
-use Magento\Framework\Filesystem\Directory\ReadInterface;
-use Magento\Framework\Filesystem\Directory\WriteInterface;
-use Magento\SampleData\Model\Dependency;
-use Symfony\Component\Console\Input\ArrayInputFactory;
-use Composer\Console\ApplicationFactory;
-use Composer\Console\Application;
 
-/**
- * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
- */
-class SampleDataDeployCommandTest extends \PHPUnit\Framework\TestCase
+class SampleDataDeployCommandTest extends AbstractSampleDataCommandTest
 {
     /**
-     * @var ReadInterface|\PHPUnit_Framework_MockObject_MockObject
-     */
-    private $directoryReadMock;
-
-    /**
-     * @var WriteInterface|\PHPUnit_Framework_MockObject_MockObject
-     */
-    private $directoryWriteMock;
-
-    /**
-     * @var Filesystem|\PHPUnit_Framework_MockObject_MockObject
-     */
-    private $filesystemMock;
-
-    /**
-     * @var Dependency|\PHPUnit_Framework_MockObject_MockObject
-     */
-    private $sampleDataDependencyMock;
-
-    /**
-     * @var ArrayInputFactory|\PHPUnit_Framework_MockObject_MockObject
-     */
-    private $arrayInputFactoryMock;
-
-    /**
-     * @var Application|\PHPUnit_Framework_MockObject_MockObject
-     */
-    private $applicationMock;
-
-    /**
-     * @var ApplicationFactory|\PHPUnit_Framework_MockObject_MockObject
+     * @param bool $authExist               True to test with existing auth.json, false without
      */
-    private $applicationFactoryMock;
-
-    /**
-     * @return void
-     */
-    protected function setUp()
+    protected function setupMocksForAuthFile($authExist)
     {
-        $this->directoryReadMock = $this->createMock(ReadInterface::class);
-        $this->directoryWriteMock = $this->createMock(WriteInterface::class);
-        $this->filesystemMock = $this->createMock(Filesystem::class);
-        $this->sampleDataDependencyMock = $this->createMock(Dependency::class);
-        $this->arrayInputFactoryMock = $this->createMock(ArrayInputFactory::class);
-        $this->applicationMock = $this->createMock(Application::class);
-        $this->applicationFactoryMock = $this->createPartialMock(ApplicationFactory::class, ['create']);
+        $this->directoryWriteMock->expects($this->once())
+            ->method('isExist')
+            ->with(PackagesAuth::PATH_TO_AUTH_FILE)
+            ->willReturn($authExist);
+        $this->directoryWriteMock->expects($authExist ? $this->never() : $this->once())->method('writeFile')->with(
+            PackagesAuth::PATH_TO_AUTH_FILE,
+            '{}'
+        );
+        $this->filesystemMock->expects($this->once())
+            ->method('getDirectoryWrite')
+            ->with(DirectoryList::COMPOSER_HOME)
+            ->willReturn($this->directoryWriteMock);
     }
 
     /**
@@ -82,68 +42,36 @@ class SampleDataDeployCommandTest extends \PHPUnit\Framework\TestCase
      */
     public function testExecute(array $sampleDataPackages, $appRunResult, $expectedMsg, $authExist)
     {
-        $pathToComposerJson = '/path/to/composer.json';
-
-        $this->directoryReadMock->expects($this->any())
-            ->method('getAbsolutePath')
-            ->willReturn($pathToComposerJson);
-        $this->directoryWriteMock->expects($this->once())
-            ->method('isExist')
-            ->with(PackagesAuth::PATH_TO_AUTH_FILE)
-            ->willReturn($authExist);
-        $this->directoryWriteMock->expects($authExist ? $this->never() : $this->once())
-            ->method('writeFile')
-            ->with(PackagesAuth::PATH_TO_AUTH_FILE, '{}');
-        $this->filesystemMock->expects($this->any())
-            ->method('getDirectoryRead')
-            ->with(DirectoryList::ROOT)
-            ->willReturn($this->directoryReadMock);
-        $this->filesystemMock->expects($this->once())
-            ->method('getDirectoryWrite')
-            ->with(DirectoryList::COMPOSER_HOME)
-            ->willReturn($this->directoryWriteMock);
-        $this->sampleDataDependencyMock->expects($this->any())
-            ->method('getSampleDataPackages')
-            ->willReturn($sampleDataPackages);
-        $this->arrayInputFactoryMock->expects($this->never())
-            ->method('create');
-
-        array_walk($sampleDataPackages, function (&$v, $k) {
-            $v = "$k:$v";
-        });
-
-        $packages = array_values($sampleDataPackages);
-
-        $requireArgs = [
-            'command'       => 'require',
-            '--working-dir' => $pathToComposerJson,
-            '--no-progress' => 1,
-            'packages'      => $packages,
-        ];
-        $commandInput = new \Symfony\Component\Console\Input\ArrayInput($requireArgs);
-
-        $this->applicationMock->expects($this->any())
-            ->method('run')
-            ->with($commandInput, $this->anything())
-            ->willReturn($appRunResult);
-
-        if (($appRunResult !== 0) && !empty($sampleDataPackages)) {
-            $this->applicationMock->expects($this->once())->method('resetComposer')->willReturnSelf();
-        }
+        $this->setupMocks($sampleDataPackages, '/path/to/composer.json', $appRunResult);
+        $this->setupMocksForAuthFile($authExist);
+        $commandTester = $this->createCommandTester();
+        $commandTester->execute([]);
 
-        $this->applicationFactoryMock->expects($this->any())
-            ->method('create')
-            ->willReturn($this->applicationMock);
+        $this->assertEquals($expectedMsg, $commandTester->getDisplay());
+    }
 
-        $commandTester = new CommandTester(
-            new SampleDataDeployCommand(
-                $this->filesystemMock,
-                $this->sampleDataDependencyMock,
-                $this->arrayInputFactoryMock,
-                $this->applicationFactoryMock
-            )
+    /**
+     * @param array     $sampleDataPackages
+     * @param int       $appRunResult - int 0 if everything went fine, or an error code
+     * @param string    $expectedMsg
+     * @param bool      $authExist
+     * @return          void
+     *
+     * @dataProvider processDataProvider
+     */
+    public function testExecuteWithNoUpdate(array $sampleDataPackages, $appRunResult, $expectedMsg, $authExist)
+    {
+        $this->setupMocks(
+            $sampleDataPackages,
+            '/path/to/composer.json',
+            $appRunResult,
+            ['--no-update' => 1]
         );
-        $commandTester->execute([]);
+        $this->setupMocksForAuthFile($authExist);
+        $commandInput = ['--no-update' => 1];
+
+        $commandTester = $this->createCommandTester();
+        $commandTester->execute($commandInput);
 
         $this->assertEquals($expectedMsg, $commandTester->getDisplay());
     }
@@ -154,13 +82,13 @@ class SampleDataDeployCommandTest extends \PHPUnit\Framework\TestCase
     public function processDataProvider()
     {
         return [
-            [
+            'No sample data found' => [
                 'sampleDataPackages' => [],
                 'appRunResult' => 1,
                 'expectedMsg' => 'There is no sample data for current set of modules.' . PHP_EOL,
                 'authExist' => true,
             ],
-            [
+            'No auth.json found' => [
                 'sampleDataPackages' => [
                     'magento/module-cms-sample-data' => '1.0.0-beta',
                 ],
@@ -169,7 +97,7 @@ class SampleDataDeployCommandTest extends \PHPUnit\Framework\TestCase
                     . PHP_EOL,
                 'authExist' => false,
             ],
-            [
+            'Successful sample data installation' => [
                 'sampleDataPackages' => [
                     'magento/module-cms-sample-data' => '1.0.0-beta',
                 ],
@@ -204,6 +132,14 @@ class SampleDataDeployCommandTest extends \PHPUnit\Framework\TestCase
             ->with(DirectoryList::COMPOSER_HOME)
             ->willReturn($this->directoryWriteMock);
 
+        $this->createCommandTester()->execute([]);
+    }
+
+    /**
+     * @return CommandTester
+     */
+    private function createCommandTester(): CommandTester
+    {
         $commandTester = new CommandTester(
             new SampleDataDeployCommand(
                 $this->filesystemMock,
@@ -212,6 +148,36 @@ class SampleDataDeployCommandTest extends \PHPUnit\Framework\TestCase
                 $this->applicationFactoryMock
             )
         );
-        $commandTester->execute([]);
+        return $commandTester;
+    }
+
+    /**
+     * @param $sampleDataPackages
+     * @param $pathToComposerJson
+     * @return array
+     */
+    protected function expectedComposerArguments(
+        array $sampleDataPackages,
+        string $pathToComposerJson
+    ) : array {
+        return [
+            'command' => 'require',
+            '--working-dir' => $pathToComposerJson,
+            '--no-progress' => 1,
+            'packages' => $this->packageVersionStrings($sampleDataPackages),
+        ];
+    }
+
+    /**
+     * @param array $sampleDataPackages
+     * @return array
+     */
+    private function packageVersionStrings(array $sampleDataPackages): array
+    {
+        array_walk($sampleDataPackages, function (&$v, $k) {
+            $v = "$k:$v";
+        });
+
+        return array_values($sampleDataPackages);
     }
 }
diff --git a/app/code/Magento/SampleData/Test/Unit/Console/Command/SampleDataRemoveCommandTest.php b/app/code/Magento/SampleData/Test/Unit/Console/Command/SampleDataRemoveCommandTest.php
new file mode 100644
index 00000000000..7fce70fd9c3
--- /dev/null
+++ b/app/code/Magento/SampleData/Test/Unit/Console/Command/SampleDataRemoveCommandTest.php
@@ -0,0 +1,109 @@
+<?php
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\SampleData\Test\Unit\Console\Command;
+
+use Magento\SampleData\Console\Command\SampleDataRemoveCommand;
+use Symfony\Component\Console\Tester\CommandTester;
+
+class SampleDataRemoveCommandTest extends AbstractSampleDataCommandTest
+{
+
+    /**
+     * @param array     $sampleDataPackages
+     * @param int       $appRunResult - int 0 if everything went fine, or an error code
+     * @param string    $expectedMsg
+     * @return          void
+     *
+     * @dataProvider processDataProvider
+     */
+    public function testExecute(array $sampleDataPackages, $appRunResult, $expectedMsg)
+    {
+        $this->setupMocks($sampleDataPackages, '/path/to/composer.json', $appRunResult);
+        $commandTester = $this->createCommandTester();
+        $commandTester->execute([]);
+
+        $this->assertEquals($expectedMsg, $commandTester->getDisplay());
+    }
+
+    /**
+     * @param array     $sampleDataPackages
+     * @param int       $appRunResult - int 0 if everything went fine, or an error code
+     * @param string    $expectedMsg
+     * @return          void
+     *
+     * @dataProvider processDataProvider
+     */
+    public function testExecuteWithNoUpdate(array $sampleDataPackages, $appRunResult, $expectedMsg)
+    {
+        $this->setupMocks(
+            $sampleDataPackages,
+            '/path/to/composer.json',
+            $appRunResult,
+            ['--no-update' => 1]
+        );
+        $commandInput = ['--no-update' => 1];
+
+        $commandTester = $this->createCommandTester();
+        $commandTester->execute($commandInput);
+
+        $this->assertEquals($expectedMsg, $commandTester->getDisplay());
+    }
+
+    /**
+     * @return array
+     */
+    public function processDataProvider()
+    {
+        return [
+            'No sample data found' => [
+                'sampleDataPackages' => [],
+                'appRunResult' => 1,
+                'expectedMsg' => 'There is no sample data for current set of modules.' . PHP_EOL,
+            ],
+            'Successful sample data installation' => [
+                'sampleDataPackages' => [
+                    'magento/module-cms-sample-data' => '1.0.0-beta',
+                ],
+                'appRunResult' => 0,
+                'expectedMsg' => '',
+            ],
+        ];
+    }
+
+    /**
+     * @return CommandTester
+     */
+    private function createCommandTester(): CommandTester
+    {
+        $commandTester = new CommandTester(
+            new SampleDataRemoveCommand(
+                $this->filesystemMock,
+                $this->sampleDataDependencyMock,
+                $this->arrayInputFactoryMock,
+                $this->applicationFactoryMock
+            )
+        );
+        return $commandTester;
+    }
+
+    /**
+     * @param $sampleDataPackages
+     * @param $pathToComposerJson
+     * @return array
+     */
+    protected function expectedComposerArguments(
+        array $sampleDataPackages,
+        string $pathToComposerJson
+    ) : array {
+        return [
+            'command' => 'remove',
+            '--working-dir' => $pathToComposerJson,
+            '--no-interaction' => 1,
+            '--no-progress' => 1,
+            'packages' => array_keys($sampleDataPackages),
+        ];
+    }
+}
-- 
GitLab


From 2158987fe15d22e76f0c0e7555e3d2c94d64bc4c Mon Sep 17 00:00:00 2001
From: Dmytro Voskoboinikov <dvoskoboinikov@magento.com>
Date: Mon, 20 Nov 2017 16:25:54 +0200
Subject: [PATCH 137/380] MAGETWO-77840: [2.2.x] - Special/lowest price in
 child of a Configurable Product causes the entire product to show that price

---
 .../templates/product/price/final_price.phtml | 29 ++++++------
 .../view/frontend/web/js/configurable.js      | 35 ++++++++++++++-
 .../view/frontend/web/js/swatch-renderer.js   | 21 ++++++++-
 .../Block/Product/Compare/ListCompare.php     | 11 ++++-
 .../Catalog/Test/Block/Product/View.php       | 15 ++++++-
 .../Constraint/AssertProductComparePage.php   | 25 ++++++++---
 .../Test/Constraint/AssertProductPage.php     |  2 +-
 ...AssertProductSpecialPriceOnProductPage.php |  2 +-
 .../Product/AddCompareProductsTest.xml        |  4 +-
 .../Test/Block/Product/Price.php              | 45 +++++++++++++++++++
 .../Test/Block/Product/View.php               | 20 ++++++++-
 .../AssertConfigurableProductPage.php         | 37 ++++++++++++++-
 .../Test/Repository/ConfigurableProduct.xml   | 31 +++++++++++++
 .../RenderingBasedOnIsProductListFlagTest.php |  8 ++--
 14 files changed, 246 insertions(+), 39 deletions(-)
 create mode 100644 dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/Block/Product/Price.php

diff --git a/app/code/Magento/ConfigurableProduct/view/base/templates/product/price/final_price.phtml b/app/code/Magento/ConfigurableProduct/view/base/templates/product/price/final_price.phtml
index 98abb906f69..df05fb22104 100644
--- a/app/code/Magento/ConfigurableProduct/view/base/templates/product/price/final_price.phtml
+++ b/app/code/Magento/ConfigurableProduct/view/base/templates/product/price/final_price.phtml
@@ -19,16 +19,22 @@ $finalPriceModel = $block->getPriceType('final_price');
 $idSuffix = $block->getIdSuffix() ? $block->getIdSuffix() : '';
 $schema = ($block->getZone() == 'item_view') ? true : false;
 ?>
-<?php if (!$block->isProductList() && $block->hasSpecialPrice()): ?>
-    <span class="special-price">
-        <?php /* @escapeNotVerified */ echo $block->renderAmount($finalPriceModel->getAmount(), [
-            'display_label'     => __('Special Price'),
-            'price_id'          => $block->getPriceId('product-price-' . $idSuffix),
-            'price_type'        => 'finalPrice',
+
+<span class="normal-price">
+    <?php
+        $arguments = [
+            'display_label' => __('As low as'),
+            'price_id' => $block->getPriceId('product-price-' . $idSuffix),
+            'price_type' => 'finalPrice',
             'include_container' => true,
             'schema' => $schema
-        ]); ?>
-    </span>
+        ];
+
+        /* @escapeNotVerified */ echo $block->renderAmount($finalPriceModel->getAmount(), $arguments);
+    ?>
+</span>
+
+<?php if (!$block->isProductList() && $block->hasSpecialPrice()): ?>
     <span class="old-price sly-old-price no-display">
         <?php /* @escapeNotVerified */ echo $block->renderAmount($priceModel->getAmount(), [
             'display_label'     => __('Regular Price'),
@@ -38,13 +44,6 @@ $schema = ($block->getZone() == 'item_view') ? true : false;
             'skip_adjustments'  => true
         ]); ?>
     </span>
-<?php else: ?>
-    <?php /* @escapeNotVerified */ echo $block->renderAmount($finalPriceModel->getAmount(), [
-        'price_id'          => $block->getPriceId('product-price-' . $idSuffix),
-        'price_type'        => 'finalPrice',
-        'include_container' => true,
-        'schema' => $schema
-    ]); ?>
 <?php endif; ?>
 
 <?php if ($block->showMinimalPrice()): ?>
diff --git a/app/code/Magento/ConfigurableProduct/view/frontend/web/js/configurable.js b/app/code/Magento/ConfigurableProduct/view/frontend/web/js/configurable.js
index 545887d04c9..8cabe71c175 100644
--- a/app/code/Magento/ConfigurableProduct/view/frontend/web/js/configurable.js
+++ b/app/code/Magento/ConfigurableProduct/view/frontend/web/js/configurable.js
@@ -32,6 +32,7 @@ define([
             mediaGallerySelector: '[data-gallery-role=gallery-placeholder]',
             mediaGalleryInitial: null,
             slyOldPriceSelector: '.sly-old-price',
+            normalPriceLabelSelector: '.normal-price .price-label',
 
             /**
              * Defines the mechanism of how images of a gallery should be
@@ -269,6 +270,7 @@ define([
             this._reloadPrice();
             this._displayRegularPriceBlock(this.simpleProduct);
             this._displayTierPriceBlock(this.simpleProduct);
+            this._displayNormalPriceLabel();
             this._changeProductImage();
         },
 
@@ -527,8 +529,16 @@ define([
          * @private
          */
         _displayRegularPriceBlock: function (optionId) {
-            if (typeof optionId != 'undefined' &&
-                this.options.spConfig.optionPrices[optionId].oldPrice.amount != //eslint-disable-line eqeqeq
+            var shouldBeShown = true;
+
+            _.each(this.options.settings, function (element) {
+                if (element.value === '') {
+                    shouldBeShown = false;
+                }
+            });
+
+            if (shouldBeShown &&
+                this.options.spConfig.optionPrices[optionId].oldPrice.amount !==
                 this.options.spConfig.optionPrices[optionId].finalPrice.amount
             ) {
                 $(this.options.slyOldPriceSelector).show();
@@ -537,6 +547,27 @@ define([
             }
         },
 
+        /**
+         * Show or hide normal price label
+         *
+         * @private
+         */
+        _displayNormalPriceLabel: function () {
+            var shouldBeShown = false;
+
+            _.each(this.options.settings, function (element) {
+                if (element.value === '') {
+                    shouldBeShown = true;
+                }
+            });
+
+            if (shouldBeShown) {
+                $(this.options.normalPriceLabelSelector).show();
+            } else {
+                $(this.options.normalPriceLabelSelector).hide();
+            }
+        },
+
         /**
          * Callback which fired after gallery gets initialized.
          *
diff --git a/app/code/Magento/Swatches/view/frontend/web/js/swatch-renderer.js b/app/code/Magento/Swatches/view/frontend/web/js/swatch-renderer.js
index c09c17f0ad6..df2345b741e 100644
--- a/app/code/Magento/Swatches/view/frontend/web/js/swatch-renderer.js
+++ b/app/code/Magento/Swatches/view/frontend/web/js/swatch-renderer.js
@@ -268,8 +268,11 @@ define([
             // tier prise selectors start
             tierPriceTemplateSelector: '#tier-prices-template',
             tierPriceBlockSelector: '[data-role="tier-price-block"]',
-            tierPriceTemplate: ''
+            tierPriceTemplate: '',
             // tier prise selectors end
+
+            // A price label selector
+            normalPriceLabelSelector: '.normal-price .price-label'
         },
 
         /**
@@ -930,6 +933,22 @@ define([
             } else {
                 $(this.options.tierPriceBlockSelector).hide();
             }
+
+            $(this.options.normalPriceLabelSelector).hide();
+
+            _.each($('.' + this.options.classes.attributeOptionsWrapper), function (attribute) {
+                if ($(attribute).find('.' + this.options.classes.optionClass + '.selected').length === 0) {
+                    if ($(attribute).find('.' + this.options.classes.selectClass).length > 0) {
+                        _.each($(attribute).find('.' + this.options.classes.selectClass), function (dropdown) {
+                            if ($(dropdown).val() === '0') {
+                                $(this.options.normalPriceLabelSelector).show();
+                            }
+                        }.bind(this));
+                    } else {
+                        $(this.options.normalPriceLabelSelector).show();
+                    }
+                }
+            }.bind(this));
         },
 
         /**
diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/Block/Product/Compare/ListCompare.php b/dev/tests/functional/tests/app/Magento/Catalog/Test/Block/Product/Compare/ListCompare.php
index 0a19fb73c31..7082eb5ffae 100644
--- a/dev/tests/functional/tests/app/Magento/Catalog/Test/Block/Product/Compare/ListCompare.php
+++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/Block/Product/Compare/ListCompare.php
@@ -16,6 +16,13 @@ use Magento\Mtf\Client\Element\SimpleElement;
  */
 class ListCompare extends Block
 {
+    /**
+     * Price displaying format.
+     *
+     * @var int
+     */
+    protected $priceFormat = 2;
+
     /**
      * Selector by product info.
      *
@@ -94,12 +101,12 @@ class ListCompare extends Block
     protected $confirmModal = '.confirm._show[data-role=modal]';
 
     /**
-     * Get product info.
+     * Get Product info.
      *
      * @param int $index
      * @param string $attributeKey
      * @param string $currency
-     * @return string
+     * @return string|array
      */
     public function getProductInfo($index, $attributeKey, $currency = ' $')
     {
diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/Block/Product/View.php b/dev/tests/functional/tests/app/Magento/Catalog/Test/Block/Product/View.php
index 92f3a2102e8..955731e8209 100644
--- a/dev/tests/functional/tests/app/Magento/Catalog/Test/Block/Product/View.php
+++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/Block/Product/View.php
@@ -243,10 +243,23 @@ class View extends AbstractConfigureBlock
     /**
      * Get block price.
      *
+     * @param FixtureInterface|null $product
+     *
      * @return Price
      */
-    public function getPriceBlock()
+    public function getPriceBlock(FixtureInterface $product = null)
     {
+        $typeId = null;
+
+        if ($product) {
+            $dataConfig = $product->getDataConfig();
+            $typeId = isset($dataConfig['type_id']) ? $dataConfig['type_id'] : null;
+        }
+
+        if ($this->hasRender($typeId)) {
+            return $this->callRender($typeId, 'getPriceBlock');
+        }
+
         return $this->blockFactory->create(
             \Magento\Catalog\Test\Block\Product\Price::class,
             ['element' => $this->_rootElement->find($this->priceBlock, Locator::SELECTOR_XPATH)]
diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductComparePage.php b/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductComparePage.php
index d7dd6fbdaaf..9831328fffb 100644
--- a/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductComparePage.php
+++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductComparePage.php
@@ -16,6 +16,13 @@ use Magento\Mtf\Constraint\AbstractConstraint;
  */
 class AssertProductComparePage extends AbstractConstraint
 {
+    /**
+     * Price displaying format.
+     *
+     * @var int
+     */
+    protected $priceFormat = 2;
+
     /**
      * Product attribute on compare product page
      *
@@ -30,8 +37,8 @@ class AssertProductComparePage extends AbstractConstraint
     ];
 
     /**
-     * Assert that "Compare Product" page contains product(s) that was added
-     * - Product name
+     * Assert that "Compare Product" Storefront page contains added Products with expected Attribute values:
+     * - Name
      * - Price
      * - SKU
      * - Description (if exists, else text "No")
@@ -56,19 +63,23 @@ class AssertProductComparePage extends AbstractConstraint
                 $value = $attribute;
                 $attribute = is_numeric($attributeKey) ? $attribute : $attributeKey;
 
-                $attributeValue = $attribute != 'price'
+                $expectedAttributeValue = $attribute != 'price'
                     ? ($product->hasData($attribute)
                         ? $product->getData($attribute)
                         : 'N/A')
                     : ($product->getDataFieldConfig('price')['source']->getPriceData() !== null
                         ? $product->getDataFieldConfig('price')['source']->getPriceData()['compare_price']
-                        : number_format($product->getPrice(), 2));
+                        : number_format($product->getPrice(), $this->priceFormat));
 
                 $attribute = is_numeric($attributeKey) ? 'info' : 'attribute';
+                $attribute = ucfirst($attribute);
+                $actualAttributeValue =
+                    $comparePage->getCompareProductsBlock()->{'getProduct' . $attribute}($key + 1, $value);
+
                 \PHPUnit_Framework_Assert::assertEquals(
-                    $attributeValue,
-                    $comparePage->getCompareProductsBlock()->{'getProduct' . ucfirst($attribute)}($key + 1, $value),
-                    'Product "' . $product->getName() . '" is\'n equals with data from fixture.'
+                    $expectedAttributeValue,
+                    $actualAttributeValue,
+                    'Product "' . $product->getName() . '" has "' . $attribute . '" value different from fixture one.'
                 );
             }
         }
diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductPage.php b/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductPage.php
index 049ecaf053e..cf9f608b935 100644
--- a/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductPage.php
+++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductPage.php
@@ -145,7 +145,7 @@ class AssertProductPage extends AbstractAssertForm
         }
         $expectedSpecialPrice = $this->product->getSpecialPrice();
         $expectedSpecialPrice = number_format($expectedSpecialPrice, 2);
-        $priceBlock = $this->productView->getPriceBlock();
+        $priceBlock = $this->productView->getPriceBlock($this->product);
         if (!$priceBlock->isVisible()) {
             return "Price block for '{$this->product->getName()}' product' is not visible.";
         }
diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductSpecialPriceOnProductPage.php b/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductSpecialPriceOnProductPage.php
index 0d8ebd5ac33..17607ffad59 100644
--- a/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductSpecialPriceOnProductPage.php
+++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductSpecialPriceOnProductPage.php
@@ -64,7 +64,7 @@ class AssertProductSpecialPriceOnProductPage extends AbstractConstraint implemen
     public function assertPrice(FixtureInterface $product, View $productViewBlock)
     {
         $fields = $product->getData();
-        $specialPrice = $productViewBlock->getPriceBlock()->getSpecialPrice();
+        $specialPrice = $productViewBlock->getPriceBlock($product)->getSpecialPrice();
         if (isset($fields['special_price'])) {
             \PHPUnit_Framework_Assert::assertEquals(
                 number_format($fields['special_price'], 2),
diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/Product/AddCompareProductsTest.xml b/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/Product/AddCompareProductsTest.xml
index 2ff67cdeb4d..18272923031 100644
--- a/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/Product/AddCompareProductsTest.xml
+++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/Product/AddCompareProductsTest.xml
@@ -21,14 +21,14 @@
             <constraint name="Magento\Catalog\Test\Constraint\AssertProductComparePage" />
         </variation>
         <variation name="AddCompareProductsTestVariation3">
-            <data name="products" xsi:type="string">configurableProduct::configurable_with_qty_1</data>
+            <data name="products" xsi:type="string">configurableProduct::configurable_as_low_as</data>
             <data name="isCustomerLoggedIn" xsi:type="string">Yes</data>
             <constraint name="Magento\Catalog\Test\Constraint\AssertProductCompareItemsLink" />
             <constraint name="Magento\Catalog\Test\Constraint\AssertProductComparePage" />
             <constraint name="Magento\Catalog\Test\Constraint\AssertProductCompareBlockOnCmsPage" />
         </variation>
         <variation name="AddCompareProductsTestVariation4">
-            <data name="products" xsi:type="string">catalogProductSimple::simple_for_composite_products,catalogProductVirtual::default,downloadableProduct::default,groupedProduct::grouped_product_with_price,configurableProduct::configurable_with_qty_1,bundleProduct::bundle_dynamic_product,bundleProduct::bundle_fixed_product</data>
+            <data name="products" xsi:type="string">catalogProductSimple::simple_for_composite_products,catalogProductVirtual::default,downloadableProduct::default,groupedProduct::grouped_product_with_price,configurableProduct::configurable_as_low_as,bundleProduct::bundle_dynamic_product,bundleProduct::bundle_fixed_product</data>
             <data name="isCustomerLoggedIn" xsi:type="string">Yes</data>
             <constraint name="Magento\Catalog\Test\Constraint\AssertProductCompareItemsLink" />
             <constraint name="Magento\Catalog\Test\Constraint\AssertProductComparePage" />
diff --git a/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/Block/Product/Price.php b/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/Block/Product/Price.php
new file mode 100644
index 00000000000..2facfafbb83
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/Block/Product/Price.php
@@ -0,0 +1,45 @@
+<?php
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\ConfigurableProduct\Test\Block\Product;
+
+use Magento\Mtf\Client\Locator;
+use Magento\Mtf\Client\Element\SimpleElement;
+
+/**
+ * This class is used to access the price related information
+ * of a configurable product from the storefront.
+ */
+class Price extends \Magento\Catalog\Test\Block\Product\Price
+{
+    /**
+     * A CSS selector for a Price label.
+     *
+     * @var string
+     */
+    protected $priceLabel = '.normal-price .price-label';
+
+    /**
+     * Mapping for different types of Price.
+     *
+     * @var array
+     */
+    protected $mapTypePrices = [
+        'special_price' => [
+            'selector' => '.normal-price .price'
+        ]
+    ];
+
+    /**
+     * This method returns the price represented by the block.
+     *
+     * @return SimpleElement
+     */
+    public function getPriceLabel()
+    {
+        return $this->_rootElement->find($this->priceLabel);
+    }
+}
diff --git a/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/Block/Product/View.php b/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/Block/Product/View.php
index a1f64822a6e..6092983c7e8 100644
--- a/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/Block/Product/View.php
+++ b/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/Block/Product/View.php
@@ -3,11 +3,10 @@
  * Copyright © Magento, Inc. All rights reserved.
  * See COPYING.txt for license details.
  */
-
 namespace Magento\ConfigurableProduct\Test\Block\Product;
 
 use Magento\ConfigurableProduct\Test\Block\Product\View\ConfigurableOptions;
-use Magento\ConfigurableProduct\Test\Fixture\ConfigurableProduct;
+use Magento\Mtf\Client\Locator;
 use Magento\Mtf\Fixture\FixtureInterface;
 use Magento\Mtf\Fixture\InjectableFixture;
 
@@ -17,6 +16,23 @@ use Magento\Mtf\Fixture\InjectableFixture;
  */
 class View extends \Magento\Catalog\Test\Block\Product\View
 {
+    /**
+     * Gets a configurable product price block.
+     *
+     * @param FixtureInterface|null $product
+     *
+     * @return Price
+     *
+     * @SuppressWarnings(PHPMD.UnusedFormalParameter)
+     */
+    public function getPriceBlock(FixtureInterface $product = null)
+    {
+        return $this->blockFactory->create(
+            'Magento\ConfigurableProduct\Test\Block\Product\Price',
+            ['element' => $this->_rootElement->find($this->priceBlock, Locator::SELECTOR_XPATH)]
+        );
+    }
+
     /**
      * Get configurable options block
      *
diff --git a/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/Constraint/AssertConfigurableProductPage.php b/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/Constraint/AssertConfigurableProductPage.php
index 580aff91210..e582be63379 100644
--- a/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/Constraint/AssertConfigurableProductPage.php
+++ b/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/Constraint/AssertConfigurableProductPage.php
@@ -14,6 +14,14 @@ use Magento\Catalog\Test\Constraint\AssertProductPage;
  */
 class AssertConfigurableProductPage extends AssertProductPage
 {
+
+    /**
+     * Price format.
+     *
+     * @var int
+     */
+    protected $priceFormat = 2;
+
     /**
      * Verify displayed product data on product page(front-end) equals passed from fixture:
      * 1. Product Name
@@ -28,6 +36,7 @@ class AssertConfigurableProductPage extends AssertProductPage
     protected function verify()
     {
         $errors = parent::verify();
+        $errors[] = $this->verifyPriceLabel();
         $errors[] = $this->verifyAttributes();
 
         return array_filter($errors);
@@ -47,7 +56,7 @@ class AssertConfigurableProductPage extends AssertProductPage
         $formPrice = $priceBlock->isOldPriceVisible() ? $priceBlock->getOldPrice() : $priceBlock->getPrice();
         $fixturePrice = $this->getLowestConfigurablePrice();
 
-        if ($fixturePrice != $formPrice) {
+        if ($fixturePrice != number_format($formPrice, $this->priceFormat)) {
             return "Displayed product price on product page(front-end) not equals passed from fixture. "
             . "Actual: {$formPrice}, expected: {$fixturePrice}.";
         }
@@ -144,4 +153,30 @@ class AssertConfigurableProductPage extends AssertProductPage
         }
         return $price;
     }
+
+    /**
+     * Verifies displayed product price label on a product page (front-end)
+     * equals passed from the fixture.
+     *
+     * @return string|null
+     */
+    protected function verifyPriceLabel()
+    {
+        /** @var \Magento\ConfigurableProduct\Test\Block\Product\Price $priceBlock */
+        $priceBlock = $this->productView->getPriceBlock($this->product);
+
+        if (!$priceBlock->getPriceLabel()->isVisible()) {
+            return "Product price label should be displayed.";
+        } else {
+            $expectedPriceLabel = 'As low as';
+            $actualPriceLabel = $priceBlock->getPriceLabel()->getText();
+
+            if ($expectedPriceLabel !== $actualPriceLabel) {
+                return "Displayed product price label on product page (front-end) not equals passed from fixture. "
+                    . "Actual: {$actualPriceLabel}, expected: {$expectedPriceLabel}.";
+            }
+        }
+
+        return null;
+    }
 }
diff --git a/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/Repository/ConfigurableProduct.xml b/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/Repository/ConfigurableProduct.xml
index a524139d3f3..61ae2a4dfad 100644
--- a/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/Repository/ConfigurableProduct.xml
+++ b/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/Repository/ConfigurableProduct.xml
@@ -176,6 +176,37 @@
             </field>
         </dataset>
 
+        <dataset name="configurable_as_low_as">
+            <field name="name" xsi:type="string">Test configurable product %isolation%</field>
+            <field name="sku" xsi:type="string">sku_test_configurable_product_%isolation%</field>
+            <field name="price" xsi:type="array">
+                <item name="dataset" xsi:type="string">price_as-40.00</item>
+            </field>
+            <field name="product_has_weight" xsi:type="string">This item has weight</field>
+            <field name="weight" xsi:type="string">30</field>
+            <field name="status" xsi:type="string">Yes</field>
+            <field name="visibility" xsi:type="string">Catalog, Search</field>
+            <field name="tax_class_id" xsi:type="array">
+                <item name="dataset" xsi:type="string">taxable_goods</item>
+            </field>
+            <field name="url_key" xsi:type="string">configurable-product-%isolation%</field>
+            <field name="configurable_attributes_data" xsi:type="array">
+                <item name="dataset" xsi:type="string">default</item>
+            </field>
+            <field name="quantity_and_stock_status" xsi:type="array">
+                <item name="is_in_stock" xsi:type="string">In Stock</item>
+            </field>
+            <field name="website_ids" xsi:type="array">
+                <item name="0" xsi:type="string">Main Website</item>
+            </field>
+            <field name="attribute_set_id" xsi:type="array">
+                <item name="dataset" xsi:type="string">default</item>
+            </field>
+            <field name="checkout_data" xsi:type="array">
+                <item name="dataset" xsi:type="string">configurable_options_with_qty_1</item>
+            </field>
+        </dataset>
+
         <dataset name="product_with_special_price">
             <field name="name" xsi:type="string">Test configurable product %isolation%</field>
             <field name="sku" xsi:type="string">sku_test_configurable_product_%isolation%</field>
diff --git a/dev/tests/integration/testsuite/Magento/ConfigurableProduct/Pricing/Render/FinalPriceBox/RenderingBasedOnIsProductListFlagTest.php b/dev/tests/integration/testsuite/Magento/ConfigurableProduct/Pricing/Render/FinalPriceBox/RenderingBasedOnIsProductListFlagTest.php
index 379e61e64c7..076ed342627 100644
--- a/dev/tests/integration/testsuite/Magento/ConfigurableProduct/Pricing/Render/FinalPriceBox/RenderingBasedOnIsProductListFlagTest.php
+++ b/dev/tests/integration/testsuite/Magento/ConfigurableProduct/Pricing/Render/FinalPriceBox/RenderingBasedOnIsProductListFlagTest.php
@@ -83,7 +83,7 @@ class RenderingBasedOnIsProductListFlagTest extends \PHPUnit\Framework\TestCase
         $this->assertGreaterThanOrEqual(
             1,
             \Magento\TestFramework\Helper\Xpath::getElementsCountForXpath(
-                '//*[contains(@class,"special-price")]',
+                '//*[contains(@class,"normal-price")]',
                 $html
             )
         );
@@ -116,9 +116,9 @@ class RenderingBasedOnIsProductListFlagTest extends \PHPUnit\Framework\TestCase
         $html = $this->finalPriceBox->toHtml();
         self::assertContains('5.99', $html);
         $this->assertEquals(
-            $count,
+            1,
             \Magento\TestFramework\Helper\Xpath::getElementsCountForXpath(
-                '//*[contains(@class,"special-price")]',
+                '//*[contains(@class,"normal-price")]',
                 $html
             )
         );
@@ -137,7 +137,7 @@ class RenderingBasedOnIsProductListFlagTest extends \PHPUnit\Framework\TestCase
     public function isProductListDataProvider()
     {
         return [
-            'is_not_product_list' => [false, true],
+            'is_not_product_list' => [false, 1],
             'is_product_list' => [true, 0],
         ];
     }
-- 
GitLab


From 4f3625b40c1e20c93391afb003ad82dd98cd7fb0 Mon Sep 17 00:00:00 2001
From: Dmytro Vilchynskyi <dvilchynskyi@magento.com>
Date: Mon, 20 Nov 2017 19:36:10 +0200
Subject: [PATCH 138/380] MAGETWO-70725: Admin token does not expire after
 'Admin Token Lifetime (hours)'

- fix
---
 .../Model/Authorization/TokenUserContext.php  |  56 +++-
 .../Authorization/TokenUserContextTest.php    | 269 +++++++++++++++++-
 2 files changed, 312 insertions(+), 13 deletions(-)

diff --git a/app/code/Magento/Webapi/Model/Authorization/TokenUserContext.php b/app/code/Magento/Webapi/Model/Authorization/TokenUserContext.php
index eaf39549b2c..afa5889fe55 100644
--- a/app/code/Magento/Webapi/Model/Authorization/TokenUserContext.php
+++ b/app/code/Magento/Webapi/Model/Authorization/TokenUserContext.php
@@ -7,6 +7,8 @@
 namespace Magento\Webapi\Model\Authorization;
 
 use Magento\Authorization\Model\UserContextInterface;
+use Magento\Framework\App\ObjectManager;
+use Magento\Framework\Oauth\Exception;
 use Magento\Integration\Model\Oauth\Token;
 use Magento\Integration\Model\Oauth\TokenFactory;
 use Magento\Integration\Api\IntegrationServiceInterface;
@@ -47,6 +49,21 @@ class TokenUserContext implements UserContextInterface
      */
     protected $integrationService;
 
+    /**
+     * @var \Magento\Framework\Stdlib\DateTime
+     */
+    private $dateTime;
+
+    /**
+     * @var \Magento\Framework\Stdlib\DateTime\DateTime
+     */
+    private $date;
+
+    /**
+     * @var \Magento\Integration\Helper\Oauth\Data
+     */
+    private $oauthHelper;
+
     /**
      * Initialize dependencies.
      *
@@ -57,11 +74,23 @@ class TokenUserContext implements UserContextInterface
     public function __construct(
         Request $request,
         TokenFactory $tokenFactory,
-        IntegrationServiceInterface $integrationService
+        IntegrationServiceInterface $integrationService,
+        \Magento\Framework\Stdlib\DateTime $dateTime = null,
+        \Magento\Framework\Stdlib\DateTime\DateTime $date = null,
+        \Magento\Integration\Helper\Oauth\Data $oauthHelper = null
     ) {
         $this->request = $request;
         $this->tokenFactory = $tokenFactory;
         $this->integrationService = $integrationService;
+        $this->dateTime = $dateTime ?: ObjectManager::getInstance()->get(
+            \Magento\Framework\Stdlib\DateTime::class
+        );
+        $this->date = $date ?: ObjectManager::getInstance()->get(
+            \Magento\Framework\Stdlib\DateTime\DateTime::class
+        );
+        $this->oauthHelper = $oauthHelper ?: ObjectManager::getInstance()->get(
+            \Magento\Integration\Helper\Oauth\Data::class
+        );
     }
 
     /**
@@ -82,6 +111,29 @@ class TokenUserContext implements UserContextInterface
         return $this->userType;
     }
 
+    /**
+     * Check if token is expired.
+     *
+     * @param Token $token
+     *
+     * @return bool
+     */
+    private function isTokenExpired(Token $token)
+    {
+        if ($token->getUserType() == \Magento\Authorization\Model\UserContextInterface::USER_TYPE_ADMIN) {
+            $tokenTtl = $this->oauthHelper->getAdminTokenLifetime();
+        } elseif ($token->getUserType() == \Magento\Authorization\Model\UserContextInterface::USER_TYPE_CUSTOMER) {
+            $tokenTtl = $this->oauthHelper->getCustomerTokenLifetime();
+        } else {
+            // other user-type tokens are considered always valid
+            return false;
+        }
+        if ($this->dateTime->strToTime($token->getCreatedAt()) < ($this->date->gmtTimestamp() - $tokenTtl * 3600)) {
+            return true;
+        }
+        return false;
+    }
+
     /**
      * Finds the bearer token and looks up the value.
      *
@@ -114,7 +166,7 @@ class TokenUserContext implements UserContextInterface
         $bearerToken = $headerPieces[1];
         $token = $this->tokenFactory->create()->loadByToken($bearerToken);
 
-        if (!$token->getId() || $token->getRevoked()) {
+        if (!$token->getId() || $token->getRevoked() || $this->isTokenExpired($token)) {
             $this->isRequestProcessed = true;
             return;
         }
diff --git a/app/code/Magento/Webapi/Test/Unit/Model/Authorization/TokenUserContextTest.php b/app/code/Magento/Webapi/Test/Unit/Model/Authorization/TokenUserContextTest.php
index 45ea678bdf8..f7ab848083d 100644
--- a/app/code/Magento/Webapi/Test/Unit/Model/Authorization/TokenUserContextTest.php
+++ b/app/code/Magento/Webapi/Test/Unit/Model/Authorization/TokenUserContextTest.php
@@ -24,20 +24,35 @@ class TokenUserContextTest extends \PHPUnit\Framework\TestCase
     protected $tokenUserContext;
 
     /**
-     * @var \Magento\Integration\Model\Oauth\TokenFactory
+     * @var \Magento\Integration\Model\Oauth\TokenFactory|\PHPUnit_Framework_MockObject_MockObject
      */
     protected $tokenFactory;
 
     /**
-     * @var \Magento\Integration\Api\IntegrationServiceInterface
+     * @var \Magento\Integration\Api\IntegrationServiceInterface|\PHPUnit_Framework_MockObject_MockObject
      */
     protected $integrationService;
 
     /**
-     * @var \Magento\Framework\Webapi\Request
+     * @var \Magento\Framework\Webapi\Request|\PHPUnit_Framework_MockObject_MockObject
      */
     protected $request;
 
+    /**
+     * @var \Magento\Integration\Helper\Oauth\Data|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $oauthHelperMock;
+
+    /**
+     * @var \Magento\Framework\Stdlib\DateTime\DateTime|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $dateMock;
+
+    /**
+     * @var \Magento\Framework\Stdlib\DateTime|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $dateTimeMock;
+
     protected function setUp()
     {
         $this->objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
@@ -68,12 +83,39 @@ class TokenUserContextTest extends \PHPUnit\Framework\TestCase
             )
             ->getMock();
 
+        $this->oauthHelperMock = $this->getMockBuilder(\Magento\Integration\Helper\Oauth\Data::class)
+            ->disableOriginalConstructor()
+            ->setMethods(['getAdminTokenLifetime', 'getCustomerTokenLifetime'])
+            ->getMock();
+
+        $this->dateMock = $this->getMockBuilder(\Magento\Framework\Stdlib\DateTime\DateTime::class)
+            ->disableOriginalConstructor()
+            ->setMethods(['gmtTimestamp'])
+            ->getMock();
+
+        $this->dateTimeMock = $this->getMockBuilder(\Magento\Framework\Stdlib\DateTime::class)
+            ->disableOriginalConstructor()
+            ->setMethods(['strToTime'])
+            ->getMock();
+
+        $this->dateTimeMock->expects($this->any())
+            ->method('strToTime')
+            ->will($this->returnCallback(
+                function ($str) {
+                    return strtotime($str);
+                }
+            )
+            );
+
         $this->tokenUserContext = $this->objectManager->getObject(
             \Magento\Webapi\Model\Authorization\TokenUserContext::class,
             [
                 'request' => $this->request,
                 'tokenFactory' => $this->tokenFactory,
-                'integrationService' => $this->integrationService
+                'integrationService' => $this->integrationService,
+                'oauthHelper' => $this->oauthHelperMock,
+                'date' => $this->dateMock,
+                'dateTime' => $this->dateTimeMock,
             ]
         );
     }
@@ -181,8 +223,17 @@ class TokenUserContextTest extends \PHPUnit\Framework\TestCase
 
         $token = $this->getMockBuilder(\Magento\Integration\Model\Oauth\Token::class)
             ->disableOriginalConstructor()
-            ->setMethods(['loadByToken', 'getId', 'getUserType', 'getCustomerId', 'getAdminId', '__wakeup'])
-            ->getMock();
+            ->setMethods(
+                [
+                    'loadByToken',
+                    'getId',
+                    'getUserType',
+                    'getCustomerId',
+                    'getAdminId',
+                    '__wakeup',
+                    'getCreatedAt'
+                ]
+            )->getMock();
         $this->tokenFactory->expects($this->once())
             ->method('create')
             ->will($this->returnValue($token));
@@ -193,17 +244,21 @@ class TokenUserContextTest extends \PHPUnit\Framework\TestCase
         $token->expects($this->once())
             ->method('getId')
             ->will($this->returnValue(1));
-        $token->expects($this->once())
+        $token->expects($this->any())
             ->method('getUserType')
             ->will($this->returnValue($userType));
 
-        $integration = $this->getMockBuilder(\Magento\Integration\Model\Integration::class)
-            ->disableOriginalConstructor()
-            ->setMethods(['getId', '__wakeup'])
-            ->getMock();
+        $token->expects($this->any())
+            ->method('getCreatedAt')
+            ->willReturn(date('Y-m-d H:i:s', time()));
 
         switch ($userType) {
             case UserContextInterface::USER_TYPE_INTEGRATION:
+                $integration = $this->getMockBuilder(\Magento\Integration\Model\Integration::class)
+                    ->disableOriginalConstructor()
+                    ->setMethods(['getId', '__wakeup'])
+                    ->getMock();
+
                 $integration->expects($this->once())
                     ->method('getId')
                     ->will($this->returnValue($userId));
@@ -260,4 +315,196 @@ class TokenUserContextTest extends \PHPUnit\Framework\TestCase
             ]
         ];
     }
+
+    /**
+     * @dataProvider getExpiredTestTokenData
+     */
+    public function testExpiredToken($tokenData, $tokenTtl, $currentTime, $expectedUserType, $expectedUserId)
+    {
+        $bearerToken = 'bearer1234';
+
+        $this->dateMock->expects($this->any())
+            ->method('gmtTimestamp')
+            ->willReturn($currentTime);
+
+        $this->request->expects($this->once())
+            ->method('getHeader')
+            ->with('Authorization')
+            ->will($this->returnValue("Bearer {$bearerToken}"));
+
+        $token = $this->getMockBuilder(\Magento\Integration\Model\Oauth\Token::class)
+            ->disableOriginalConstructor()
+            ->setMethods(
+                [
+                    'loadByToken',
+                    'getCreatedAt',
+                    'getId',
+                    'getUserType',
+                    'getCustomerId',
+                    'getAdminId',
+                    '__wakeup',
+                ]
+            )->getMock();
+
+        $token->expects($this->once())
+            ->method('loadByToken')
+            ->with($bearerToken)
+            ->will($this->returnSelf());
+
+        $token->expects($this->any())
+            ->method('getId')
+            ->will($this->returnValue(1));
+
+        $token->expects($this->any())
+            ->method('getUserType')
+            ->will($this->returnValue($tokenData['user_type']));
+
+        $token->expects($this->any())
+            ->method('getCreatedAt')
+            ->willReturn($tokenData['created_at']);
+
+        $this->tokenFactory->expects($this->once())
+            ->method('create')
+            ->will($this->returnValue($token));
+
+        $this->oauthHelperMock->expects($this->any())
+            ->method('getAdminTokenLifetime')
+            ->willReturn($tokenTtl);
+
+        $this->oauthHelperMock->expects($this->any())
+            ->method('getCustomerTokenLifetime')
+            ->willReturn($tokenTtl);
+
+        switch ($tokenData['user_type']) {
+            case UserContextInterface::USER_TYPE_INTEGRATION:
+                $integration = $this->getMockBuilder(\Magento\Integration\Model\Integration::class)
+                    ->disableOriginalConstructor()
+                    ->setMethods(['getId', '__wakeup'])
+                    ->getMock();
+                $integration->expects($this->any())
+                    ->method('getId')
+                    ->will($this->returnValue($tokenData['user_id']));
+
+                $this->integrationService->expects($this->any())
+                    ->method('findByConsumerId')
+                    ->will($this->returnValue($integration));
+                break;
+            case UserContextInterface::USER_TYPE_ADMIN:
+                $token->expects($this->any())
+                    ->method('getAdminId')
+                    ->will($this->returnValue($tokenData['user_id']));
+                break;
+            case UserContextInterface::USER_TYPE_CUSTOMER:
+                $token->expects($this->any())
+                    ->method('getCustomerId')
+                    ->will($this->returnValue($tokenData['user_id']));
+                break;
+        }
+
+        $this->assertEquals($expectedUserType, $this->tokenUserContext->getUserType());
+        $this->assertEquals($expectedUserId, $this->tokenUserContext->getUserId());
+
+        /* check again to make sure that the above method loadByToken in only called once */
+        $this->assertEquals($expectedUserType, $this->tokenUserContext->getUserType());
+        $this->assertEquals($expectedUserId, $this->tokenUserContext->getUserId());
+    }
+
+    /**
+     * Data provider for expired token test
+     * @return array
+     */
+    public function getExpiredTestTokenData()
+    {
+        $time = time();
+        return [
+            'token_expired_admin' => [
+                'tokenData' => [
+                    'user_type' => UserContextInterface::USER_TYPE_ADMIN,
+                    'user_id' => 1234,
+                    'created_at' => date('Y-m-d H:i:s', $time - 3600 - 400),
+                ],
+                'tokenTtl' => 1,
+                'currentTime' => $time,
+                'expedtedUserType' => null,
+                'expectedUserId' => null,
+            ],
+            'token_vigent_admin' => [
+                'tokenData' => [
+                    'user_type' => UserContextInterface::USER_TYPE_ADMIN,
+                    'user_id' => 1234,
+                    'created_at' => date('Y-m-d H:i:s', $time - 400),
+                ],
+                'tokenTtl' => 1,
+                'currentTime' => $time,
+                'expedtedUserType' => UserContextInterface::USER_TYPE_ADMIN,
+                'expectedUserId' => 1234,
+            ],
+            'token_expired_customer' => [
+                'tokenData' => [
+                    'user_type' => UserContextInterface::USER_TYPE_CUSTOMER,
+                    'user_id' => 1234,
+                    'created_at' => date('Y-m-d H:i:s', $time - 3600 - 400),
+                ],
+                'tokenTtl' => 1,
+                'currentTime' => $time,
+                'expedtedUserType' => null,
+                'expectedUserId' => null,
+            ],
+            'token_vigent_customer' => [
+                'tokenData' => [
+                    'user_type' => UserContextInterface::USER_TYPE_CUSTOMER,
+                    'user_id' => 1234,
+                    'created_at' => date('Y-m-d H:i:s', $time - 400),
+                ],
+                'tokenTtl' => 1,
+                'currentTime' => $time,
+                'expedtedUserType' => UserContextInterface::USER_TYPE_CUSTOMER,
+                'expectedUserId' => 1234,
+            ],
+            'token_expired_integration' => [
+                'tokenData' => [
+                    'user_type' => UserContextInterface::USER_TYPE_INTEGRATION,
+                    'user_id' => 1234,
+                    'created_at' => date('Y-m-d H:i:s', $time - 3600 - 400),
+                ],
+                'tokenTtl' => 1,
+                'currentTime' => $time,
+                'expectedUserType' => UserContextInterface::USER_TYPE_INTEGRATION,
+                'expectedUserId' => 1234,
+            ],
+            'token_vigent_integration' => [
+                'tokenData' => [
+                    'user_type' => UserContextInterface::USER_TYPE_INTEGRATION,
+                    'user_id' => 1234,
+                    'created_at' => date('Y-m-d H:i:s', $time - 400),
+                ],
+                'tokenTtl' => 1,
+                'currentTime' => $time,
+                'expedtedUserType' => UserContextInterface::USER_TYPE_INTEGRATION,
+                'expectedUserId' => 1234,
+            ],
+            'token_expired_guest' => [
+                'tokenData' => [
+                    'user_type' => UserContextInterface::USER_TYPE_GUEST,
+                    'user_id' => 1234,
+                    'created_at' => date('Y-m-d H:i:s', $time - 3600 - 400),
+                ],
+                'tokenTtl' => 1,
+                'currentTime' => $time,
+                'expedtedUserType' => null,
+                'expectedUserId' => null,
+            ],
+            'token_vigent_guest' => [
+                'tokenData' => [
+                    'user_type' => UserContextInterface::USER_TYPE_GUEST,
+                    'user_id' => 1234,
+                    'created_at' => date('Y-m-d H:i:s', $time - 400),
+                ],
+                'tokenTtl' => 1,
+                'currentTime' => $time,
+                'expedtedUserType' => null,
+                'expectedUserId' => null,
+            ],
+        ];
+    }
 }
-- 
GitLab


From 992b3a10abfa7ad39a4f263f61d1b47f36113ae0 Mon Sep 17 00:00:00 2001
From: Marius Grad <marius.grad@evozon.com>
Date: Tue, 21 Nov 2017 09:25:43 +0200
Subject: [PATCH 139/380] use FQCN throughout the class

---
 .../Catalog/Block/Product/ListProduct.php     | 45 ++++++++++---------
 1 file changed, 24 insertions(+), 21 deletions(-)

diff --git a/app/code/Magento/Catalog/Block/Product/ListProduct.php b/app/code/Magento/Catalog/Block/Product/ListProduct.php
index 5bb0b772f90..df91488cf5f 100644
--- a/app/code/Magento/Catalog/Block/Product/ListProduct.php
+++ b/app/code/Magento/Catalog/Block/Product/ListProduct.php
@@ -7,16 +7,19 @@
 namespace Magento\Catalog\Block\Product;
 
 use Magento\Catalog\Api\CategoryRepositoryInterface;
-use Magento\Catalog\Block\Product\Context;
 use Magento\Catalog\Block\Product\ProductList\Toolbar;
 use Magento\Catalog\Model\Category;
+use Magento\Catalog\Model\Layer;
 use Magento\Catalog\Model\Layer\Resolver;
 use Magento\Catalog\Model\Product;
 use Magento\Catalog\Model\ResourceModel\Product\Collection;
+use Magento\Catalog\Pricing\Price\FinalPrice;
 use Magento\Eav\Model\Entity\Collection\AbstractCollection;
+use Magento\Framework\App\ActionInterface;
 use Magento\Framework\Data\Helper\PostHelper;
 use Magento\Framework\DataObject\IdentityInterface;
 use Magento\Framework\Exception\NoSuchEntityException;
+use Magento\Framework\Pricing\Render;
 use Magento\Framework\Url\Helper\Data;
 
 /**
@@ -64,11 +67,11 @@ class ListProduct extends AbstractProduct implements IdentityInterface
     protected $categoryRepository;
 
     /**
-     * @param \Magento\Catalog\Block\Product\Context $context
-     * @param \Magento\Framework\Data\Helper\PostHelper $postDataHelper
-     * @param \Magento\Catalog\Model\Layer\Resolver $layerResolver
-     * @param \Magento\Catalog\Api\CategoryRepositoryInterface $categoryRepository
-     * @param \Magento\Framework\Url\Helper\Data $urlHelper
+     * @param Context $context
+     * @param PostHelper $postDataHelper
+     * @param Resolver $layerResolver
+     * @param CategoryRepositoryInterface $categoryRepository
+     * @param Data $urlHelper
      * @param array $data
      */
     public function __construct(
@@ -117,7 +120,7 @@ class ListProduct extends AbstractProduct implements IdentityInterface
     /**
      * Get catalog layer model
      *
-     * @return \Magento\Catalog\Model\Layer
+     * @return Layer
      */
     public function getLayer()
     {
@@ -191,7 +194,7 @@ class ListProduct extends AbstractProduct implements IdentityInterface
     /**
      * Add toolbar block from product listing layout
      *
-     * @param \Magento\Catalog\Model\ResourceModel\Product\Collection $collection
+     * @param Collection $collection
      */
     private function addToolbarBlock(Collection $collection)
     {
@@ -267,7 +270,7 @@ class ListProduct extends AbstractProduct implements IdentityInterface
     }
 
     /**
-     * @param array|string|integer|\Magento\Framework\App\Config\Element $code
+     * @param array|string|integer|Element $code
      * @return $this
      */
     public function addAttribute($code)
@@ -287,7 +290,7 @@ class ListProduct extends AbstractProduct implements IdentityInterface
     /**
      * Retrieve Catalog Config object
      *
-     * @return \Magento\Catalog\Model\Config
+     * @return Config
      */
     protected function _getConfig()
     {
@@ -297,10 +300,10 @@ class ListProduct extends AbstractProduct implements IdentityInterface
     /**
      * Prepare Sort By fields from Category Data
      *
-     * @param \Magento\Catalog\Model\Category $category
-     * @return \Magento\Catalog\Block\Product\ListProduct
+     * @param Category $category
+     * @return $this
      */
-    public function prepareSortableFieldsByCategory($category)
+    public function prepareSortableFieldsByCategory(Category $category)
     {
         if (!$this->getAvailableOrders()) {
             $this->setAvailableOrders($category->getAvailableSortByOptions());
@@ -342,38 +345,38 @@ class ListProduct extends AbstractProduct implements IdentityInterface
     /**
      * Get post parameters
      *
-     * @param \Magento\Catalog\Model\Product $product
+     * @param Product $product
      * @return string
      */
-    public function getAddToCartPostParams(\Magento\Catalog\Model\Product $product)
+    public function getAddToCartPostParams(Product $product)
     {
         $url = $this->getAddToCartUrl($product);
         return [
             'action' => $url,
             'data' => [
                 'product' => $product->getEntityId(),
-                \Magento\Framework\App\ActionInterface::PARAM_NAME_URL_ENCODED => $this->urlHelper->getEncodedUrl($url),
+                ActionInterface::PARAM_NAME_URL_ENCODED => $this->urlHelper->getEncodedUrl($url),
             ]
         ];
     }
 
     /**
-     * @param \Magento\Catalog\Model\Product $product
+     * @param Product $product
      * @return string
      */
-    public function getProductPrice(\Magento\Catalog\Model\Product $product)
+    public function getProductPrice(Product $product)
     {
         $priceRender = $this->getPriceRender();
 
         $price = '';
         if ($priceRender) {
             $price = $priceRender->render(
-                \Magento\Catalog\Pricing\Price\FinalPrice::PRICE_CODE,
+                FinalPrice::PRICE_CODE,
                 $product,
                 [
                     'include_container' => true,
                     'display_minimal_price' => true,
-                    'zone' => \Magento\Framework\Pricing\Render::ZONE_ITEM_LIST,
+                    'zone' => Render::ZONE_ITEM_LIST,
                     'list_category_page' => true
                 ]
             );
@@ -386,7 +389,7 @@ class ListProduct extends AbstractProduct implements IdentityInterface
      * Specifies that price rendering should be done for the list of products
      * i.e. rendering happens in the scope of product list, but not single product
      *
-     * @return \Magento\Framework\Pricing\Render
+     * @return Render
      */
     protected function getPriceRender()
     {
-- 
GitLab


From 4e937a39fa59a7cc0cefcd19691bc095accc1c9e Mon Sep 17 00:00:00 2001
From: Marius Grad <grad_marius@yahoo.com>
Date: Tue, 21 Nov 2017 09:57:30 +0200
Subject: [PATCH 140/380] use FQCN, revert doc parameter namespace

---
 app/code/Magento/Catalog/Block/Product/ListProduct.php | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/app/code/Magento/Catalog/Block/Product/ListProduct.php b/app/code/Magento/Catalog/Block/Product/ListProduct.php
index df91488cf5f..5c51429ce83 100644
--- a/app/code/Magento/Catalog/Block/Product/ListProduct.php
+++ b/app/code/Magento/Catalog/Block/Product/ListProduct.php
@@ -270,7 +270,7 @@ class ListProduct extends AbstractProduct implements IdentityInterface
     }
 
     /**
-     * @param array|string|integer|Element $code
+     * @param array|string|integer|\Magento\Framework\App\Config\Element $code
      * @return $this
      */
     public function addAttribute($code)
@@ -415,7 +415,7 @@ class ListProduct extends AbstractProduct implements IdentityInterface
     private function initializeProductCollection()
     {
         $layer = $this->getLayer();
-        /* @var $layer \Magento\Catalog\Model\Layer */
+        /* @var $layer Layer */
         if ($this->getShowRootCategory()) {
             $this->setCategoryId($this->_storeManager->getStore()->getRootCategoryId());
         }
-- 
GitLab


From c303e4dcbc0501a125e844d521d5fc57624b6b8b Mon Sep 17 00:00:00 2001
From: Marius Grad <grad_marius@yahoo.com>
Date: Tue, 21 Nov 2017 10:43:01 +0200
Subject: [PATCH 141/380] import Config class

---
 app/code/Magento/Catalog/Block/Product/ListProduct.php | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/app/code/Magento/Catalog/Block/Product/ListProduct.php b/app/code/Magento/Catalog/Block/Product/ListProduct.php
index 5c51429ce83..0d9a19ce6ae 100644
--- a/app/code/Magento/Catalog/Block/Product/ListProduct.php
+++ b/app/code/Magento/Catalog/Block/Product/ListProduct.php
@@ -9,6 +9,7 @@ namespace Magento\Catalog\Block\Product;
 use Magento\Catalog\Api\CategoryRepositoryInterface;
 use Magento\Catalog\Block\Product\ProductList\Toolbar;
 use Magento\Catalog\Model\Category;
+use Magento\Catalog\Model\Config;
 use Magento\Catalog\Model\Layer;
 use Magento\Catalog\Model\Layer\Resolver;
 use Magento\Catalog\Model\Product;
@@ -16,6 +17,7 @@ use Magento\Catalog\Model\ResourceModel\Product\Collection;
 use Magento\Catalog\Pricing\Price\FinalPrice;
 use Magento\Eav\Model\Entity\Collection\AbstractCollection;
 use Magento\Framework\App\ActionInterface;
+use Magento\Framework\App\Config\Element;
 use Magento\Framework\Data\Helper\PostHelper;
 use Magento\Framework\DataObject\IdentityInterface;
 use Magento\Framework\Exception\NoSuchEntityException;
@@ -270,7 +272,7 @@ class ListProduct extends AbstractProduct implements IdentityInterface
     }
 
     /**
-     * @param array|string|integer|\Magento\Framework\App\Config\Element $code
+     * @param array|string|integer| Element $code
      * @return $this
      */
     public function addAttribute($code)
-- 
GitLab


From 813ff0a2994f298952846a732ddd986747cdba3a Mon Sep 17 00:00:00 2001
From: Dmytro Voskoboinikov <dvoskoboinikov@magento.com>
Date: Tue, 21 Nov 2017 12:35:48 +0200
Subject: [PATCH 142/380] MAGETWO-77840: [2.2.x] - Special/lowest price in
 child of a Configurable Product causes the entire product to show that price

---
 .../view/base/templates/product/price/final_price.phtml         | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/app/code/Magento/ConfigurableProduct/view/base/templates/product/price/final_price.phtml b/app/code/Magento/ConfigurableProduct/view/base/templates/product/price/final_price.phtml
index df05fb22104..97238d0813b 100644
--- a/app/code/Magento/ConfigurableProduct/view/base/templates/product/price/final_price.phtml
+++ b/app/code/Magento/ConfigurableProduct/view/base/templates/product/price/final_price.phtml
@@ -30,7 +30,7 @@ $schema = ($block->getZone() == 'item_view') ? true : false;
             'schema' => $schema
         ];
 
-        /* @escapeNotVerified */ echo $block->renderAmount($finalPriceModel->getAmount(), $arguments);
+        /* @noEscape */ echo $block->renderAmount($finalPriceModel->getAmount(), $arguments);
     ?>
 </span>
 
-- 
GitLab


From 1053d6c0b43ae8453b14ad678de19d8f02e9b76d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Gonzalo=20M=C3=A9ndez=20Calzada?=
 <gonzalo.mendez@interactiv4.com>
Date: Tue, 21 Nov 2017 11:54:35 +0100
Subject: [PATCH 143/380] add static and api-funcional tests for swatches

---
 ...AttributeOptionManagementInterfaceTest.php | 85 +++++++++++++++++++
 .../Attribute/_files/swatch_attribute.php     | 48 +++++++++++
 .../Model/SwatchAttributeOptionAddTest.php    | 72 ++++++++++++++++
 3 files changed, 205 insertions(+)
 create mode 100644 dev/tests/api-functional/testsuite/Magento/Catalog/Api/ProductSwatchAttributeOptionManagementInterfaceTest.php
 create mode 100644 dev/tests/integration/testsuite/Magento/Catalog/Model/Product/Attribute/_files/swatch_attribute.php
 create mode 100644 dev/tests/integration/testsuite/Magento/Swatches/Model/SwatchAttributeOptionAddTest.php

diff --git a/dev/tests/api-functional/testsuite/Magento/Catalog/Api/ProductSwatchAttributeOptionManagementInterfaceTest.php b/dev/tests/api-functional/testsuite/Magento/Catalog/Api/ProductSwatchAttributeOptionManagementInterfaceTest.php
new file mode 100644
index 00000000000..11dc3c9484a
--- /dev/null
+++ b/dev/tests/api-functional/testsuite/Magento/Catalog/Api/ProductSwatchAttributeOptionManagementInterfaceTest.php
@@ -0,0 +1,85 @@
+<?php
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Catalog\Api;
+
+use Magento\Eav\Api\Data\AttributeOptionInterface;
+use Magento\Eav\Api\Data\AttributeOptionLabelInterface;
+use Magento\TestFramework\TestCase\WebapiAbstract;
+
+class ProductSwatchAttributeOptionManagementInterfaceTest extends WebapiAbstract
+{
+    const SERVICE_NAME = 'catalogProductAttributeOptionManagementV1';
+    const SERVICE_VERSION = 'V1';
+    const RESOURCE_PATH = '/V1/products/attributes';
+
+    /**
+     * @magentoApiDataFixture Magento/Catalog/Model/Product/Attribute/_files/swatch_attribute.php
+     * @dataProvider addDataProvider
+     */
+    public function testAdd($optionData)
+    {
+        $testAttributeCode = 'swatch_attribute';
+        $serviceInfo = [
+            'rest' => [
+                'resourcePath' => self::RESOURCE_PATH . '/' . $testAttributeCode . '/options',
+                'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_POST,
+            ],
+            'soap' => [
+                'service' => self::SERVICE_NAME,
+                'serviceVersion' => self::SERVICE_VERSION,
+                'operation' => self::SERVICE_NAME . 'add',
+            ],
+        ];
+
+        $response = $this->_webApiCall(
+            $serviceInfo,
+            [
+                'attributeCode' => $testAttributeCode,
+                'option' => $optionData,
+            ]
+        );
+
+        $this->assertTrue($response);
+        $updatedData = $this->getAttributeOptions($testAttributeCode);
+        $lastOption = array_pop($updatedData);
+        $this->assertEquals(
+            $optionData[AttributeOptionInterface::STORE_LABELS][0][AttributeOptionLabelInterface::LABEL],
+            $lastOption['label']
+        );
+    }
+
+    /**
+     * @return array
+     */
+    public function addDataProvider()
+    {
+        $optionPayload = [
+            AttributeOptionInterface::LABEL => 'new color',
+            AttributeOptionInterface::SORT_ORDER => 100,
+            AttributeOptionInterface::IS_DEFAULT => true,
+            AttributeOptionInterface::STORE_LABELS => [
+                [
+                    AttributeOptionLabelInterface::LABEL => 'DE label',
+                    AttributeOptionLabelInterface::STORE_ID => 1,
+                ],
+            ],
+            AttributeOptionInterface::VALUE => ''
+        ];
+
+        return [
+            'option_without_value_node' => [
+                $optionPayload
+            ],
+            'option_with_value_node_that_starts_with_text' => [
+                array_merge($optionPayload, [AttributeOptionInterface::VALUE => 'some_text'])
+            ],
+            'option_with_value_node_that_starts_with_a_number' => [
+                array_merge($optionPayload, [AttributeOptionInterface::VALUE => '123_some_text'])
+            ],
+
+        ];
+    }
+}
diff --git a/dev/tests/integration/testsuite/Magento/Catalog/Model/Product/Attribute/_files/swatch_attribute.php b/dev/tests/integration/testsuite/Magento/Catalog/Model/Product/Attribute/_files/swatch_attribute.php
new file mode 100644
index 00000000000..4e51d4e16ee
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Catalog/Model/Product/Attribute/_files/swatch_attribute.php
@@ -0,0 +1,48 @@
+<?php
+/**
+ * "dropdown" fixture of product EAV attribute.
+ *
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+/** @var \Magento\Eav\Model\Entity\Type $entityType */
+$entityType = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create(
+    \Magento\Eav\Model\Entity\Type::class
+);
+$entityType->loadByCode('catalog_product');
+$defaultSetId = $entityType->getDefaultAttributeSetId();
+/** @var \Magento\Eav\Model\Entity\Attribute\Set $defaultSet */
+$defaultSet = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create(
+    \Magento\Eav\Model\Entity\Attribute\Set::class
+);
+$defaultSet->load($defaultSetId);
+$defaultGroupId = $defaultSet->getDefaultGroupId();
+$optionData = ['value' => ['option_1' => [0 => 'Fixture Option']], 'order' => ['option_1' => 1]];
+
+/** @var $attribute \Magento\Catalog\Model\ResourceModel\Eav\Attribute */
+$attribute = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create(
+    \Magento\Catalog\Model\ResourceModel\Eav\Attribute::class
+);
+
+$attribute->setAttributeCode(
+    'swatch_attribute'
+)->setEntityTypeId(
+    $entityType->getEntityTypeId()
+)->setAttributeGroupId(
+    $defaultGroupId
+)->setAttributeSetId(
+    $defaultSetId
+)->setFrontendInput(
+    'media_image'
+)->setFrontendLabel(
+    'Swatch Attribute'
+)->setBackendType(
+    'varchar'
+)->setFrontendModel(
+    \Magento\Catalog\Model\Product\Attribute\Frontend\Image::class
+)->setIsUserDefined(
+    1
+)->setOption(
+    $optionData
+)->save();
diff --git a/dev/tests/integration/testsuite/Magento/Swatches/Model/SwatchAttributeOptionAddTest.php b/dev/tests/integration/testsuite/Magento/Swatches/Model/SwatchAttributeOptionAddTest.php
new file mode 100644
index 00000000000..4505cbd64c2
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Swatches/Model/SwatchAttributeOptionAddTest.php
@@ -0,0 +1,72 @@
+<?php
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Swatches\Model;
+
+use Magento\Catalog\Api\ProductAttributeOptionManagementInterface;
+use Magento\Eav\Api\Data\AttributeOptionInterface;
+use Magento\Eav\Api\Data\AttributeOptionInterfaceFactory;
+
+/**
+ * Test add option of swatch attribute
+ *
+ */
+class SwatchAttributeOptionAddTest extends \PHPUnit\Framework\TestCase
+{
+    /**
+     * @magentoAppArea adminhtml
+     * @magentoDbIsolation enabled
+     * @magentoDataFixture Magento/Swatches/_files/swatch_attribute.php
+     */
+    public function testSwatchOptionAdd()
+    {
+        $om = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
+
+        /** @var \Magento\Catalog\Api\Data\ProductAttributeInterface $attribute */
+        $attribute = $om
+            ->create(\Magento\Catalog\Model\ResourceModel\Eav\Attribute::class)
+            ->load('color_swatch', 'attribute_code');
+        $optionsPerAttribute = 3;
+
+        $data['options']['option'] = array_reduce(
+            range(10, $optionsPerAttribute),
+            function ($values, $index) use ($optionsPerAttribute) {
+                $values[] = [
+                    'label' => 'option ' . $index,
+                    'value' => 'option_' . $index
+                ];
+                return $values;
+            },
+            []
+        );
+
+        /** @var AttributeOptionInterface[] $options */
+        $options = [];
+        foreach ($data['options']['option'] as $optionData) {
+            $options[] = $om->get(AttributeOptionInterfaceFactory::class)->create(['data' => $optionData]);
+        }
+
+        /** @var ProductAttributeOptionManagementInterface $optionManagement */
+        $optionManagement = $om->get(ProductAttributeOptionManagementInterface::class);
+        foreach ($options as $option) {
+            $optionManagement->add(
+                $attribute->getAttributeCode(),
+                $option
+            );
+        }
+
+        $items = $optionManagement->getItems($attribute->getAttributeCode());
+        array_walk(
+            $items,
+            function (&$item) {
+                /** @var  AttributeOptionInterface $item */
+                $item = $item->getLabel();
+            }
+        );
+        foreach ($options as $option) {
+            $this->assertTrue(in_array($option->getLabel(), $items));
+        }
+    }
+}
-- 
GitLab


From bc727b159a4593e693e89dac7360f7da5c50962a Mon Sep 17 00:00:00 2001
From: Dmytro Vilchynskyi <dvilchynskyi@magento.com>
Date: Tue, 21 Nov 2017 13:26:34 +0200
Subject: [PATCH 144/380] MAGETWO-70725: Admin token does not expire after
 'Admin Token Lifetime (hours)'

- fix static tests
---
 .../Unit/Model/Authorization/TokenUserContextTest.php | 11 ++++++-----
 1 file changed, 6 insertions(+), 5 deletions(-)

diff --git a/app/code/Magento/Webapi/Test/Unit/Model/Authorization/TokenUserContextTest.php b/app/code/Magento/Webapi/Test/Unit/Model/Authorization/TokenUserContextTest.php
index f7ab848083d..3fca9847257 100644
--- a/app/code/Magento/Webapi/Test/Unit/Model/Authorization/TokenUserContextTest.php
+++ b/app/code/Magento/Webapi/Test/Unit/Model/Authorization/TokenUserContextTest.php
@@ -100,11 +100,12 @@ class TokenUserContextTest extends \PHPUnit\Framework\TestCase
 
         $this->dateTimeMock->expects($this->any())
             ->method('strToTime')
-            ->will($this->returnCallback(
-                function ($str) {
-                    return strtotime($str);
-                }
-            )
+            ->will(
+                $this->returnCallback(
+                    function ($str) {
+                        return strtotime($str);
+                    }
+                )
             );
 
         $this->tokenUserContext = $this->objectManager->getObject(
-- 
GitLab


From cd7dc5652b56b62713808233b0220cc7c8741078 Mon Sep 17 00:00:00 2001
From: Marius Grad <grad_marius@yahoo.com>
Date: Tue, 21 Nov 2017 13:33:44 +0200
Subject: [PATCH 145/380] revert type parameter on method
 prepareSortableFieldsByCategory

---
 app/code/Magento/Catalog/Block/Product/ListProduct.php | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/app/code/Magento/Catalog/Block/Product/ListProduct.php b/app/code/Magento/Catalog/Block/Product/ListProduct.php
index 0d9a19ce6ae..db592353da4 100644
--- a/app/code/Magento/Catalog/Block/Product/ListProduct.php
+++ b/app/code/Magento/Catalog/Block/Product/ListProduct.php
@@ -305,7 +305,7 @@ class ListProduct extends AbstractProduct implements IdentityInterface
      * @param Category $category
      * @return $this
      */
-    public function prepareSortableFieldsByCategory(Category $category)
+    public function prepareSortableFieldsByCategory($category)
     {
         if (!$this->getAvailableOrders()) {
             $this->setAvailableOrders($category->getAvailableSortByOptions());
-- 
GitLab


From 6fc27357f240786b1a3bb0319fb8438bc6a18f40 Mon Sep 17 00:00:00 2001
From: Dmytro Vilchynskyi <dvilchynskyi@magento.com>
Date: Tue, 21 Nov 2017 13:58:19 +0200
Subject: [PATCH 146/380] MAGETWO-70725: Admin token does not expire after
 'Admin Token Lifetime (hours)'

- fix static tests
---
 .../Model/Authorization/TokenUserContext.php  | 33 +++++----
 .../Authorization/TokenUserContextTest.php    | 73 +++++++++++--------
 2 files changed, 61 insertions(+), 45 deletions(-)

diff --git a/app/code/Magento/Webapi/Model/Authorization/TokenUserContext.php b/app/code/Magento/Webapi/Model/Authorization/TokenUserContext.php
index afa5889fe55..110191360ac 100644
--- a/app/code/Magento/Webapi/Model/Authorization/TokenUserContext.php
+++ b/app/code/Magento/Webapi/Model/Authorization/TokenUserContext.php
@@ -8,11 +8,13 @@ namespace Magento\Webapi\Model\Authorization;
 
 use Magento\Authorization\Model\UserContextInterface;
 use Magento\Framework\App\ObjectManager;
-use Magento\Framework\Oauth\Exception;
 use Magento\Integration\Model\Oauth\Token;
 use Magento\Integration\Model\Oauth\TokenFactory;
 use Magento\Integration\Api\IntegrationServiceInterface;
 use Magento\Framework\Webapi\Request;
+use Magento\Framework\Stdlib\DateTime\DateTime as Date;
+use Magento\Framework\Stdlib\DateTime;
+use Magento\Integration\Helper\Oauth\Data as OauthHelper;
 
 /**
  * A user context determined by tokens in a HTTP request Authorization header.
@@ -50,46 +52,50 @@ class TokenUserContext implements UserContextInterface
     protected $integrationService;
 
     /**
-     * @var \Magento\Framework\Stdlib\DateTime
+     * @var DateTime
      */
     private $dateTime;
 
     /**
-     * @var \Magento\Framework\Stdlib\DateTime\DateTime
+     * @var Date
      */
     private $date;
 
     /**
-     * @var \Magento\Integration\Helper\Oauth\Data
+     * @var OauthHelper
      */
     private $oauthHelper;
 
     /**
      * Initialize dependencies.
      *
+     * TokenUserContext constructor.
      * @param Request $request
      * @param TokenFactory $tokenFactory
      * @param IntegrationServiceInterface $integrationService
+     * @param DateTime|null $dateTime
+     * @param Date|null $date
+     * @param OauthHelper|null $oauthHelper
      */
     public function __construct(
         Request $request,
         TokenFactory $tokenFactory,
         IntegrationServiceInterface $integrationService,
-        \Magento\Framework\Stdlib\DateTime $dateTime = null,
-        \Magento\Framework\Stdlib\DateTime\DateTime $date = null,
-        \Magento\Integration\Helper\Oauth\Data $oauthHelper = null
+        DateTime $dateTime = null,
+        Date $date = null,
+        OauthHelper $oauthHelper = null
     ) {
         $this->request = $request;
         $this->tokenFactory = $tokenFactory;
         $this->integrationService = $integrationService;
         $this->dateTime = $dateTime ?: ObjectManager::getInstance()->get(
-            \Magento\Framework\Stdlib\DateTime::class
+            DateTime::class
         );
         $this->date = $date ?: ObjectManager::getInstance()->get(
-            \Magento\Framework\Stdlib\DateTime\DateTime::class
+            Date::class
         );
         $this->oauthHelper = $oauthHelper ?: ObjectManager::getInstance()->get(
-            \Magento\Integration\Helper\Oauth\Data::class
+            OauthHelper::class
         );
     }
 
@@ -115,14 +121,13 @@ class TokenUserContext implements UserContextInterface
      * Check if token is expired.
      *
      * @param Token $token
-     *
      * @return bool
      */
-    private function isTokenExpired(Token $token)
+    private function isTokenExpired(Token $token): bool
     {
-        if ($token->getUserType() == \Magento\Authorization\Model\UserContextInterface::USER_TYPE_ADMIN) {
+        if ($token->getUserType() == UserContextInterface::USER_TYPE_ADMIN) {
             $tokenTtl = $this->oauthHelper->getAdminTokenLifetime();
-        } elseif ($token->getUserType() == \Magento\Authorization\Model\UserContextInterface::USER_TYPE_CUSTOMER) {
+        } elseif ($token->getUserType() == UserContextInterface::USER_TYPE_CUSTOMER) {
             $tokenTtl = $this->oauthHelper->getCustomerTokenLifetime();
         } else {
             // other user-type tokens are considered always valid
diff --git a/app/code/Magento/Webapi/Test/Unit/Model/Authorization/TokenUserContextTest.php b/app/code/Magento/Webapi/Test/Unit/Model/Authorization/TokenUserContextTest.php
index 3fca9847257..c7272e3e5a2 100644
--- a/app/code/Magento/Webapi/Test/Unit/Model/Authorization/TokenUserContextTest.php
+++ b/app/code/Magento/Webapi/Test/Unit/Model/Authorization/TokenUserContextTest.php
@@ -6,68 +6,78 @@
 
 namespace Magento\Webapi\Test\Unit\Model\Authorization;
 
+use Magento\Webapi\Model\Authorization\TokenUserContext;
+use Magento\Framework\TestFramework\Unit\Helper\ObjectManager;
 use Magento\Authorization\Model\UserContextInterface;
+use Magento\Integration\Model\Oauth\TokenFactory;
+use Magento\Integration\Model\Oauth\Token;
+use Magento\Integration\Api\IntegrationServiceInterface;
+use Magento\Framework\Webapi\Request;
+use Magento\Integration\Helper\Oauth\Data as OauthHelper;
+use Magento\Framework\Stdlib\DateTime\DateTime as Date;
+use Magento\Framework\Stdlib\DateTime;
+use Magento\Integration\Model\Integration;
 
 /**
- * Tests \Magento\Webapi\Model\Authorization\TokenUserContext
+ * Tests TokenUserContext
  */
 class TokenUserContextTest extends \PHPUnit\Framework\TestCase
 {
     /**
-     * @var \Magento\Framework\TestFramework\Unit\Helper\ObjectManager
+     * @var ObjectManager
      */
     protected $objectManager;
 
     /**
-     * @var \Magento\Webapi\Model\Authorization\TokenUserContext
+     * @var TokenUserContext
      */
     protected $tokenUserContext;
 
     /**
-     * @var \Magento\Integration\Model\Oauth\TokenFactory|\PHPUnit_Framework_MockObject_MockObject
+     * @var TokenFactory|\PHPUnit_Framework_MockObject_MockObject
      */
     protected $tokenFactory;
 
     /**
-     * @var \Magento\Integration\Api\IntegrationServiceInterface|\PHPUnit_Framework_MockObject_MockObject
+     * @var IntegrationServiceInterface|\PHPUnit_Framework_MockObject_MockObject
      */
     protected $integrationService;
 
     /**
-     * @var \Magento\Framework\Webapi\Request|\PHPUnit_Framework_MockObject_MockObject
+     * @var Request|\PHPUnit_Framework_MockObject_MockObject
      */
     protected $request;
 
     /**
-     * @var \Magento\Integration\Helper\Oauth\Data|\PHPUnit_Framework_MockObject_MockObject
+     * @var OauthHelper|\PHPUnit_Framework_MockObject_MockObject
      */
     private $oauthHelperMock;
 
     /**
-     * @var \Magento\Framework\Stdlib\DateTime\DateTime|\PHPUnit_Framework_MockObject_MockObject
+     * @var Date|\PHPUnit_Framework_MockObject_MockObject
      */
     private $dateMock;
 
     /**
-     * @var \Magento\Framework\Stdlib\DateTime|\PHPUnit_Framework_MockObject_MockObject
+     * @var DateTime|\PHPUnit_Framework_MockObject_MockObject
      */
     private $dateTimeMock;
 
     protected function setUp()
     {
-        $this->objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
+        $this->objectManager = new ObjectManager($this);
 
-        $this->request = $this->getMockBuilder(\Magento\Framework\Webapi\Request::class)
+        $this->request = $this->getMockBuilder(Request::class)
             ->disableOriginalConstructor()
             ->setMethods(['getHeader'])
             ->getMock();
 
-        $this->tokenFactory = $this->getMockBuilder(\Magento\Integration\Model\Oauth\TokenFactory::class)
+        $this->tokenFactory = $this->getMockBuilder(TokenFactory::class)
             ->disableOriginalConstructor()
             ->setMethods(['create'])
             ->getMock();
 
-        $this->integrationService = $this->getMockBuilder(\Magento\Integration\Api\IntegrationServiceInterface::class)
+        $this->integrationService = $this->getMockBuilder(IntegrationServiceInterface::class)
             ->disableOriginalConstructor()
             ->setMethods(
                 [
@@ -83,17 +93,17 @@ class TokenUserContextTest extends \PHPUnit\Framework\TestCase
             )
             ->getMock();
 
-        $this->oauthHelperMock = $this->getMockBuilder(\Magento\Integration\Helper\Oauth\Data::class)
+        $this->oauthHelperMock = $this->getMockBuilder(OauthHelper::class)
             ->disableOriginalConstructor()
             ->setMethods(['getAdminTokenLifetime', 'getCustomerTokenLifetime'])
             ->getMock();
 
-        $this->dateMock = $this->getMockBuilder(\Magento\Framework\Stdlib\DateTime\DateTime::class)
+        $this->dateMock = $this->getMockBuilder(Date::class)
             ->disableOriginalConstructor()
             ->setMethods(['gmtTimestamp'])
             ->getMock();
 
-        $this->dateTimeMock = $this->getMockBuilder(\Magento\Framework\Stdlib\DateTime::class)
+        $this->dateTimeMock = $this->getMockBuilder(DateTime::class)
             ->disableOriginalConstructor()
             ->setMethods(['strToTime'])
             ->getMock();
@@ -109,7 +119,7 @@ class TokenUserContextTest extends \PHPUnit\Framework\TestCase
             );
 
         $this->tokenUserContext = $this->objectManager->getObject(
-            \Magento\Webapi\Model\Authorization\TokenUserContext::class,
+            TokenUserContext::class,
             [
                 'request' => $this->request,
                 'tokenFactory' => $this->tokenFactory,
@@ -160,7 +170,7 @@ class TokenUserContextTest extends \PHPUnit\Framework\TestCase
             ->with('Authorization')
             ->will($this->returnValue("Bearer {$bearerToken}"));
 
-        $token = $this->getMockBuilder(\Magento\Integration\Model\Oauth\Token::class)
+        $token = $this->getMockBuilder(Token::class)
             ->disableOriginalConstructor()
             ->setMethods(['loadByToken', 'getId', '__wakeup'])
             ->getMock();
@@ -188,7 +198,7 @@ class TokenUserContextTest extends \PHPUnit\Framework\TestCase
             ->with('Authorization')
             ->will($this->returnValue("Bearer {$bearerToken}"));
 
-        $token = $this->getMockBuilder(\Magento\Integration\Model\Oauth\Token::class)
+        $token = $this->getMockBuilder(Token::class)
             ->disableOriginalConstructor()
             ->setMethods(['loadByToken', 'getId', 'getRevoked', '__wakeup'])
             ->getMock();
@@ -222,7 +232,7 @@ class TokenUserContextTest extends \PHPUnit\Framework\TestCase
             ->with('Authorization')
             ->will($this->returnValue("Bearer {$bearerToken}"));
 
-        $token = $this->getMockBuilder(\Magento\Integration\Model\Oauth\Token::class)
+        $token = $this->getMockBuilder(Token::class)
             ->disableOriginalConstructor()
             ->setMethods(
                 [
@@ -255,7 +265,7 @@ class TokenUserContextTest extends \PHPUnit\Framework\TestCase
 
         switch ($userType) {
             case UserContextInterface::USER_TYPE_INTEGRATION:
-                $integration = $this->getMockBuilder(\Magento\Integration\Model\Integration::class)
+                $integration = $this->getMockBuilder(Integration::class)
                     ->disableOriginalConstructor()
                     ->setMethods(['getId', '__wakeup'])
                     ->getMock();
@@ -333,7 +343,7 @@ class TokenUserContextTest extends \PHPUnit\Framework\TestCase
             ->with('Authorization')
             ->will($this->returnValue("Bearer {$bearerToken}"));
 
-        $token = $this->getMockBuilder(\Magento\Integration\Model\Oauth\Token::class)
+        $token = $this->getMockBuilder(Token::class)
             ->disableOriginalConstructor()
             ->setMethods(
                 [
@@ -378,7 +388,7 @@ class TokenUserContextTest extends \PHPUnit\Framework\TestCase
 
         switch ($tokenData['user_type']) {
             case UserContextInterface::USER_TYPE_INTEGRATION:
-                $integration = $this->getMockBuilder(\Magento\Integration\Model\Integration::class)
+                $integration = $this->getMockBuilder(Integration::class)
                     ->disableOriginalConstructor()
                     ->setMethods(['getId', '__wakeup'])
                     ->getMock();
@@ -411,7 +421,8 @@ class TokenUserContextTest extends \PHPUnit\Framework\TestCase
     }
 
     /**
-     * Data provider for expired token test
+     * Data provider for expired token test.
+     *
      * @return array
      */
     public function getExpiredTestTokenData()
@@ -426,7 +437,7 @@ class TokenUserContextTest extends \PHPUnit\Framework\TestCase
                 ],
                 'tokenTtl' => 1,
                 'currentTime' => $time,
-                'expedtedUserType' => null,
+                'expectedUserType' => null,
                 'expectedUserId' => null,
             ],
             'token_vigent_admin' => [
@@ -437,7 +448,7 @@ class TokenUserContextTest extends \PHPUnit\Framework\TestCase
                 ],
                 'tokenTtl' => 1,
                 'currentTime' => $time,
-                'expedtedUserType' => UserContextInterface::USER_TYPE_ADMIN,
+                'expectedUserType' => UserContextInterface::USER_TYPE_ADMIN,
                 'expectedUserId' => 1234,
             ],
             'token_expired_customer' => [
@@ -448,7 +459,7 @@ class TokenUserContextTest extends \PHPUnit\Framework\TestCase
                 ],
                 'tokenTtl' => 1,
                 'currentTime' => $time,
-                'expedtedUserType' => null,
+                'expectedUserType' => null,
                 'expectedUserId' => null,
             ],
             'token_vigent_customer' => [
@@ -459,7 +470,7 @@ class TokenUserContextTest extends \PHPUnit\Framework\TestCase
                 ],
                 'tokenTtl' => 1,
                 'currentTime' => $time,
-                'expedtedUserType' => UserContextInterface::USER_TYPE_CUSTOMER,
+                'expectedUserType' => UserContextInterface::USER_TYPE_CUSTOMER,
                 'expectedUserId' => 1234,
             ],
             'token_expired_integration' => [
@@ -481,7 +492,7 @@ class TokenUserContextTest extends \PHPUnit\Framework\TestCase
                 ],
                 'tokenTtl' => 1,
                 'currentTime' => $time,
-                'expedtedUserType' => UserContextInterface::USER_TYPE_INTEGRATION,
+                'expectedUserType' => UserContextInterface::USER_TYPE_INTEGRATION,
                 'expectedUserId' => 1234,
             ],
             'token_expired_guest' => [
@@ -492,7 +503,7 @@ class TokenUserContextTest extends \PHPUnit\Framework\TestCase
                 ],
                 'tokenTtl' => 1,
                 'currentTime' => $time,
-                'expedtedUserType' => null,
+                'expectedUserType' => null,
                 'expectedUserId' => null,
             ],
             'token_vigent_guest' => [
@@ -503,7 +514,7 @@ class TokenUserContextTest extends \PHPUnit\Framework\TestCase
                 ],
                 'tokenTtl' => 1,
                 'currentTime' => $time,
-                'expedtedUserType' => null,
+                'expectedUserType' => null,
                 'expectedUserId' => null,
             ],
         ];
-- 
GitLab


From 0031a1c56b5277149e3cdc567251c19dbcf8df12 Mon Sep 17 00:00:00 2001
From: Javier Villanueva <javier@medialounge.co.uk>
Date: Wed, 18 Oct 2017 14:36:49 +0100
Subject: [PATCH 147/380] Fix depends field not working for radio elements

Fixes #9360
---
 lib/web/mage/adminhtml/form.js | 30 ++++++++++++++++++++++++++----
 1 file changed, 26 insertions(+), 4 deletions(-)

diff --git a/lib/web/mage/adminhtml/form.js b/lib/web/mage/adminhtml/form.js
index 0053dce8207..2bd3ef86e8f 100644
--- a/lib/web/mage/adminhtml/form.js
+++ b/lib/web/mage/adminhtml/form.js
@@ -386,7 +386,7 @@ define([
          * @param {Object} config
          */
         initialize: function (elementsMap, config) {
-            var idTo, idFrom;
+            var idTo, idFrom, values, fromId, radioFrom;
 
             if (config) {
                 this._config = config;
@@ -400,10 +400,21 @@ define([
                             'change',
                             this.trackChange.bindAsEventListener(this, idTo, elementsMap[idTo])
                         );
-                        this.trackChange(null, idTo, elementsMap[idTo]);
                     } else {
-                        this.trackChange(null, idTo, elementsMap[idTo]);
+                        // Check if radio button
+                        values = elementsMap[idTo][idFrom].values;
+                        fromId = $(idFrom + values[0]);
+                        radioFrom = fromId ? $$('[name="' + fromId.name + '"]') : false;
+
+                        if (radioFrom) {
+                            radioFrom.invoke(
+                                'on',
+                                'change',
+                                this.trackChange.bindAsEventListener(this, idTo, elementsMap[idTo])
+                            );
+                        }
                     }
+                    this.trackChange(null, idTo, elementsMap[idTo]);
                 }
             }
         },
@@ -428,7 +439,7 @@ define([
             // define whether the target should show up
             var shouldShowUp = true,
                 idFrom, from, values, isInArray, isNegative, headElement, isInheritCheckboxChecked, target, inputs,
-                isAnInputOrSelect, currentConfig,rowElement;
+                isAnInputOrSelect, currentConfig, rowElement, fromId, radioFrom;
 
             for (idFrom in valuesFrom) { //eslint-disable-line guard-for-in
                 from = $(idFrom);
@@ -441,6 +452,17 @@ define([
                     if (!from || isInArray && isNegative || !isInArray && !isNegative) {
                         shouldShowUp = false;
                     }
+                // Check if radio button
+                } else {
+                    values = valuesFrom[idFrom].values;
+                    fromId = $(idFrom + values[0]);
+                    radioFrom = fromId ? $$('[name="' + fromId.name + '"]:checked') : [];
+                    isInArray = radioFrom.length > 0 && values.indexOf(radioFrom[0].value) !== -1;
+                    isNegative = valuesFrom[idFrom].negative;
+
+                    if (!radioFrom || isInArray && isNegative || !isInArray && !isNegative) {
+                        shouldShowUp = false;
+                    }
                 }
             }
 
-- 
GitLab


From ae6839a42cf8e011b4f96db8df53093ac0f8d18a Mon Sep 17 00:00:00 2001
From: Oleksii Korshenko <okorshenko@magento.com>
Date: Tue, 21 Nov 2017 17:08:01 -0600
Subject: [PATCH 148/380] MAGETWO-84267: #11528 can't save customizable options
 #12048

 - fixed code style
---
 .../Product/Form/Modifier/AdvancedPricing.php            | 9 ++++++---
 1 file changed, 6 insertions(+), 3 deletions(-)

diff --git a/app/code/Magento/Catalog/Ui/DataProvider/Product/Form/Modifier/AdvancedPricing.php b/app/code/Magento/Catalog/Ui/DataProvider/Product/Form/Modifier/AdvancedPricing.php
index d66c8db01b4..c8ee83ee36f 100644
--- a/app/code/Magento/Catalog/Ui/DataProvider/Product/Form/Modifier/AdvancedPricing.php
+++ b/app/code/Magento/Catalog/Ui/DataProvider/Product/Form/Modifier/AdvancedPricing.php
@@ -396,7 +396,8 @@ class AdvancedPricing extends AbstractModifier
                 'additionalForGroup' => true,
                 'provider' => false,
                 'source' => 'product_details',
-                'sortOrder' => $this->arrayManager->get($pricePath . '/arguments/data/config/sortOrder', $this->meta) + 1,
+                'sortOrder' =>
+                    $this->arrayManager->get($pricePath . '/arguments/data/config/sortOrder', $this->meta) + 1,
             ];
 
             $this->meta = $this->arrayManager->set(
@@ -433,7 +434,8 @@ class AdvancedPricing extends AbstractModifier
                         ],
                         'disabled' => false,
                         'required' => false,
-                        'sortOrder' => $this->arrayManager->get($tierPricePath . '/arguments/data/config/sortOrder', $this->meta),
+                        'sortOrder' =>
+                            $this->arrayManager->get($tierPricePath . '/arguments/data/config/sortOrder', $this->meta),
                     ],
                 ],
             ],
@@ -567,7 +569,8 @@ class AdvancedPricing extends AbstractModifier
                     'additionalClasses' => 'admin__control-grouped-date',
                     'breakLine' => false,
                     'component' => 'Magento_Ui/js/form/components/group',
-                    'scopeLabel' => $this->arrayManager->get($pathFrom . '/arguments/data/config/scopeLabel', $this->meta),
+                    'scopeLabel' =>
+                        $this->arrayManager->get($pathFrom . '/arguments/data/config/scopeLabel', $this->meta),
                 ]
             );
             $this->meta = $this->arrayManager->merge(
-- 
GitLab


From ff734598c86942dd98f55bbd9e0a30b361da26e6 Mon Sep 17 00:00:00 2001
From: Rhodri Davies <rhodri.davies@temando.com>
Date: Wed, 22 Nov 2017 11:04:37 +1100
Subject: [PATCH 149/380] CAPTCHA LABEL : Update the captcha labels and help
 text to refer to the contents of the captcha image

---
 app/code/Magento/Captcha/i18n/en_US.csv                       | 4 ++--
 .../Magento/Captcha/view/adminhtml/templates/default.phtml    | 2 +-
 .../Magento/Captcha/view/frontend/templates/default.phtml     | 4 ++--
 .../Captcha/view/frontend/web/template/checkout/captcha.html  | 4 ++--
 4 files changed, 7 insertions(+), 7 deletions(-)

diff --git a/app/code/Magento/Captcha/i18n/en_US.csv b/app/code/Magento/Captcha/i18n/en_US.csv
index 2de4ab5345c..3c56d3f0d39 100644
--- a/app/code/Magento/Captcha/i18n/en_US.csv
+++ b/app/code/Magento/Captcha/i18n/en_US.csv
@@ -4,10 +4,10 @@ Always,Always
 "Incorrect CAPTCHA","Incorrect CAPTCHA"
 "Incorrect CAPTCHA.","Incorrect CAPTCHA."
 "The account is locked. Please wait and try again or contact %1.","The account is locked. Please wait and try again or contact %1."
-"Please enter the letters from the image","Please enter the letters from the image"
+"Please enter the letters and numbers from the image","Please enter the letters and numbers from the image"
 "<strong>Attention</strong>: Captcha is case sensitive.","<strong>Attention</strong>: Captcha is case sensitive."
 "Reload captcha","Reload captcha"
-"Please type the letters below","Please type the letters below"
+"Please type the letters and numbers below","Please type the letters and numbers below"
 "Attention: Captcha is case sensitive.","Attention: Captcha is case sensitive."
 CAPTCHA,CAPTCHA
 "Enable CAPTCHA in Admin","Enable CAPTCHA in Admin"
diff --git a/app/code/Magento/Captcha/view/adminhtml/templates/default.phtml b/app/code/Magento/Captcha/view/adminhtml/templates/default.phtml
index b8dcd6c654c..1be4bd19cd4 100644
--- a/app/code/Magento/Captcha/view/adminhtml/templates/default.phtml
+++ b/app/code/Magento/Captcha/view/adminhtml/templates/default.phtml
@@ -13,7 +13,7 @@ $captcha = $block->getCaptchaModel();
 ?>
 <div class="admin__field _required">
     <label for="captcha" class="admin__field-label">
-        <span><?= $block->escapeHtml(__('Please enter the letters from the image')) ?></span>
+        <span><?= $block->escapeHtml(__('Please enter the letters and numbers from the image')) ?></span>
     </label>
     <div class="admin__field-control">
         <input
diff --git a/app/code/Magento/Captcha/view/frontend/templates/default.phtml b/app/code/Magento/Captcha/view/frontend/templates/default.phtml
index 9851b1cd8bd..980a78ff0f7 100644
--- a/app/code/Magento/Captcha/view/frontend/templates/default.phtml
+++ b/app/code/Magento/Captcha/view/frontend/templates/default.phtml
@@ -12,7 +12,7 @@
 $captcha = $block->getCaptchaModel();
 ?>
 <div class="field captcha required" role="<?= $block->escapeHtmlAttr($block->getFormId()) ?>">
-    <label for="captcha_<?= $block->escapeHtmlAttr($block->getFormId()) ?>" class="label"><span><?= $block->escapeHtml(__('Please type the letters below')) ?></span></label>
+    <label for="captcha_<?= $block->escapeHtmlAttr($block->getFormId()) ?>" class="label"><span><?= $block->escapeHtml(__('Please type the letters and numbers below')) ?></span></label>
     <div class="control captcha">
         <input name="<?= $block->escapeHtmlAttr(\Magento\Captcha\Helper\Data::INPUT_NAME_FIELD_VALUE) ?>[<?= $block->escapeHtmlAttr($block->getFormId()) ?>]" type="text" class="input-text required-entry" data-validate="{required:true}" id="captcha_<?= $block->escapeHtmlAttr($block->getFormId()) ?>" />
         <div class="nested">
@@ -23,7 +23,7 @@ $captcha = $block->getCaptchaModel();
                                             "imageLoader": "<?= $block->escapeUrl($block->getViewFileUrl('images/loader-2.gif')) ?>",
                                              "type": "<?= $block->escapeHtmlAttr($block->getFormId()) ?>"}}'>
                 <div class="control captcha-image">
-                    <img alt="<?= $block->escapeHtmlAttr(__('Please type the letters below')) ?>" class="captcha-img" height="<?= /* @noEscape */ (float) $block->getImgHeight() ?>" src="<?= $block->escapeUrl($captcha->getImgSrc()) ?>"/>
+                    <img alt="<?= $block->escapeHtmlAttr(__('Please type the letters and numbers below')) ?>" class="captcha-img" height="<?= /* @noEscape */ (float) $block->getImgHeight() ?>" src="<?= $block->escapeUrl($captcha->getImgSrc()) ?>"/>
                     <button type="button" class="action reload captcha-reload" title="<?= $block->escapeHtmlAttr(__('Reload captcha')) ?>"><span><?= $block->escapeHtml(__('Reload captcha')) ?></span></button>
                 </div>
             </div>
diff --git a/app/code/Magento/Captcha/view/frontend/web/template/checkout/captcha.html b/app/code/Magento/Captcha/view/frontend/web/template/checkout/captcha.html
index 6767a121d84..1e2f595a008 100644
--- a/app/code/Magento/Captcha/view/frontend/web/template/checkout/captcha.html
+++ b/app/code/Magento/Captcha/view/frontend/web/template/checkout/captcha.html
@@ -6,7 +6,7 @@
 -->
 <!-- ko if: (isRequired() && getIsVisible())-->
 <div class="field captcha required" data-bind="blockLoader: getIsLoading()">
-    <label data-bind="attr: {for: 'captcha_' + formId}" class="label"><span data-bind="i18n: 'Please type the letters below'"></span></label>
+    <label data-bind="attr: {for: 'captcha_' + formId}" class="label"><span data-bind="i18n: 'Please type the letters and numbers below'"></span></label>
     <div class="control captcha">
         <input name="captcha_string" type="text" class="input-text required-entry" data-bind="value: captchaValue(), attr: {id: 'captcha_' + formId, 'data-scope': dataScope}" />
         <input name="captcha_form_id" type="hidden" data-bind="value: formId,  attr: {'data-scope': dataScope}" />
@@ -14,7 +14,7 @@
             <div class="field captcha no-label">
                 <div class="control captcha-image">
                     <img data-bind="attr: {
-                                        alt: $t('Please type the letters below'),
+                                        alt: $t('Please type the letters and numbers below'),
                                         height: imageHeight(),
                                         src: getImageSource(),
                                         }"
-- 
GitLab


From 9165dd9e16235c723283a2beddd905049c23c818 Mon Sep 17 00:00:00 2001
From: Oleksii Korshenko <okorshenko@magento.com>
Date: Tue, 21 Nov 2017 18:41:13 -0600
Subject: [PATCH 150/380] MAGETWO-84272: Update AbstractBackend.php #12120

 - fixed failed tests
---
 .../Eav/Model/Entity/Attribute/Backend/AbstractBackend.php   | 5 +++--
 .../testsuite/Magento/Customer/Api/AccountManagementTest.php | 4 ++--
 .../Magento/Catalog/Controller/Adminhtml/CategoryTest.php    | 2 +-
 3 files changed, 6 insertions(+), 5 deletions(-)

diff --git a/app/code/Magento/Eav/Model/Entity/Attribute/Backend/AbstractBackend.php b/app/code/Magento/Eav/Model/Entity/Attribute/Backend/AbstractBackend.php
index 206bff163f2..38e7b883f4e 100644
--- a/app/code/Magento/Eav/Model/Entity/Attribute/Backend/AbstractBackend.php
+++ b/app/code/Magento/Eav/Model/Entity/Attribute/Backend/AbstractBackend.php
@@ -231,13 +231,13 @@ abstract class AbstractBackend implements \Magento\Eav\Model\Entity\Attribute\Ba
         $attribute = $this->getAttribute();
         $attrCode = $attribute->getAttributeCode();
         $value = $object->getData($attrCode);
-        $label = $attribute->getFrontend()->getLabel();
 
         if ($attribute->getIsVisible()
             && $attribute->getIsRequired()
             && $attribute->isValueEmpty($value)
             && $attribute->isValueEmpty($attribute->getDefaultValue())
         ) {
+            $label = $attribute->getFrontend()->getLabel();
             throw new LocalizedException(__('The value of attribute "%1" must be set', $label));
         }
 
@@ -249,7 +249,8 @@ abstract class AbstractBackend implements \Magento\Eav\Model\Entity\Attribute\Ba
         }
 
         if ($attribute->getIsUnique()) {
-            if (!$attribute->getEntity()->checkAttributeUniqueValue($attribute, $object)) {               
+            if (!$attribute->getEntity()->checkAttributeUniqueValue($attribute, $object)) {
+                $label = $attribute->getFrontend()->getLabel();
                 throw new LocalizedException(__('The value of attribute "%1" must be unique', $label));
             }
         }
diff --git a/dev/tests/api-functional/testsuite/Magento/Customer/Api/AccountManagementTest.php b/dev/tests/api-functional/testsuite/Magento/Customer/Api/AccountManagementTest.php
index dec9711cda7..48cc8b8384d 100644
--- a/dev/tests/api-functional/testsuite/Magento/Customer/Api/AccountManagementTest.php
+++ b/dev/tests/api-functional/testsuite/Magento/Customer/Api/AccountManagementTest.php
@@ -579,8 +579,8 @@ class AccountManagementTest extends WebapiAbstract
         $validationResponse = $this->_webApiCall($serviceInfo, $requestData);
         $this->assertFalse($validationResponse['valid']);
 
-        $this->assertEquals('The value of attribute "firstname" must be set', $validationResponse['messages'][0]);
-        $this->assertEquals('The value of attribute "lastname" must be set', $validationResponse['messages'][1]);
+        $this->assertEquals('The value of attribute "First Name" must be set', $validationResponse['messages'][0]);
+        $this->assertEquals('The value of attribute "Last Name" must be set', $validationResponse['messages'][1]);
     }
 
     public function testIsReadonly()
diff --git a/dev/tests/integration/testsuite/Magento/Catalog/Controller/Adminhtml/CategoryTest.php b/dev/tests/integration/testsuite/Magento/Catalog/Controller/Adminhtml/CategoryTest.php
index fd7e23e507c..bfc7e33d5f7 100644
--- a/dev/tests/integration/testsuite/Magento/Catalog/Controller/Adminhtml/CategoryTest.php
+++ b/dev/tests/integration/testsuite/Magento/Catalog/Controller/Adminhtml/CategoryTest.php
@@ -339,7 +339,7 @@ class CategoryTest extends \Magento\TestFramework\TestCase\AbstractBackendContro
         );
         $this->dispatch('backend/catalog/category/save');
         $this->assertSessionMessages(
-            $this->equalTo(['The value of attribute "name" must be set']),
+            $this->equalTo(['The value of attribute "Name" must be set']),
             \Magento\Framework\Message\MessageInterface::TYPE_ERROR
         );
     }
-- 
GitLab


From 97d449ce3b90a18a6292c2c739cb325519769985 Mon Sep 17 00:00:00 2001
From: RomanKis <romaikiss@gmail.com>
Date: Wed, 22 Nov 2017 11:22:57 +0200
Subject: [PATCH 151/380] 9515: South Korea Zip Code Validation incorrect

---
 app/code/Magento/Directory/etc/zip_codes.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/app/code/Magento/Directory/etc/zip_codes.xml b/app/code/Magento/Directory/etc/zip_codes.xml
index d70dee8abc1..22908933711 100644
--- a/app/code/Magento/Directory/etc/zip_codes.xml
+++ b/app/code/Magento/Directory/etc/zip_codes.xml
@@ -226,7 +226,7 @@
     </zip>
     <zip countryCode="KR">
         <codes>
-            <code id="pattern_1" active="true" example="123-456">^[0-9]{3}-[0-9]{3}$</code>
+            <code id="pattern_1" active="true" example="12345">^[0-9]{5}$</code>
         </codes>
     </zip>
     <zip countryCode="KG">
-- 
GitLab


From 1f7618a7e71233acbc0d93e0159c93da74766645 Mon Sep 17 00:00:00 2001
From: magento-engcom-team <mikola.malevanec@transoftgroup.com>
Date: Wed, 22 Nov 2017 12:50:38 +0200
Subject: [PATCH 152/380] 11882: It's not possible to enable "log to file"
 (debugging) in production mode. Psr logger debug method does not work by the
 default in developer mode.

---
 app/code/Magento/Deploy/etc/di.xml | 10 +++++++++-
 1 file changed, 9 insertions(+), 1 deletion(-)

diff --git a/app/code/Magento/Deploy/etc/di.xml b/app/code/Magento/Deploy/etc/di.xml
index e59ad7e39fc..5f031842536 100644
--- a/app/code/Magento/Deploy/etc/di.xml
+++ b/app/code/Magento/Deploy/etc/di.xml
@@ -80,6 +80,8 @@
                             <item name="lock" xsi:type="boolean">false</item>
                         </item>
                     </item>
+                </item>
+                <item name="production" xsi:type="array">
                     <item name="developer" xsi:type="array">
                         <item name="dev/debug/debug_logging" xsi:type="array">
                             <item name="value" xsi:type="string">1</item>
@@ -87,7 +89,13 @@
                         </item>
                     </item>
                 </item>
-                <item name="production" xsi:type="array">
+                <item name="default" xsi:type="array">
+                    <item name="production" xsi:type="array">
+                        <item name="dev/debug/debug_logging" xsi:type="array">
+                            <item name="value" xsi:type="string">0</item>
+                            <item name="lock" xsi:type="boolean">false</item>
+                        </item>
+                    </item>
                     <item name="developer" xsi:type="array">
                         <item name="dev/debug/debug_logging" xsi:type="array">
                             <item name="value" xsi:type="string">1</item>
-- 
GitLab


From adf18dc485f8eeaea266cc79c28193d354e79399 Mon Sep 17 00:00:00 2001
From: RomanKis <romaikiss@gmail.com>
Date: Wed, 22 Nov 2017 13:36:08 +0200
Subject: [PATCH 153/380] 9468: REST API bundle-products/:sku/options/all
 always return is not authorized

---
 app/code/Magento/WebapiSecurity/etc/di.xml | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/app/code/Magento/WebapiSecurity/etc/di.xml b/app/code/Magento/WebapiSecurity/etc/di.xml
index 0ffdfd5574d..7065ec3f91b 100644
--- a/app/code/Magento/WebapiSecurity/etc/di.xml
+++ b/app/code/Magento/WebapiSecurity/etc/di.xml
@@ -41,6 +41,10 @@
                 <item name="/V1/configurable-products/:sku/children::GET" xsi:type="string"/>
                 <item name="/V1/configurable-products/:sku/options/:id::GET" xsi:type="string"/>
                 <item name="/V1/configurable-products/:sku/options/all::GET" xsi:type="string"/>
+                <item name="/V1/bundle-products/:productSku/children::GET" xsi:type="string"/>
+                <item name="/V1/bundle-products/:sku/options/all::GET" xsi:type="string"/>
+                <item name="/V1/bundle-products/options/types::GET" xsi:type="string"/>
+                <item name="/V1/bundle-products/:sku/options/:optionId::GET" xsi:type="string"/>
                 <item name="/V1/cmsPage/:pageId::GET" xsi:type="string"/>
                 <item name="/V1/cmsBlock/:blockId::GET" xsi:type="string"/>
                 <item name="/V1/store/storeViews::GET" xsi:type="string"/>
-- 
GitLab


From 5c3d29503b89d7b5f2623e33d1798c7c25dd6dcd Mon Sep 17 00:00:00 2001
From: RomanKis <romaikiss@gmail.com>
Date: Wed, 22 Nov 2017 18:10:32 +0200
Subject: [PATCH 154/380] 9515: South Korea Zip Code Validation incorrect

---
 .../Magento/Directory/Model/Country/Postcode/ValidatorTest.php  | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/dev/tests/integration/testsuite/Magento/Directory/Model/Country/Postcode/ValidatorTest.php b/dev/tests/integration/testsuite/Magento/Directory/Model/Country/Postcode/ValidatorTest.php
index 45a5473176e..cdc26079c4d 100644
--- a/dev/tests/integration/testsuite/Magento/Directory/Model/Country/Postcode/ValidatorTest.php
+++ b/dev/tests/integration/testsuite/Magento/Directory/Model/Country/Postcode/ValidatorTest.php
@@ -95,7 +95,7 @@ class ValidatorTest extends \PHPUnit\Framework\TestCase
             ['countryId' => 'JE', 'postcode' => 'TY8 9PL'],
             ['countryId' => 'KZ', 'postcode' => '123456'],
             ['countryId' => 'KE', 'postcode' => '12345'],
-            ['countryId' => 'KR', 'postcode' => '123-456'],
+            ['countryId' => 'KR', 'postcode' => '12345'],
             ['countryId' => 'KG', 'postcode' => '123456'],
             ['countryId' => 'LV', 'postcode' => '1234'],
             ['countryId' => 'LI', 'postcode' => '1234'],
-- 
GitLab


From cbd8b28f34f164f06764f74652f8b46314c7c8f9 Mon Sep 17 00:00:00 2001
From: magento-engcom-team <mikola.malevanec@transoftgroup.com>
Date: Thu, 23 Nov 2017 17:06:31 +0200
Subject: [PATCH 155/380] 8255: Export Products action doesn't consider
 hide_for_product_page value.

---
 .../Import/Product/MediaGalleryProcessor.php  | 164 ++++++++----------
 1 file changed, 73 insertions(+), 91 deletions(-)

diff --git a/app/code/Magento/CatalogImportExport/Model/Import/Product/MediaGalleryProcessor.php b/app/code/Magento/CatalogImportExport/Model/Import/Product/MediaGalleryProcessor.php
index bced070ae56..55d908f2190 100644
--- a/app/code/Magento/CatalogImportExport/Model/Import/Product/MediaGalleryProcessor.php
+++ b/app/code/Magento/CatalogImportExport/Model/Import/Product/MediaGalleryProcessor.php
@@ -109,42 +109,73 @@ class MediaGalleryProcessor
     public function saveMediaGallery(array $mediaGalleryData)
     {
         $this->initMediaGalleryResources();
+        $mediaGalleryDataGlobal = $this->processMediaGallery($mediaGalleryData);
         $imageNames = [];
         $multiInsertData = [];
         $valueToProductId = [];
-        $mediaGalleryData = $this->restoreDisableImage($mediaGalleryData);
-        foreach (array_keys($mediaGalleryData) as $storeId) {
-            foreach ($mediaGalleryData[$storeId] as $productSku => $mediaGalleryRows) {
-                $productId = $this->skuProcessor->getNewSku($productSku)[$this->getProductEntityLinkField()];
-
-                $insertedGalleryImgs = [];
-                foreach ($mediaGalleryRows as $insertValue) {
-                    if (!in_array($insertValue['value'], $insertedGalleryImgs)) {
-                        $valueArr = [
-                            'attribute_id' => $insertValue['attribute_id'],
-                            'value' => $insertValue['value'],
-                        ];
-                        $valueToProductId[$insertValue['value']][] = $productId;
-                        $imageNames[] = $insertValue['value'];
-                        $multiInsertData[] = $valueArr;
-                        $insertedGalleryImgs[] = $insertValue['value'];
-                    }
+        foreach ($mediaGalleryDataGlobal as $productSku => $mediaGalleryRows) {
+            $productId = $this->skuProcessor->getNewSku($productSku)[$this->getProductEntityLinkField()];
+            $insertedGalleryImgs = [];
+            foreach ($mediaGalleryRows as $insertValue) {
+                if (!in_array($insertValue['value'], $insertedGalleryImgs)) {
+                    $valueArr = [
+                        'attribute_id' => $insertValue['attribute_id'],
+                        'value' => $insertValue['value'],
+                    ];
+                    $valueToProductId[$insertValue['value']][] = $productId;
+                    $imageNames[] = $insertValue['value'];
+                    $multiInsertData[] = $valueArr;
+                    $insertedGalleryImgs[] = $insertValue['value'];
                 }
             }
         }
-        $multiInsertData = $this->filterImageInsertData($multiInsertData, $imageNames);
-        if ($multiInsertData) {
+        $oldMediaValues = $this->connection->fetchAssoc(
+            $this->connection->select()->from($this->mediaGalleryTableName, ['value_id', 'value'])
+                ->where('value IN (?)', $imageNames)
+        );
+        if (!empty($multiInsertData)) {
             $this->connection->insertOnDuplicate($this->mediaGalleryTableName, $multiInsertData);
         }
+        $multiInsertData = [];
         $newMediaSelect = $this->connection->select()->from($this->mediaGalleryTableName, ['value_id', 'value'])
             ->where('value IN (?)', $imageNames);
+        if (array_keys($oldMediaValues)) {
+            $newMediaSelect->where('value_id NOT IN (?)', array_keys($oldMediaValues));
+        }
 
+        $dataForSkinnyTable = [];
         $newMediaValues = $this->connection->fetchAssoc($newMediaSelect);
-        list($multiInsertData, $dataForSkinnyTable) = $this->prepareInsertData(
-            $mediaGalleryData,
-            $newMediaValues,
-            $valueToProductId
-        );
+        $this->restoreDisableImage($mediaGalleryData);
+        foreach ($mediaGalleryData as $storeId => $mediaGalleryDataPerStore) {
+            foreach ($mediaGalleryDataPerStore as $productSku => $mediaGalleryRows) {
+                foreach ($mediaGalleryRows as $insertValue) {
+                    foreach ($newMediaValues as $value_id => $values) {
+                        if ($values['value'] == $insertValue['value']) {
+                            $insertValue['value_id'] = $value_id;
+                            $insertValue[$this->getProductEntityLinkField()]
+                                = array_shift($valueToProductId[$values['value']]);
+                            unset($newMediaValues[$value_id]);
+                            break;
+                        }
+                    }
+                    if (isset($insertValue['value_id'])) {
+                        $valueArr = [
+                            'value_id' => $insertValue['value_id'],
+                            'store_id' => $storeId,
+                            $this->getProductEntityLinkField() => $insertValue[$this->getProductEntityLinkField()],
+                            'label' => $insertValue['label'],
+                            'position' => $insertValue['position'],
+                            'disabled' => $insertValue['disabled'],
+                        ];
+                        $multiInsertData[] = $valueArr;
+                        $dataForSkinnyTable[] = [
+                            'value_id' => $insertValue['value_id'],
+                            $this->getProductEntityLinkField() => $insertValue[$this->getProductEntityLinkField()],
+                        ];
+                    }
+                }
+            }
+        }
         try {
             $this->connection->insertOnDuplicate(
                 $this->mediaGalleryValueTableName,
@@ -279,30 +310,6 @@ class MediaGalleryProcessor
         }
     }
 
-    /**
-     * Remove existed images from insert data.
-     *
-     * @param array $multiInsertData
-     * @param array $imageNames
-     * @return array
-     */
-    private function filterImageInsertData(array $multiInsertData, array $imageNames)
-    {
-        $oldMediaValues = $this->connection->fetchAssoc(
-            $this->connection->select()->from($this->mediaGalleryTableName, ['value_id', 'value', 'attribute_id'])
-                ->where('value IN (?)', $imageNames)
-        );
-        foreach ($multiInsertData as $key => $data) {
-            foreach ($oldMediaValues as $mediaValue) {
-                if ($data['value'] === $mediaValue['value'] && $data['attribute_id'] === $mediaValue['attribute_id']) {
-                    unset($multiInsertData[$key]);
-                }
-            }
-        }
-
-        return $multiInsertData;
-    }
-
     /**
      * Set product images 'disable' = 0 for specified store.
      *
@@ -336,6 +343,24 @@ class MediaGalleryProcessor
         return $mediaGalleryData;
     }
 
+    /**
+     * Remove store specific information for inserting images.
+     *
+     * @param array $mediaGalleryData
+     * @return array
+     */
+    private function processMediaGallery(array $mediaGalleryData)
+    {
+        $mediaGalleryDataGlobal = array_merge(...$mediaGalleryData);
+        foreach ($mediaGalleryDataGlobal as $sku => $row) {
+            if (isset($mediaGalleryDataGlobal[$sku]['all']['restore'])) {
+                unset($mediaGalleryDataGlobal[$sku]);
+            }
+        }
+
+        return $mediaGalleryDataGlobal;
+    }
+
     /**
      * Get product entity link field.
      *
@@ -361,47 +386,4 @@ class MediaGalleryProcessor
 
         return $this->resourceModel;
     }
-
-    /**
-     * @param array $mediaGalleryData
-     * @param array $newMediaValues
-     * @param array $valueToProductId
-     * @return array
-     */
-    private function prepareInsertData(array $mediaGalleryData, array $newMediaValues, array $valueToProductId)
-    {
-        $dataForSkinnyTable = [];
-        $multiInsertData = [];
-        foreach (array_keys($mediaGalleryData) as $storeId) {
-            foreach ($mediaGalleryData[$storeId] as $mediaGalleryRows) {
-                foreach ($mediaGalleryRows as $insertValue) {
-                    foreach ($newMediaValues as $value_id => $values) {
-                        if ($values['value'] == $insertValue['value']) {
-                            $insertValue['value_id'] = $value_id;
-                            $insertValue[$this->getProductEntityLinkField()]
-                                = array_shift($valueToProductId[$values['value']]);
-                            break;
-                        }
-                    }
-                    if (isset($insertValue['value_id'])) {
-                        $valueArr = [
-                            'value_id' => $insertValue['value_id'],
-                            'store_id' => $storeId,
-                            $this->getProductEntityLinkField() => $insertValue[$this->getProductEntityLinkField()],
-                            'label' => $insertValue['label'],
-                            'position' => $insertValue['position'],
-                            'disabled' => $insertValue['disabled'],
-                        ];
-                        $multiInsertData[] = $valueArr;
-                        $dataForSkinnyTable[] = [
-                            'value_id' => $insertValue['value_id'],
-                            $this->getProductEntityLinkField() => $insertValue[$this->getProductEntityLinkField()],
-                        ];
-                    }
-                }
-            }
-        }
-
-        return [$multiInsertData, $dataForSkinnyTable];
-    }
 }
-- 
GitLab


From 5e6f1cb064ab1b0181d4cbe1f09addda25a5f3b6 Mon Sep 17 00:00:00 2001
From: Dmytro Vilchynskyi <dvilchynskyi@magento.com>
Date: Thu, 23 Nov 2017 18:07:47 +0200
Subject: [PATCH 156/380] MAGETWO-77840: [2.2.x] - Special/lowest price in
 child of a Configurable Product causes the entire product to show that price

- fixing FAT
---
 .../AssertCatalogPriceRuleAppliedProductPage.php          | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)

diff --git a/dev/tests/functional/tests/app/Magento/CatalogRule/Test/Constraint/AssertCatalogPriceRuleAppliedProductPage.php b/dev/tests/functional/tests/app/Magento/CatalogRule/Test/Constraint/AssertCatalogPriceRuleAppliedProductPage.php
index ce0f7a73006..b2cc7e1297e 100644
--- a/dev/tests/functional/tests/app/Magento/CatalogRule/Test/Constraint/AssertCatalogPriceRuleAppliedProductPage.php
+++ b/dev/tests/functional/tests/app/Magento/CatalogRule/Test/Constraint/AssertCatalogPriceRuleAppliedProductPage.php
@@ -11,6 +11,8 @@ use Magento\Customer\Test\Fixture\Customer;
 use Magento\Mtf\Constraint\AbstractConstraint;
 use Magento\Catalog\Test\Page\Product\CatalogProductView;
 use Magento\Catalog\Test\Page\Category\CatalogCategoryView;
+use Magento\Customer\Test\TestStep\LoginCustomerOnFrontendStep;
+use Magento\Customer\Test\TestStep\LogoutCustomerOnFrontendStep;
 
 /**
  * Assert that Catalog Price Rule is applied on Product page.
@@ -38,11 +40,11 @@ class AssertCatalogPriceRuleAppliedProductPage extends AbstractConstraint
     ) {
         if ($customer !== null) {
             $this->objectManager->create(
-                \Magento\Customer\Test\TestStep\LoginCustomerOnFrontendStep::class,
+                LoginCustomerOnFrontendStep::class,
                 ['customer' => $customer]
             )->run();
         } else {
-            $this->objectManager->create(\Magento\Customer\Test\TestStep\LogoutCustomerOnFrontendStep::class)->run();
+            $this->objectManager->create(LogoutCustomerOnFrontendStep::class)->run();
         }
 
         $cmsIndexPage->open();
@@ -52,7 +54,7 @@ class AssertCatalogPriceRuleAppliedProductPage extends AbstractConstraint
             $catalogCategoryViewPage->getListProductBlock()->getProductItem($product)->open();
 
             $catalogProductViewPage->getViewBlock()->waitLoader();
-            $productPriceBlock = $catalogProductViewPage->getViewBlock()->getPriceBlock();
+            $productPriceBlock = $catalogProductViewPage->getViewBlock()->getPriceBlock($product);
             $actualPrice['special'] = $productPriceBlock->getSpecialPrice();
             if ($productPrice[$key]['regular'] !== 'No') {
                 $actualPrice['regular'] = $productPriceBlock->getOldPrice();
-- 
GitLab


From 51fa4bc17c9a31e30e01fa3ae8fabe2c4b3583fd Mon Sep 17 00:00:00 2001
From: magento-engcom-team <mikola.malevanec@transoftgroup.com>
Date: Thu, 23 Nov 2017 18:37:51 +0200
Subject: [PATCH 157/380] 8255: Export Products action doesn't consider
 hide_for_product_page value.

---
 .../Import/Product/MediaGalleryProcessor.php  | 66 +++++++------------
 1 file changed, 23 insertions(+), 43 deletions(-)

diff --git a/app/code/Magento/CatalogImportExport/Model/Import/Product/MediaGalleryProcessor.php b/app/code/Magento/CatalogImportExport/Model/Import/Product/MediaGalleryProcessor.php
index 55d908f2190..857f8f99d21 100644
--- a/app/code/Magento/CatalogImportExport/Model/Import/Product/MediaGalleryProcessor.php
+++ b/app/code/Magento/CatalogImportExport/Model/Import/Product/MediaGalleryProcessor.php
@@ -109,7 +109,8 @@ class MediaGalleryProcessor
     public function saveMediaGallery(array $mediaGalleryData)
     {
         $this->initMediaGalleryResources();
-        $mediaGalleryDataGlobal = $this->processMediaGallery($mediaGalleryData);
+        $mediaGalleryData = $this->restoreDisableImage($mediaGalleryData);
+        $mediaGalleryDataGlobal = array_merge(...$mediaGalleryData);
         $imageNames = [];
         $multiInsertData = [];
         $valueToProductId = [];
@@ -136,25 +137,22 @@ class MediaGalleryProcessor
         if (!empty($multiInsertData)) {
             $this->connection->insertOnDuplicate($this->mediaGalleryTableName, $multiInsertData);
         }
-        $multiInsertData = [];
         $newMediaSelect = $this->connection->select()->from($this->mediaGalleryTableName, ['value_id', 'value'])
             ->where('value IN (?)', $imageNames);
         if (array_keys($oldMediaValues)) {
             $newMediaSelect->where('value_id NOT IN (?)', array_keys($oldMediaValues));
         }
-
-        $dataForSkinnyTable = [];
         $newMediaValues = $this->connection->fetchAssoc($newMediaSelect);
-        $this->restoreDisableImage($mediaGalleryData);
         foreach ($mediaGalleryData as $storeId => $mediaGalleryDataPerStore) {
+            $dataForSkinnyTable = [];
+            $multiInsertData = [];
             foreach ($mediaGalleryDataPerStore as $productSku => $mediaGalleryRows) {
                 foreach ($mediaGalleryRows as $insertValue) {
                     foreach ($newMediaValues as $value_id => $values) {
                         if ($values['value'] == $insertValue['value']) {
                             $insertValue['value_id'] = $value_id;
-                            $insertValue[$this->getProductEntityLinkField()]
-                                = array_shift($valueToProductId[$values['value']]);
-                            unset($newMediaValues[$value_id]);
+                            $ids = array_values($valueToProductId[$values['value']]);
+                            $insertValue[$this->getProductEntityLinkField()] = array_shift($ids);
                             break;
                         }
                     }
@@ -175,23 +173,23 @@ class MediaGalleryProcessor
                     }
                 }
             }
-        }
-        try {
-            $this->connection->insertOnDuplicate(
-                $this->mediaGalleryValueTableName,
-                $multiInsertData,
-                ['value_id', 'store_id', $this->getProductEntityLinkField(), 'label', 'position', 'disabled']
-            );
-            $this->connection->insertOnDuplicate(
-                $this->mediaGalleryEntityToValueTableName,
-                $dataForSkinnyTable,
-                ['value_id']
-            );
-        } catch (\Exception $e) {
-            $this->connection->delete(
-                $this->mediaGalleryTableName,
-                $this->connection->quoteInto('value_id IN (?)', $newMediaValues)
-            );
+            try {
+                $this->connection->insertOnDuplicate(
+                    $this->mediaGalleryValueTableName,
+                    $multiInsertData,
+                    ['value_id', 'store_id', $this->getProductEntityLinkField(), 'label', 'position', 'disabled']
+                );
+                $this->connection->insertOnDuplicate(
+                    $this->mediaGalleryEntityToValueTableName,
+                    $dataForSkinnyTable,
+                    ['value_id']
+                );
+            } catch (\Exception $e) {
+                $this->connection->delete(
+                    $this->mediaGalleryTableName,
+                    $this->connection->quoteInto('value_id IN (?)', $newMediaValues)
+                );
+            }
         }
     }
 
@@ -343,24 +341,6 @@ class MediaGalleryProcessor
         return $mediaGalleryData;
     }
 
-    /**
-     * Remove store specific information for inserting images.
-     *
-     * @param array $mediaGalleryData
-     * @return array
-     */
-    private function processMediaGallery(array $mediaGalleryData)
-    {
-        $mediaGalleryDataGlobal = array_merge(...$mediaGalleryData);
-        foreach ($mediaGalleryDataGlobal as $sku => $row) {
-            if (isset($mediaGalleryDataGlobal[$sku]['all']['restore'])) {
-                unset($mediaGalleryDataGlobal[$sku]);
-            }
-        }
-
-        return $mediaGalleryDataGlobal;
-    }
-
     /**
      * Get product entity link field.
      *
-- 
GitLab


From c21229cb8e91ebd30a28ad63aa87405faeafeee6 Mon Sep 17 00:00:00 2001
From: Carlos Lizaga <carlos.lizaga@pronovias.com>
Date: Tue, 14 Nov 2017 20:07:31 +0100
Subject: [PATCH 158/380] New validation: validate-no-utf8mb4-characters.

---
 .../product/view/options/type/text.phtml      |  2 +
 .../jasmine/tests/lib/mage/validation.test.js | 72 +++++++++++++++++++
 lib/web/i18n/en_US.csv                        |  1 +
 lib/web/mage/validation.js                    | 18 +++++
 4 files changed, 93 insertions(+)

diff --git a/app/code/Magento/Catalog/view/frontend/templates/product/view/options/type/text.phtml b/app/code/Magento/Catalog/view/frontend/templates/product/view/options/type/text.phtml
index 79dc8591fd7..11aedc33c2d 100644
--- a/app/code/Magento/Catalog/view/frontend/templates/product/view/options/type/text.phtml
+++ b/app/code/Magento/Catalog/view/frontend/templates/product/view/options/type/text.phtml
@@ -29,6 +29,7 @@ $class = ($_option->getIsRequire()) ? ' required' : '';
             if ($_option->getMaxCharacters()) {
                 $_textValidate['maxlength'] = $_option->getMaxCharacters();
             }
+            $_textValidate['validate-no-utf8mb4-characters'] = true;
             ?>
             <input type="text"
                    id="options_<?= /* @escapeNotVerified */ $_option->getId() ?>_text"
@@ -47,6 +48,7 @@ $class = ($_option->getIsRequire()) ? ' required' : '';
             if ($_option->getMaxCharacters()) {
                 $_textAreaValidate['maxlength'] = $_option->getMaxCharacters();
             }
+            $_textAreaValidate['validate-no-utf8mb4-characters'] = true;
             ?>
             <textarea id="options_<?= /* @escapeNotVerified */ $_option->getId() ?>_text"
                       class="product-custom-option"
diff --git a/dev/tests/js/jasmine/tests/lib/mage/validation.test.js b/dev/tests/js/jasmine/tests/lib/mage/validation.test.js
index 50931f940c6..12138e5939a 100644
--- a/dev/tests/js/jasmine/tests/lib/mage/validation.test.js
+++ b/dev/tests/js/jasmine/tests/lib/mage/validation.test.js
@@ -183,4 +183,76 @@ define([
             )).toEqual(true);
         });
     });
+
+    describe('Testing 3 bytes characters only policy (UTF-8)', function () {
+        it('rejects data, if any of the characters cannot be stored using UTF-8 collation', function () {
+            expect($.validator.methods['validate-no-utf8mb4-characters'].call(
+                $.validator.prototype, '😅😂', null
+            )).toEqual(false);
+            expect($.validator.methods['validate-no-utf8mb4-characters'].call(
+                $.validator.prototype, '😅 test 😂', null
+            )).toEqual(false);
+            expect($.validator.methods['validate-no-utf8mb4-characters'].call(
+                $.validator.prototype, '💩 👻 💀', null
+            )).toEqual(false);
+        });
+
+        it('approves data, if all the characters can be stored using UTF-8 collation', function () {
+            expect($.validator.methods['validate-no-utf8mb4-characters'].call(
+                $.validator.prototype, '', null
+            )).toEqual(true);
+            expect($.validator.methods['validate-no-utf8mb4-characters'].call(
+                $.validator.prototype, '!$-_%ç&#?!', null
+            )).toEqual(true);
+            expect($.validator.methods['validate-no-utf8mb4-characters'].call(
+                $.validator.prototype, '1234567890', null
+            )).toEqual(true);
+            expect($.validator.methods['validate-no-utf8mb4-characters'].call(
+                $.validator.prototype, '   ', null
+            )).toEqual(true);
+            expect($.validator.methods['validate-no-utf8mb4-characters'].call(
+                $.validator.prototype, 'test', null
+            )).toEqual(true);
+            expect($.validator.methods['validate-no-utf8mb4-characters'].call(
+                $.validator.prototype, 'испытание', null
+            )).toEqual(true);
+            expect($.validator.methods['validate-no-utf8mb4-characters'].call(
+                $.validator.prototype, 'тест', null
+            )).toEqual(true);
+            expect($.validator.methods['validate-no-utf8mb4-characters'].call(
+                $.validator.prototype, 'ÖƒÕ¸Ö€Õ±Õ¡Ö€Õ¯Õ¸Ö‚Õ´', null
+            )).toEqual(true);
+            expect($.validator.methods['validate-no-utf8mb4-characters'].call(
+                $.validator.prototype, 'परीक्षण', null
+            )).toEqual(true);
+            expect($.validator.methods['validate-no-utf8mb4-characters'].call(
+                $.validator.prototype, 'テスト', null
+            )).toEqual(true);
+            expect($.validator.methods['validate-no-utf8mb4-characters'].call(
+                $.validator.prototype, '테스트', null
+            )).toEqual(true);
+            expect($.validator.methods['validate-no-utf8mb4-characters'].call(
+                $.validator.prototype, '测试', null
+            )).toEqual(true);
+            expect($.validator.methods['validate-no-utf8mb4-characters'].call(
+                $.validator.prototype, '測試', null
+            )).toEqual(true);
+            expect($.validator.methods['validate-no-utf8mb4-characters'].call(
+                $.validator.prototype, 'ทดสอบ', null
+            )).toEqual(true);
+            expect($.validator.methods['validate-no-utf8mb4-characters'].call(
+                $.validator.prototype, 'δοκιμή', null
+            )).toEqual(true);
+            expect($.validator.methods['validate-no-utf8mb4-characters'].call(
+                $.validator.prototype, 'اختبار', null
+            )).toEqual(true);
+            expect($.validator.methods['validate-no-utf8mb4-characters'].call(
+                $.validator.prototype, 'تست', null
+            )).toEqual(true);
+            expect($.validator.methods['validate-no-utf8mb4-characters'].call(
+                $.validator.prototype, 'מִבְחָן', null
+            )).toEqual(true);
+        });
+    });
+
 });
diff --git a/lib/web/i18n/en_US.csv b/lib/web/i18n/en_US.csv
index 21cfb51d5e3..5c63a191420 100644
--- a/lib/web/i18n/en_US.csv
+++ b/lib/web/i18n/en_US.csv
@@ -99,6 +99,7 @@ Submit,Submit
 "Password cannot be the same as email address.","Password cannot be the same as email address."
 "Please fix this field.","Please fix this field."
 "Please enter a valid email address.","Please enter a valid email address."
+"Please remove invalid characters: {0}.", "Please remove invalid characters: {0}."
 "Please enter a valid URL.","Please enter a valid URL."
 "Please enter a valid date (ISO).","Please enter a valid date (ISO)."
 "Please enter only digits.","Please enter only digits."
diff --git a/lib/web/mage/validation.js b/lib/web/mage/validation.js
index 85158c581ae..fee88826be7 100644
--- a/lib/web/mage/validation.js
+++ b/lib/web/mage/validation.js
@@ -396,6 +396,24 @@
             $.mage.__('Please enter at least {0} characters')
         ],
 
+        /* detect chars that would require more than 3 bytes */
+        'validate-no-utf8mb4-characters': [
+            function (value) {
+                var validator = this,
+                    message = $.mage.__('Please remove invalid characters: {0}.'),
+                    matches = value.match(/(?:[\uD800-\uDBFF][\uDC00-\uDFFF])/g),
+                    result = matches === null;
+
+                if (!result) {
+                    validator.charErrorMessage = message.replace('{0}', matches.join());
+                }
+
+                return result;
+            }, function () {
+                return this.charErrorMessage;
+            }
+        ],
+
         /* eslint-disable max-len */
         'email2': [
             function (value, element) {
-- 
GitLab


From 0599c8eb227536517ca3acbb4349695cb4f023b9 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Gonzalo=20M=C3=A9ndez=20Calzada?=
 <gonzalo.mendez@interactiv4.com>
Date: Thu, 23 Nov 2017 20:21:15 +0100
Subject: [PATCH 159/380] drop useless fixture, fix tests

---
 ...AttributeOptionManagementInterfaceTest.php | 24 +++++++++-
 .../Attribute/_files/swatch_attribute.php     | 48 -------------------
 .../Model/SwatchAttributeOptionAddTest.php    | 18 +++++--
 3 files changed, 35 insertions(+), 55 deletions(-)
 delete mode 100644 dev/tests/integration/testsuite/Magento/Catalog/Model/Product/Attribute/_files/swatch_attribute.php

diff --git a/dev/tests/api-functional/testsuite/Magento/Catalog/Api/ProductSwatchAttributeOptionManagementInterfaceTest.php b/dev/tests/api-functional/testsuite/Magento/Catalog/Api/ProductSwatchAttributeOptionManagementInterfaceTest.php
index 11dc3c9484a..63e5282c221 100644
--- a/dev/tests/api-functional/testsuite/Magento/Catalog/Api/ProductSwatchAttributeOptionManagementInterfaceTest.php
+++ b/dev/tests/api-functional/testsuite/Magento/Catalog/Api/ProductSwatchAttributeOptionManagementInterfaceTest.php
@@ -16,12 +16,12 @@ class ProductSwatchAttributeOptionManagementInterfaceTest extends WebapiAbstract
     const RESOURCE_PATH = '/V1/products/attributes';
 
     /**
-     * @magentoApiDataFixture Magento/Catalog/Model/Product/Attribute/_files/swatch_attribute.php
+     * @magentoApiDataFixture Magento/Swatches/_files/swatch_attribute.php
      * @dataProvider addDataProvider
      */
     public function testAdd($optionData)
     {
-        $testAttributeCode = 'swatch_attribute';
+        $testAttributeCode = 'color_swatch';
         $serviceInfo = [
             'rest' => [
                 'resourcePath' => self::RESOURCE_PATH . '/' . $testAttributeCode . '/options',
@@ -82,4 +82,24 @@ class ProductSwatchAttributeOptionManagementInterfaceTest extends WebapiAbstract
 
         ];
     }
+
+    /**
+     * @param $testAttributeCode
+     * @return array|bool|float|int|string
+     */
+    private function getAttributeOptions($testAttributeCode)
+    {
+        $serviceInfo = [
+            'rest' => [
+                'resourcePath' => self::RESOURCE_PATH . '/' . $testAttributeCode . '/options',
+                'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_GET,
+            ],
+            'soap' => [
+                'service' => self::SERVICE_NAME,
+                'serviceVersion' => self::SERVICE_VERSION,
+                'operation' => self::SERVICE_NAME . 'getItems',
+            ],
+        ];
+        return $this->_webApiCall($serviceInfo, ['attributeCode' => $testAttributeCode]);
+    }
 }
diff --git a/dev/tests/integration/testsuite/Magento/Catalog/Model/Product/Attribute/_files/swatch_attribute.php b/dev/tests/integration/testsuite/Magento/Catalog/Model/Product/Attribute/_files/swatch_attribute.php
deleted file mode 100644
index 4e51d4e16ee..00000000000
--- a/dev/tests/integration/testsuite/Magento/Catalog/Model/Product/Attribute/_files/swatch_attribute.php
+++ /dev/null
@@ -1,48 +0,0 @@
-<?php
-/**
- * "dropdown" fixture of product EAV attribute.
- *
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
- */
-
-/** @var \Magento\Eav\Model\Entity\Type $entityType */
-$entityType = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create(
-    \Magento\Eav\Model\Entity\Type::class
-);
-$entityType->loadByCode('catalog_product');
-$defaultSetId = $entityType->getDefaultAttributeSetId();
-/** @var \Magento\Eav\Model\Entity\Attribute\Set $defaultSet */
-$defaultSet = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create(
-    \Magento\Eav\Model\Entity\Attribute\Set::class
-);
-$defaultSet->load($defaultSetId);
-$defaultGroupId = $defaultSet->getDefaultGroupId();
-$optionData = ['value' => ['option_1' => [0 => 'Fixture Option']], 'order' => ['option_1' => 1]];
-
-/** @var $attribute \Magento\Catalog\Model\ResourceModel\Eav\Attribute */
-$attribute = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create(
-    \Magento\Catalog\Model\ResourceModel\Eav\Attribute::class
-);
-
-$attribute->setAttributeCode(
-    'swatch_attribute'
-)->setEntityTypeId(
-    $entityType->getEntityTypeId()
-)->setAttributeGroupId(
-    $defaultGroupId
-)->setAttributeSetId(
-    $defaultSetId
-)->setFrontendInput(
-    'media_image'
-)->setFrontendLabel(
-    'Swatch Attribute'
-)->setBackendType(
-    'varchar'
-)->setFrontendModel(
-    \Magento\Catalog\Model\Product\Attribute\Frontend\Image::class
-)->setIsUserDefined(
-    1
-)->setOption(
-    $optionData
-)->save();
diff --git a/dev/tests/integration/testsuite/Magento/Swatches/Model/SwatchAttributeOptionAddTest.php b/dev/tests/integration/testsuite/Magento/Swatches/Model/SwatchAttributeOptionAddTest.php
index 4505cbd64c2..5cfbc8e580e 100644
--- a/dev/tests/integration/testsuite/Magento/Swatches/Model/SwatchAttributeOptionAddTest.php
+++ b/dev/tests/integration/testsuite/Magento/Swatches/Model/SwatchAttributeOptionAddTest.php
@@ -15,6 +15,16 @@ use Magento\Eav\Api\Data\AttributeOptionInterfaceFactory;
  */
 class SwatchAttributeOptionAddTest extends \PHPUnit\Framework\TestCase
 {
+    /**
+     * @var \Magento\Framework\ObjectManagerInterface
+     */
+    private $objectManager;
+
+    protected function setUp()
+    {
+        $this->objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
+    }
+
     /**
      * @magentoAppArea adminhtml
      * @magentoDbIsolation enabled
@@ -22,10 +32,8 @@ class SwatchAttributeOptionAddTest extends \PHPUnit\Framework\TestCase
      */
     public function testSwatchOptionAdd()
     {
-        $om = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
-
         /** @var \Magento\Catalog\Api\Data\ProductAttributeInterface $attribute */
-        $attribute = $om
+        $attribute = $this->objectManager
             ->create(\Magento\Catalog\Model\ResourceModel\Eav\Attribute::class)
             ->load('color_swatch', 'attribute_code');
         $optionsPerAttribute = 3;
@@ -45,11 +53,11 @@ class SwatchAttributeOptionAddTest extends \PHPUnit\Framework\TestCase
         /** @var AttributeOptionInterface[] $options */
         $options = [];
         foreach ($data['options']['option'] as $optionData) {
-            $options[] = $om->get(AttributeOptionInterfaceFactory::class)->create(['data' => $optionData]);
+            $options[] = $this->objectManager->get(AttributeOptionInterfaceFactory::class)->create(['data' => $optionData]);
         }
 
         /** @var ProductAttributeOptionManagementInterface $optionManagement */
-        $optionManagement = $om->get(ProductAttributeOptionManagementInterface::class);
+        $optionManagement = $this->objectManager->get(ProductAttributeOptionManagementInterface::class);
         foreach ($options as $option) {
             $optionManagement->add(
                 $attribute->getAttributeCode(),
-- 
GitLab


From 243dccba6ecde194f56c052ff91f2bdd641def09 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Gonzalo=20M=C3=A9ndez=20Calzada?=
 <gonzalo.mendez@interactiv4.com>
Date: Fri, 24 Nov 2017 09:24:20 +0100
Subject: [PATCH 160/380] codestyle fix

---
 .../Magento/Swatches/Model/SwatchAttributeOptionAddTest.php   | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/dev/tests/integration/testsuite/Magento/Swatches/Model/SwatchAttributeOptionAddTest.php b/dev/tests/integration/testsuite/Magento/Swatches/Model/SwatchAttributeOptionAddTest.php
index 5cfbc8e580e..84ba587f5e7 100644
--- a/dev/tests/integration/testsuite/Magento/Swatches/Model/SwatchAttributeOptionAddTest.php
+++ b/dev/tests/integration/testsuite/Magento/Swatches/Model/SwatchAttributeOptionAddTest.php
@@ -53,7 +53,9 @@ class SwatchAttributeOptionAddTest extends \PHPUnit\Framework\TestCase
         /** @var AttributeOptionInterface[] $options */
         $options = [];
         foreach ($data['options']['option'] as $optionData) {
-            $options[] = $this->objectManager->get(AttributeOptionInterfaceFactory::class)->create(['data' => $optionData]);
+            $options[] = $this->objectManager
+                ->get(AttributeOptionInterfaceFactory::class)
+                ->create(['data' => $optionData]);
         }
 
         /** @var ProductAttributeOptionManagementInterface $optionManagement */
-- 
GitLab


From 5dc5acdbae841d04118408fb6d73b85f33529e60 Mon Sep 17 00:00:00 2001
From: magento-engcom-team <mikola.malevanec@transoftgroup.com>
Date: Fri, 24 Nov 2017 16:03:06 +0200
Subject: [PATCH 161/380] 8255: Export Products action doesn't consider
 hide_for_product_page value.

---
 .../Import/Product/MediaGalleryProcessor.php  | 117 ++++++++++--------
 1 file changed, 68 insertions(+), 49 deletions(-)

diff --git a/app/code/Magento/CatalogImportExport/Model/Import/Product/MediaGalleryProcessor.php b/app/code/Magento/CatalogImportExport/Model/Import/Product/MediaGalleryProcessor.php
index 857f8f99d21..045f0942021 100644
--- a/app/code/Magento/CatalogImportExport/Model/Import/Product/MediaGalleryProcessor.php
+++ b/app/code/Magento/CatalogImportExport/Model/Import/Product/MediaGalleryProcessor.php
@@ -109,7 +109,7 @@ class MediaGalleryProcessor
     public function saveMediaGallery(array $mediaGalleryData)
     {
         $this->initMediaGalleryResources();
-        $mediaGalleryData = $this->restoreDisableImage($mediaGalleryData);
+        $mediaGalleryData = $this->restoreDisabledImage($mediaGalleryData);
         $mediaGalleryDataGlobal = array_merge(...$mediaGalleryData);
         $imageNames = [];
         $multiInsertData = [];
@@ -143,53 +143,8 @@ class MediaGalleryProcessor
             $newMediaSelect->where('value_id NOT IN (?)', array_keys($oldMediaValues));
         }
         $newMediaValues = $this->connection->fetchAssoc($newMediaSelect);
-        foreach ($mediaGalleryData as $storeId => $mediaGalleryDataPerStore) {
-            $dataForSkinnyTable = [];
-            $multiInsertData = [];
-            foreach ($mediaGalleryDataPerStore as $productSku => $mediaGalleryRows) {
-                foreach ($mediaGalleryRows as $insertValue) {
-                    foreach ($newMediaValues as $value_id => $values) {
-                        if ($values['value'] == $insertValue['value']) {
-                            $insertValue['value_id'] = $value_id;
-                            $ids = array_values($valueToProductId[$values['value']]);
-                            $insertValue[$this->getProductEntityLinkField()] = array_shift($ids);
-                            break;
-                        }
-                    }
-                    if (isset($insertValue['value_id'])) {
-                        $valueArr = [
-                            'value_id' => $insertValue['value_id'],
-                            'store_id' => $storeId,
-                            $this->getProductEntityLinkField() => $insertValue[$this->getProductEntityLinkField()],
-                            'label' => $insertValue['label'],
-                            'position' => $insertValue['position'],
-                            'disabled' => $insertValue['disabled'],
-                        ];
-                        $multiInsertData[] = $valueArr;
-                        $dataForSkinnyTable[] = [
-                            'value_id' => $insertValue['value_id'],
-                            $this->getProductEntityLinkField() => $insertValue[$this->getProductEntityLinkField()],
-                        ];
-                    }
-                }
-            }
-            try {
-                $this->connection->insertOnDuplicate(
-                    $this->mediaGalleryValueTableName,
-                    $multiInsertData,
-                    ['value_id', 'store_id', $this->getProductEntityLinkField(), 'label', 'position', 'disabled']
-                );
-                $this->connection->insertOnDuplicate(
-                    $this->mediaGalleryEntityToValueTableName,
-                    $dataForSkinnyTable,
-                    ['value_id']
-                );
-            } catch (\Exception $e) {
-                $this->connection->delete(
-                    $this->mediaGalleryTableName,
-                    $this->connection->quoteInto('value_id IN (?)', $newMediaValues)
-                );
-            }
+        foreach ($mediaGalleryData as $storeId => $storeMediaGalleryData) {
+            $this->processMediaPerStore((int)$storeId, $storeMediaGalleryData, $newMediaValues, $valueToProductId);
         }
     }
 
@@ -314,7 +269,7 @@ class MediaGalleryProcessor
      * @param array $mediaGalleryData
      * @return array
      */
-    private function restoreDisableImage(array $mediaGalleryData)
+    private function restoreDisabledImage(array $mediaGalleryData)
     {
         $restoreData = [];
         foreach (array_keys($mediaGalleryData) as $storeId) {
@@ -341,6 +296,70 @@ class MediaGalleryProcessor
         return $mediaGalleryData;
     }
 
+    /**
+     * Save media gallery data per store.
+     *
+     * @param $storeId
+     * @param array $mediaGalleryData
+     * @param array $newMediaValues
+     * @param array $valueToProductId
+     * @return void
+     */
+    private function processMediaPerStore(
+        int $storeId,
+        array $mediaGalleryData,
+        array $newMediaValues,
+        array $valueToProductId
+    ) {
+        $multiInsertData = [];
+        $dataForSkinnyTable = [];
+        foreach ($mediaGalleryData as $mediaGalleryRows) {
+            foreach ($mediaGalleryRows as $insertValue) {
+                foreach ($newMediaValues as $value_id => $values) {
+                    if ($values['value'] == $insertValue['value']) {
+                        $insertValue['value_id'] = $value_id;
+                        $insertValue[$this->getProductEntityLinkField()]
+                            = array_shift($valueToProductId[$values['value']]);
+                        unset($newMediaValues[$value_id]);
+                        break;
+                    }
+                }
+                if (isset($insertValue['value_id'])) {
+                    $valueArr = [
+                        'value_id' => $insertValue['value_id'],
+                        'store_id' => $storeId,
+                        $this->getProductEntityLinkField() => $insertValue[$this->getProductEntityLinkField()],
+                        'label' => $insertValue['label'],
+                        'position' => $insertValue['position'],
+                        'disabled' => $insertValue['disabled'],
+                    ];
+                    $multiInsertData[] = $valueArr;
+                    $dataForSkinnyTable[] = [
+                        'value_id' => $insertValue['value_id'],
+                        $this->getProductEntityLinkField() => $insertValue[$this->getProductEntityLinkField()],
+                    ];
+                }
+            }
+        }
+        try {
+            $this->connection->insertOnDuplicate(
+                $this->mediaGalleryValueTableName,
+                $multiInsertData,
+                ['value_id', 'store_id', $this->getProductEntityLinkField(), 'label', 'position', 'disabled']
+            );
+            $this->connection->insertOnDuplicate(
+                $this->mediaGalleryEntityToValueTableName,
+                $dataForSkinnyTable,
+                ['value_id']
+            );
+        } catch (\Exception $e) {
+            $this->connection->delete(
+                $this->mediaGalleryTableName,
+                $this->connection->quoteInto('value_id IN (?)', $newMediaValues)
+            );
+        }
+    }
+
     /**
      * Get product entity link field.
      *
-- 
GitLab


From 8805bc07da432624236a4678258a5c6973545810 Mon Sep 17 00:00:00 2001
From: alojua <juan.alonso@staempfli.com>
Date: Sat, 25 Nov 2017 12:51:27 +0100
Subject: [PATCH 162/380] Add command "app:config:status" to check whether the
 config propagation is up to date. This command can be used to decide whether
 app:config:import execution is needed

---
 .../Command/App/ConfigStatusCommand.php       | 64 ++++++++++++++++
 .../Command/App/ConfigStatusCommandTest.php   | 76 +++++++++++++++++++
 app/code/Magento/Deploy/etc/di.xml            |  1 +
 3 files changed, 141 insertions(+)
 create mode 100644 app/code/Magento/Deploy/Console/Command/App/ConfigStatusCommand.php
 create mode 100644 app/code/Magento/Deploy/Test/Unit/Console/Command/App/ConfigStatusCommandTest.php

diff --git a/app/code/Magento/Deploy/Console/Command/App/ConfigStatusCommand.php b/app/code/Magento/Deploy/Console/Command/App/ConfigStatusCommand.php
new file mode 100644
index 00000000000..57782a3be5e
--- /dev/null
+++ b/app/code/Magento/Deploy/Console/Command/App/ConfigStatusCommand.php
@@ -0,0 +1,64 @@
+<?php
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Deploy\Console\Command\App;
+
+use Magento\Deploy\Model\DeploymentConfig\ChangeDetector;
+use Magento\Framework\Console\Cli;
+use Symfony\Component\Console\Command\Command;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Output\OutputInterface;
+
+/**
+ * Command for checking if Config propagation is up to date
+ */
+class ConfigStatusCommand extends Command
+{
+    /**
+     * Code for error when config import is required.
+     */
+    const EXIT_CODE_CONFIG_IMPORT_REQUIRED = 2;
+
+    /**
+     * @var ChangeDetector
+     */
+    private $changeDetector;
+
+    /**
+     * ConfigStatusCommand constructor.
+     * @param ChangeDetector $changeDetector
+     */
+    public function __construct(ChangeDetector $changeDetector)
+    {
+        $this->changeDetector = $changeDetector;
+        parent::__construct();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function configure()
+    {
+        $this->setName('app:config:status')
+            ->setDescription('Checks if config propagation requires update');
+        parent::configure();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function execute(InputInterface $input, OutputInterface $output)
+    {
+        if ($this->changeDetector->hasChanges()) {
+            $output->writeln(
+                '<info>The configuration file has changed. ' .
+                'Run app:config:import or setup:upgrade command to synchronize configuration.</info>'
+            );
+            return self::EXIT_CODE_CONFIG_IMPORT_REQUIRED;
+        }
+        $output->writeln('<info>Configuration files are up to date.</info>');
+        return Cli::RETURN_SUCCESS;
+    }
+}
\ No newline at end of file
diff --git a/app/code/Magento/Deploy/Test/Unit/Console/Command/App/ConfigStatusCommandTest.php b/app/code/Magento/Deploy/Test/Unit/Console/Command/App/ConfigStatusCommandTest.php
new file mode 100644
index 00000000000..cff4e7b4559
--- /dev/null
+++ b/app/code/Magento/Deploy/Test/Unit/Console/Command/App/ConfigStatusCommandTest.php
@@ -0,0 +1,76 @@
+<?php
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Deploy\Test\Unit\Console\Command\App;
+
+use Magento\Deploy\Console\Command\App\ConfigStatusCommand;
+use Magento\Deploy\Model\DeploymentConfig\ChangeDetector;
+use Magento\Framework\Console\Cli;
+use Symfony\Component\Console\Tester\CommandTester;
+
+/**
+ * @inheritdoc
+ */
+class ConfigStatusCommandTest extends \PHPUnit\Framework\TestCase
+{
+
+    /**
+     * @var ConfigStatusCommand
+     */
+    private $command;
+    /**
+     * @var ChangeDetector
+     */
+    private $changeDetector;
+
+    /**
+     * @inheritdoc
+     */
+    protected function setUp()
+    {
+        $this->changeDetector = $this->getMockBuilder(ChangeDetector::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $this->command = new ConfigStatusCommand($this->changeDetector);
+    }
+
+    /**
+     * @param bool $hasChanges
+     * @param string $expectedMessage
+     * @param int $expectedCode
+     *
+     * @dataProvider executeDataProvider
+     */
+    public function testExecute(bool $hasChanges, $expectedMessage, $expectedCode)
+    {
+        $this->changeDetector->expects($this->once())
+            ->method('hasChanges')
+            ->will($this->returnValue($hasChanges));
+
+        $tester = new CommandTester($this->command);
+        $tester->execute([]);
+
+        $this->assertEquals($expectedMessage, $tester->getDisplay());
+        $this->assertSame($expectedCode, $tester->getStatusCode());
+    }
+
+    public function executeDataProvider()
+    {
+        return [
+            'Config is up to date' => [
+                false,
+                'Configuration files are up to date.' . PHP_EOL,
+                Cli::RETURN_SUCCESS
+            ],
+            'Config needs update' => [
+                true,
+                'The configuration file has changed. ' .
+                'Run app:config:import or setup:upgrade command to synchronize configuration.' . PHP_EOL,
+                ConfigStatusCommand::EXIT_CODE_CONFIG_IMPORT_REQUIRED,
+            ],
+        ];
+    }
+}
\ No newline at end of file
diff --git a/app/code/Magento/Deploy/etc/di.xml b/app/code/Magento/Deploy/etc/di.xml
index e47fca3a6b9..ce7c84c9553 100644
--- a/app/code/Magento/Deploy/etc/di.xml
+++ b/app/code/Magento/Deploy/etc/di.xml
@@ -31,6 +31,7 @@
                 <item name="dumpApplicationCommand" xsi:type="object">\Magento\Deploy\Console\Command\App\ApplicationDumpCommand</item>
                 <item name="sensitiveConfigSetCommand" xsi:type="object">\Magento\Deploy\Console\Command\App\SensitiveConfigSetCommand</item>
                 <item name="configImportCommand" xsi:type="object">Magento\Deploy\Console\Command\App\ConfigImportCommand</item>
+                <item name="configStatusCommand" xsi:type="object">Magento\Deploy\Console\Command\App\ConfigStatusCommand</item>
             </argument>
         </arguments>
     </type>
-- 
GitLab


From e47ec9b35325c1c1134f9340784f7e8f79c36c61 Mon Sep 17 00:00:00 2001
From: alojua <juan.alonso@staempfli.com>
Date: Sat, 25 Nov 2017 17:32:27 +0100
Subject: [PATCH 163/380] Small change on output messages

---
 .../Deploy/Console/Command/App/ConfigStatusCommand.php        | 4 ++--
 .../Test/Unit/Console/Command/App/ConfigStatusCommandTest.php | 4 ++--
 2 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/app/code/Magento/Deploy/Console/Command/App/ConfigStatusCommand.php b/app/code/Magento/Deploy/Console/Command/App/ConfigStatusCommand.php
index 57782a3be5e..534a54918a3 100644
--- a/app/code/Magento/Deploy/Console/Command/App/ConfigStatusCommand.php
+++ b/app/code/Magento/Deploy/Console/Command/App/ConfigStatusCommand.php
@@ -53,12 +53,12 @@ class ConfigStatusCommand extends Command
     {
         if ($this->changeDetector->hasChanges()) {
             $output->writeln(
-                '<info>The configuration file has changed. ' .
+                '<info>Config files have changed. ' .
                 'Run app:config:import or setup:upgrade command to synchronize configuration.</info>'
             );
             return self::EXIT_CODE_CONFIG_IMPORT_REQUIRED;
         }
-        $output->writeln('<info>Configuration files are up to date.</info>');
+        $output->writeln('<info>Config files are up to date.</info>');
         return Cli::RETURN_SUCCESS;
     }
 }
\ No newline at end of file
diff --git a/app/code/Magento/Deploy/Test/Unit/Console/Command/App/ConfigStatusCommandTest.php b/app/code/Magento/Deploy/Test/Unit/Console/Command/App/ConfigStatusCommandTest.php
index cff4e7b4559..3e400a28537 100644
--- a/app/code/Magento/Deploy/Test/Unit/Console/Command/App/ConfigStatusCommandTest.php
+++ b/app/code/Magento/Deploy/Test/Unit/Console/Command/App/ConfigStatusCommandTest.php
@@ -62,12 +62,12 @@ class ConfigStatusCommandTest extends \PHPUnit\Framework\TestCase
         return [
             'Config is up to date' => [
                 false,
-                'Configuration files are up to date.' . PHP_EOL,
+                'Config files are up to date.' . PHP_EOL,
                 Cli::RETURN_SUCCESS
             ],
             'Config needs update' => [
                 true,
-                'The configuration file has changed. ' .
+                'Config files have changed. ' .
                 'Run app:config:import or setup:upgrade command to synchronize configuration.' . PHP_EOL,
                 ConfigStatusCommand::EXIT_CODE_CONFIG_IMPORT_REQUIRED,
             ],
-- 
GitLab


From 13574b461903ad8ac726e09ad3f6de015c670dbb Mon Sep 17 00:00:00 2001
From: alojua <juan.alonso@staempfli.com>
Date: Sat, 25 Nov 2017 17:33:14 +0100
Subject: [PATCH 164/380] Add 1 new line at the end of php files as it is
 needed to pass the static tests

---
 .../Magento/Deploy/Console/Command/App/ConfigStatusCommand.php  | 2 +-
 .../Test/Unit/Console/Command/App/ConfigStatusCommandTest.php   | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/app/code/Magento/Deploy/Console/Command/App/ConfigStatusCommand.php b/app/code/Magento/Deploy/Console/Command/App/ConfigStatusCommand.php
index 534a54918a3..90438380e22 100644
--- a/app/code/Magento/Deploy/Console/Command/App/ConfigStatusCommand.php
+++ b/app/code/Magento/Deploy/Console/Command/App/ConfigStatusCommand.php
@@ -61,4 +61,4 @@ class ConfigStatusCommand extends Command
         $output->writeln('<info>Config files are up to date.</info>');
         return Cli::RETURN_SUCCESS;
     }
-}
\ No newline at end of file
+}
diff --git a/app/code/Magento/Deploy/Test/Unit/Console/Command/App/ConfigStatusCommandTest.php b/app/code/Magento/Deploy/Test/Unit/Console/Command/App/ConfigStatusCommandTest.php
index 3e400a28537..7822e75930e 100644
--- a/app/code/Magento/Deploy/Test/Unit/Console/Command/App/ConfigStatusCommandTest.php
+++ b/app/code/Magento/Deploy/Test/Unit/Console/Command/App/ConfigStatusCommandTest.php
@@ -73,4 +73,4 @@ class ConfigStatusCommandTest extends \PHPUnit\Framework\TestCase
             ],
         ];
     }
-}
\ No newline at end of file
+}
-- 
GitLab


From 14205b7c4997603daf657faddcdecd2c478245b7 Mon Sep 17 00:00:00 2001
From: Oleksii Korshenko <okorshenko@magento.com>
Date: Thu, 9 Nov 2017 19:54:53 -0600
Subject: [PATCH 165/380] MAGETWO-82265: Fixed missing 'size' and 'type' props
 on a third-party category images #11541

---
 app/code/Magento/Catalog/Model/Category/DataProvider.php | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/app/code/Magento/Catalog/Model/Category/DataProvider.php b/app/code/Magento/Catalog/Model/Category/DataProvider.php
index a1ccfc9f209..5f02e50082e 100644
--- a/app/code/Magento/Catalog/Model/Category/DataProvider.php
+++ b/app/code/Magento/Catalog/Model/Category/DataProvider.php
@@ -494,8 +494,8 @@ class DataProvider extends \Magento\Ui\DataProvider\AbstractDataProvider
 
                     $categoryData[$attributeCode][0]['name'] = $fileName;
                     $categoryData[$attributeCode][0]['url'] = $category->getImageUrl($attributeCode);
-                    $categoryData['image'][0]['size'] = isset($stat) ? $stat['size'] : 0;
-                    $categoryData['image'][0]['type'] = $mime;
+                    $categoryData[$attributeCode][0]['size'] = isset($stat) ? $stat['size'] : 0;
+                    $categoryData[$attributeCode][0]['type'] = $mime;
                 }
             }
         }
-- 
GitLab


From e9239727aca131f442f93558a1cd185ed537d21d Mon Sep 17 00:00:00 2001
From: Ji Lu <jilu1@magento.com>
Date: Wed, 4 Oct 2017 01:04:15 +0300
Subject: [PATCH 166/380] MQE-377: Add a wishlist test to demo data persistence
 through frontend http request.

---
 .../StorefrontExistingCustomerLoginCest.xml   | 16 +++----
 .../Store/Cest/AdminCreateStoreGroupCest.xml  |  9 ++--
 .../Store/Metadata/store-meta.xml             |  2 +-
 .../Store/Metadata/store_group-meta.xml       |  2 +-
 .../StorefrontCustomerCreateWishlistCest.xml  | 47 +++++++++++++++++++
 .../Wishlist/Data/WishlistData.xml            | 10 ++++
 .../Wishlist/Metadata/wishlist-meta.xml       | 12 +++++
 .../Page/StorefrontCustomerWishlistPage.xml   | 14 ++++++
 .../StorefrontCustomerWishlistSection.xml     | 14 ++++++
 9 files changed, 111 insertions(+), 15 deletions(-)
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Wishlist/Cest/StorefrontCustomerCreateWishlistCest.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Wishlist/Data/WishlistData.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Wishlist/Metadata/wishlist-meta.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Wishlist/Page/StorefrontCustomerWishlistPage.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Wishlist/Section/StorefrontCustomerWishlistSection.xml

diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Cest/StorefrontExistingCustomerLoginCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Cest/StorefrontExistingCustomerLoginCest.xml
index 0d6212a96e7..db78d89bb8d 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Cest/StorefrontExistingCustomerLoginCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Cest/StorefrontExistingCustomerLoginCest.xml
@@ -14,10 +14,10 @@
             <stories value="Existing Customer can Login on the Storefront"/>
         </annotations>
         <before>
-            <createData entity="Simple_US_Customer" mergeKey="Simple_US_Customer"/>
+            <createData mergeKey="customer" entity="Simple_US_Customer"/>
         </before>
         <after>
-            <deleteData createDataKey="Simple_US_Customer" mergeKey="Simple_US_Customer"/>
+            <deleteData mergeKey="deleteCustomer" createDataKey="customer" />
         </after>
         <test name="ExistingCustomerLoginStorefrontTest">
             <annotations>
@@ -31,13 +31,13 @@
                 <env value="phantomjs"/>
                 <env value="headless"/>
             </annotations>
-            <amOnPage mergeKey="amOnSignInPage"  url="customer/account/login/"/>
-            <fillField  mergeKey="fillEmail" userInput="$$Simple_US_Customer.email$$" selector="{{StorefrontCustomerSignInFormSection.emailField}}"/>
-            <fillField  mergeKey="fillPassword" userInput="{{Simple_US_Customer.password}}" selector="{{StorefrontCustomerSignInFormSection.passwordField}}"/>
+            <amOnPage mergeKey="amOnSignInPage"  url="{{StorefrontCustomerSignInPage}}"/>
+            <fillField  mergeKey="fillEmail" userInput="$$customer.email$$" selector="{{StorefrontCustomerSignInFormSection.emailField}}"/>
+            <fillField  mergeKey="fillPassword" userInput="$$customer.password$$" selector="{{StorefrontCustomerSignInFormSection.passwordField}}"/>
             <click mergeKey="clickSignInAccountButton" selector="{{StorefrontCustomerSignInFormSection.signInAccountButton}}"/>
-            <see mergeKey="seeFirstName" userInput="{{Simple_US_Customer.firstname}}" selector="{{StorefrontCustomerDashboardAccountInformationSection.ContactInformation}}" />
-            <see mergeKey="seeLastName" userInput="{{Simple_US_Customer.lastname}}" selector="{{StorefrontCustomerDashboardAccountInformationSection.ContactInformation}}" />
-            <see mergeKey="seeEmail" userInput="$$Simple_US_Customer.email$$" selector="{{StorefrontCustomerDashboardAccountInformationSection.ContactInformation}}" />
+            <see mergeKey="seeFirstName" userInput="$$customer.firstname$$" selector="{{StorefrontCustomerDashboardAccountInformationSection.ContactInformation}}" />
+            <see mergeKey="seeLastName" userInput="$$customer.lastname$$" selector="{{StorefrontCustomerDashboardAccountInformationSection.ContactInformation}}" />
+            <see mergeKey="seeEmail" userInput="$$customer.email$$" selector="{{StorefrontCustomerDashboardAccountInformationSection.ContactInformation}}" />
         </test>
     </cest>
 </config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/Cest/AdminCreateStoreGroupCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/Cest/AdminCreateStoreGroupCest.xml
index 7d1c8895b41..b5f38258783 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/Cest/AdminCreateStoreGroupCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/Cest/AdminCreateStoreGroupCest.xml
@@ -36,18 +36,17 @@
             <click mergeKey="s11" selector="{{AdminStoresGridSection.resetButton}}"/>
             <waitForPageLoad mergeKey="s15" time="10"/>
 
-            <!-- Uncomment after MFTF Bug MQE-391 is fixed -->
-            <!--fillField mergeKey="s17" selector="{{AdminStoresGridSection.storeGrpFilterTextField}}" userInput="$$b1.group[name]$$"/-->
+            <fillField mergeKey="s17" selector="{{AdminStoresGridSection.storeGrpFilterTextField}}" userInput="$$b1.group[name]$$"/>
             <click mergeKey="s19" selector="{{AdminStoresGridSection.searchButton}}"/>
             <waitForPageLoad mergeKey="s21" time="10"/>
-            <!--see mergeKey="s23" selector="{{AdminStoresGridSection.storeGrpNameInFirstRow}}" userInput="$$b1.group[name]$$"/-->
+            <see mergeKey="s23" selector="{{AdminStoresGridSection.storeGrpNameInFirstRow}}" userInput="$$b1.group[name]$$"/>
 
             <click mergeKey="s31" selector="{{AdminStoresGridSection.resetButton}}"/>
             <waitForPageLoad mergeKey="s35" time="10"/>
-            <!--fillField mergeKey="s37" selector="{{AdminStoresGridSection.storeGrpFilterTextField}}" userInput="$$b2.group[name]$$"/-->
+            <fillField mergeKey="s37" selector="{{AdminStoresGridSection.storeGrpFilterTextField}}" userInput="$$b2.group[name]$$"/>
             <click mergeKey="s39" selector="{{AdminStoresGridSection.searchButton}}"/>
             <waitForPageLoad mergeKey="s41" time="10"/>
-            <!--see mergeKey="s43" selector="{{AdminStoresGridSection.storeGrpNameInFirstRow}}" userInput="$$b2.group[name]$$"/-->
+            <see mergeKey="s43" selector="{{AdminStoresGridSection.storeGrpNameInFirstRow}}" userInput="$$b2.group[name]$$"/>
         </test>
     </cest>
 </config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/Metadata/store-meta.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/Metadata/store-meta.xml
index 0cf7683f87c..e31443927a1 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/Metadata/store-meta.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/Metadata/store-meta.xml
@@ -8,7 +8,7 @@
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataOperation.xsd">
     <operation name="CreateStore" dataType="store" type="create"
-               auth="adminFormKey" url="/admin/system_store/save" method="POST" successRegex="messages-message-success" returnRegex="" >
+               auth="adminFormKey" url="/admin/system_store/save" method="POST" successRegex="/messages-message-success/" returnRegex="" >
         <object dataType="store" key="store">
             <field key="group_id">string</field>
             <field key="name">string</field>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/Metadata/store_group-meta.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/Metadata/store_group-meta.xml
index a4820aea080..a090e706d12 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/Metadata/store_group-meta.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/Metadata/store_group-meta.xml
@@ -8,7 +8,7 @@
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataOperation.xsd">
     <operation name="CreateStoreGroup" dataType="group" type="create"
-               auth="adminFormKey" url="/admin/system_store/save" method="POST" successRegex="messages-message-success" returnRegex="" >
+               auth="adminFormKey" url="/admin/system_store/save" method="POST" successRegex="/messages-message-success/" returnRegex="" >
         <contentType>application/x-www-form-urlencoded</contentType>
         <object dataType="group" key="group">
             <field key="group_id">string</field>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Wishlist/Cest/StorefrontCustomerCreateWishlistCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Wishlist/Cest/StorefrontCustomerCreateWishlistCest.xml
new file mode 100644
index 00000000000..a66922db382
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Wishlist/Cest/StorefrontCustomerCreateWishlistCest.xml
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Test XML Example -->
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Test/etc/testSchema.xsd">
+    <cest name="StorefrontCustomerCreateWishlistCest">
+        <annotations>
+            <features value="Persist a wishlist for a customer"/>
+            <stories value="Persist a wishlist for a customer"/>
+            <env value="chrome"/>
+            <env value="firefox"/>
+            <env value="phantomjs"/>
+            <group value="wishlist"/>
+        </annotations>
+        <before>
+            <createData mergeKey="category" entity="SimpleSubCategory"/>
+            <createData mergeKey="product" entity="SimpleProduct" >
+                <required-entity persistedKey="category"/>
+            </createData>
+            <createData mergeKey="customer" entity="Simple_US_Customer"/>
+            <createData mergeKey="wishlist" entity="Wishlist">
+                <required-entity persistedKey="customer"/>
+                <required-entity persistedKey="product"/>
+            </createData>
+        </before>
+        <after>
+            <deleteData mergeKey="deleteProduct" createDataKey="product"/>
+            <deleteData mergeKey="deleteCategory" createDataKey="category"/>
+            <deleteData mergeKey="deleteCustomer" createDataKey="customer"/>
+        </after>
+        <test name="StorefrontCustomerCreateWishlistTest">
+            <annotations>
+                <title value="Persist a wishlist for a customer"/>
+                <description value="Persist a wishlist for a customer"/>
+            </annotations>
+            <amOnPage mergeKey="amOnSignInPage"  url="{{StorefrontCustomerSignInPage}}"/>
+            <fillField  mergeKey="fillEmail" userInput="$$customer.email$$" selector="{{StorefrontCustomerSignInFormSection.emailField}}"/>
+            <fillField  mergeKey="fillPassword" userInput="$$customer.password$$" selector="{{StorefrontCustomerSignInFormSection.passwordField}}"/>
+            <waitForElementVisible mergeKey="waitForButton" selector="{{StorefrontCustomerSignInFormSection.signInAccountButton}}"/>
+            <click mergeKey="clickSignInAccountButton" selector="{{StorefrontCustomerSignInFormSection.signInAccountButton}}"/>
+            <see mergeKey="seeFirstName" userInput="$$customer.firstname$$" selector="{{StorefrontCustomerDashboardAccountInformationSection.ContactInformation}}" />
+            <see mergeKey="seeLastName" userInput="$$customer.lastname$$" selector="{{StorefrontCustomerDashboardAccountInformationSection.ContactInformation}}" />
+            <see mergeKey="seeEmail" userInput="$$customer.email$$" selector="{{StorefrontCustomerDashboardAccountInformationSection.ContactInformation}}" />
+            <waitForPageLoad mergeKey="15"/>
+            <amOnPage mergeKey="amOnWishlist" url="{{StorefrontCustomerWishlistPage}}"/>
+            <see mergeKey="seeInField" userInput="$$product.name$$" selector="{{StorefrontCustomerWishlistSection.productItemName}}"/>
+        </test>
+    </cest>
+</config>
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Wishlist/Data/WishlistData.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Wishlist/Data/WishlistData.xml
new file mode 100644
index 00000000000..343923fada8
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Wishlist/Data/WishlistData.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataProfileSchema.xsd">
+    <entity name="Wishlist" type="wishlist">
+        <data key="id">null</data>
+        <var key="product" entityType="product" entityKey="id"/>
+        <var key="customer_email" entityType="customer" entityKey="email"/>
+        <var key="customer_password" entityType="customer" entityKey="password"/>
+    </entity>
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Wishlist/Metadata/wishlist-meta.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Wishlist/Metadata/wishlist-meta.xml
new file mode 100644
index 00000000000..1a542d465ba
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Wishlist/Metadata/wishlist-meta.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataOperation.xsd">
+    <operation name="CreateWishlist" dataType="wishlist" type="create"
+               auth="customerFormKey" url="/wishlist/index/add/" method="POST" successRegex="" returnRegex="~\/wishlist_id\/(\d*?)\/~" >
+        <contentType>application/x-www-form-urlencoded</contentType>
+        <field key="product">integer</field>
+        <field key="customer_email">string</field>
+        <field key="customer_password">string</field>
+    </operation>
+</config>
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Wishlist/Page/StorefrontCustomerWishlistPage.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Wishlist/Page/StorefrontCustomerWishlistPage.xml
new file mode 100644
index 00000000000..b488387c8bf
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Wishlist/Page/StorefrontCustomerWishlistPage.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/PageObject.xsd">
+    <page name="StorefrontCustomerWishlistPage" urlPath="/wishlist/" module="Magento_Wishlist">
+        <section name="StorefrontCustomerWishlistSection" />
+    </page>
+</config>
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Wishlist/Section/StorefrontCustomerWishlistSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Wishlist/Section/StorefrontCustomerWishlistSection.xml
new file mode 100644
index 00000000000..3f40af87a50
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Wishlist/Section/StorefrontCustomerWishlistSection.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
+    <section name="StorefrontCustomerWishlistSection">
+        <element name="productItemName" type="text" selector=".products-grid .product-item-name a"/>
+    </section>
+</config>
\ No newline at end of file
-- 
GitLab


From 229e38144d08227daa6f8fdb785e5571a59ebf69 Mon Sep 17 00:00:00 2001
From: Ji Lu <jilu1@magento.com>
Date: Fri, 6 Oct 2017 22:08:11 +0300
Subject: [PATCH 167/380] MQE-377: Addressed review feedback regarding page url
 reference.

---
 .../Magento/FunctionalTest/Backend/Cest/AdminLoginCest.xml  | 2 +-
 .../FunctionalTest/Catalog/Cest/AdminCreateCategoryCest.xml | 4 ++--
 .../Catalog/Cest/AdminCreateConfigurableProductCest.xml     | 2 +-
 .../Checkout/Cest/StorefrontCustomerCheckoutCest.xml        | 2 +-
 .../Checkout/Cest/StorefrontGuestCheckoutCest.xml           | 4 ++--
 .../FunctionalTest/Cms/Cest/AdminCreateCmsPageCest.xml      | 4 ++--
 .../Customer/Cest/StorefrontExistingCustomerLoginCest.xml   | 2 +-
 .../FunctionalTest/Sales/Cest/AdminCreateInvoiceCest.xml    | 6 +++---
 .../FunctionalTest/Store/Cest/AdminCreateStoreGroupCest.xml | 6 ++----
 .../Wishlist/Cest/StorefrontCustomerCreateWishlistCest.xml  | 4 ++--
 10 files changed, 17 insertions(+), 19 deletions(-)

diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/Cest/AdminLoginCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/Cest/AdminLoginCest.xml
index 4b14e76edb0..a5c9c0c81cc 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/Cest/AdminLoginCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/Cest/AdminLoginCest.xml
@@ -26,7 +26,7 @@
                 <env value="phantomjs"/>
                 <env value="headless"/>
             </annotations>
-            <amOnPage url="{{AdminLoginPage}}" mergeKey="amOnAdminLoginPage"/>
+            <amOnPage url="{{AdminLoginPage.url}}" mergeKey="amOnAdminLoginPage"/>
             <fillField selector="{{AdminLoginFormSection.username}}" userInput="{{_ENV.MAGENTO_ADMIN_USERNAME}}" mergeKey="fillUsername"/>
             <fillField selector="{{AdminLoginFormSection.password}}" userInput="{{_ENV.MAGENTO_ADMIN_PASSWORD}}" mergeKey="fillPassword"/>
             <click selector="{{AdminLoginFormSection.signIn}}" mergeKey="clickOnSignIn"/>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Cest/AdminCreateCategoryCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Cest/AdminCreateCategoryCest.xml
index 0cb12ebe6df..550e668b080 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Cest/AdminCreateCategoryCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Cest/AdminCreateCategoryCest.xml
@@ -26,11 +26,11 @@
                 <env value="chrome"/>
                 <env value="headless"/>
             </annotations>
-            <amOnPage url="{{AdminLoginPage}}" mergeKey="amOnAdminLoginPage"/>
+            <amOnPage url="{{AdminLoginPage.url}}" mergeKey="amOnAdminLoginPage"/>
             <fillField selector="{{AdminLoginFormSection.username}}" userInput="{{_ENV.MAGENTO_ADMIN_USERNAME}}" mergeKey="fillUsername"/>
             <fillField selector="{{AdminLoginFormSection.password}}" userInput="{{_ENV.MAGENTO_ADMIN_PASSWORD}}" mergeKey="fillPassword"/>
             <click selector="{{AdminLoginFormSection.signIn}}" mergeKey="clickOnSignIn"/>
-            <amOnPage url="{{AdminCategoryPage}}" mergeKey="navigateToCategoryPage"/>
+            <amOnPage url="{{AdminCategoryPage.url}}" mergeKey="navigateToCategoryPage"/>
             <waitForPageLoad mergeKey="waitForPageLoad1"/>
             <click selector="{{AdminCategorySidebarActionSection.AddSubcategoryButton}}" mergeKey="clickOnAddSubCategory"/>
             <fillField selector="{{AdminCategoryBasicFieldSection.CategoryNameInput}}" userInput="{{SimpleSubCategory.name}}" mergeKey="enterCategoryName"/>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Cest/AdminCreateConfigurableProductCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Cest/AdminCreateConfigurableProductCest.xml
index a595cf8b476..69f1a7ea6b0 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Cest/AdminCreateConfigurableProductCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Cest/AdminCreateConfigurableProductCest.xml
@@ -40,7 +40,7 @@
             <click selector="{{AdminCategoryMainActionsSection.SaveButton}}" mergeKey="clickOnSaveCategory"/>
             <seeElement selector="{{AdminCategoryMessagesSection.SuccessMessage}}" mergeKey="assertSuccessMessage"/>
 
-            <amOnPage url="{{AdminProductIndexPage.urlPath}}" mergeKey="amOnProductGridPage"/>
+            <amOnPage url="{{AdminProductIndexPage.url}}" mergeKey="amOnProductGridPage"/>
             <waitForPageLoad mergeKey="waitForPageLoad2"/>
             <click selector="{{AdminProductGridActionSection.addProductToggle}}" mergeKey="clickOnAddProductToggle"/>
             <click selector="{{AdminProductGridActionSection.addConfigurableProduct}}" mergeKey="clickOnAddConfigurableProduct"/>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Cest/StorefrontCustomerCheckoutCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Cest/StorefrontCustomerCheckoutCest.xml
index 20442a48733..cd529555ab6 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Cest/StorefrontCustomerCheckoutCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Cest/StorefrontCustomerCheckoutCest.xml
@@ -63,7 +63,7 @@
             <grabTextFrom mergeKey="s53" selector="{{CheckoutSuccessMainSection.orderNumber22}}" returnVariable="orderNumber" />
             <see mergeKey="s55" selector="{{CheckoutSuccessMainSection.success}}" userInput="Your order number is:" />
 
-            <amOnPage mergeKey="s59" url="{{AdminLoginPage}}" />
+            <amOnPage mergeKey="s59" url="{{AdminLoginPage.url}}" />
             <fillField mergeKey="s61" selector="{{AdminLoginFormSection.username}}" userInput="{{_ENV.MAGENTO_ADMIN_USERNAME}}" />
             <fillField mergeKey="s63" selector="{{AdminLoginFormSection.password}}" userInput="{{_ENV.MAGENTO_ADMIN_PASSWORD}}" />
             <click mergeKey="s65" selector="{{AdminLoginFormSection.signIn}}" />
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Cest/StorefrontGuestCheckoutCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Cest/StorefrontGuestCheckoutCest.xml
index 03e36ff28d9..fa441fd6737 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Cest/StorefrontGuestCheckoutCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Cest/StorefrontGuestCheckoutCest.xml
@@ -62,11 +62,11 @@
             <grabTextFrom selector="{{CheckoutSuccessMainSection.orderNumber}}" returnVariable="orderNumber" mergeKey="grabOrderNumber"/>
             <see selector="{{CheckoutSuccessMainSection.success}}" userInput="Your order # is:" mergeKey="seeOrderNumber"/>
             <see selector="{{CheckoutSuccessMainSection.success}}" userInput="We'll email you an order confirmation with details and tracking info." mergeKey="seeEmailYou"/>
-            <amOnPage url="{{AdminLoginPage}}" mergeKey="navigateToAdmin"/>
+            <amOnPage url="{{AdminLoginPage.url}}" mergeKey="navigateToAdmin"/>
             <fillField selector="{{AdminLoginFormSection.username}}" userInput="{{_ENV.MAGENTO_ADMIN_USERNAME}}" mergeKey="fillUsername"/>
             <fillField selector="{{AdminLoginFormSection.password}}" userInput="{{_ENV.MAGENTO_ADMIN_PASSWORD}}" mergeKey="fillPassword"/>
             <click selector="{{AdminLoginFormSection.signIn}}" mergeKey="clickLogin"/>
-            <amOnPage url="{{OrdersPage}}" mergeKey="onOrdersPage"/>
+            <amOnPage url="{{OrdersPage.url}}" mergeKey="onOrdersPage"/>
             <waitForElementNotVisible selector="{{OrdersGridSection.spinner}}" time="30" mergeKey="waitForOrdersPage"/>
             <fillField selector="{{OrdersGridSection.search}}" variable="orderNumber" mergeKey="fillOrderNum"/>
             <click selector="{{OrdersGridSection.submitSearch}}" mergeKey="submitSearchOrderNum"/>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Cest/AdminCreateCmsPageCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Cest/AdminCreateCmsPageCest.xml
index cf1f9564c4b..9e1525c3670 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Cest/AdminCreateCmsPageCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Cest/AdminCreateCmsPageCest.xml
@@ -27,11 +27,11 @@
                 <env value="firefox"/>
                 <env value="headless"/>
             </annotations>
-            <amOnPage url="{{AdminLoginPage}}" mergeKey="navigateToAdmin"/>
+            <amOnPage url="{{AdminLoginPage.url}}" mergeKey="navigateToAdmin"/>
             <fillField selector="{{AdminLoginFormSection.username}}" userInput="{{_ENV.MAGENTO_ADMIN_USERNAME}}" mergeKey="fillUsername"/>
             <fillField selector="{{AdminLoginFormSection.password}}" userInput="{{_ENV.MAGENTO_ADMIN_PASSWORD}}" mergeKey="fillPassword"/>
             <click selector="{{AdminLoginFormSection.signIn}}" mergeKey="clickLogin"/>
-            <amOnPage url="{{CmsPagesPage}}" mergeKey="amOnPagePagesGrid"/>
+            <amOnPage url="{{CmsPagesPage.url}}" mergeKey="amOnPagePagesGrid"/>
             <waitForPageLoad mergeKey="waitForPageLoad1"/>
             <click selector="{{CmsPagesPageActionsSection.addNewPage}}" mergeKey="clickAddNewPage"/>
             <fillField selector="{{CmsNewPagePageBasicFieldsSection.pageTitle}}" userInput="{{_defaultCmsPage.title}}" mergeKey="fillFieldTitle"/>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Cest/StorefrontExistingCustomerLoginCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Cest/StorefrontExistingCustomerLoginCest.xml
index db78d89bb8d..79fb72a5ff5 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Cest/StorefrontExistingCustomerLoginCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Cest/StorefrontExistingCustomerLoginCest.xml
@@ -31,7 +31,7 @@
                 <env value="phantomjs"/>
                 <env value="headless"/>
             </annotations>
-            <amOnPage mergeKey="amOnSignInPage"  url="{{StorefrontCustomerSignInPage}}"/>
+            <amOnPage mergeKey="amOnSignInPage"  url="{{StorefrontCustomerSignInPage.url}}"/>
             <fillField  mergeKey="fillEmail" userInput="$$customer.email$$" selector="{{StorefrontCustomerSignInFormSection.emailField}}"/>
             <fillField  mergeKey="fillPassword" userInput="$$customer.password$$" selector="{{StorefrontCustomerSignInFormSection.passwordField}}"/>
             <click mergeKey="clickSignInAccountButton" selector="{{StorefrontCustomerSignInFormSection.signInAccountButton}}"/>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Cest/AdminCreateInvoiceCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Cest/AdminCreateInvoiceCest.xml
index 7ff96a3bed9..c043fe298f7 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Cest/AdminCreateInvoiceCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Cest/AdminCreateInvoiceCest.xml
@@ -57,13 +57,13 @@
             <grabTextFrom selector="{{CheckoutSuccessMainSection.orderNumber}}" returnVariable="orderNumber" mergeKey="grabOrderNumber"/>
             <!-- end todo -->
 
-            <amOnPage url="{{AdminLoginPage}}" mergeKey="goToAdmin"/>
+            <amOnPage url="{{AdminLoginPage.url}}" mergeKey="goToAdmin"/>
             <waitForPageLoad mergeKey="waitForPageLoad1"/>
             <fillField selector="{{AdminLoginFormSection.username}}" userInput="{{_ENV.MAGENTO_ADMIN_USERNAME}}" mergeKey="fillUsername"/>
             <fillField selector="{{AdminLoginFormSection.password}}" userInput="{{_ENV.MAGENTO_ADMIN_PASSWORD}}" mergeKey="fillPassword"/>
             <click selector="{{AdminLoginFormSection.signIn}}" mergeKey="clickLogin"/>
 
-            <amOnPage url="{{OrdersPage}}" mergeKey="onOrdersPage"/>
+            <amOnPage url="{{OrdersPage.url}}" mergeKey="onOrdersPage"/>
             <waitForElementNotVisible selector="{{OrdersGridSection.spinner}}" time="10" mergeKey="waitSpinner1"/>
             <fillField selector="{{OrdersGridSection.search}}" variable="orderNumber" mergeKey="searchOrderNum"/>
             <click selector="{{OrdersGridSection.submitSearch}}" mergeKey="submitSearch"/>
@@ -79,7 +79,7 @@
             <see selector="{{OrderDetailsInvoicesSection.content}}" userInput="John Doe" mergeKey="seeInvoice2"/>
             <click selector="{{OrderDetailsOrderViewSection.information}}" mergeKey="clickInformation"/>
             <see selector="{{OrderDetailsInformationSection.orderStatus}}" userInput="Processing" mergeKey="seeOrderStatus"/>
-            <amOnPage url="{{InvoicesPage}}" mergeKey="goToInvoices"/>
+            <amOnPage url="{{InvoicesPage.url}}" mergeKey="goToInvoices"/>
             <waitForElementNotVisible selector="{{InvoicesGridSection.spinner}}" time="10" mergeKey="waitSpinner4"/>
             <click selector="{{InvoicesGridSection.filter}}" mergeKey="clickFilters"/>
             <fillField selector="{{InvoicesFiltersSection.orderNum}}" variable="orderNumber" mergeKey="searchOrderNum2"/>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/Cest/AdminCreateStoreGroupCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/Cest/AdminCreateStoreGroupCest.xml
index b5f38258783..53692f3f41d 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/Cest/AdminCreateStoreGroupCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/Cest/AdminCreateStoreGroupCest.xml
@@ -24,14 +24,12 @@
             <annotations>
                 <title value="Create a store group in admin"/>
                 <description value="Create a store group in admin"/>
-                <severity value="CRITICAL"/>
-                <testCaseId value="MAGETWO-?????"/>
             </annotations>
-            <amOnPage mergeKey="s1" url="{{AdminLoginPage}}"/>
+            <amOnPage mergeKey="s1" url="{{AdminLoginPage.url}}"/>
             <fillField mergeKey="s3" selector="{{AdminLoginFormSection.username}}" userInput="{{_ENV.MAGENTO_ADMIN_USERNAME}}"/>
             <fillField mergeKey="s5" selector="{{AdminLoginFormSection.password}}" userInput="{{_ENV.MAGENTO_ADMIN_PASSWORD}}"/>
             <click mergeKey="s7" selector="{{AdminLoginFormSection.signIn}}"/>
-            <amOnPage mergeKey="s9" url="{{AdminSystemStorePage}}"/>
+            <amOnPage mergeKey="s9" url="{{AdminSystemStorePage.url}}"/>
 
             <click mergeKey="s11" selector="{{AdminStoresGridSection.resetButton}}"/>
             <waitForPageLoad mergeKey="s15" time="10"/>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Wishlist/Cest/StorefrontCustomerCreateWishlistCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Wishlist/Cest/StorefrontCustomerCreateWishlistCest.xml
index a66922db382..6a31e358f53 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Wishlist/Cest/StorefrontCustomerCreateWishlistCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Wishlist/Cest/StorefrontCustomerCreateWishlistCest.xml
@@ -31,7 +31,7 @@
                 <title value="Persist a wishlist for a customer"/>
                 <description value="Persist a wishlist for a customer"/>
             </annotations>
-            <amOnPage mergeKey="amOnSignInPage"  url="{{StorefrontCustomerSignInPage}}"/>
+            <amOnPage mergeKey="amOnSignInPage"  url="{{StorefrontCustomerSignInPage.url}}"/>
             <fillField  mergeKey="fillEmail" userInput="$$customer.email$$" selector="{{StorefrontCustomerSignInFormSection.emailField}}"/>
             <fillField  mergeKey="fillPassword" userInput="$$customer.password$$" selector="{{StorefrontCustomerSignInFormSection.passwordField}}"/>
             <waitForElementVisible mergeKey="waitForButton" selector="{{StorefrontCustomerSignInFormSection.signInAccountButton}}"/>
@@ -40,7 +40,7 @@
             <see mergeKey="seeLastName" userInput="$$customer.lastname$$" selector="{{StorefrontCustomerDashboardAccountInformationSection.ContactInformation}}" />
             <see mergeKey="seeEmail" userInput="$$customer.email$$" selector="{{StorefrontCustomerDashboardAccountInformationSection.ContactInformation}}" />
             <waitForPageLoad mergeKey="15"/>
-            <amOnPage mergeKey="amOnWishlist" url="{{StorefrontCustomerWishlistPage}}"/>
+            <amOnPage mergeKey="amOnWishlist" url="{{StorefrontCustomerWishlistPage.url}}"/>
             <see mergeKey="seeInField" userInput="$$product.name$$" selector="{{StorefrontCustomerWishlistSection.productItemName}}"/>
         </test>
     </cest>
-- 
GitLab


From 55684096f29589b68daaec88f28f6ab9d0f4b086 Mon Sep 17 00:00:00 2001
From: Ji Lu <jilu1@magento.com>
Date: Tue, 10 Oct 2017 17:54:41 +0300
Subject: [PATCH 168/380] MQE-377: Addressed review feedback regarding wishlist
 test.

---
 ... StorefrontDeletePersistedWishlistCest.xml} | 18 +++++++++++-------
 .../StorefrontCustomerWishlistSection.xml      |  4 +++-
 2 files changed, 14 insertions(+), 8 deletions(-)
 rename dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Wishlist/Cest/{StorefrontCustomerCreateWishlistCest.xml => StorefrontDeletePersistedWishlistCest.xml} (71%)

diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Wishlist/Cest/StorefrontCustomerCreateWishlistCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Wishlist/Cest/StorefrontDeletePersistedWishlistCest.xml
similarity index 71%
rename from dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Wishlist/Cest/StorefrontCustomerCreateWishlistCest.xml
rename to dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Wishlist/Cest/StorefrontDeletePersistedWishlistCest.xml
index 6a31e358f53..1c3ebf7c0ab 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Wishlist/Cest/StorefrontCustomerCreateWishlistCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Wishlist/Cest/StorefrontDeletePersistedWishlistCest.xml
@@ -1,10 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!-- Test XML Example -->
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Test/etc/testSchema.xsd">
-    <cest name="StorefrontCustomerCreateWishlistCest">
+    <cest name="StorefrontDeletePersistedWishlistCest">
         <annotations>
-            <features value="Persist a wishlist for a customer"/>
-            <stories value="Persist a wishlist for a customer"/>
+            <features value="Delete a persist wishlist for a customer"/>
+            <stories value="Delete a persist wishlist for a customer"/>
             <env value="chrome"/>
             <env value="firefox"/>
             <env value="phantomjs"/>
@@ -26,10 +26,10 @@
             <deleteData mergeKey="deleteCategory" createDataKey="category"/>
             <deleteData mergeKey="deleteCustomer" createDataKey="customer"/>
         </after>
-        <test name="StorefrontCustomerCreateWishlistTest">
+        <test name="StorefrontDeletePersistedWishlistTest">
             <annotations>
-                <title value="Persist a wishlist for a customer"/>
-                <description value="Persist a wishlist for a customer"/>
+                <title value="Delete a persist wishlist for a customer"/>
+                <description value="Delete a persist wishlist for a customer"/>
             </annotations>
             <amOnPage mergeKey="amOnSignInPage"  url="{{StorefrontCustomerSignInPage.url}}"/>
             <fillField  mergeKey="fillEmail" userInput="$$customer.email$$" selector="{{StorefrontCustomerSignInFormSection.emailField}}"/>
@@ -41,7 +41,11 @@
             <see mergeKey="seeEmail" userInput="$$customer.email$$" selector="{{StorefrontCustomerDashboardAccountInformationSection.ContactInformation}}" />
             <waitForPageLoad mergeKey="15"/>
             <amOnPage mergeKey="amOnWishlist" url="{{StorefrontCustomerWishlistPage.url}}"/>
-            <see mergeKey="seeInField" userInput="$$product.name$$" selector="{{StorefrontCustomerWishlistSection.productItemName}}"/>
+            <see mergeKey="seeWishlist" userInput="$$product.name$$" selector="{{StorefrontCustomerWishlistSection.productItemNameText}}"/>
+            <moveMouseOver mergeKey="mouseOver" selector="{{StorefrontCustomerWishlistSection.productItemNameText}}"/>
+            <waitForElementVisible mergeKey="waitForRemoveButton" selector="{{StorefrontCustomerWishlistSection.removeWishlistButton}}"/>
+            <click mergeKey="clickRemove" selector="{{StorefrontCustomerWishlistSection.removeWishlistButton}}"/>
+            <see mergeKey="seeEmptyWishlist" userInput="You have no items in your wish list" selector="{{StorefrontCustomerWishlistSection.emptyWishlistText}}"/>
         </test>
     </cest>
 </config>
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Wishlist/Section/StorefrontCustomerWishlistSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Wishlist/Section/StorefrontCustomerWishlistSection.xml
index 3f40af87a50..0379cc24e89 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Wishlist/Section/StorefrontCustomerWishlistSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Wishlist/Section/StorefrontCustomerWishlistSection.xml
@@ -9,6 +9,8 @@
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
     <section name="StorefrontCustomerWishlistSection">
-        <element name="productItemName" type="text" selector=".products-grid .product-item-name a"/>
+        <element name="productItemNameText" type="text" selector=".products-grid .product-item-name a"/>
+        <element name="removeWishlistButton" type="button" selector=".products-grid .btn-remove.action.delete>span" timeout="30"/>
+        <element name="emptyWishlistText" type="text" selector=".message.info.empty>span"/>
     </section>
 </config>
\ No newline at end of file
-- 
GitLab


From e807e1c9a72060703a0e5b916fa1e0bca023c4d7 Mon Sep 17 00:00:00 2001
From: Ji Lu <jilu1@magento.com>
Date: Tue, 10 Oct 2017 22:01:02 +0300
Subject: [PATCH 169/380] MQE-377: resolved additional merge conflicts in
 wishlist test.

---
 .../Wishlist/Cest/StorefrontDeletePersistedWishlistCest.xml | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Wishlist/Cest/StorefrontDeletePersistedWishlistCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Wishlist/Cest/StorefrontDeletePersistedWishlistCest.xml
index 1c3ebf7c0ab..a424e6b921f 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Wishlist/Cest/StorefrontDeletePersistedWishlistCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Wishlist/Cest/StorefrontDeletePersistedWishlistCest.xml
@@ -13,12 +13,12 @@
         <before>
             <createData mergeKey="category" entity="SimpleSubCategory"/>
             <createData mergeKey="product" entity="SimpleProduct" >
-                <required-entity persistedKey="category"/>
+                <required-entity createDataKey="category"/>
             </createData>
             <createData mergeKey="customer" entity="Simple_US_Customer"/>
             <createData mergeKey="wishlist" entity="Wishlist">
-                <required-entity persistedKey="customer"/>
-                <required-entity persistedKey="product"/>
+                <required-entity createDataKey="customer"/>
+                <required-entity createDataKey="product"/>
             </createData>
         </before>
         <after>
-- 
GitLab


From 5bdb89160a854d0637146d9d202d100e5c47d447 Mon Sep 17 00:00:00 2001
From: Ian Meron <imeron@magento.com>
Date: Wed, 11 Oct 2017 22:46:28 +0300
Subject: [PATCH 170/380] MQE-345: [DevOps] [Customizability] Create suite
 schema declaration and supporting interpretation

 - add new sample suite file
 - add robo command to include suite generate
---
 dev/tests/acceptance/RoboFile.php               | 17 +++++++++++++++++
 .../acceptance/tests/_suite/sampleSuite.xml     | 13 +++++++++++++
 2 files changed, 30 insertions(+)
 create mode 100644 dev/tests/acceptance/tests/_suite/sampleSuite.xml

diff --git a/dev/tests/acceptance/RoboFile.php b/dev/tests/acceptance/RoboFile.php
index ac1e9f40763..6ebbb756393 100644
--- a/dev/tests/acceptance/RoboFile.php
+++ b/dev/tests/acceptance/RoboFile.php
@@ -43,6 +43,23 @@ class RoboFile extends \Robo\Tasks
         $this->say("Generate Tests Command Run");
     }
 
+    /**
+     * Generate a suite based on name(s) passed in as args
+     */
+    function generateSuite(array $args)
+    {
+        if (empty($args)) {
+            throw new Exception("Please provide suite name(s) after generate:suite command");
+        }
+
+        require 'tests/functional/_bootstrap.php';
+        $sg = \Magento\FunctionalTestingFramework\Suite\SuiteGenerator::getInstance();
+
+        foreach ($args as $arg) {
+            $sg->generateSuite($arg);
+        }
+    }
+
     /**
      * Run all Functional tests using the Chrome environment
      */
diff --git a/dev/tests/acceptance/tests/_suite/sampleSuite.xml b/dev/tests/acceptance/tests/_suite/sampleSuite.xml
new file mode 100644
index 00000000000..339cb70d890
--- /dev/null
+++ b/dev/tests/acceptance/tests/_suite/sampleSuite.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Suite/etc/suiteSchema.xsd">
+    <suite name="mySuite">
+        <include>
+            <group name="example"/>
+            <cest test="PersistMultipleEntitiesTest"  name="PersistMultipleEntitiesCest"/>
+            <module name="SampleTests" file="SampleCest.xml"/>
+        </include>
+        <exclude>
+            <group name="testGroup"/>
+        </exclude>
+    </suite>
+</config>
\ No newline at end of file
-- 
GitLab


From 02d2807b06bf08b330a8eff4cd40c4824f48f479 Mon Sep 17 00:00:00 2001
From: Ian Meron <imeron@magento.com>
Date: Fri, 13 Oct 2017 20:19:26 +0300
Subject: [PATCH 171/380] MQE-453: [DevOps] Add optional arg for consolidated
 test run

 - add args to robofile command for env and config during test generation
---
 dev/tests/acceptance/RoboFile.php | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/dev/tests/acceptance/RoboFile.php b/dev/tests/acceptance/RoboFile.php
index 6ebbb756393..0c8b075b092 100644
--- a/dev/tests/acceptance/RoboFile.php
+++ b/dev/tests/acceptance/RoboFile.php
@@ -36,10 +36,10 @@ class RoboFile extends \Robo\Tasks
     /**
      * Generate all Tests
      */
-    function generateTests()
+    function generateTests($opts = ['config' => null, 'env' => 'chrome'])
     {
         require 'tests/functional/_bootstrap.php';
-        \Magento\FunctionalTestingFramework\Util\TestGenerator::getInstance()->createAllCestFiles();
+        \Magento\FunctionalTestingFramework\Util\TestGenerator::getInstance()->createAllCestFiles($opts['config'], $opts['env']);
         $this->say("Generate Tests Command Run");
     }
 
-- 
GitLab


From 1e9886bf6b89ed2c2fd3439555bf6bf5fd26f55b Mon Sep 17 00:00:00 2001
From: Ji Lu <jilu1@magento.com>
Date: Thu, 19 Oct 2017 21:21:08 +0300
Subject: [PATCH 172/380] MQE-429: Added a sample test to perform api PUT
 request.

---
 .../Catalog/Data/ProductData.xml              | 15 ++++++++++
 .../Cest/UpdateSimpleProductByApiCest.xml     | 29 +++++++++++++++++++
 2 files changed, 44 insertions(+)
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/UpdateSimpleProductByApiCest.xml

diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Data/ProductData.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Data/ProductData.xml
index 5be4b73510c..ea57af75d63 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Data/ProductData.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Data/ProductData.xml
@@ -33,4 +33,19 @@
         <required-entity type="custom_attribute_array">CustomAttributeCategoryIds</required-entity>
         <!--required-entity type="custom_attribute">CustomAttributeProductUrlKey</required-entity-->
     </entity>
+    <entity name="NewSimpleProduct" type="product">
+        <data key="price">321.00</data>
+    </entity>
+    <entity name="SimpleOne" type="product">
+        <data key="sku" unique="suffix">SimpleOne</data>
+        <data key="type_id">simple</data>
+        <data key="attribute_set_id">4</data>
+        <data key="name" unique="suffix">SimpleProduct</data>
+        <data key="price">1.23</data>
+        <data key="visibility">4</data>
+        <data key="status">1</data>
+        <required-entity type="product_extension_attribute">EavStockItem</required-entity>
+        <!--required-entity type="custom_attribute_array">CustomAttributeCategoryIds</required-entity-->
+        <required-entity type="custom_attribute">CustomAttributeProductAttribute</required-entity>
+    </entity>
 </config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/UpdateSimpleProductByApiCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/UpdateSimpleProductByApiCest.xml
new file mode 100644
index 00000000000..929b8488e52
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/UpdateSimpleProductByApiCest.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Test XML Example -->
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Test/etc/testSchema.xsd">
+    <cest name="UpdateSimpleProductByApiCest">
+        <annotations>
+            <features value="Update simple product by api test."/>
+            <stories value="Update simple product by api test."/>
+            <group value="example"/>
+            <env value="chrome"/>
+            <env value="firefox"/>
+            <env value="phantomjs"/>
+            <env value="headless"/>
+        </annotations>
+        <before>
+            <createData mergeKey="categoryHandle" entity="SimpleSubCategory"/>
+            <createData mergeKey="originalProductHandle" entity="SimpleProduct" >
+                <required-entity createDataKey="categoryHandle"/>
+            </createData>
+            <updateData mergeKey="productHandle" entity="NewSimpleProduct" createDataKey="originalProductHandle">
+            </updateData>
+            
+        </before>
+        <after>
+            <deleteData mergeKey="delete" createDataKey="productHandle"/>
+        </after>
+        <test name="UpdateSimpleProductByApiTest">
+        </test>
+    </cest>
+</config>
\ No newline at end of file
-- 
GitLab


From 5dc68b7881e528bf67400d22b5466966a9825029 Mon Sep 17 00:00:00 2001
From: Ji Lu <jilu1@magento.com>
Date: Thu, 19 Oct 2017 19:07:09 +0300
Subject: [PATCH 173/380] MQE-440: Added configurable product related metadata,
 data, and a sample test.

---
 .../Catalog/Data/CategoryData.xml             |   1 -
 .../Catalog/Data/CustomAttributeData.xml      |   4 +
 .../Data/FrontendLabelData.xml}               |   6 +-
 .../Catalog/Data/ProductAttributeData.xml     |  32 +++++
 .../Data/ProductAttributeOptionData.xml       |  30 +++++
 .../Catalog/Data/ProductAttributeSetData.xml  |  17 +++
 .../Catalog/Data/StoreLabelData.xml           |  27 ++++
 .../Metadata/custom_attribute-meta.xml        |   0
 .../empty_extension_attribute-meta.xml        |   0
 .../Catalog/Metadata/frontend_label-meta.xml  |  15 +++
 .../Catalog/Metadata/product-meta.xml         |  13 +-
 .../Metadata/product_attribute-meta.xml       | 117 ++++++++++++++++++
 .../product_attribute_option-meta.xml         |  33 +++++
 .../Metadata/product_attribute_set-meta.xml   |  23 ++++
 .../Catalog/Metadata/store_label-meta.xml     |  15 +++
 .../Catalog/Metadata/validation_rule-meta.xml |  19 +++
 .../AdminCreateConfigurableProductCest.xml    |   0
 .../Data/ConfigurableProductData.xml          |  14 ++-
 .../Data/ConfigurableProductOptionData.xml    |  17 +++
 .../Data/ValueIndexData.xml                   |  17 +++
 .../configurable_product_add_child-meta.xml   |  16 +++
 .../configurable_product_options-meta.xml     |  22 ++++
 ...bute_configurable_product_options-meta.xml |  21 ++++
 .../Metadata/valueIndex-meta.xml              |  14 +++
 .../ConfigurableProduct/composer.json         |   4 +-
 ... StorefrontPersistedCustomerLoginCest.xml} |  12 +-
 .../Customer/Data/CustomerData.xml            |   5 +
 .../Customer/Metadata/customer-meta.xml       |  33 +----
 .../FunctionalTest/Customer/composer.json     |   4 +-
 .../CreateConfigurableProductByApiCest.xml    |  70 +++++++++++
 30 files changed, 545 insertions(+), 56 deletions(-)
 rename dev/tests/acceptance/tests/functional/Magento/FunctionalTest/{Customer/Data/CustomAttributeData.xml => Catalog/Data/FrontendLabelData.xml} (71%)
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Data/ProductAttributeData.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Data/ProductAttributeOptionData.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Data/ProductAttributeSetData.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Data/StoreLabelData.xml
 rename dev/tests/acceptance/tests/functional/Magento/FunctionalTest/{Customer => Catalog}/Metadata/custom_attribute-meta.xml (100%)
 rename dev/tests/acceptance/tests/functional/Magento/FunctionalTest/{Customer => Catalog}/Metadata/empty_extension_attribute-meta.xml (100%)
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/frontend_label-meta.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product_attribute-meta.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product_attribute_option-meta.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product_attribute_set-meta.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/store_label-meta.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/validation_rule-meta.xml
 rename dev/tests/acceptance/tests/functional/Magento/FunctionalTest/{Catalog => ConfigurableProduct}/Cest/AdminCreateConfigurableProductCest.xml (100%)
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/Data/ConfigurableProductOptionData.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/Data/ValueIndexData.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/Metadata/configurable_product_add_child-meta.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/Metadata/configurable_product_options-meta.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/Metadata/extension_attribute_configurable_product_options-meta.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/Metadata/valueIndex-meta.xml
 rename dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Cest/{StorefrontExistingCustomerLoginCest.xml => StorefrontPersistedCustomerLoginCest.xml} (82%)
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/CreateConfigurableProductByApiCest.xml

diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Data/CategoryData.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Data/CategoryData.xml
index b2877aebe72..67413dc4756 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Data/CategoryData.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Data/CategoryData.xml
@@ -18,6 +18,5 @@
         <data key="name_lwr" unique="suffix">simplesubcategory</data>
         <data key="is_active">true</data>
         <data key="include_in_menu">true</data>
-        <!--required-entity type="custom_attribute">CustomAttributeCategoryUrlKey</required-entity-->
     </entity>
 </config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Data/CustomAttributeData.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Data/CustomAttributeData.xml
index 46383269b88..5319df4773a 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Data/CustomAttributeData.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Data/CustomAttributeData.xml
@@ -20,4 +20,8 @@
         <data key="attribute_code">category_ids</data>
         <var key="value" entityType="category" entityKey="id"/>
     </entity>
+    <entity name="CustomAttributeProductAttribute" type="custom_attribute">
+        <var key="attribute_code" entityKey="attribute_code" entityType="ProductAttribute"/>
+        <var key="value" entityKey="value" entityType="ProductAttributeOption"/>
+    </entity>
 </config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Data/CustomAttributeData.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Data/FrontendLabelData.xml
similarity index 71%
rename from dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Data/CustomAttributeData.xml
rename to dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Data/FrontendLabelData.xml
index ca98ffedd11..5cd129297e0 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Data/CustomAttributeData.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Data/FrontendLabelData.xml
@@ -8,8 +8,8 @@
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataProfileSchema.xsd">
-    <entity name="CustomAttributeSimple" type="custom_attribute">
-        <data key="attribute_code">100</data>
-        <data key="value">test</data>
+    <entity name="ProductAttributeFrontendLabel" type="FrontendLabel">
+        <data key="store_id">0</data>
+        <data key="label" unique="suffix">attribute</data>
     </entity>
 </config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Data/ProductAttributeData.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Data/ProductAttributeData.xml
new file mode 100644
index 00000000000..118b93a0219
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Data/ProductAttributeData.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataProfileSchema.xsd">
+    <entity name="productAttributeWithTwoOptions" type="ProductAttribute">
+        <data key="attribute_code" unique="suffix">attribute</data>
+        <data key="frontend_input">select</data>
+        <data key="scope">global</data>
+        <data key="is_required">false</data>
+        <data key="is_unique">false</data>
+        <data key="is_searchable">true</data>
+        <data key="is_visible">true</data>
+        <data key="is_visible_in_advanced_search">true</data>
+        <data key="is_visible_on_front">true</data>
+        <data key="is_filterable">true</data>
+        <data key="is_filterable_in_search">true</data>
+        <data key="used_in_product_listing">true</data>
+        <data key="is_used_for_promo_rules">true</data>
+        <data key="is_comparable">true</data>
+        <data key="is_used_in_grid">true</data>
+        <data key="is_visible_in_grid">true</data>
+        <data key="is_filterable_in_grid">true</data>
+        <data key="used_for_sort_by">true</data>
+        <required-entity type="FrontendLabel">ProductAttributeFrontendLabel</required-entity>
+    </entity>
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Data/ProductAttributeOptionData.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Data/ProductAttributeOptionData.xml
new file mode 100644
index 00000000000..3f75639c21a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Data/ProductAttributeOptionData.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataProfileSchema.xsd">
+    <entity name="productAttributeOption1" type="ProductAttributeOption">
+        <var key="attribute_code" entityKey="attribute_code" entityType="ProductAttribute"/>
+        <data key="label" unique="suffix">option1</data>
+        <data key="is_default">false</data>
+        <data key="sort_order">0</data>
+        <required-entity type="StoreLabel">Option1Store0</required-entity>
+        <required-entity type="StoreLabel">Option1Store1</required-entity>
+    </entity>
+    <entity name="productAttributeOption2" type="ProductAttributeOption">
+        <var key="attribute_code" entityKey="attribute_code" entityType="ProductAttribute"/>
+        <data key="label" unique="suffix">option2</data>
+        <data key="is_default">true</data>
+        <data key="sort_order">1</data>
+        <required-entity type="StoreLabel">Option2Store0</required-entity>
+        <required-entity type="StoreLabel">Option2Store1</required-entity>
+    </entity>
+    <entity name="ProductAttributeOptionGetter" type="ProductAttributeOption">
+        <var key="attribute_code" entityKey="attribute_code" entityType="ProductAttribute"/>
+    </entity>
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Data/ProductAttributeSetData.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Data/ProductAttributeSetData.xml
new file mode 100644
index 00000000000..fca2c8ec569
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Data/ProductAttributeSetData.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataProfileSchema.xsd">
+    <entity name="AddToDefaultSet" type="ProductAttributeSet">
+        <var key="attributeCode" entityKey="attribute_code" entityType="ProductAttribute"/>
+        <data key="attributeSetId">4</data>
+        <data key="attributeGroupId">7</data>
+        <data key="sortOrder">0</data>
+    </entity>
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Data/StoreLabelData.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Data/StoreLabelData.xml
new file mode 100644
index 00000000000..c362f81eb2e
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Data/StoreLabelData.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataProfileSchema.xsd">
+    <entity name="Option1Store0" type="StoreLabel">
+        <data key="store_id">0</data>
+        <data key="label">option1</data>
+    </entity>
+    <entity name="Option1Store1" type="StoreLabel">
+        <data key="store_id">1</data>
+        <data key="label">option1</data>
+    </entity>
+    <entity name="Option2Store0" type="StoreLabel">
+        <data key="store_id">0</data>
+        <data key="label">option2</data>
+    </entity>
+    <entity name="Option2Store1" type="StoreLabel">
+        <data key="store_id">1</data>
+        <data key="label">option2</data>
+    </entity>
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Metadata/custom_attribute-meta.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/custom_attribute-meta.xml
similarity index 100%
rename from dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Metadata/custom_attribute-meta.xml
rename to dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/custom_attribute-meta.xml
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Metadata/empty_extension_attribute-meta.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/empty_extension_attribute-meta.xml
similarity index 100%
rename from dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Metadata/empty_extension_attribute-meta.xml
rename to dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/empty_extension_attribute-meta.xml
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/frontend_label-meta.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/frontend_label-meta.xml
new file mode 100644
index 00000000000..90e717019c0
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/frontend_label-meta.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataOperation.xsd">
+    <operation name="CreateFrontendLabel" dataType="FrontendLabel" type="create">
+        <field key="store_id">integer</field>
+        <field key="label">string</field>
+    </operation>
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product-meta.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product-meta.xml
index 068eb692a46..6103c6cc3f4 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product-meta.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product-meta.xml
@@ -27,14 +27,16 @@
             </array>
             <array key="custom_attributes">
                 <value>custom_attribute_array</value>
+                <value>custom_attribute</value>
             </array>
             <array key="options">
                 <value>product_option</value>
             </array>
         </object>
     </operation>
-    <operation name="UpdateProduct" dataType="product" type="update" auth="adminOauth" url="/V1/products" method="PUT">
+    <operation name="UpdateProduct" dataType="product" type="update" auth="adminOauth" url="/V1/products/{sku}" method="PUT">
         <contentType>application/json</contentType>
+        <param key="sku" type="path">{sku}</param>
         <object dataType="product" key="product">
             <field key="id">integer</field>
             <field key="sku">string</field>
@@ -53,20 +55,15 @@
             </array>
             <array key="custom_attributes">
                 <value>custom_attribute_array</value>
+                <value>custom_attribute</value>
             </array>
             <array key="options">
                 <value>product_option</value>
             </array>
-            <!--array key="media_gallery_entries">
-                <value>media_gallery_entries</value>
-            </array>
-            <array key="tier_prices">
-                <value>tier_prices</value>
-            </array-->
         </object>
         <field key="saveOptions">boolean</field>
     </operation>
-    <operation name="deleteProduct" dataType="product" type="delete" auth="adminOauth" url="/V1/products" method="DELETE">
+    <operation name="deleteProduct" dataType="product" type="delete" auth="adminOauth" url="/V1/products/{sku}" method="DELETE">
         <contentType>application/json</contentType>
         <param key="sku" type="path">{sku}</param>
     </operation>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product_attribute-meta.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product_attribute-meta.xml
new file mode 100644
index 00000000000..a517d6cd80a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product_attribute-meta.xml
@@ -0,0 +1,117 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataOperation.xsd">
+    <operation name="CreateProductAttribute" dataType="ProductAttribute" type="create" auth="adminOauth" url="/V1/products/attributes" method="POST">
+        <contentType>application/json</contentType>
+        <object dataType="ProductAttribute" key="attribute">
+            <field key="attribute_code">string</field>
+            <field key="default_value">string</field>
+            <field key="frontend_input">string</field>
+            <field key="entity_type_id">string</field>
+            <field key="backend_type">string</field>
+            <field key="backend_model">string</field>
+            <field key="source_model">string</field>
+            <field key="frontend_class">string</field>
+            <field key="default_frontend_label">string</field>
+            <field key="note">string</field>
+            <field key="scope">string</field>
+            <field key="is_unique">boolean</field>
+            <field key="is_searchable">boolean</field>
+            <field key="is_visible_in_advanced_search">boolean</field>
+            <field key="is_comparable">boolean</field>
+            <field key="is_used_for_promo_rules">boolean</field>
+            <field key="is_visible_on_front">boolean</field>
+            <field key="used_in_product_listing">boolean</field>
+            <field key="is_wysiwyg_enabled">boolean</field>
+            <field key="is_html_allowed_on_front">boolean</field>
+            <field key="used_for_sort_by">boolean</field>
+            <field key="is_filterable">boolean</field>
+            <field key="is_filterable_in_search">boolean</field>
+            <field key="is_used_in_grid">boolean</field>
+            <field key="is_visible_in_grid">boolean</field>
+            <field key="is_filterable_in_grid">boolean</field>
+            <field key="is_visible">boolean</field>
+            <field key="is_required">boolean</field>
+            <field key="is_user_defined">boolean</field>
+            <field key="extension_attributes">empty_extension_attribute-meta</field>
+            <array key="apply_to">
+                <value>string</value>
+            </array>
+            <array key="options">
+                <value>ProductAttributeOption</value>
+            </array>
+            <array key="custom_attributes">
+                <value>custom_attribute_array</value>
+            </array>
+            <array key="validation_rules">
+                <value>validation_rule</value>
+            </array>
+            <array key="frontend_labels">
+                <value>FrontendLabel</value>
+            </array>
+        </object>
+    </operation>
+    <operation name="UpdateProductAttribute" dataType="ProductAttribute" type="update" auth="adminOauth" url="/V1/products/attributes/{attributeCode}" method="PUT">
+        <contentType>application/json</contentType>
+        <param key="attributeCode" type="path">{attributeCode}</param>
+        <object dataType="ProductAttribute" key="attribute">
+            <field key="attribute_code">string</field>
+            <field key="attribute_id">string</field>
+            <field key="default_value">string</field>
+            <field key="frontend_input">string</field>
+            <field key="entity_type_id">string</field>
+            <field key="backend_type">string</field>
+            <field key="backend_model">string</field>
+            <field key="source_model">string</field>
+            <field key="frontend_class">string</field>
+            <field key="default_frontend_label">string</field>
+            <field key="note">string</field>
+            <field key="scope">string</field>
+            <field key="is_unique">boolean</field>
+            <field key="is_searchable">boolean</field>
+            <field key="is_visible_in_advanced_search">boolean</field>
+            <field key="is_comparable">boolean</field>
+            <field key="is_used_for_promo_rules">boolean</field>
+            <field key="is_visible_on_front">boolean</field>
+            <field key="used_in_product_listing">boolean</field>
+            <field key="is_wysiwyg_enabled">boolean</field>
+            <field key="is_html_allowed_on_front">boolean</field>
+            <field key="used_for_sort_by">boolean</field>
+            <field key="is_filterable">boolean</field>
+            <field key="is_filterable_in_search">boolean</field>
+            <field key="is_used_in_grid">boolean</field>
+            <field key="is_visible_in_grid">boolean</field>
+            <field key="is_filterable_in_grid">boolean</field>
+            <field key="is_visible">boolean</field>
+            <field key="is_required">boolean</field>
+            <field key="is_user_defined">boolean</field>
+            <field key="extension_attributes">empty_extension_attribute-meta</field>
+            <array key="apply_to">
+                <value>string</value>
+            </array>
+            <array key="options">
+                <value>ProductAttributeOption</value>
+            </array>
+            <array key="custom_attributes">
+                <value>custom_attribute_array</value>
+            </array>
+            <array key="validation_rules">
+                <value>validation_rule</value>
+            </array>
+            <array key="frontend_labels">
+                <value>FrontendLabel</value>
+            </array>
+        </object>
+    </operation>
+    <operation name="DeleteProductAttribute" dataType="ProductAttribute" type="delete" auth="adminOauth" url="/V1/products/attributes/{attributeCode}" method="DELETE">
+        <contentType>application/json</contentType>
+        <param key="attributeCode" type="path">{attributeCode}</param>
+    </operation>
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product_attribute_option-meta.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product_attribute_option-meta.xml
new file mode 100644
index 00000000000..bb5a37229fd
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product_attribute_option-meta.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataOperation.xsd">
+    <operation name="CreateProductAttributeOption" dataType="ProductAttributeOption" type="create" auth="adminOauth" url="/V1/products/attributes/{attribute_code}/options" method="POST">
+        <contentType>application/json</contentType>
+        <param key="attribute_code" type="path">{attribute_code}</param>
+        <object dataType="ProductAttributeOption" key="option">
+            <field key="label">string</field>
+            <field key="value">string</field>
+            <field key="sort_order">integer</field>
+            <field key="is_default">boolean</field>
+            <array key="store_labels">
+                <value>StoreLabel</value>
+            </array>
+        </object>
+    </operation>
+    <operation name="DeleteProductAttributeOption" dataType="ProductAttributeOption" type="delete" auth="adminOauth" url="/V1/products/attributes/{attribute_code}/options/{optionId}" method="DELETE">
+        <contentType>application/json</contentType>
+        <param key="attribute_code" type="path">{attribute_code}</param>
+        <param key="optionId" type="path">{optionId}</param>
+    </operation>
+    <operation name="GetProductAttributeOption" dataType="ProductAttributeOption" type="get" auth="adminOauth" url="/V1/products/attributes/{attribute_code}/options/" method="GET">
+        <contentType>application/json</contentType>
+        <param key="attribute_code" type="path">{attribute_code}</param>
+    </operation>
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product_attribute_set-meta.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product_attribute_set-meta.xml
new file mode 100644
index 00000000000..c15fb764a7f
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product_attribute_set-meta.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataOperation.xsd">
+    <operation name="AddProductAttributeToAttributeSet" dataType="ProductAttributeSet" type="create" auth="adminOauth" url="/V1/products/attribute-sets/attributes" method="POST">
+        <contentType>application/json</contentType>
+        <field key="attributeSetId">integer</field>
+        <field key="attributeGroupId">integer</field>
+        <field key="attributeCode">string</field>
+        <field key="sortOrder">integer</field>
+    </operation>
+    <operation name="DeleteProductAttributeFromAttributeSet" dataType="ProductAttributeSet" type="delete" auth="adminOauth" url="/V1/products/attribute-sets/{attributeSetId}/attributes/{attributeCode}" method="DELETE">
+        <contentType>application/json</contentType>
+        <param key="attributeSetId" type="path">{attributeSetId}</param>
+        <param key="attributeCode" type="path">{attributeCode}</param>
+    </operation>
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/store_label-meta.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/store_label-meta.xml
new file mode 100644
index 00000000000..ae5210ed3a6
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/store_label-meta.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataOperation.xsd">
+    <operation name="CreateStoreLabel" dataType="StoreLabel" type="create">
+        <field key="store_id">integer</field>
+        <field key="label">string</field>
+    </operation>
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/validation_rule-meta.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/validation_rule-meta.xml
new file mode 100644
index 00000000000..d79c7b637fb
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/validation_rule-meta.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataOperation.xsd">
+    <operation name="CreateValidationRule" dataType="validation_rule" type="create">
+        <field key="key">string</field>
+        <field key="value">string</field>
+    </operation>
+    <operation name="UpdateValidationRule" dataType="validation_rule" type="update">
+        <field key="key">string</field>
+        <field key="value">string</field>
+    </operation>
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Cest/AdminCreateConfigurableProductCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/Cest/AdminCreateConfigurableProductCest.xml
similarity index 100%
rename from dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Cest/AdminCreateConfigurableProductCest.xml
rename to dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/Cest/AdminCreateConfigurableProductCest.xml
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/Data/ConfigurableProductData.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/Data/ConfigurableProductData.xml
index 1e5538dae88..7569f7aeea3 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/Data/ConfigurableProductData.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/Data/ConfigurableProductData.xml
@@ -8,7 +8,17 @@
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataProfileSchema.xsd">
-    <entity name="ConfigurableProductOne" type="configurableProduct">
-        <data key="configurableProductName">data</data>
+    <entity name="BaseConfigurableProduct" type="product">
+        <data key="sku" unique="suffix">configurable</data>
+        <data key="type_id">configurable</data>
+        <data key="attribute_set_id">4</data>
+        <data key="visibility">4</data>
+        <data key="name" unique="suffix">configurable</data>
+        <data key="price">123.00</data>
+        <data key="urlKey" unique="suffix">configurableurlkey</data>
+        <data key="status">1</data>
+        <data key="quantity">100</data>
+        <required-entity type="product_extension_attribute">EavStockItem</required-entity>
+        <required-entity type="custom_attribute_array">CustomAttributeCategoryIds</required-entity>
     </entity>
 </config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/Data/ConfigurableProductOptionData.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/Data/ConfigurableProductOptionData.xml
new file mode 100644
index 00000000000..58697b76581
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/Data/ConfigurableProductOptionData.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataProfileSchema.xsd">
+    <entity name="ConfigurableProductTwoOptions" type="ConfigurableProductOption">
+        <var key="attribute_id" entityKey="attribute_id" entityType="ProductAttribute" />
+        <data key="label">option</data>
+        <required-entity type="ValueIndex">ValueIndex1</required-entity>
+        <required-entity type="ValueIndex">ValueIndex2</required-entity>
+    </entity>
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/Data/ValueIndexData.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/Data/ValueIndexData.xml
new file mode 100644
index 00000000000..58a28b0fe0f
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/Data/ValueIndexData.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataProfileSchema.xsd">
+    <entity name="ValueIndex1" type="ValueIndex">
+        <var key="value_index" entityKey="value" entityType="ProductAttributeOption"/>
+    </entity>
+    <entity name="ValueIndex2" type="ValueIndex">
+        <var key="value_index" entityKey="value" entityType="ProductAttributeOption"/>
+    </entity>
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/Metadata/configurable_product_add_child-meta.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/Metadata/configurable_product_add_child-meta.xml
new file mode 100644
index 00000000000..625cb160c58
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/Metadata/configurable_product_add_child-meta.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataOperation.xsd">
+    <operation name="ConfigurableProductAddChild" dataType="ConfigurableProductAddChild" type="create" auth="adminOauth" url="/V1/configurable-products/{sku}/child" method="POST">
+        <contentType>application/json</contentType>
+        <param key="sku" type="path">{sku}</param>
+        <field key="childSku">string</field>
+    </operation>
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/Metadata/configurable_product_options-meta.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/Metadata/configurable_product_options-meta.xml
new file mode 100644
index 00000000000..e3c10d88f53
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/Metadata/configurable_product_options-meta.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataOperation.xsd">
+    <operation name="CreateConfigurableProductOption" dataType="ConfigurableProductOption" type="create" auth="adminOauth" url="/V1/configurable-products/{sku}/options" method="POST">
+        <contentType>application/json</contentType>
+        <param key="sku" type="path">{sku}</param>
+        <object dataType="ConfigurableProductOption" key="option">
+            <field key="attribute_id">integer</field>
+            <field key="label">string</field>
+            <array key="values">
+                <value>ValueIndex</value>
+            </array>
+        </object>
+    </operation>
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/Metadata/extension_attribute_configurable_product_options-meta.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/Metadata/extension_attribute_configurable_product_options-meta.xml
new file mode 100644
index 00000000000..757e1d66f47
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/Metadata/extension_attribute_configurable_product_options-meta.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataOperation.xsd">
+    <operation name="CreateExtensionAttributeConfigProductOption" dataType="ExtensionAttributeConfigProductOption" type="create">
+        <contentType>application/json</contentType>
+        <array key="configurable_product_options">
+            <object dataType="ExtensionAttributeConfigProductOption" key="configurable_product_options">
+                <array key="0">
+                    <value>ConfigProductOption</value>
+                </array>
+            </object>
+        </array>
+    </operation>
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/Metadata/valueIndex-meta.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/Metadata/valueIndex-meta.xml
new file mode 100644
index 00000000000..a0e9c0b790d
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/Metadata/valueIndex-meta.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataOperation.xsd">
+    <operation name="ValueIndex" dataType="ValueIndex" type="create">
+        <field key="value_index">integer</field>
+    </operation>
+</config>
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/composer.json
index 9bc6d9d574c..6cdd99c2e0c 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/composer.json
@@ -14,11 +14,11 @@
         "consolidation/robo": "^1.0.0",
         "henrikbjorn/lurker": "^1.2",
         "vlucas/phpdotenv": "~2.4",
-        "magento/magento2-functional-testing-framework": "dev-develop"
+        "magento/magento2-functional-testing-framework": "dev-develop",
+        "magento/magento2-functional-test-module-catalog": "dev-master"
     },
     "suggest": {
         "magento/magento2-functional-test-module-store": "dev-master",
-        "magento/magento2-functional-test-module-catalog": "dev-master",
         "magento/magento2-functional-test-module-catalog-inventory": "dev-master",
         "magento/magento2-functional-test-module-checkout": "dev-master",
         "magento/magento2-functional-test-module-msrp": "dev-master",
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Cest/StorefrontExistingCustomerLoginCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Cest/StorefrontPersistedCustomerLoginCest.xml
similarity index 82%
rename from dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Cest/StorefrontExistingCustomerLoginCest.xml
rename to dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Cest/StorefrontPersistedCustomerLoginCest.xml
index 79fb72a5ff5..2e039b51bf1 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Cest/StorefrontExistingCustomerLoginCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Cest/StorefrontPersistedCustomerLoginCest.xml
@@ -8,10 +8,10 @@
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Test/etc/testSchema.xsd">
-    <cest name="StorefrontExistingCustomerLoginCest">
+    <cest name="StorefrontPersistedCustomerLoginCest">
         <annotations>
-            <features value="Customer Login"/>
-            <stories value="Existing Customer can Login on the Storefront"/>
+            <features value="Persisted customer can login from storefront."/>
+            <stories value="Persisted customer can login from storefront."/>
         </annotations>
         <before>
             <createData mergeKey="customer" entity="Simple_US_Customer"/>
@@ -19,10 +19,10 @@
         <after>
             <deleteData mergeKey="deleteCustomer" createDataKey="customer" />
         </after>
-        <test name="ExistingCustomerLoginStorefrontTest">
+        <test name="StorefrontPersistedCustomerLoginTest">
             <annotations>
-                <title value="You should be able to create a customer via the storefront"/>
-                <description value="You should be able to create a customer via the storefront."/>
+                <title value="Persisted customer can login from storefront."/>
+                <description value="Persisted customer can login from storefront."/>
                 <severity value="CRITICAL"/>
                 <testCaseId value="MAGETWO-72103"/>
                 <group value="customer"/>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Data/CustomerData.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Data/CustomerData.xml
index b2693d09b6e..a5bb51fbcc0 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Data/CustomerData.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Data/CustomerData.xml
@@ -44,4 +44,9 @@
         <data key="website_id">0</data>
         <required-entity type="address">US_Address_TX</required-entity>
     </entity>
+    <entity name="Simple_US_Customer_For_Update" type="customer">
+        <var key="id" entityKey="id" entityType="customer"/>
+        <data key="firstname">Jane</data>
+
+    </entity>
 </config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Metadata/customer-meta.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Metadata/customer-meta.xml
index 797ffff72f8..a8ef5dcce9b 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Metadata/customer-meta.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Metadata/customer-meta.xml
@@ -39,40 +39,9 @@
             </array>
         </object>
         <field key="password">string</field>
-    </operation>
-    <operation name="UpdateCustomer" dataType="customer" type="update" auth="adminOauth" url="/V1/customers" method="PUT">
-        <contentType>application/json</contentType>
-        <field key="id">integer</field>
-        <field key="group_id">integer</field>
-        <field key="default_billing">string</field>
-        <field key="default_shipping">string</field>
-        <field key="confirmation">string</field>
-        <field key="created_at">string</field>
-        <field key="updated_at">string</field>
-        <field key="created_in">string</field>
-        <field key="dob">string</field>
-        <field key="email">string</field>
-        <field key="firstname">string</field>
-        <field key="lastname">string</field>
-        <field key="middlename">string</field>
-        <field key="prefix">string</field>
-        <field key="suffix">string</field>
-        <field key="gender">integer</field>
-        <field key="store_id">integer</field>
-        <field key="taxvat">string</field>
-        <field key="website_id">integer</field>
-        <array key="addresses">
-            <value>address</value>
-        </array>
-        <field key="disable_auto_group_change">integer</field>
-        <field key="extension_attributes">customer_extension_attribute</field>
-        <array key="custom_attributes">
-            <value>custom_attribute</value>
-        </array>
-        <field key="password">string</field>
         <field key="redirectUrl">string</field>
     </operation>
-    <operation name="DeleteCustomer" dataType="customer" type="delete" auth="adminOauth" url="/V1/customers" method="DELETE">
+    <operation name="DeleteCustomer" dataType="customer" type="delete" auth="adminOauth" url="/V1/customers/{id}" method="DELETE">
         <contentType>application/json</contentType>
         <param key="id" type="path">{id}</param>
     </operation>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/composer.json
index 3a13bf562bb..61a6eddb0ed 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/composer.json
@@ -14,13 +14,13 @@
         "consolidation/robo": "^1.0.0",
         "henrikbjorn/lurker": "^1.2",
         "vlucas/phpdotenv": "~2.4",
-        "magento/magento2-functional-testing-framework": "dev-develop"
+        "magento/magento2-functional-testing-framework": "dev-develop",
+        "magento/magento2-functional-test-module-catalog": "dev-master"
     },
     "suggest": {
         "magento/magento2-functional-test-module-store": "dev-master",
         "magento/magento2-functional-test-module-eav": "dev-master",
         "magento/magento2-functional-test-module-directory": "dev-master",
-        "magento/magento2-functional-test-module-catalog": "dev-master",
         "magento/magento2-functional-test-module-newsletter": "dev-master",
         "magento/magento2-functional-test-module-sales": "dev-master",
         "magento/magento2-functional-test-module-checkout": "dev-master",
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/CreateConfigurableProductByApiCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/CreateConfigurableProductByApiCest.xml
new file mode 100644
index 00000000000..f90270ae718
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/CreateConfigurableProductByApiCest.xml
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Test/etc/testSchema.xsd">
+    <cest name="CreateConfigurableProductByApiCest">
+        <annotations>
+            <features value="Create a Configurable Product By API"/>
+            <stories value="Create a Configurable Product By API"/>
+        </annotations>
+        <before>
+            <createData mergeKey="categoryHandle" entity="SimpleSubCategory" />
+            <createData mergeKey="baseConfigProductHandle" entity="BaseConfigurableProduct" >
+                <required-entity createDataKey="categoryHandle"/>
+            </createData>
+            <createData mergeKey="productAttributeHandle" entity="productAttributeWithTwoOptions"/>
+
+            <createData mergeKey="productAttributeOption1Handle" entity="productAttributeOption1">
+                <required-entity createDataKey="productAttributeHandle"/>
+            </createData>
+            <createData mergeKey="productAttributeOption2Handle" entity="productAttributeOption2">
+                <required-entity createDataKey="productAttributeHandle"/>
+            </createData>
+
+            <createData mergeKey="addToAttributeSetHandle" entity="AddToDefaultSet">
+                <required-entity createDataKey="productAttributeHandle"/>
+            </createData>
+
+            <getData mergeKey="getAttributeOption1Handle" entity="ProductAttributeOptionGetter" index="1">
+                <required-entity createDataKey="productAttributeHandle"/>
+            </getData>
+            <getData mergeKey="getAttributeOption2Handle" entity="ProductAttributeOptionGetter" index="2">
+                <required-entity createDataKey="productAttributeHandle"/>
+            </getData>
+
+            <createData mergeKey="childProductHandle1" entity="SimpleOne">
+                <required-entity createDataKey="productAttributeHandle"/>
+                <required-entity createDataKey="getAttributeOption1Handle"/>
+            </createData>
+            <createData mergeKey="childProductHandle2" entity="SimpleOne">
+                <required-entity createDataKey="productAttributeHandle"/>
+                <required-entity createDataKey="getAttributeOption2Handle"/>
+            </createData>
+
+            <createData mergeKey="configProductOptionHandle" entity="ConfigurableProductTwoOptions">
+                <required-entity createDataKey="baseConfigProductHandle"/>
+                <required-entity createDataKey="productAttributeHandle"/>
+                <required-entity createDataKey="getAttributeOption1Handle"/>
+                <required-entity createDataKey="getAttributeOption2Handle"/>
+            </createData>
+
+            <createData mergeKey="configProductHandle1" entity="ConfigurableProductAddChild">
+                <required-entity createDataKey="childProductHandle1"/>
+                <required-entity createDataKey="baseConfigProductHandle"/>
+            </createData>
+            <!--Uncomment this when MQE-472 is fixed-->
+            <!--createData mergeKey="configProductHandle2" entity="ConfigurableProductAddChild">
+                <required-entity createDataKey="childProductHandle2"/>
+                <required-entity createDataKey="baseConfigProductHandle"/>
+            </createData-->
+        </before>
+        <test name="CreateConfigurableProductByApiTest">
+        </test>
+    </cest>
+</config>
\ No newline at end of file
-- 
GitLab


From 0bb0b0aa2d52cb402f7d3a02c27de4d82c80cfd7 Mon Sep 17 00:00:00 2001
From: John Stennett <john00ivy@gmail.com>
Date: Fri, 20 Oct 2017 17:26:49 +0300
Subject: [PATCH 174/380] MQE-394: Pre-Install Script

- Adding pre-install script for the framework that will check to see if you have all necessary software installed.
- Adding a Robo command to run the script.
---
 dev/tests/acceptance/RoboFile.php    |   8 +
 dev/tests/acceptance/pre-install.php | 387 +++++++++++++++++++++++++++
 2 files changed, 395 insertions(+)
 create mode 100644 dev/tests/acceptance/pre-install.php

diff --git a/dev/tests/acceptance/RoboFile.php b/dev/tests/acceptance/RoboFile.php
index 0c8b075b092..1a52216038b 100644
--- a/dev/tests/acceptance/RoboFile.php
+++ b/dev/tests/acceptance/RoboFile.php
@@ -173,4 +173,12 @@ class RoboFile extends \Robo\Tasks
             $this->allure2Open();
         }
     }
+
+    /**
+     * Run the Pre-Install Check Script
+     */
+    function preInstall()
+    {
+        $this->_exec('php pre-install.php');
+    }
 }
diff --git a/dev/tests/acceptance/pre-install.php b/dev/tests/acceptance/pre-install.php
new file mode 100644
index 00000000000..e723eb8d149
--- /dev/null
+++ b/dev/tests/acceptance/pre-install.php
@@ -0,0 +1,387 @@
+<?php
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+class CliColors {
+    private $foreground_colors = array();
+    private $background_colors = array();
+
+    public function __construct() {
+        // Set up shell colors
+        $this->foreground_colors['black'] = '0;30';
+        $this->foreground_colors['dark_gray'] = '1;30';
+        $this->foreground_colors['blue'] = '0;34';
+        $this->foreground_colors['light_blue'] = '1;34';
+        $this->foreground_colors['green'] = '0;32';
+        $this->foreground_colors['light_green'] = '1;32';
+        $this->foreground_colors['cyan'] = '0;36';
+        $this->foreground_colors['light_cyan'] = '1;36';
+        $this->foreground_colors['red'] = '0;31';
+        $this->foreground_colors['light_red'] = '1;31';
+        $this->foreground_colors['purple'] = '0;35';
+        $this->foreground_colors['light_purple'] = '1;35';
+        $this->foreground_colors['brown'] = '0;33';
+        $this->foreground_colors['yellow'] = '1;33';
+        $this->foreground_colors['light_gray'] = '0;37';
+        $this->foreground_colors['white'] = '1;37';
+
+        $this->background_colors['black'] = '40';
+        $this->background_colors['red'] = '41';
+        $this->background_colors['green'] = '42';
+        $this->background_colors['yellow'] = '43';
+        $this->background_colors['blue'] = '44';
+        $this->background_colors['magenta'] = '45';
+        $this->background_colors['cyan'] = '46';
+        $this->background_colors['light_gray'] = '47';
+    }
+
+    /**
+     * Returns colored string
+     *
+     * @param $string
+     * @param null $foreground_color
+     * @param null $background_color
+     * @return string
+     */
+    public function getColoredString($string, $foreground_color = null, $background_color = null) {
+        $colored_string = "";
+
+        // Check if given foreground color found
+        if (isset($this->foreground_colors[$foreground_color])) {
+            $colored_string .= "\033[" . $this->foreground_colors[$foreground_color] . "m";
+        }
+        // Check if given background color found
+        if (isset($this->background_colors[$background_color])) {
+            $colored_string .= "\033[" . $this->background_colors[$background_color] . "m";
+        }
+
+        // Add string and end coloring
+        $colored_string .=  $string . "\033[0m";
+
+        return $colored_string;
+    }
+
+    /**
+     * Returns all foreground color names
+     *
+     * @return array
+     */
+    public function getForegroundColors() {
+        return array_keys($this->foreground_colors);
+    }
+
+    /**
+     * Returns all background color names
+     *
+     * @return array
+     */
+    public function getBackgroundColors() {
+        return array_keys($this->background_colors);
+    }
+}
+
+class PreInstallCheck {
+    private $installedViaBrew             = false;
+    private $filePath                     = '';
+    private $seleniumJarVersion           = '';
+
+    private $phpWebsite                   = 'http://php.net/manual/en/install.php';
+    private $composerWebsite              = 'https://getcomposer.org/download/';
+    private $javaWebsite                  = 'https://www.java.com/en/download/';
+    private $allureCliWebsite             = 'https://docs.qameta.io/allure/latest/#_installing_a_commandline';
+    private $seleniumWebsite              = 'http://www.seleniumhq.org/download/';
+    private $chromeDriverWebsite          = 'https://sites.google.com/a/chromium.org/chromedriver/downloads';
+    private $geckoDriverWebsite           = 'https://github.com/mozilla/geckodriver';
+    private $phantomJsWebsite             = 'http://phantomjs.org/';
+
+    private $phpSupportedVersion          = '7.1.0';
+    private $composerSupportedVersion     = '1.3.0';
+    private $javaSupportedVersion         = '1.8.0';
+    private $allureCliSupportedVersion    = '2.3.0';
+    private $seleniumSupportedVersion     = '3.6.0';
+    private $chromeDriverSupportedVersion = '2.33.0';
+    private $geckoDriverSupportedVersion  = '0.19.0';
+    private $phantomJsSupportedVersion    = '2.1.0';
+
+    private $getPhpVersion;
+    private $getComposerVersion;
+    private $getJavaVersion;
+    private $getAllureCliVersion;
+    private $getSeleniumVersion;
+    private $getChromeDriverVersion;
+    private $getGeckoDriverVersion;
+    private $getPhantomJsVersion;
+
+    private $phpVersion;
+    private $composerVersion;
+    private $javaVersion;
+    private $allureCliVersion;
+    private $seleniumVersion;
+    private $chromeDriverVersion;
+    private $geckoDriverVersion;
+    private $phantomJsVersion;
+
+    private $phpStatus;
+    private $composerStatus;
+    private $javaStatus;
+    private $allureCliStatus;
+    private $seleniumStatus;
+    private $chromeDriverStatus;
+    private $geckoDriverStatus;
+    private $phantomJsStatus;
+
+    function __construct() {
+        $this->didYouInstallViaBrew();
+
+        $this->getPhpVersion = shell_exec('php --version');
+        $this->getComposerVersion           = shell_exec('composer --version');
+        $this->getJavaVersion               = shell_exec("java -version 2>&1");
+        $this->getAllureCliVersion          = shell_exec('allure --version');
+        $this->getSeleniumVersion           = $this->getSeleniumVersion();
+        $this->getChromeDriverVersion       = $this->getChromeDriverVersion();
+        $this->getGeckoDriverVersion        = shell_exec('geckodriver --version');
+        $this->getPhantomJsVersion          = $this->getPhantomJsVersion();
+
+        $this->phpVersion                   = $this->parseVersion($this->getPhpVersion);
+        $this->composerVersion              = $this->parseVersion($this->getComposerVersion);
+        $this->javaVersion                  = $this->parseJavaVersion($this->getJavaVersion);
+        $this->allureCliVersion             = $this->parseVersion($this->getAllureCliVersion);
+        $this->seleniumVersion              = $this->parseVersion($this->getSeleniumVersion);
+        $this->chromeDriverVersion          = $this->parseVersion($this->getChromeDriverVersion);
+        $this->geckoDriverVersion           = $this->parseVersion($this->getGeckoDriverVersion);
+        $this->phantomJsVersion             = $this->parseVersion($this->getPhantomJsVersion);
+
+        // String of null Versions - For Testing
+//        $this->phpVersion            = null;
+//        $this->composerVersion       = null;
+//        $this->javaVersion           = null;
+//        $this->allureCliVersion      = null;
+//        $this->seleniumVersion       = null;
+//        $this->chromeDriverVersion   = null;
+//        $this->geckoDriverVersion    = null;
+//        $this->phantomJsVersion      = null;
+
+        // String of invalid Versions - For Testing
+//        $this->phpVersion            = '7.0.0';
+//        $this->composerVersion       = '1.0.0';
+//        $this->javaVersion           = '1.0.0';
+//        $this->allureCliVersion      = '2.0.0';
+//        $this->seleniumVersion       = '3.0.0';
+//        $this->chromeDriverVersion   = '2.0.0';
+//        $this->geckoDriverVersion    = '0.0.0';
+//        $this->phantomJsVersion      = '2.0.0';
+
+        $this->phpStatus          = $this->verifyVersion('PHP', $this->phpVersion, $this->phpSupportedVersion, $this->phpWebsite);
+        $this->composerStatus     = $this->verifyVersion('Composer', $this->composerVersion, $this->composerSupportedVersion, $this->composerWebsite);
+        $this->javaStatus         = $this->verifyVersion('Java', $this->javaVersion, $this->javaSupportedVersion, $this->javaWebsite);
+        $this->allureCliStatus    = $this->verifyVersion('Allure CLI', $this->allureCliVersion, $this->allureCliSupportedVersion, $this->allureCliWebsite);
+        $this->seleniumStatus     = $this->verifyVersion('Selenium Standalone Server', $this->seleniumVersion, $this->seleniumSupportedVersion, $this->seleniumWebsite);
+        $this->chromeDriverStatus = $this->verifyVersion('ChromeDriver', $this->chromeDriverVersion, $this->chromeDriverSupportedVersion, $this->chromeDriverWebsite);
+        $this->geckoDriverStatus  = $this->verifyVersion('GeckoDriver', $this->geckoDriverVersion, $this->geckoDriverSupportedVersion, $this->geckoDriverWebsite);
+        $this->phantomJsStatus    = $this->verifyVersion('PhantomJS', $this->phantomJsVersion, $this->phantomJsSupportedVersion, $this->phantomJsWebsite);
+
+        ECHO "\n";
+        $mask = "|%-13.13s |%18.18s |%18.18s |%-23.23s |\n";
+        printf("---------------------------------------------------------------------------------\n");
+        printf($mask, ' Software', 'Supported Version', 'Installed Version', ' Status');
+        printf("---------------------------------------------------------------------------------\n");
+        printf($mask, ' PHP',          $this->phpSupportedVersion          . '+',          $this->phpVersion, ' ' . $this->phpStatus);
+        printf($mask, ' Composer',     $this->composerSupportedVersion     . '+',     $this->composerVersion, ' ' . $this->composerStatus);
+        printf($mask, ' Java',         $this->javaSupportedVersion         . '+',         $this->javaVersion, ' ' . $this->javaStatus);
+        printf($mask, ' Allure CLI',   $this->allureCliSupportedVersion    . '+',    $this->allureCliVersion, ' ' . $this->allureCliStatus);
+        printf($mask, ' Selenium',     $this->seleniumSupportedVersion     . '+',     $this->seleniumVersion, ' ' . $this->seleniumStatus);
+        printf($mask, ' ChromeDriver', $this->chromeDriverSupportedVersion . '+', $this->chromeDriverVersion, ' ' . $this->chromeDriverStatus);
+        printf($mask, ' GeckoDriver',  $this->geckoDriverSupportedVersion  . '+',  $this->geckoDriverVersion, ' ' . $this->geckoDriverStatus);
+        printf($mask, ' PhantomJS',    $this->phantomJsSupportedVersion    . '+',    $this->phantomJsVersion, ' ' . $this->phantomJsStatus);
+        printf("---------------------------------------------------------------------------------\n");
+    }
+
+    /**
+     * Ask if they installed the Browser Drivers via Brew.
+     * Brew installs things globally making them easier for us to access.
+     */
+    public function didYouInstallViaBrew()
+    {
+        ECHO "Did you install Selenium Server, ChromeDriver, GeckoDriver and PhantomJS using Brew? (y/n) ";
+        $handle1 = fopen ("php://stdin","r");
+        $line1 = fgets($handle1);
+        if (trim($line1) != 'y') {
+            ECHO "Where did you save the files? (ex /Users/first_last/Automation/) ";
+            $handle2 = fopen ("php://stdin","r");
+            $this->filePath = fgets($handle2);
+            fclose($handle2);
+
+            ECHO "Which selenium-server-standalone-X.X.X.jar file did you download? (ex 3.6.0) ";
+            $handle3 = fopen ("php://stdin","r");
+            $this->seleniumJarVersion = fgets($handle3);
+            fclose($handle3);
+            fclose($handle1);
+            ECHO "\n";
+        } else {
+            $this->installedViaBrew = true;
+            fclose($handle1);
+            ECHO "\n";
+        }
+    }
+
+    /**
+     * Parse the string that is returned for the Version number only.
+     *
+     * @param $stdout
+     * @return null
+     */
+    public function parseVersion($stdout)
+    {
+        preg_match("/\d+(?:\.\d+)+/", $stdout, $matches);
+
+        if (!is_null($matches) && isset($matches[0])) {
+            return $matches[0];
+        } else {
+            return null;
+        }
+    }
+
+    /**
+     * Parse the string that is returned for the Version number only.
+     * The message Java returns differs from the others hence the separate function.
+     *
+     * @param $stdout
+     * @return null
+     */
+    public function parseJavaVersion($stdout)
+    {
+        preg_match('/\"(.+?)\"/', $stdout, $output_array);
+
+        if (!is_null($output_array)) {
+            return $output_array[1];
+        } else {
+            return null;
+        }
+    }
+
+    /**
+     * Get the Selenium Server version based on how it was installed.
+     *
+     * @return string
+     */
+    public function getSeleniumVersion()
+    {
+        $this->installedViaBrew;
+        $this->filePath;
+        $this->seleniumJarVersion;
+
+        if ($this->installedViaBrew) {
+            return shell_exec('selenium-server --version');
+        } else {
+            $command = sprintf('java -jar %s/selenium-server-standalone-%s.jar --version', $this->filePath, $this->seleniumJarVersion);
+            $command = str_replace(array("\r", "\n"), '', $command) . "\n";
+            return shell_exec($command);
+        }
+    }
+
+    /**
+     * Get the ChromeDriver version based on how it was installed.
+     *
+     * @return string
+     */
+    public function getChromeDriverVersion()
+    {
+        $this->installedViaBrew;
+        $this->filePath;
+
+        if ($this->installedViaBrew) {
+            return shell_exec('chromedriver --version');
+        } else {
+            $command = sprintf('%s/chromedriver --version', $this->filePath);
+            $command = str_replace(array("\r", "\n"), '', $command) . "\n";
+            return shell_exec($command);
+        }
+    }
+
+    /**
+     * Get the PhantomJS version based on how it was installed.
+     *
+     * @return string
+     */
+    public function getPhantomJsVersion()
+    {
+        $this->installedViaBrew;
+        $this->filePath;
+
+        if ($this->installedViaBrew) {
+            return shell_exec('phantomjs --version');
+        } else {
+            $command = sprintf('%s/phantomjs --version', $this->filePath);
+            $command = str_replace(array("\r", "\n"), '', $command) . "\n";
+            return shell_exec($command);
+        }
+    }
+
+    /**
+     * Print a "Valid Version Detected" message in color.
+     *
+     * @param $softwareName
+     */
+    public function printValidVersion($softwareName)
+    {
+        $colors = new CliColors();
+        $string = sprintf("%s detected. Version is supported!", $softwareName);
+        ECHO $colors->getColoredString($string, "black", "green") . "\n";
+    }
+
+    /**
+     * Print a "Upgraded Version Needed" message in color.
+     *
+     * @param $softwareName
+     * @param $supportedVersion
+     * @param $website
+     */
+    public function printUpgradeVersion($softwareName, $supportedVersion, $website)
+    {
+        $colors = new CliColors();
+        $string = sprintf("Unsupported version of %s detected. Please upgrade to v%s+: %s", $softwareName, $supportedVersion, $website);
+        ECHO $colors->getColoredString($string, "black", "yellow") . "\n";
+    }
+
+    /**
+     * Print a "Not Installed. Install Required." message in color.
+     *
+     * @param $softwareName
+     * @param $supportedVersion
+     * @param $website
+     */
+    public function printNoInstalledVersion($softwareName, $supportedVersion, $website)
+    {
+        $colors = new CliColors();
+        $string = sprintf("%s not detected. Please install v%s+: %s", $softwareName, $supportedVersion, $website);
+        ECHO $colors->getColoredString($string, "black", "red") . "\n";
+    }
+
+    /**
+     * Verify that the versions.
+     * Print the correct status message.
+     *
+     * @param $softwareName
+     * @param $installedVersion
+     * @param $supportedVersion
+     * @param $website
+     * @return string
+     */
+    public function verifyVersion($softwareName, $installedVersion, $supportedVersion, $website)
+    {
+        if (is_null($installedVersion)) {
+            $this->printNoInstalledVersion($softwareName, $supportedVersion, $website);
+            return 'Installation Required!';
+        } else if ($installedVersion >= $supportedVersion) {
+            $this->printValidVersion($softwareName);
+            return 'Correct Version!';
+        } else {
+            $this->printUpgradeVersion($softwareName, $supportedVersion, $website);
+            return 'Upgrade Required!';
+        }
+    }
+}
+
+$preCheck = new PreInstallCheck();
\ No newline at end of file
-- 
GitLab


From 7a5a0f927562ba1914716d46e30590973078f977 Mon Sep 17 00:00:00 2001
From: Ian Meron <imeron@magento.com>
Date: Thu, 19 Oct 2017 22:30:39 +0300
Subject: [PATCH 175/380] MQE-237: [Generator] Add before and after logic to
 suites

- update sample suite file
---
 dev/tests/acceptance/tests/_suite/sampleSuite.xml | 14 ++++++++++++--
 1 file changed, 12 insertions(+), 2 deletions(-)

diff --git a/dev/tests/acceptance/tests/_suite/sampleSuite.xml b/dev/tests/acceptance/tests/_suite/sampleSuite.xml
index 339cb70d890..977563871a3 100644
--- a/dev/tests/acceptance/tests/_suite/sampleSuite.xml
+++ b/dev/tests/acceptance/tests/_suite/sampleSuite.xml
@@ -1,6 +1,16 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Suite/etc/suiteSchema.xsd">
+<suites xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Suite/etc/suiteSchema.xsd">
     <suite name="mySuite">
+        <before>
+            <createData entity="_defaultCategory" mergeKey="createCategory"/>
+            <createData entity="_defaultProduct" mergeKey="createProduct">
+                <required-entity createDataKey="createCategory"/>
+            </createData>
+        </before>
+        <after>
+            <deleteData mergeKey="deleteMyProduct" createDataKey="createProduct"/>
+            <deleteData mergeKey="deleteMyCategory" createDataKey="createCategory"/>
+        </after>
         <include>
             <group name="example"/>
             <cest test="PersistMultipleEntitiesTest"  name="PersistMultipleEntitiesCest"/>
@@ -10,4 +20,4 @@
             <group name="testGroup"/>
         </exclude>
     </suite>
-</config>
\ No newline at end of file
+</suites>
\ No newline at end of file
-- 
GitLab


From 9495d63cd267a1015c847aecc68db6d83e9a159e Mon Sep 17 00:00:00 2001
From: Ji Lu <jilu1@magento.com>
Date: Fri, 20 Oct 2017 18:43:00 +0300
Subject: [PATCH 176/380] MQE-440: metadata changes for path parameters bug
 fix.

---
 .../FunctionalTest/Catalog/Metadata/category-meta.xml      | 7 ++++---
 .../FunctionalTest/Checkout/Metadata/coupon-meta.xml       | 4 ++--
 2 files changed, 6 insertions(+), 5 deletions(-)

diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/category-meta.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/category-meta.xml
index 0ab9bd1f562..e88c454d694 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/category-meta.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/category-meta.xml
@@ -30,8 +30,9 @@
         </object>
     </operation>
 
-    <operation name="UpdateCategory" dataType="category" type="update" auth="adminOauth" url="/V1/categories" method="PUT">
+    <operation name="UpdateCategory" dataType="category" type="update" auth="adminOauth" url="/V1/categories/{id}" method="PUT">
         <contentType>application/json</contentType>
+        <param key="id" type="path">{id}</param>
         <object key="category" dataType="category">
             <field key="id">integer</field>
             <field key="parent_id">integer</field>
@@ -54,8 +55,8 @@
         </object>
     </operation>
 
-    <operation name="DeleteCategory" dataType="category" type="delete" auth="adminOauth" url="/V1/categories" method="DELETE">
+    <operation name="DeleteCategory" dataType="category" type="delete" auth="adminOauth" url="/V1/categories/{id}" method="DELETE">
         <contentType>application/json</contentType>
-        <param key="categoryId" type="path">{id}</param>
+        <param key="id" type="path">{id}</param>
     </operation>
 </config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Metadata/coupon-meta.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Metadata/coupon-meta.xml
index 5be13e54fc5..5e2eeee9cce 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Metadata/coupon-meta.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Metadata/coupon-meta.xml
@@ -25,8 +25,8 @@
         </object>
     </operation>
 
-    <operation name="DeleteCoupon" dataType="coupon" type="delete" auth="adminOauth" url="/rest/V1/coupons" method="DELETE">
+    <operation name="DeleteCoupon" dataType="coupon" type="delete" auth="adminOauth" url="/rest/V1/coupons/{couponId}" method="DELETE">
         <header param="Content-Type">application/json</header>
-        <param key="couponId" type="path">{coupon_id}</param>
+        <param key="couponId" type="path">{couponId}</param>
     </operation>
 </config>
-- 
GitLab


From 9a15f7afde5b5cd806a235bb3e7a962bcb6d5630 Mon Sep 17 00:00:00 2001
From: Tom Reece <treece@magento.com>
Date: Tue, 24 Oct 2017 03:16:38 +0300
Subject: [PATCH 177/380] MQE-478: Deliver Pangolins Sprint 11

---
 .../ConfigurableProduct/Data/ConfigurableProductData.xml    | 4 ++++
 .../FunctionalTest/Sales/Cest/AdminCreateInvoiceCest.xml    | 6 +++---
 .../SampleTests/Cest/PersistMultipleEntitiesCest.xml        | 1 -
 3 files changed, 7 insertions(+), 4 deletions(-)

diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/Data/ConfigurableProductData.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/Data/ConfigurableProductData.xml
index 7569f7aeea3..c00794af79c 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/Data/ConfigurableProductData.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/Data/ConfigurableProductData.xml
@@ -21,4 +21,8 @@
         <required-entity type="product_extension_attribute">EavStockItem</required-entity>
         <required-entity type="custom_attribute_array">CustomAttributeCategoryIds</required-entity>
     </entity>
+    <entity name="ConfigurableProductAddChild" type="ConfigurableProductAddChild">
+        <var key="sku" entityKey="sku" entityType="product" />
+        <var key="childSku" entityKey="sku" entityType="product"/>
+    </entity>
 </config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Cest/AdminCreateInvoiceCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Cest/AdminCreateInvoiceCest.xml
index c043fe298f7..7ff96a3bed9 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Cest/AdminCreateInvoiceCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Cest/AdminCreateInvoiceCest.xml
@@ -57,13 +57,13 @@
             <grabTextFrom selector="{{CheckoutSuccessMainSection.orderNumber}}" returnVariable="orderNumber" mergeKey="grabOrderNumber"/>
             <!-- end todo -->
 
-            <amOnPage url="{{AdminLoginPage.url}}" mergeKey="goToAdmin"/>
+            <amOnPage url="{{AdminLoginPage}}" mergeKey="goToAdmin"/>
             <waitForPageLoad mergeKey="waitForPageLoad1"/>
             <fillField selector="{{AdminLoginFormSection.username}}" userInput="{{_ENV.MAGENTO_ADMIN_USERNAME}}" mergeKey="fillUsername"/>
             <fillField selector="{{AdminLoginFormSection.password}}" userInput="{{_ENV.MAGENTO_ADMIN_PASSWORD}}" mergeKey="fillPassword"/>
             <click selector="{{AdminLoginFormSection.signIn}}" mergeKey="clickLogin"/>
 
-            <amOnPage url="{{OrdersPage.url}}" mergeKey="onOrdersPage"/>
+            <amOnPage url="{{OrdersPage}}" mergeKey="onOrdersPage"/>
             <waitForElementNotVisible selector="{{OrdersGridSection.spinner}}" time="10" mergeKey="waitSpinner1"/>
             <fillField selector="{{OrdersGridSection.search}}" variable="orderNumber" mergeKey="searchOrderNum"/>
             <click selector="{{OrdersGridSection.submitSearch}}" mergeKey="submitSearch"/>
@@ -79,7 +79,7 @@
             <see selector="{{OrderDetailsInvoicesSection.content}}" userInput="John Doe" mergeKey="seeInvoice2"/>
             <click selector="{{OrderDetailsOrderViewSection.information}}" mergeKey="clickInformation"/>
             <see selector="{{OrderDetailsInformationSection.orderStatus}}" userInput="Processing" mergeKey="seeOrderStatus"/>
-            <amOnPage url="{{InvoicesPage.url}}" mergeKey="goToInvoices"/>
+            <amOnPage url="{{InvoicesPage}}" mergeKey="goToInvoices"/>
             <waitForElementNotVisible selector="{{InvoicesGridSection.spinner}}" time="10" mergeKey="waitSpinner4"/>
             <click selector="{{InvoicesGridSection.filter}}" mergeKey="clickFilters"/>
             <fillField selector="{{InvoicesFiltersSection.orderNum}}" variable="orderNumber" mergeKey="searchOrderNum2"/>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/PersistMultipleEntitiesCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/PersistMultipleEntitiesCest.xml
index 74bde899cb4..12b2a8774c4 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/PersistMultipleEntitiesCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/PersistMultipleEntitiesCest.xml
@@ -25,7 +25,6 @@
         </after>
         <test name="PersistMultipleEntitiesTest">
             <annotations>
-                <group value="ff"/>
                 <group value="skip"/>
             </annotations>
             <amOnPage mergeKey="s11" url="/$$simplecategory.name$$.html" />
-- 
GitLab


From 001c35cfabe2a24d6fc790f72019b328e143bce1 Mon Sep 17 00:00:00 2001
From: Ian Meron <imeron@magento.com>
Date: Tue, 24 Oct 2017 17:54:09 +0300
Subject: [PATCH 178/380] MQE-478: Deliver Pangolins Sprint 11

- code review fixes
---
 dev/tests/acceptance/RoboFile.php             | 45 +++++++++++++++++--
 dev/tests/acceptance/pre-install.php          |  5 ++-
 .../acceptance/tests/_suite/sampleSuite.xml   |  9 +++-
 .../Customer/Data/CustomerData.xml            |  1 -
 .../Cest/UpdateSimpleProductByApiCest.xml     | 11 +++--
 .../StorefrontDeletePersistedWishlistCest.xml | 10 ++++-
 .../Wishlist/Data/WishlistData.xml            |  6 +++
 .../Wishlist/Metadata/wishlist-meta.xml       |  8 +++-
 8 files changed, 82 insertions(+), 13 deletions(-)

diff --git a/dev/tests/acceptance/RoboFile.php b/dev/tests/acceptance/RoboFile.php
index 1a52216038b..f79f04839cf 100644
--- a/dev/tests/acceptance/RoboFile.php
+++ b/dev/tests/acceptance/RoboFile.php
@@ -15,6 +15,8 @@ class RoboFile extends \Robo\Tasks
 
     /**
      * Duplicate the Example configuration files used to customize the Project for customization
+     *
+     * @return void
      */
     function cloneFiles()
     {
@@ -26,6 +28,8 @@ class RoboFile extends \Robo\Tasks
     /**
      * Clone the Example configuration files
      * Build the Codeception project
+     *
+     * @return void
      */
     function buildProject()
     {
@@ -34,17 +38,24 @@ class RoboFile extends \Robo\Tasks
     }
 
     /**
-     * Generate all Tests
+     * Generate all Tests command.
+     *
+     * @param string[] $opts
+     * @return void
      */
     function generateTests($opts = ['config' => null, 'env' => 'chrome'])
     {
-        require 'tests/functional/_bootstrap.php';
+        require 'tests'. DIRECTORY_SEPARATOR . 'functional' . DIRECTORY_SEPARATOR . '_bootstrap.php';
         \Magento\FunctionalTestingFramework\Util\TestGenerator::getInstance()->createAllCestFiles($opts['config'], $opts['env']);
         $this->say("Generate Tests Command Run");
     }
 
     /**
      * Generate a suite based on name(s) passed in as args
+     *
+     * @param string[] args
+     * @return void
+     * @throws Exception
      */
     function generateSuite(array $args)
     {
@@ -52,7 +63,7 @@ class RoboFile extends \Robo\Tasks
             throw new Exception("Please provide suite name(s) after generate:suite command");
         }
 
-        require 'tests/functional/_bootstrap.php';
+        require 'tests'. DIRECTORY_SEPARATOR . 'functional' . DIRECTORY_SEPARATOR . '_bootstrap.php';
         $sg = \Magento\FunctionalTestingFramework\Suite\SuiteGenerator::getInstance();
 
         foreach ($args as $arg) {
@@ -62,6 +73,8 @@ class RoboFile extends \Robo\Tasks
 
     /**
      * Run all Functional tests using the Chrome environment
+     *
+     * @return void
      */
     function chrome()
     {
@@ -70,6 +83,8 @@ class RoboFile extends \Robo\Tasks
 
     /**
      * Run all Functional tests using the FireFox environment
+     *
+     * @return void
      */
     function firefox()
     {
@@ -78,6 +93,8 @@ class RoboFile extends \Robo\Tasks
 
     /**
      * Run all Functional tests using the PhantomJS environment
+     *
+     * @return void
      */
     function phantomjs()
     {
@@ -86,6 +103,8 @@ class RoboFile extends \Robo\Tasks
 
     /**
      * Run all Functional tests using the Chrome Headless environment
+     *
+     * @return void
      */
     function headless()
     {
@@ -94,7 +113,9 @@ class RoboFile extends \Robo\Tasks
 
     /**
      * Run all Tests with the specified @group tag, excluding @group 'skip', using the Chrome environment
+     *
      * @param string $args
+     * @return void
      */
     function group($args = '')
     {
@@ -103,7 +124,9 @@ class RoboFile extends \Robo\Tasks
 
     /**
      * Run all Functional tests located under the Directory Path provided using the Chrome environment
+     *
      * @param string $args
+     * @return void
      */
     function folder($args = '')
     {
@@ -112,6 +135,8 @@ class RoboFile extends \Robo\Tasks
 
     /**
      * Run all Tests marked with the @group tag 'example', using the Chrome environment
+     *
+     * @return void
      */
     function example()
     {
@@ -120,6 +145,8 @@ class RoboFile extends \Robo\Tasks
 
     /**
      * Generate the HTML for the Allure report based on the Test XML output - Allure v1.4.X
+     *
+     * @return void
      */
     function allure1Generate()
     {
@@ -128,6 +155,8 @@ class RoboFile extends \Robo\Tasks
 
     /**
      * Generate the HTML for the Allure report based on the Test XML output - Allure v2.3.X
+     *
+     * @return void
      */
     function allure2Generate()
     {
@@ -136,6 +165,8 @@ class RoboFile extends \Robo\Tasks
 
     /**
      * Open the HTML Allure report - Allure v1.4.xX
+     *
+     * @return void
      */
     function allure1Open()
     {
@@ -144,6 +175,8 @@ class RoboFile extends \Robo\Tasks
 
     /**
      * Open the HTML Allure report - Allure v2.3.X
+     *
+     * @return void
      */
     function allure2Open()
     {
@@ -152,6 +185,8 @@ class RoboFile extends \Robo\Tasks
 
     /**
      * Generate and open the HTML Allure report - Allure v1.4.X
+     *
+     * @return void
      */
     function allure1Report()
     {
@@ -164,6 +199,8 @@ class RoboFile extends \Robo\Tasks
 
     /**
      * Generate and open the HTML Allure report - Allure v2.3.X
+     *
+     * @return void
      */
     function allure2Report()
     {
@@ -176,6 +213,8 @@ class RoboFile extends \Robo\Tasks
 
     /**
      * Run the Pre-Install Check Script
+     *
+     * @return void
      */
     function preInstall()
     {
diff --git a/dev/tests/acceptance/pre-install.php b/dev/tests/acceptance/pre-install.php
index e723eb8d149..eaa25998f6d 100644
--- a/dev/tests/acceptance/pre-install.php
+++ b/dev/tests/acceptance/pre-install.php
@@ -3,7 +3,7 @@
  * Copyright © Magento, Inc. All rights reserved.
  * See COPYING.txt for license details.
  */
-
+// @codingStandardsIgnoreStart
 class CliColors {
     private $foreground_colors = array();
     private $background_colors = array();
@@ -384,4 +384,5 @@ class PreInstallCheck {
     }
 }
 
-$preCheck = new PreInstallCheck();
\ No newline at end of file
+$preCheck = new PreInstallCheck();
+// @codingStandardsIgnoreEnd
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/_suite/sampleSuite.xml b/dev/tests/acceptance/tests/_suite/sampleSuite.xml
index 977563871a3..f9b142d89c8 100644
--- a/dev/tests/acceptance/tests/_suite/sampleSuite.xml
+++ b/dev/tests/acceptance/tests/_suite/sampleSuite.xml
@@ -1,4 +1,11 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
+
 <suites xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Suite/etc/suiteSchema.xsd">
     <suite name="mySuite">
         <before>
@@ -20,4 +27,4 @@
             <group name="testGroup"/>
         </exclude>
     </suite>
-</suites>
\ No newline at end of file
+</suites>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Data/CustomerData.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Data/CustomerData.xml
index a5bb51fbcc0..f4bed283bb7 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Data/CustomerData.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Data/CustomerData.xml
@@ -47,6 +47,5 @@
     <entity name="Simple_US_Customer_For_Update" type="customer">
         <var key="id" entityKey="id" entityType="customer"/>
         <data key="firstname">Jane</data>
-
     </entity>
 </config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/UpdateSimpleProductByApiCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/UpdateSimpleProductByApiCest.xml
index 929b8488e52..aaf5439b3b5 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/UpdateSimpleProductByApiCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/UpdateSimpleProductByApiCest.xml
@@ -1,5 +1,11 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- Test XML Example -->
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
+
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Test/etc/testSchema.xsd">
     <cest name="UpdateSimpleProductByApiCest">
         <annotations>
@@ -18,7 +24,6 @@
             </createData>
             <updateData mergeKey="productHandle" entity="NewSimpleProduct" createDataKey="originalProductHandle">
             </updateData>
-            
         </before>
         <after>
             <deleteData mergeKey="delete" createDataKey="productHandle"/>
@@ -26,4 +31,4 @@
         <test name="UpdateSimpleProductByApiTest">
         </test>
     </cest>
-</config>
\ No newline at end of file
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Wishlist/Cest/StorefrontDeletePersistedWishlistCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Wishlist/Cest/StorefrontDeletePersistedWishlistCest.xml
index a424e6b921f..b1f452ac565 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Wishlist/Cest/StorefrontDeletePersistedWishlistCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Wishlist/Cest/StorefrontDeletePersistedWishlistCest.xml
@@ -1,5 +1,11 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- Test XML Example -->
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
+
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Test/etc/testSchema.xsd">
     <cest name="StorefrontDeletePersistedWishlistCest">
         <annotations>
@@ -48,4 +54,4 @@
             <see mergeKey="seeEmptyWishlist" userInput="You have no items in your wish list" selector="{{StorefrontCustomerWishlistSection.emptyWishlistText}}"/>
         </test>
     </cest>
-</config>
\ No newline at end of file
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Wishlist/Data/WishlistData.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Wishlist/Data/WishlistData.xml
index 343923fada8..b45c2e21d48 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Wishlist/Data/WishlistData.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Wishlist/Data/WishlistData.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataProfileSchema.xsd">
     <entity name="Wishlist" type="wishlist">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Wishlist/Metadata/wishlist-meta.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Wishlist/Metadata/wishlist-meta.xml
index 1a542d465ba..ab1aa22f9b8 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Wishlist/Metadata/wishlist-meta.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Wishlist/Metadata/wishlist-meta.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataOperation.xsd">
@@ -9,4 +15,4 @@
         <field key="customer_email">string</field>
         <field key="customer_password">string</field>
     </operation>
-</config>
\ No newline at end of file
+</config>
-- 
GitLab


From e7bdb594deb154d7be5558ae194103962669e5d7 Mon Sep 17 00:00:00 2001
From: Alex Kolesnyk <okolesnyk@magento.com>
Date: Tue, 24 Oct 2017 19:58:14 +0300
Subject: [PATCH 179/380] MQE-478: Deliver Pangolins Sprint 11

- code review fixes
---
 dev/tests/acceptance/pre-install.php | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/dev/tests/acceptance/pre-install.php b/dev/tests/acceptance/pre-install.php
index eaa25998f6d..6192044af9d 100644
--- a/dev/tests/acceptance/pre-install.php
+++ b/dev/tests/acceptance/pre-install.php
@@ -3,7 +3,11 @@
  * Copyright © Magento, Inc. All rights reserved.
  * See COPYING.txt for license details.
  */
-// @codingStandardsIgnoreStart
+
+/**
+ * @codingStandardsIgnoreStart
+ * @SuppressWarnings(PHPMD)
+ */
 class CliColors {
     private $foreground_colors = array();
     private $background_colors = array();
-- 
GitLab


From 754d569363ac1315e026491010a9f69d9bc5aa63 Mon Sep 17 00:00:00 2001
From: Alex Kolesnyk <okolesnyk@magento.com>
Date: Tue, 24 Oct 2017 20:34:49 +0300
Subject: [PATCH 180/380] MQE-478: Deliver Pangolins Sprint 11

- code review fixes
---
 dev/tests/acceptance/pre-install.php | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/dev/tests/acceptance/pre-install.php b/dev/tests/acceptance/pre-install.php
index 6192044af9d..4021dc10949 100644
--- a/dev/tests/acceptance/pre-install.php
+++ b/dev/tests/acceptance/pre-install.php
@@ -86,6 +86,9 @@ class CliColors {
     }
 }
 
+/**
+ * @SuppressWarnings(PHPMD)
+ */
 class PreInstallCheck {
     private $installedViaBrew             = false;
     private $filePath                     = '';
-- 
GitLab


From ca1df8c6dd906b9fb50d116529e47c011b9debae Mon Sep 17 00:00:00 2001
From: John Stennett <john00ivy@gmail.com>
Date: Fri, 27 Oct 2017 18:16:21 +0300
Subject: [PATCH 181/380] MQE-487: Robo Symfony Error

- Updating the Doc Comments, adjusting the @param value. "@param string[]" is invalid now, use "@param array" instead.
- Updating the Doc Comments, adding "@return void" to most of the functions. PHPStorm doesn't automatically add that now.
---
 dev/tests/acceptance/RoboFile.php | 38 +++++++++++++++----------------
 1 file changed, 19 insertions(+), 19 deletions(-)

diff --git a/dev/tests/acceptance/RoboFile.php b/dev/tests/acceptance/RoboFile.php
index f79f04839cf..038e3e9cd26 100644
--- a/dev/tests/acceptance/RoboFile.php
+++ b/dev/tests/acceptance/RoboFile.php
@@ -14,7 +14,7 @@ class RoboFile extends \Robo\Tasks
     use Robo\Task\Base\loadShortcuts;
 
     /**
-     * Duplicate the Example configuration files used to customize the Project for customization
+     * Duplicate the Example configuration files used to customize the Project for customization.
      *
      * @return void
      */
@@ -26,8 +26,8 @@ class RoboFile extends \Robo\Tasks
     }
 
     /**
-     * Clone the Example configuration files
-     * Build the Codeception project
+     * Duplicate the Example configuration files for the Project.
+     * Build the Codeception project.
      *
      * @return void
      */
@@ -38,9 +38,9 @@ class RoboFile extends \Robo\Tasks
     }
 
     /**
-     * Generate all Tests command.
+     * Generate all Tests in PHP.
      *
-     * @param string[] $opts
+     * @param array $opts
      * @return void
      */
     function generateTests($opts = ['config' => null, 'env' => 'chrome'])
@@ -51,11 +51,11 @@ class RoboFile extends \Robo\Tasks
     }
 
     /**
-     * Generate a suite based on name(s) passed in as args
+     * Generate a suite based on name(s) passed in as args.
      *
-     * @param string[] args
-     * @return void
+     * @param array $args
      * @throws Exception
+     * @return void
      */
     function generateSuite(array $args)
     {
@@ -72,7 +72,7 @@ class RoboFile extends \Robo\Tasks
     }
 
     /**
-     * Run all Functional tests using the Chrome environment
+     * Run all Functional tests using the Chrome environment.
      *
      * @return void
      */
@@ -82,7 +82,7 @@ class RoboFile extends \Robo\Tasks
     }
 
     /**
-     * Run all Functional tests using the FireFox environment
+     * Run all Functional tests using the FireFox environment.
      *
      * @return void
      */
@@ -92,7 +92,7 @@ class RoboFile extends \Robo\Tasks
     }
 
     /**
-     * Run all Functional tests using the PhantomJS environment
+     * Run all Functional tests using the PhantomJS environment.
      *
      * @return void
      */
@@ -102,7 +102,7 @@ class RoboFile extends \Robo\Tasks
     }
 
     /**
-     * Run all Functional tests using the Chrome Headless environment
+     * Run all Functional tests using the Chrome Headless environment.
      *
      * @return void
      */
@@ -112,7 +112,7 @@ class RoboFile extends \Robo\Tasks
     }
 
     /**
-     * Run all Tests with the specified @group tag, excluding @group 'skip', using the Chrome environment
+     * Run all Tests with the specified @group tag, excluding @group 'skip', using the Chrome environment.
      *
      * @param string $args
      * @return void
@@ -123,7 +123,7 @@ class RoboFile extends \Robo\Tasks
     }
 
     /**
-     * Run all Functional tests located under the Directory Path provided using the Chrome environment
+     * Run all Functional tests located under the Directory Path provided using the Chrome environment.
      *
      * @param string $args
      * @return void
@@ -134,7 +134,7 @@ class RoboFile extends \Robo\Tasks
     }
 
     /**
-     * Run all Tests marked with the @group tag 'example', using the Chrome environment
+     * Run all Tests marked with the @group tag 'example', using the Chrome environment.
      *
      * @return void
      */
@@ -146,7 +146,7 @@ class RoboFile extends \Robo\Tasks
     /**
      * Generate the HTML for the Allure report based on the Test XML output - Allure v1.4.X
      *
-     * @return void
+     * @return \Robo\Result
      */
     function allure1Generate()
     {
@@ -156,7 +156,7 @@ class RoboFile extends \Robo\Tasks
     /**
      * Generate the HTML for the Allure report based on the Test XML output - Allure v2.3.X
      *
-     * @return void
+     * @return \Robo\Result
      */
     function allure2Generate()
     {
@@ -164,7 +164,7 @@ class RoboFile extends \Robo\Tasks
     }
 
     /**
-     * Open the HTML Allure report - Allure v1.4.xX
+     * Open the HTML Allure report - Allure v1.4.X
      *
      * @return void
      */
@@ -212,7 +212,7 @@ class RoboFile extends \Robo\Tasks
     }
 
     /**
-     * Run the Pre-Install Check Script
+     * Run the Pre-Install system check script.
      *
      * @return void
      */
-- 
GitLab


From f12100a0de1aabbbfe2baceb06c9f8634f085add Mon Sep 17 00:00:00 2001
From: John Stennett <john00ivy@gmail.com>
Date: Fri, 27 Oct 2017 18:30:28 +0300
Subject: [PATCH 182/380] MQE-236: Adding a comment tag

- Adding an example to the SampleCest.
---
 .../Magento/FunctionalTest/SampleTests/Cest/SampleCest.xml       | 1 +
 1 file changed, 1 insertion(+)

diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/SampleCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/SampleCest.xml
index 21c3e6ef347..277f4e3341a 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/SampleCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/SampleCest.xml
@@ -49,6 +49,7 @@
             <clickWithRightButton selectorArray="['css' => '.checkout']" mergeKey="clickWithRightButton2" x="23" y="324"/>
             <clickWithRightButton mergeKey="clickWithRightButton3" x="23" y="324"/>
             <closeTab mergeKey="closeTab"/>
+            <comment userInput="This is a Comment." mergeKey="comment"/>
             <createData entity="CustomerEntity1" mergeKey="createData1"/>
             <deleteData createDataKey="createData1" mergeKey="deleteData1"/>
             <dontSee userInput="Text" mergeKey="dontSee1"/>
-- 
GitLab


From dd50ccd280999ff14bed382dbd7cd9a7ff565ce7 Mon Sep 17 00:00:00 2001
From: John Stennett <john00ivy@gmail.com>
Date: Fri, 27 Oct 2017 18:38:53 +0300
Subject: [PATCH 183/380] MQE-450: Adding a clearField method

- Adding the clearField method to the SampleCest.
---
 .../Magento/FunctionalTest/SampleTests/Cest/SampleCest.xml       | 1 +
 1 file changed, 1 insertion(+)

diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/SampleCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/SampleCest.xml
index 277f4e3341a..92bf0c29149 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/SampleCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/SampleCest.xml
@@ -38,6 +38,7 @@
             <attachFile userInput="filename.php" selector="#stuff" mergeKey="attachFile"/>
             <cancelPopup mergeKey="cancelPopup"/>
             <checkOption selector="#checkbox" mergeKey="checkOption"/>
+            <clearField selector="#field" mergeKey="clearField"/>
             <click selector="#button" userInput="Context" mergeKey="click1"/>
             <click selectorArray="['link' => 'Login']" mergeKey="click2"/>
             <click selectorArray="['link' => 'Login']" userInput="stuff" mergeKey="click3"/>
-- 
GitLab


From e693d3b1874b3c5ce227ef6d384a386f971296d0 Mon Sep 17 00:00:00 2001
From: Tom Reece <treece@magento.com>
Date: Mon, 30 Oct 2017 21:40:16 +0200
Subject: [PATCH 184/380] MQE-398: Rename Page.urlPath attribute

---
 .../Magento/FunctionalTest/Backend/Cest/AdminLoginCest.xml  | 2 +-
 .../Magento/FunctionalTest/Backend/Page/AdminLoginPage.xml  | 2 +-
 .../FunctionalTest/Catalog/Page/AdminCategoryPage.xml       | 2 +-
 .../FunctionalTest/Catalog/Page/AdminProductEditPage.xml    | 2 +-
 .../FunctionalTest/Catalog/Page/AdminProductIndexPage.xml   | 2 +-
 .../FunctionalTest/Catalog/Page/StorefrontCategoryPage.xml  | 2 +-
 .../FunctionalTest/Catalog/Page/StorefrontProductPage.xml   | 2 +-
 .../Checkout/Cest/StorefrontCustomerCheckoutCest.xml        | 2 +-
 .../Magento/FunctionalTest/Checkout/Page/CheckoutPage.xml   | 2 +-
 .../FunctionalTest/Checkout/Page/CheckoutSuccessPage.xml    | 2 +-
 .../FunctionalTest/Checkout/Page/GuestCheckoutPage.xml      | 2 +-
 .../Magento/FunctionalTest/Cms/Page/CmsNewPagePage.xml      | 2 +-
 .../Magento/FunctionalTest/Cms/Page/CmsPagesPage.xml        | 2 +-
 .../Cest/AdminCreateConfigurableProductCest.xml             | 4 ++--
 .../FunctionalTest/Customer/Page/AdminCustomerPage.xml      | 2 +-
 .../FunctionalTest/Customer/Page/AdminNewCustomerPage.xml   | 2 +-
 .../Customer/Page/StorefrontCustomerCreatePage.xml          | 2 +-
 .../Customer/Page/StorefrontCustomerDashboardPage.xml       | 2 +-
 .../Customer/Page/StorefrontCustomerSignInPage.xml          | 2 +-
 .../FunctionalTest/Customer/Page/StorefrontHomePage.xml     | 2 +-
 .../FunctionalTest/Sales/Cest/AdminCreateInvoiceCest.xml    | 6 +++---
 .../FunctionalTest/Sales/Page/InvoiceDetailsPage.xml        | 2 +-
 .../Magento/FunctionalTest/Sales/Page/InvoiceNewPage.xml    | 2 +-
 .../Magento/FunctionalTest/Sales/Page/InvoicesPage.xml      | 2 +-
 .../Magento/FunctionalTest/Sales/Page/OrderDetailsPage.xml  | 2 +-
 .../Magento/FunctionalTest/Sales/Page/OrdersPage.xml        | 2 +-
 .../SampleTemplates/Page/TemplatePageFile.xml               | 2 +-
 .../FunctionalTest/SampleTests/Cest/AdvancedSampleCest.xml  | 2 +-
 .../FunctionalTest/SampleTests/Cest/MinimumTestCest.xml     | 2 +-
 .../Magento/FunctionalTest/SampleTests/Page/SamplePage.xml  | 2 +-
 .../FunctionalTest/Store/Page/AdminSystemStorePage.xml      | 2 +-
 .../Wishlist/Page/StorefrontCustomerWishlistPage.xml        | 4 ++--
 32 files changed, 36 insertions(+), 36 deletions(-)

diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/Cest/AdminLoginCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/Cest/AdminLoginCest.xml
index a5c9c0c81cc..a50d75c167c 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/Cest/AdminLoginCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/Cest/AdminLoginCest.xml
@@ -30,7 +30,7 @@
             <fillField selector="{{AdminLoginFormSection.username}}" userInput="{{_ENV.MAGENTO_ADMIN_USERNAME}}" mergeKey="fillUsername"/>
             <fillField selector="{{AdminLoginFormSection.password}}" userInput="{{_ENV.MAGENTO_ADMIN_PASSWORD}}" mergeKey="fillPassword"/>
             <click selector="{{AdminLoginFormSection.signIn}}" mergeKey="clickOnSignIn"/>
-            <seeInCurrentUrl url="{{AdminLoginPage}}" mergeKey="seeAdminLoginUrl"/>
+            <seeInCurrentUrl url="{{AdminLoginPage.url}}" mergeKey="seeAdminLoginUrl"/>
         </test>
     </cest>
 </config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/Page/AdminLoginPage.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/Page/AdminLoginPage.xml
index 582c0733ff5..6dd9f1334f7 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/Page/AdminLoginPage.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/Page/AdminLoginPage.xml
@@ -8,7 +8,7 @@
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/PageObject.xsd">
-    <page name="AdminLoginPage" urlPath="admin/admin" module="Magento_Backend">
+    <page name="AdminLoginPage" url="admin/admin" module="Magento_Backend">
         <section name="AdminLoginFormSection"/>
     </page>
 </config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Page/AdminCategoryPage.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Page/AdminCategoryPage.xml
index 5cb797de26c..42eac82293d 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Page/AdminCategoryPage.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Page/AdminCategoryPage.xml
@@ -8,7 +8,7 @@
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/PageObject.xsd">
-    <page name="AdminCategoryPage" urlPath="admin/catalog/category/" module="Catalog">
+    <page name="AdminCategoryPage" url="admin/catalog/category/" module="Catalog">
         <section name="AdminCategorySidebarActionSection"/>
         <section name="AdminCategorySidebarTreeSection"/>
         <section name="AdminCategoryBasicFieldSection"/>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Page/AdminProductEditPage.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Page/AdminProductEditPage.xml
index ec19e6f3cc0..b0a19c3dac6 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Page/AdminProductEditPage.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Page/AdminProductEditPage.xml
@@ -8,7 +8,7 @@
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/PageObject.xsd">
-    <page name="AdminProductEditPage" urlPath="admin/catalog/product/new" module="Magento_Catalog">
+    <page name="AdminProductEditPage" url="admin/catalog/product/new" module="Magento_Catalog">
         <section name="AdminProductFormSection"/>
         <section name="AdminProductFormActionSection"/>
         <section name="AdminMessagesSection"/>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Page/AdminProductIndexPage.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Page/AdminProductIndexPage.xml
index e3ad5dac78c..7ebb7e05f31 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Page/AdminProductIndexPage.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Page/AdminProductIndexPage.xml
@@ -8,7 +8,7 @@
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/PageObject.xsd">
-    <page name="AdminProductIndexPage" urlPath="admin/catalog/product/index" module="Magento_Catalog">
+    <page name="AdminProductIndexPage" url="admin/catalog/product/index" module="Magento_Catalog">
         <section name="AdminProductGridActionSection" />
         <section name="AdminProductGridSection" />
         <section name="AdminMessagesSection" />
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Page/StorefrontCategoryPage.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Page/StorefrontCategoryPage.xml
index 7cc0fcf1364..2f8a1440838 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Page/StorefrontCategoryPage.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Page/StorefrontCategoryPage.xml
@@ -8,7 +8,7 @@
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/PageObject.xsd">
-    <page name="StorefrontCategoryPage" urlPath="/{{var1}}.html" module="Category" parameterized="true">
+    <page name="StorefrontCategoryPage" url="/{{var1}}.html" module="Category" parameterized="true">
         <section name="StorefrontCategoryMainSection"/>
     </page>
 </config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Page/StorefrontProductPage.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Page/StorefrontProductPage.xml
index 998bf0035f5..5565afa9549 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Page/StorefrontProductPage.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Page/StorefrontProductPage.xml
@@ -8,7 +8,7 @@
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/PageObject.xsd">
-    <page name="StorefrontProductPage" urlPath="admin/catalog/product/view" module="Magento_Catalog">
+    <page name="StorefrontProductPage" url="admin/catalog/product/view" module="Magento_Catalog">
         <section name="StorefrontProductInfoMainSection" />
         <section name="StorefrontProductInfoDetailsSection" />
         <section name="StorefrontProductImageSection" />
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Cest/StorefrontCustomerCheckoutCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Cest/StorefrontCustomerCheckoutCest.xml
index cd529555ab6..5e97a6ab03b 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Cest/StorefrontCustomerCheckoutCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Cest/StorefrontCustomerCheckoutCest.xml
@@ -68,7 +68,7 @@
             <fillField mergeKey="s63" selector="{{AdminLoginFormSection.password}}" userInput="{{_ENV.MAGENTO_ADMIN_PASSWORD}}" />
             <click mergeKey="s65" selector="{{AdminLoginFormSection.signIn}}" />
 
-            <amOnPage mergeKey="s67" url="{{OrdersPage}}"/>
+            <amOnPage mergeKey="s67" url="{{OrdersPage.url}}"/>
             <waitForPageLoad mergeKey="s75"/>
             <fillField mergeKey="s77" selector="{{OrdersGridSection.search}}" variable="orderNumber" />
             <waitForPageLoad mergeKey="s78"/>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Page/CheckoutPage.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Page/CheckoutPage.xml
index 54b9062425c..5a2640a52bd 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Page/CheckoutPage.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Page/CheckoutPage.xml
@@ -8,7 +8,7 @@
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/PageObject.xsd">
-    <page name="CheckoutPage" urlPath="/checkout" module="Checkout">
+    <page name="CheckoutPage" url="/checkout" module="Checkout">
         <section name="CheckoutShippingSection"/>
         <section name="CheckoutShippingMethodsSection"/>
         <section name="CheckoutOrderSummarySection"/>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Page/CheckoutSuccessPage.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Page/CheckoutSuccessPage.xml
index 44b82ab9270..23b6e0a01e7 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Page/CheckoutSuccessPage.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Page/CheckoutSuccessPage.xml
@@ -8,7 +8,7 @@
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/PageObject.xsd">
-    <page name="CheckoutSuccessPage" urlPath="/checkout/onepage/success/" module="Checkout">
+    <page name="CheckoutSuccessPage" url="/checkout/onepage/success/" module="Checkout">
         <section name="CheckoutSuccessMainSection"/>
     </page>
 </config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Page/GuestCheckoutPage.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Page/GuestCheckoutPage.xml
index a54db5eb82f..a1ff9ad939a 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Page/GuestCheckoutPage.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Page/GuestCheckoutPage.xml
@@ -8,7 +8,7 @@
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/PageObject.xsd">
-    <page name="GuestCheckoutPage" urlPath="/checkout" module="Checkout">
+    <page name="GuestCheckoutPage" url="/checkout" module="Checkout">
         <section name="GuestCheckoutShippingSection"/>
         <section name="GuestCheckoutPaymentSection"/>
     </page>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Page/CmsNewPagePage.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Page/CmsNewPagePage.xml
index 5624767bb25..fd75faa59f5 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Page/CmsNewPagePage.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Page/CmsNewPagePage.xml
@@ -8,7 +8,7 @@
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/PageObject.xsd">
-    <page name="CmsNewPagePage" urlPath="admin/cms/page/new" module="Magento_Cms">
+    <page name="CmsNewPagePage" url="admin/cms/page/new" module="Magento_Cms">
         <section name="CmsNewPagePageActionsSection"/>
         <section name="CmsNewPagePageBasicFieldsSection"/>
         <section name="CmsNewPagePageContentSection"/>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Page/CmsPagesPage.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Page/CmsPagesPage.xml
index f8564145ae3..a3e9406b990 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Page/CmsPagesPage.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Page/CmsPagesPage.xml
@@ -8,7 +8,7 @@
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/PageObject.xsd">
-    <page name="CmsPagesPage" urlPath="admin/cms/page" module="Magento_Cms">
+    <page name="CmsPagesPage" url="admin/cms/page" module="Magento_Cms">
         <section name="CmsPagesPageActionsSection"/>
     </page>
 </config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/Cest/AdminCreateConfigurableProductCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/Cest/AdminCreateConfigurableProductCest.xml
index 69f1a7ea6b0..ec091a292d4 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/Cest/AdminCreateConfigurableProductCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/Cest/AdminCreateConfigurableProductCest.xml
@@ -30,7 +30,7 @@
                 <env value="chrome"/>
             </annotations>
 
-            <amOnPage url="{{AdminCategoryPage.urlPath}}" mergeKey="amOnCategoryGridPage"/>
+            <amOnPage url="{{AdminCategoryPage.url}}" mergeKey="amOnCategoryGridPage"/>
             <waitForPageLoad mergeKey="waitForPageLoad1"/>
 
             <click selector="{{AdminCategorySidebarActionSection.AddSubcategoryButton}}" mergeKey="clickOnAddSubCategory"/>
@@ -131,4 +131,4 @@
             <see selector="{{StorefrontProductInfoMainSection.productAttributeOptions1}}" userInput="{{colorProductAttribute3.name}}" mergeKey="seeInDropDown3"/>
         </test>
     </cest>
-</config>
\ No newline at end of file
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Page/AdminCustomerPage.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Page/AdminCustomerPage.xml
index 450372d2d8b..84977673096 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Page/AdminCustomerPage.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Page/AdminCustomerPage.xml
@@ -8,7 +8,7 @@
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/PageObject.xsd">
-    <page name="AdminCustomerPage" urlPath="/admin/customer/index/" module="Customer">
+    <page name="AdminCustomerPage" url="/admin/customer/index/" module="Customer">
         <section name="AdminCustomerMainActionsSection"/>
         <section name="AdminCustomerMessagesSection"/>
         <section name="AdminCustomerGridSection"/>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Page/AdminNewCustomerPage.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Page/AdminNewCustomerPage.xml
index 725fe9f9618..5535e229f13 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Page/AdminNewCustomerPage.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Page/AdminNewCustomerPage.xml
@@ -8,7 +8,7 @@
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/PageObject.xsd">
-    <page name="AdminNewCustomerPage" urlPath="/admin/customer/index/new" module="Customer">
+    <page name="AdminNewCustomerPage" url="/admin/customer/index/new" module="Customer">
         <section name="AdminNewCustomerAccountInformationSection"/>
         <section name="AdminNewCustomerMainActionsSection"/>
     </page>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Page/StorefrontCustomerCreatePage.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Page/StorefrontCustomerCreatePage.xml
index 12f6c61f762..3949babe772 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Page/StorefrontCustomerCreatePage.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Page/StorefrontCustomerCreatePage.xml
@@ -8,7 +8,7 @@
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/PageObject.xsd">
-    <page name="StorefrontCustomerCreatePage" urlPath="/customer/account/create/" module="Magento_Customer">
+    <page name="StorefrontCustomerCreatePage" url="/customer/account/create/" module="Magento_Customer">
         <section name="StorefrontCustomerCreateFormSection" />
     </page>
 </config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Page/StorefrontCustomerDashboardPage.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Page/StorefrontCustomerDashboardPage.xml
index 498c39a1f6a..34b25b51444 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Page/StorefrontCustomerDashboardPage.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Page/StorefrontCustomerDashboardPage.xml
@@ -8,7 +8,7 @@
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/PageObject.xsd">
-    <page name="StorefrontCustomerDashboardPage" urlPath="/customer/account/" module="Magento_Customer">
+    <page name="StorefrontCustomerDashboardPage" url="/customer/account/" module="Magento_Customer">
         <section name="StorefrontCustomerDashboardAccountInformationSection" />
     </page>
 </config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Page/StorefrontCustomerSignInPage.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Page/StorefrontCustomerSignInPage.xml
index ddf5769bdcb..1500e59b4f0 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Page/StorefrontCustomerSignInPage.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Page/StorefrontCustomerSignInPage.xml
@@ -8,7 +8,7 @@
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/PageObject.xsd">
-    <page name="StorefrontCustomerSignInPage" urlPath="/customer/account/login/" module="Magento_Customer">
+    <page name="StorefrontCustomerSignInPage" url="/customer/account/login/" module="Magento_Customer">
         <section name="StorefrontCustomerSignInFormSection" />
     </page>
 </config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Page/StorefrontHomePage.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Page/StorefrontHomePage.xml
index 3d826553ab8..42a4336cc64 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Page/StorefrontHomePage.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Page/StorefrontHomePage.xml
@@ -8,7 +8,7 @@
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/PageObject.xsd">
-    <page name="StorefrontProductPage" urlPath="/" module="Magento_Customer">
+    <page name="StorefrontProductPage" url="/" module="Magento_Customer">
         <section name="StorefrontPanelHeader" />
     </page>
 </config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Cest/AdminCreateInvoiceCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Cest/AdminCreateInvoiceCest.xml
index 7ff96a3bed9..c043fe298f7 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Cest/AdminCreateInvoiceCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Cest/AdminCreateInvoiceCest.xml
@@ -57,13 +57,13 @@
             <grabTextFrom selector="{{CheckoutSuccessMainSection.orderNumber}}" returnVariable="orderNumber" mergeKey="grabOrderNumber"/>
             <!-- end todo -->
 
-            <amOnPage url="{{AdminLoginPage}}" mergeKey="goToAdmin"/>
+            <amOnPage url="{{AdminLoginPage.url}}" mergeKey="goToAdmin"/>
             <waitForPageLoad mergeKey="waitForPageLoad1"/>
             <fillField selector="{{AdminLoginFormSection.username}}" userInput="{{_ENV.MAGENTO_ADMIN_USERNAME}}" mergeKey="fillUsername"/>
             <fillField selector="{{AdminLoginFormSection.password}}" userInput="{{_ENV.MAGENTO_ADMIN_PASSWORD}}" mergeKey="fillPassword"/>
             <click selector="{{AdminLoginFormSection.signIn}}" mergeKey="clickLogin"/>
 
-            <amOnPage url="{{OrdersPage}}" mergeKey="onOrdersPage"/>
+            <amOnPage url="{{OrdersPage.url}}" mergeKey="onOrdersPage"/>
             <waitForElementNotVisible selector="{{OrdersGridSection.spinner}}" time="10" mergeKey="waitSpinner1"/>
             <fillField selector="{{OrdersGridSection.search}}" variable="orderNumber" mergeKey="searchOrderNum"/>
             <click selector="{{OrdersGridSection.submitSearch}}" mergeKey="submitSearch"/>
@@ -79,7 +79,7 @@
             <see selector="{{OrderDetailsInvoicesSection.content}}" userInput="John Doe" mergeKey="seeInvoice2"/>
             <click selector="{{OrderDetailsOrderViewSection.information}}" mergeKey="clickInformation"/>
             <see selector="{{OrderDetailsInformationSection.orderStatus}}" userInput="Processing" mergeKey="seeOrderStatus"/>
-            <amOnPage url="{{InvoicesPage}}" mergeKey="goToInvoices"/>
+            <amOnPage url="{{InvoicesPage.url}}" mergeKey="goToInvoices"/>
             <waitForElementNotVisible selector="{{InvoicesGridSection.spinner}}" time="10" mergeKey="waitSpinner4"/>
             <click selector="{{InvoicesGridSection.filter}}" mergeKey="clickFilters"/>
             <fillField selector="{{InvoicesFiltersSection.orderNum}}" variable="orderNumber" mergeKey="searchOrderNum2"/>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Page/InvoiceDetailsPage.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Page/InvoiceDetailsPage.xml
index 186097f4040..c18d0babc47 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Page/InvoiceDetailsPage.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Page/InvoiceDetailsPage.xml
@@ -8,7 +8,7 @@
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/PageObject.xsd">
-    <page name="InvoiceDetailsPage" urlPath="/admin/sales/invoice/view/invoice_id/" module="Sales">
+    <page name="InvoiceDetailsPage" url="/admin/sales/invoice/view/invoice_id/" module="Sales">
         <section name="InvoiceDetailsInformationSection"/>
     </page>
 </config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Page/InvoiceNewPage.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Page/InvoiceNewPage.xml
index 185d89e80f8..c22b278bdaf 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Page/InvoiceNewPage.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Page/InvoiceNewPage.xml
@@ -8,7 +8,7 @@
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/PageObject.xsd">
-    <page name="InvoiceNewPage" urlPath="/admin/sales/order_invoice/new/order_id/" module="Sales">
+    <page name="InvoiceNewPage" url="/admin/sales/order_invoice/new/order_id/" module="Sales">
         <section name="InvoiceNewSection"/>
     </page>
 </config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Page/InvoicesPage.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Page/InvoicesPage.xml
index ae145b50a8e..a774ced2436 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Page/InvoicesPage.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Page/InvoicesPage.xml
@@ -8,7 +8,7 @@
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/PageObject.xsd">
-    <page name="InvoicesPage" urlPath="/admin/sales/invoice/" module="Sales">
+    <page name="InvoicesPage" url="/admin/sales/invoice/" module="Sales">
         <section name="InvoicesGridSection"/>
         <section name="InvoicesFiltersSection"/>
     </page>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Page/OrderDetailsPage.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Page/OrderDetailsPage.xml
index 050254c7ee5..6f8f9a3d2fd 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Page/OrderDetailsPage.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Page/OrderDetailsPage.xml
@@ -8,7 +8,7 @@
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/PageObject.xsd">
-    <page name="OrderDetailsPage" urlPath="/admin/sales/order/view/order_id/" module="Sales">
+    <page name="OrderDetailsPage" url="/admin/sales/order/view/order_id/" module="Sales">
         <section name="OrderDetailsMainActionsSection"/>
         <section name="OrderDetailsInformationSection"/>
         <section name="OrderDetailsMessagesSection"/>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Page/OrdersPage.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Page/OrdersPage.xml
index 0d009bba529..d57f13f8240 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Page/OrdersPage.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Page/OrdersPage.xml
@@ -8,7 +8,7 @@
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/PageObject.xsd">
-    <page name="OrdersPage" urlPath="/admin/sales/order/" module="Sales">
+    <page name="OrdersPage" url="/admin/sales/order/" module="Sales">
         <section name="OrdersGridSection"/>
     </page>
 </config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTemplates/Page/TemplatePageFile.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTemplates/Page/TemplatePageFile.xml
index 17be26f6b6f..755e15113e4 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTemplates/Page/TemplatePageFile.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTemplates/Page/TemplatePageFile.xml
@@ -8,7 +8,7 @@
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/PageObject.xsd">
-    <page name="" urlPath="" module="">
+    <page name="" url="" module="">
         <section name=""/>
     </page>
 </config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/AdvancedSampleCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/AdvancedSampleCest.xml
index 50a3793fb2d..11dfa611f20 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/AdvancedSampleCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/AdvancedSampleCest.xml
@@ -36,7 +36,7 @@
             </createData>
 
             <!-- Parameterized url -->
-            <amOnPage url="{{SamplePage('foo', SamplePerson.bar)}}" mergeKey="amOnPage"/>
+            <amOnPage url="{{SamplePage.url('foo', SamplePerson.bar)}}" mergeKey="amOnPage"/>
 
             <!-- Parameterized selector -->
             <grabTextFrom selector="{{SampleSection.twoParamElement(SamplePerson.foo, 'bar')}}" returnVariable="myReturnVar" mergeKey="grabTextFrom"/>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/MinimumTestCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/MinimumTestCest.xml
index 6d4e6a73c87..b1cfc787acb 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/MinimumTestCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/MinimumTestCest.xml
@@ -26,7 +26,7 @@
                 <env value="phantomjs"/>
                 <env value="headless"/>
             </annotations>
-            <amOnPage url="{{AdminLoginPage}}" mergeKey="navigateToAdmin"/>
+            <amOnPage url="{{AdminLoginPage.url}}" mergeKey="navigateToAdmin"/>
             <fillField selector="{{AdminLoginFormSection.username}}" userInput="{{_ENV.MAGENTO_ADMIN_USERNAME}}" mergeKey="fillUsername"/>
             <fillField selector="{{AdminLoginFormSection.password}}" userInput="{{_ENV.MAGENTO_ADMIN_PASSWORD}}" mergeKey="fillPassword"/>
             <click selector="{{AdminLoginFormSection.signIn}}" mergeKey="clickLogin"/>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Page/SamplePage.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Page/SamplePage.xml
index 034e0dd50dd..d82d1079b75 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Page/SamplePage.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Page/SamplePage.xml
@@ -8,7 +8,7 @@
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/PageObject.xsd">
-    <page name="SamplePage" urlPath="/{{var1}}/{{var2}}.html" module="SampleTests" parameterized="true">
+    <page name="SamplePage" url="/{{var1}}/{{var2}}.html" module="SampleTests" parameterized="true">
         <section name="SampleSection"/>
     </page>
 </config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/Page/AdminSystemStorePage.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/Page/AdminSystemStorePage.xml
index 4d981b218b7..8aef6123f5a 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/Page/AdminSystemStorePage.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/Page/AdminSystemStorePage.xml
@@ -6,7 +6,7 @@
   */
 -->
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/PageObject.xsd">
-    <page name="AdminSystemStorePage" urlPath="/admin/admin/system_store/" module="Store">
+    <page name="AdminSystemStorePage" url="/admin/admin/system_store/" module="Store">
         <section name="AdminStoresMainActionsSection"/>
         <section name="AdminStoresGridSection"/>
     </page>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Wishlist/Page/StorefrontCustomerWishlistPage.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Wishlist/Page/StorefrontCustomerWishlistPage.xml
index b488387c8bf..0ffe0f6c9ef 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Wishlist/Page/StorefrontCustomerWishlistPage.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Wishlist/Page/StorefrontCustomerWishlistPage.xml
@@ -8,7 +8,7 @@
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/PageObject.xsd">
-    <page name="StorefrontCustomerWishlistPage" urlPath="/wishlist/" module="Magento_Wishlist">
+    <page name="StorefrontCustomerWishlistPage" url="/wishlist/" module="Magento_Wishlist">
         <section name="StorefrontCustomerWishlistSection" />
     </page>
-</config>
\ No newline at end of file
+</config>
-- 
GitLab


From 500cc7f68ad5b1c1582cb858ca6ac7abb6a2a0bb Mon Sep 17 00:00:00 2001
From: Ian Meron <imeron@magento.com>
Date: Thu, 26 Oct 2017 23:51:23 +0300
Subject: [PATCH 185/380] MQE-388: Write store settings before tests

- add paypal and braintree config metadata
- add paypal nad braintree sample data
---
 .../Config/Data/braintreeData.xml             | 37 ++++++++++++++
 .../FunctionalTest/Config/Data/paypalData.xml | 41 +++++++++++++++
 .../Config/Metadata/braintree_config-meta.xml | 45 ++++++++++++++++
 .../Config/Metadata/paypal_config-meta.xml    | 51 +++++++++++++++++++
 4 files changed, 174 insertions(+)
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Config/Data/braintreeData.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Config/Data/paypalData.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Config/Metadata/braintree_config-meta.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Config/Metadata/paypal_config-meta.xml

diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Config/Data/braintreeData.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Config/Data/braintreeData.xml
new file mode 100644
index 00000000000..273669acc45
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Config/Data/braintreeData.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataProfileSchema.xsd">
+    <entity name="sampleBraintreeConfig" type="braintree_config_state">
+        <required-entity type="title">sampleTitle</required-entity>
+        <required-entity type="payment_action">samplePaymentAction</required-entity>
+        <required-entity type="environment">sampleEnvironment</required-entity>
+        <required-entity type="merchant_id">sampleMerchantId</required-entity>
+        <required-entity type="public_key">samplePublicKey</required-entity>
+        <required-entity type="private_key">samplePrivateKey</required-entity>
+    </entity>
+    <entity name="sampleTitle" type="title">
+        <data key="value">Sample Braintree Config</data>
+    </entity>
+    <entity name="samplePaymentAction" type="payment_action">
+        <data key="value">authorize</data>
+    </entity>
+    <entity name="sampleEnvironment" type="environment">
+        <data key="value">sandbox</data>
+    </entity>
+    <entity name="sampleMerchantId" type="merchant_id">
+        <data key="value">someMerchantId</data>
+    </entity>
+    <entity name="samplePublicKey" type="public_key">
+        <data key="value">somePublicKey</data>
+    </entity>
+    <entity name="samplePrivateKey" type="private_key">
+        <data key="value">somePrivateKey</data>
+    </entity>
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Config/Data/paypalData.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Config/Data/paypalData.xml
new file mode 100644
index 00000000000..96c5986732d
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Config/Data/paypalData.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataProfileSchema.xsd">
+    <entity name="samplePaypalConfig" type="paypal_config_state">
+        <required-entity type="business_account">sampleBusinessAccount</required-entity>
+        <required-entity type="api_username">sampleApiUsername</required-entity>
+        <required-entity type="api_password">sampleApiPassword</required-entity>
+        <required-entity type="api_signature">sampleApiSignature</required-entity>
+        <required-entity type="api_authentication">sampleApiAuthentication</required-entity>
+        <required-entity type="sandbox_flag">sampleSandboxFlag</required-entity>
+        <required-entity type="use_proxy">sampleUseProxy</required-entity>
+    </entity>
+    <entity name="sampleBusinessAccount" type="business_account">
+        <data key="value">myBusinessAccount@magento.com</data>
+    </entity>
+    <entity name="sampleApiUsername" type="api_username">
+        <data key="value">myApiUsername.magento.com</data>
+    </entity>
+    <entity name="sampleApiPassword" type="api_password">
+        <data key="value">somePassword</data>
+    </entity>
+    <entity name="sampleApiSignature" type="api_signature">
+        <data key="value">someApiSignature</data>
+    </entity>
+    <entity name="sampleApiAuthentication" type="api_authentication">
+        <data key="value">0</data>
+    </entity>
+    <entity name="sampleSandboxFlag" type="sandbox_flag">
+        <data key="value">0</data>
+    </entity>
+    <entity name="sampleUseProxy" type="use_proxy">
+        <data key="value">0</data>
+    </entity>
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Config/Metadata/braintree_config-meta.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Config/Metadata/braintree_config-meta.xml
new file mode 100644
index 00000000000..04b7f5fb526
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Config/Metadata/braintree_config-meta.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataOperation.xsd">
+    <operation name="createBraintreeConfigState" dataType="braintree_config_state" type="create" auth="adminFormKey" url="/admin/system_config/save/section/payment/" method="POST">
+        <object key="groups" dataType="braintree_config_state">
+            <object key="braintree_section" dataType="braintree_config_state">
+                <object key="groups" dataType="braintree_config_state">
+                    <object key="braintree" dataType="braintree_config_state">
+                        <object key="groups" dataType="braintree_config_state">
+                            <object key="braintree_required" dataType="braintree_config_state">
+                                <object key="fields" dataType="braintree_config_state">
+                                    <object key="title" dataType="title">
+                                        <field key="value">string</field>
+                                    </object>
+                                    <object key="environment" dataType="environment">
+                                        <field key="value">string</field>
+                                    </object>
+                                    <object key="payment_action" dataType="payment_action">
+                                        <field key="value">string</field>
+                                    </object>
+                                    <object key="merchant_id" dataType="merchant_id">
+                                        <field key="value">string</field>
+                                    </object>
+                                    <object key="public_key" dataType="public_key">
+                                        <field key="value">string</field>
+                                    </object>
+                                    <object key="private_key" dataType="private_key">
+                                        <field key="value">string</field>
+                                    </object>
+                                </object>
+                            </object>
+                        </object>
+                    </object>
+                </object>
+            </object>
+        </object>
+    </operation>
+</config>
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Config/Metadata/paypal_config-meta.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Config/Metadata/paypal_config-meta.xml
new file mode 100644
index 00000000000..2e58876103d
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Config/Metadata/paypal_config-meta.xml
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataOperation.xsd">
+    <operation name="createPaypalConfigState" dataType="paypal_config_state" type="create" auth="adminFormKey" url="/admin/system_config/save/section/payment/" method="POST">
+        <object key="groups" dataType="paypal_config_state">
+            <object key="paypal_alternative_payment_methods" dataType="paypal_config_state">
+                <object key="groups" dataType="paypal_config_state">
+                    <object key="express_checkout_us" dataType="paypal_config_state">
+                        <object key="groups" dataType="paypal_config_state">
+                            <object key="express_checkout_required" dataType="paypal_config_state">
+                                <object key="groups" dataType="paypal_config_state">
+                                    <object key="express_checkout_required_express_checkout" dataType="paypal_config_state">
+                                        <object key="fields" dataType="paypal_config_state">
+                                            <object key="business_account" dataType="business_account">
+                                                <field key="value">string</field>
+                                            </object>
+                                            <object key="api_username" dataType="api_username">
+                                                <field key="value">string</field>
+                                            </object>
+                                            <object key="api_password" dataType="api_password">
+                                                <field key="value">string</field>
+                                            </object>
+                                            <object key="api_signature" dataType="api_signature">
+                                                <field key="value">string</field>
+                                            </object>
+                                            <object key="sandbox_flag" dataType="sandbox_flag">
+                                                <field key="value">string</field>
+                                            </object>
+                                            <object key="use_proxy" dataType="use_proxy">
+                                                <field key="value">string</field>
+                                            </object>
+                                            <object key="api_authentication" dataType="api_authentication">
+                                                <field key="value">string</field>
+                                            </object>
+                                        </object>
+                                    </object>
+                                </object>
+                            </object>
+                        </object>
+                    </object>
+                </object>
+            </object>
+        </object>
+    </operation>
+</config>
-- 
GitLab


From 5fe6e2bb66db679f184795830da52b397e7b1d13 Mon Sep 17 00:00:00 2001
From: Ian Meron <imeron@magento.com>
Date: Mon, 30 Oct 2017 20:35:12 +0200
Subject: [PATCH 186/380] MQE-388: Write store settings before tests

- add new test to demonstrate usage
- add new default config for restoring settings
---
 .../Config/Data/braintreeData.xml             | 28 +++++++++++++++++++
 .../FunctionalTest/Config/Data/paypalData.xml | 20 +++++++++++++
 .../Cest/SetPaymentConfigurationCest.xml      | 21 ++++++++++++++
 3 files changed, 69 insertions(+)
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/SetPaymentConfigurationCest.xml

diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Config/Data/braintreeData.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Config/Data/braintreeData.xml
index 273669acc45..ae5bfd17fe8 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Config/Data/braintreeData.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Config/Data/braintreeData.xml
@@ -34,4 +34,32 @@
     <entity name="samplePrivateKey" type="private_key">
         <data key="value">somePrivateKey</data>
     </entity>
+
+    <!-- default configuration used to restore Magento config -->
+    <entity name="defaultBraintreeConfig" type="braintree_config_state">
+        <required-entity type="title">defaultTitle</required-entity>
+        <required-entity type="payment_action">defaultPaymentAction</required-entity>
+        <required-entity type="environment">defaultEnvironment</required-entity>
+        <required-entity type="merchant_id">defaultMerchantId</required-entity>
+        <required-entity type="public_key">defaultPublicKey</required-entity>
+        <required-entity type="private_key">defaultPrivateKey</required-entity>
+    </entity>
+    <entity name="defaultTitle" type="title">
+        <data key="value"/>
+    </entity>
+    <entity name="defaultPaymentAction" type="payment_action">
+        <data key="value"/>
+    </entity>
+    <entity name="defaultEnvironment" type="environment">
+        <data key="value"/>
+    </entity>
+    <entity name="defaultMerchantId" type="merchant_id">
+        <data key="value"/>
+    </entity>
+    <entity name="defaultPublicKey" type="public_key">
+        <data key="value"/>
+    </entity>
+    <entity name="defaultPrivateKey" type="private_key">
+        <data key="value"/>
+    </entity>
 </config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Config/Data/paypalData.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Config/Data/paypalData.xml
index 96c5986732d..3f1190a408a 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Config/Data/paypalData.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Config/Data/paypalData.xml
@@ -38,4 +38,24 @@
     <entity name="sampleUseProxy" type="use_proxy">
         <data key="value">0</data>
     </entity>
+
+    <!-- default configuration used to restore Magento config -->
+    <entity name="defaultPayPalConfig" type="paypal_config_state">
+        <required-entity type="business_account">defaultBusinessAccount</required-entity>
+        <required-entity type="api_username">defaultApiUsername</required-entity>
+        <required-entity type="api_password">defaultApiPassword</required-entity>
+        <required-entity type="api_signature">defaultApiSignature</required-entity>
+    </entity>
+    <entity name="defaultBusinessAccount" type="business_account">
+        <data key="value"/>
+    </entity>
+    <entity name="defaultApiUsername" type="api_username">
+        <data key="value"/>
+    </entity>
+    <entity name="defaultApiPassword" type="api_password">
+        <data key="value"/>
+    </entity>
+    <entity name="defaultApiSignature" type="api_signature">
+        <data key="value"/>
+    </entity>
 </config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/SetPaymentConfigurationCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/SetPaymentConfigurationCest.xml
new file mode 100644
index 00000000000..51d07d501e3
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/SetPaymentConfigurationCest.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Test/etc/testSchema.xsd">
+    <cest name="SetPaymentConfigurationCest">
+        <test name="SetPaypalConfigurationTest">
+            <createData entity="samplePaypalConfig" mergeKey="createSamplePaypalConfig"/>
+            <createData entity="defaultPaypalConfig" mergeKey="restoreDefaultPaypalConfig"/>
+        </test>
+        <test name="SetBraintreeConfigurationTest">
+            <createData entity="sampleBraintreeConfig" mergeKey="createSampleBraintreeConfig"/>
+            <createData entity="defaultBraintreeConfig" mergeKey="restoreDefaultBraintreeConfig"/>
+        </test>
+    </cest>
+</config>
-- 
GitLab


From e5c9da6bffe7b3c65d56f3d5aa8ab094f58380be Mon Sep 17 00:00:00 2001
From: Kevin Kozan <kkozan@magento.com>
Date: Tue, 31 Oct 2017 20:34:13 +0200
Subject: [PATCH 187/380] MQE-484: parameter array with data replacement does
 not generate uniqueness function correctly

- fixed SimpleProductCest to not generate bad output
- Fixed configurableProductCest to not generate bad output.
---
 .../Catalog/Cest/AdminCreateSimpleProductCest.xml               | 2 +-
 .../Cest/AdminCreateConfigurableProductCest.xml                 | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Cest/AdminCreateSimpleProductCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Cest/AdminCreateSimpleProductCest.xml
index 87b8e2a1d94..f649580554e 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Cest/AdminCreateSimpleProductCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Cest/AdminCreateSimpleProductCest.xml
@@ -37,7 +37,7 @@
             <fillField userInput="{{_defaultProduct.sku}}" selector="{{AdminProductFormSection.productSku}}" mergeKey="fillSKU"/>
             <fillField userInput="{{_defaultProduct.price}}" selector="{{AdminProductFormSection.productPrice}}" mergeKey="fillPrice"/>
             <fillField userInput="{{_defaultProduct.quantity}}" selector="{{AdminProductFormSection.productQuantity}}" mergeKey="fillQuantity"/>
-            <searchAndMultiSelectOption selector="{{AdminProductFormSection.categoriesDropdown}}" parameterArray="['$$createPreReqCategory.name$$']" mergeKey="searchAndSelectCategory"/>
+            <searchAndMultiSelectOption selector="{{AdminProductFormSection.categoriesDropdown}}" parameterArray="[$$createPreReqCategory.name$$]" mergeKey="searchAndSelectCategory"/>
             <click selector="{{AdminProductSEOSection.sectionHeader}}" mergeKey="openSeoSection"/>
             <fillField userInput="{{_defaultProduct.urlKey}}" selector="{{AdminProductSEOSection.urlKeyInput}}" mergeKey="fillUrlKey"/>
             <click selector="{{AdminProductFormActionSection.saveButton}}" mergeKey="saveProduct"/>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/Cest/AdminCreateConfigurableProductCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/Cest/AdminCreateConfigurableProductCest.xml
index ec091a292d4..fbcc2581b40 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/Cest/AdminCreateConfigurableProductCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/Cest/AdminCreateConfigurableProductCest.xml
@@ -48,7 +48,7 @@
             <fillField userInput="{{_defaultProduct.sku}}" selector="{{AdminProductFormSection.productSku}}" mergeKey="fillSKU"/>
             <fillField userInput="{{_defaultProduct.price}}" selector="{{AdminProductFormSection.productPrice}}" mergeKey="fillPrice"/>
             <fillField userInput="{{_defaultProduct.quantity}}" selector="{{AdminProductFormSection.productQuantity}}" mergeKey="fillQuantity"/>
-            <searchAndMultiSelectOption selector="{{AdminProductFormSection.categoriesDropdown}}" parameterArray="['{{_defaultCategory.name}}']" mergeKey="searchAndSelectCategory"/>
+            <searchAndMultiSelectOption selector="{{AdminProductFormSection.categoriesDropdown}}" parameterArray="[{{_defaultCategory.name}}]" mergeKey="searchAndSelectCategory"/>
             <click selector="{{AdminProductSEOSection.sectionHeader}}" mergeKey="openSeoSection"/>
             <fillField userInput="{{_defaultProduct.urlKey}}" selector="{{AdminProductSEOSection.urlKeyInput}}" mergeKey="fillUrlKey"/>
 
-- 
GitLab


From 277a09e4ead50e71433e6ef3142f98206ebb0884 Mon Sep 17 00:00:00 2001
From: Ian Meron <imeron@magento.com>
Date: Tue, 31 Oct 2017 21:12:54 +0200
Subject: [PATCH 188/380] MQE-484: ParamterArray with data replacement does not
 generate uniqueness function correctly

- fix SampleCest.xml to account for new parameterArray rule
---
 .../FunctionalTest/SampleTests/Cest/SampleCest.xml   | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/SampleCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/SampleCest.xml
index 92bf0c29149..e3ff7be39cb 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/SampleCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/SampleCest.xml
@@ -105,9 +105,9 @@
             <performOn selector=".rememberMe" function="function (WebDriver $I) { $I->see('Remember me next time'); $I->seeElement('#LoginForm_rememberMe'); $I->dontSee('Login'); }" mergeKey="performOn1"/>
             <performOn selector=".rememberMe" function="ActionSequence::build()->see('Warning')->see('Are you sure you want to delete this?')->click('Yes')" mergeKey="performOn2"/>
             <pressKey selector="#page" userInput="a" mergeKey="pressKey1"/>
-            <pressKey selector="#page" parameterArray="array('ctrl','a'),'new'" mergeKey="pressKey2"/>
-            <pressKey selector="#page" parameterArray="array('shift','111'),'1','x'" mergeKey="pressKey3"/>
-            <pressKey selector="#page" parameterArray="array('ctrl', 'a'), \Facebook\WebDriver\WebDriverKeys::DELETE" mergeKey="pressKey4"/>
+            <pressKey selector="#page" parameterArray="[['ctrl','a'],'new']" mergeKey="pressKey2"/>
+            <pressKey selector="#page" parameterArray="[['shift','111'],'1','x']" mergeKey="pressKey3"/>
+            <pressKey selector="#page" parameterArray="[['ctrl', 'a'], \Facebook\WebDriver\WebDriverKeys::DELETE]" mergeKey="pressKey4"/>
             <!--pressKey selector="descendant-or-self::*[@id='page']" userInput="u" mergeKey="pressKey5"/-->
             <reloadPage mergeKey="reloadPage"/>
             <resetCookie userInput="cookie" mergeKey="resetCookie1"/>
@@ -135,7 +135,7 @@
             <seeInField userInput="Stuff" selector="#field" mergeKey="seeInField1"/>
             <seeInField userInput="Stuff" selectorArray="['name' => 'search']" mergeKey="seeInField2"/>
             <seeInFormFields selector="form[name=myform]" parameterArray="['input1' => 'value','input2' => 'other value']" mergeKey="seeInFormFields1"/>
-            <seeInFormFields selector=".form-class" parameterArray="['multiselect' => ['value1','value2'],'checkbox[]' => ['a checked value','another checked value',]]" mergeKey="seeInFormFields2"/>
+            <seeInFormFields selector=".form-class" parameterArray="[['multiselect' => ['value1','value2'],'checkbox[]]' => ['a checked value','another checked value',]]" mergeKey="seeInFormFields2"/>
             <!--<seeInPageSource html="<h1></h1>" mergeKey="seeInPageSource"/>-->
             <seeInPopup userInput="Yes in Popup" mergeKey="seeInPopup"/>
             <!--<seeInSource html="<h1></h1>" mergeKey="seeInSource"/>-->
@@ -146,8 +146,8 @@
             <seeNumberOfElements selector="tr" userInput="[0, 10]" mergeKey="seeNumberOfElements2"/>
             <seeOptionIsSelected selector=".option" userInput="Visa" mergeKey="seeOptionIsSelected"/>
             <selectOption selector=".dropDown" userInput="Option Name" mergeKey="selectOption1"/>
-            <selectOption selector="//form/select[@name=account]" parameterArray="array('Windows','Linux')" mergeKey="selectOption2"/>
-            <selectOption selector="Which OS do you use?" parameterArray="array('text' => 'Windows')" mergeKey="selectOption3"/>
+            <selectOption selector="//form/select[@name=account]" parameterArray="['Windows','Linux']" mergeKey="selectOption2"/>
+            <selectOption selector="Which OS do you use?" parameterArray="['text' => 'Windows']" mergeKey="selectOption3"/>
             <setCookie userInput="PHPSESSID" value="stuff" mergeKey="setCookie1"/>
             <setCookie userInput="PHPSESSID" value="stuff" parameterArray="['domainName' => 'www.google.com']" mergeKey="setCookie2"/>
             <submitForm selector="#my-form" parameterArray="['field' => ['value','another value',]]" button="#submit" mergeKey="submitForm2"/>
-- 
GitLab


From c9fe893bbf83b6d002d3e9f562f94260a8cf7b00 Mon Sep 17 00:00:00 2001
From: Tom Reece <treece@magento.com>
Date: Thu, 2 Nov 2017 18:12:02 +0200
Subject: [PATCH 189/380] MQE-510: Output from robo generate:tests contains
 --env chrome parameters

- Remove env argument from generate:tests command
---
 dev/tests/acceptance/RoboFile.php | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/dev/tests/acceptance/RoboFile.php b/dev/tests/acceptance/RoboFile.php
index 038e3e9cd26..c255e9f0653 100644
--- a/dev/tests/acceptance/RoboFile.php
+++ b/dev/tests/acceptance/RoboFile.php
@@ -43,10 +43,10 @@ class RoboFile extends \Robo\Tasks
      * @param array $opts
      * @return void
      */
-    function generateTests($opts = ['config' => null, 'env' => 'chrome'])
+    function generateTests($opts = ['config' => null])
     {
         require 'tests'. DIRECTORY_SEPARATOR . 'functional' . DIRECTORY_SEPARATOR . '_bootstrap.php';
-        \Magento\FunctionalTestingFramework\Util\TestGenerator::getInstance()->createAllCestFiles($opts['config'], $opts['env']);
+        \Magento\FunctionalTestingFramework\Util\TestGenerator::getInstance()->createAllCestFiles($opts['config']);
         $this->say("Generate Tests Command Run");
     }
 
-- 
GitLab


From 7aa51ab059d2fd2941b50332ea41a4e241e51c52 Mon Sep 17 00:00:00 2001
From: Kevin Kozan <kkozan@magento.com>
Date: Thu, 2 Nov 2017 18:19:18 +0200
Subject: [PATCH 190/380] MQE-496: Unable to pass multiple ActionGroup
 arguments into parameterized selector

- Added SampleTests eamples with the problematic ActionGroup.
---
 .../SampleTests/ActionGroup/SampleActionGroup.xml           | 6 ++++++
 .../FunctionalTest/SampleTests/Cest/AdvancedSampleCest.xml  | 4 ++++
 .../Magento/FunctionalTest/SampleTests/Data/SampleData.xml  | 5 +++++
 .../FunctionalTest/SampleTests/Section/SampleSection.xml    | 3 +++
 4 files changed, 18 insertions(+)

diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/ActionGroup/SampleActionGroup.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/ActionGroup/SampleActionGroup.xml
index 858d5017dd9..629688f7437 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/ActionGroup/SampleActionGroup.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/ActionGroup/SampleActionGroup.xml
@@ -15,4 +15,10 @@
         <fillField selector="#foo" userInput="{{person.foo}}" mergeKey="fillField1"/>
         <fillField selector="#bar" userInput="{{person.bar}}" mergeKey="fillField2"/>
     </actionGroup>
+    <actionGroup name="ValidateSlideOutPanelField">
+        <arguments>
+            <argument name="property" defaultValue=""/>
+        </arguments>
+        <see userInput="{{property.name}}" selector="{{ColumnSection.panelFieldLabel(property.section, property.fieldName, property.section, property.name)}}" mergeKey="seePropertyLabel"/>
+    </actionGroup>
 </config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/AdvancedSampleCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/AdvancedSampleCest.xml
index 11dfa611f20..761635f2818 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/AdvancedSampleCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/AdvancedSampleCest.xml
@@ -48,6 +48,10 @@
             <actionGroup ref="SampleActionGroup" mergeKey="actionGroup">
                 <argument name="person" value="OverrideDefaultPerson"/>
             </actionGroup>
+
+            <actionGroup ref="ValidateSlideOutPanelField" mergeKey="seeAppearanceMinHeightProperty">
+                <argument name="property" value="AppearanceMinHeightProperty"/>
+            </actionGroup>
         </test>
     </cest>
 </config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Data/SampleData.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Data/SampleData.xml
index 7f5fbde6217..9e431fec66e 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Data/SampleData.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Data/SampleData.xml
@@ -19,4 +19,9 @@
         <data key="foo">fizz</data>
         <data key="bar">buzz</data>
     </entity>
+    <entity name="AppearanceMinHeightProperty" type="min_height_property">
+        <data key="name">Minimum Height</data>
+        <data key="section">appearance</data>
+        <data key="fieldName">min_height</data>
+    </entity>
 </config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Section/SampleSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Section/SampleSection.xml
index 789e8dfd3a7..a3862d1520c 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Section/SampleSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Section/SampleSection.xml
@@ -14,4 +14,7 @@
         <element name="threeParamElement" type="button" selector="#{{var1}}-{{var2}} .{{var3}}" parameterized="true"/>
         <element name="timeoutElement" type="button" selector="#foo" timeout="30"/>
     </section>
+    <section name="ColumnSection">
+        <element name="panelFieldLabel" type="text" selector='//div[@data-index="{{arg1}}"]/descendant::div[@data-index="{{arg2}}"]/label | //div[@data-index="{{arg3}}"]/descendant::*[@class="admin__field-label"]/span[text()="{{arg4}}"]' parameterized="true" />
+    </section>
 </config>
-- 
GitLab


From 6a936cec5df174a6ba29de14091fd42967191991 Mon Sep 17 00:00:00 2001
From: Ji Lu <jilu1@magento.com>
Date: Wed, 25 Oct 2017 22:00:02 +0300
Subject: [PATCH 191/380] MQE-465: Data object xml support multidimensional
 arrays; SalesRule metadata, data and api test.

---
 .../SalesRule/Data/salesRuleData.xml          | 25 +++++++
 .../SalesRule/Metadata/sales_rule-meta.xml    | 75 +++++++++++++++++++
 .../Metadata/sales_rule_store_label-meta.xml  | 15 ++++
 .../Cest/CreateSalesRuleByApiCest.xml         | 23 ++++++
 4 files changed, 138 insertions(+)
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesRule/Data/salesRuleData.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesRule/Metadata/sales_rule-meta.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesRule/Metadata/sales_rule_store_label-meta.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/CreateSalesRuleByApiCest.xml

diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesRule/Data/salesRuleData.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesRule/Data/salesRuleData.xml
new file mode 100644
index 00000000000..3f13fbf02a8
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesRule/Data/salesRuleData.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataProfileSchema.xsd">
+    <entity name="SimpleSalesRule" type="SalesRule">
+        <data key="name" unique="suffix">SalesRule</data>
+        <data key="is_active">true</data>
+        <required-entity type="SalesRuleStoreLabel">SalesRuleStoreLabel1</required-entity>
+        <required-entity type="SalesRuleStoreLabel">SalesRuleStoreLabel2</required-entity>
+    </entity>
+    <entity name="SalesRuleStoreLabel1" type="SalesRuleStoreLabel">
+        <data key="store_id">0</data>
+        <data key="store_label">TestRule_Label</data>
+    </entity>
+    <entity name="SalesRuleStoreLabel2" type="SalesRuleStoreLabel">
+        <data key="store_id">1</data>
+        <data key="store_label">TestRule_Label_default</data>
+    </entity>
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesRule/Metadata/sales_rule-meta.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesRule/Metadata/sales_rule-meta.xml
new file mode 100644
index 00000000000..9417c61dd15
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesRule/Metadata/sales_rule-meta.xml
@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataOperation.xsd">
+    <operation name="CreateSalesRule" dataType="SalesRule" type="create" auth="adminOauth" url="/V1/salesRules" method="POST">
+        <contentType>application/json</contentType>
+        <object key="rule" dataType="SalesRule">
+            <field key="name" required="true">string</field>
+            <field key="description">string</field>
+            <field key="is_active">boolean</field>
+            <field key="from_date">string</field>
+            <field key="to_date">string</field>
+            <field key="uses_per_customer">integer</field>
+            <field key="sort_order">integer</field>
+            <field key="simple_action">string</field>
+            <field key="discount_amount">integer</field>
+            <field key="discount_qty">integer</field>
+            <field key="discount_step">integer</field>
+            <field key="times_used">integer</field>
+            <field key="uses_per_coupon">integer</field>
+            <field key="apply_to_shipping">boolean</field>
+            <field key="is_rss">boolean</field>
+            <field key="use_auto_generation">boolean</field>
+            <field key="coupon_type">string</field>
+            <field key="simple_free_shipping">string</field>
+            <field key="stop_rules_processing">boolean</field>
+            <field key="is_advanced">boolean</field>
+            <array key="store_labels">
+                <!-- specify object name as array value -->
+                <value>SalesRuleStoreLabel</value>
+                <!-- alternatively, define object embedded in array directly -->
+                <!--object dataType="SalesRuleStoreLabel" key="store_labels">
+                    <field key="store_id">integer</field>
+                    <field key="store_label">string</field>
+                </object-->
+            </array>
+            <array key="product_ids">
+                <value>integer</value>
+            </array>
+            <array key="customer_group_ids">
+                <value>integer</value>
+            </array>
+            <array key="website_ids">
+                <value>integer</value>
+            </array>
+            <object dataType="RuleCondition" key="condition">
+                <field key="condition_type">string</field>
+                <array key="conditions">
+                    <value>integer</value>
+                </array>
+                <field key="aggregator_type">string</field>
+                <field key="operator">string</field>
+                <field key="attribute_name">string</field>
+                <field key="value">string</field>
+                <field key="extension_attributes">empty_extension_attribute</field>
+            </object>
+            <object dataType="ActionCondition" key="action_condition">
+                <field key="condition_type">string</field>
+                <field key="aggregator_type">string</field>
+                <field key="operator">string</field>
+                <field key="attribute_name">string</field>
+                <field key="value">string</field>
+                <field key="extension_attributes">empty_extension_attribute</field>
+            </object>
+            <object dataType="ExtensionAttribute" key="extension_attributes">
+                <field key="reward_points_delta">integer</field>
+            </object>
+        </object>
+    </operation>
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesRule/Metadata/sales_rule_store_label-meta.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesRule/Metadata/sales_rule_store_label-meta.xml
new file mode 100644
index 00000000000..584bbb43cf7
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesRule/Metadata/sales_rule_store_label-meta.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataOperation.xsd">
+    <operation name="CreateSalesRuleStoreLabel" dataType="SalesRuleStoreLabel" type="create">
+        <field key="store_id">integer</field>
+        <field key="store_label">string</field>
+    </operation>
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/CreateSalesRuleByApiCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/CreateSalesRuleByApiCest.xml
new file mode 100644
index 00000000000..8ee7a705eb5
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/CreateSalesRuleByApiCest.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Test/etc/testSchema.xsd">
+    <cest name="CreateSalesRuleByApiCest">
+        <annotations>
+            <features value="Create a Sales Rule By API"/>
+            <stories value="Create a Sales Rule By API"/>
+        </annotations>
+        <before>
+            <createData mergeKey="saleRule" entity="SimpleSalesRule" />
+        </before>
+        <test name="CreateSalesRuleByApiTest">
+            <!--see mergeKey="test" userInput="$$saleRule.store_labels[0][store_id]$$" selector="test"/-->
+        </test>
+    </cest>
+</config>
\ No newline at end of file
-- 
GitLab


From 5bcc975a7506921540f3370882360021a86ae41d Mon Sep 17 00:00:00 2001
From: Tom Reece <treece@magento.com>
Date: Tue, 7 Nov 2017 18:07:45 +0200
Subject: [PATCH 192/380] MQE-523: Create mainline PRs for previous sprint (12)

- Fixed Alex's feedback
---
 .../Braintree/Data/BraintreeData.xml          | 65 +++++++++++++++++++
 .../Metadata/braintree_config-meta.xml        |  4 +-
 ...ntProductPage.xml => AdminProductPage.xml} |  2 +-
 .../Config/Data/braintreeData.xml             | 65 -------------------
 .../FunctionalTest/Config/Data/paypalData.xml | 61 -----------------
 .../FunctionalTest/Paypal/Data/PaypalData.xml | 61 +++++++++++++++++
 .../Metadata/paypal_config-meta.xml           |  2 +-
 .../Cest/CreateSalesRuleByApiCest.xml         |  2 +-
 .../Cest/SetPaymentConfigurationCest.xml      |  8 +--
 9 files changed, 135 insertions(+), 135 deletions(-)
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Braintree/Data/BraintreeData.xml
 rename dev/tests/acceptance/tests/functional/Magento/FunctionalTest/{Config => Braintree}/Metadata/braintree_config-meta.xml (97%)
 rename dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Page/{StorefrontProductPage.xml => AdminProductPage.xml} (86%)
 delete mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Config/Data/braintreeData.xml
 delete mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Config/Data/paypalData.xml
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Paypal/Data/PaypalData.xml
 rename dev/tests/acceptance/tests/functional/Magento/FunctionalTest/{Config => Paypal}/Metadata/paypal_config-meta.xml (98%)

diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Braintree/Data/BraintreeData.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Braintree/Data/BraintreeData.xml
new file mode 100644
index 00000000000..0beed525e66
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Braintree/Data/BraintreeData.xml
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataProfileSchema.xsd">
+    <entity name="SampleBraintreeConfig" type="braintree_config_state">
+        <required-entity type="title">SampleTitle</required-entity>
+        <required-entity type="payment_action">SamplePaymentAction</required-entity>
+        <required-entity type="environment">SampleEnvironment</required-entity>
+        <required-entity type="merchant_id">SampleMerchantId</required-entity>
+        <required-entity type="public_key">SamplePublicKey</required-entity>
+        <required-entity type="private_key">SamplePrivateKey</required-entity>
+    </entity>
+    <entity name="SampleTitle" type="title">
+        <data key="value">Sample Braintree Config</data>
+    </entity>
+    <entity name="SamplePaymentAction" type="payment_action">
+        <data key="value">authorize</data>
+    </entity>
+    <entity name="SampleEnvironment" type="environment">
+        <data key="value">sandbox</data>
+    </entity>
+    <entity name="SampleMerchantId" type="merchant_id">
+        <data key="value">someMerchantId</data>
+    </entity>
+    <entity name="SamplePublicKey" type="public_key">
+        <data key="value">somePublicKey</data>
+    </entity>
+    <entity name="SamplePrivateKey" type="private_key">
+        <data key="value">somePrivateKey</data>
+    </entity>
+
+    <!-- default configuration used to restore Magento config -->
+    <entity name="DefaultBraintreeConfig" type="braintree_config_state">
+        <required-entity type="title">DefaultTitle</required-entity>
+        <required-entity type="payment_action">DefaultPaymentAction</required-entity>
+        <required-entity type="environment">DefaultEnvironment</required-entity>
+        <required-entity type="merchant_id">DefaultMerchantId</required-entity>
+        <required-entity type="public_key">DefaultPublicKey</required-entity>
+        <required-entity type="private_key">DefaultPrivateKey</required-entity>
+    </entity>
+    <entity name="DefaultTitle" type="title">
+        <data key="value"/>
+    </entity>
+    <entity name="DefaultPaymentAction" type="payment_action">
+        <data key="value"/>
+    </entity>
+    <entity name="DefaultEnvironment" type="environment">
+        <data key="value"/>
+    </entity>
+    <entity name="DefaultMerchantId" type="merchant_id">
+        <data key="value"/>
+    </entity>
+    <entity name="DefaultPublicKey" type="public_key">
+        <data key="value"/>
+    </entity>
+    <entity name="DefaultPrivateKey" type="private_key">
+        <data key="value"/>
+    </entity>
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Config/Metadata/braintree_config-meta.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Braintree/Metadata/braintree_config-meta.xml
similarity index 97%
rename from dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Config/Metadata/braintree_config-meta.xml
rename to dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Braintree/Metadata/braintree_config-meta.xml
index 04b7f5fb526..d450c0ddf01 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Config/Metadata/braintree_config-meta.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Braintree/Metadata/braintree_config-meta.xml
@@ -8,7 +8,7 @@
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataOperation.xsd">
-    <operation name="createBraintreeConfigState" dataType="braintree_config_state" type="create" auth="adminFormKey" url="/admin/system_config/save/section/payment/" method="POST">
+    <operation name="CreateBraintreeConfigState" dataType="braintree_config_state" type="create" auth="adminFormKey" url="/admin/system_config/save/section/payment/" method="POST">
         <object key="groups" dataType="braintree_config_state">
             <object key="braintree_section" dataType="braintree_config_state">
                 <object key="groups" dataType="braintree_config_state">
@@ -42,4 +42,4 @@
             </object>
         </object>
     </operation>
-</config>
\ No newline at end of file
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Page/StorefrontProductPage.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Page/AdminProductPage.xml
similarity index 86%
rename from dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Page/StorefrontProductPage.xml
rename to dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Page/AdminProductPage.xml
index 5565afa9549..28449077692 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Page/StorefrontProductPage.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Page/AdminProductPage.xml
@@ -8,7 +8,7 @@
 
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/PageObject.xsd">
-    <page name="StorefrontProductPage" url="admin/catalog/product/view" module="Magento_Catalog">
+    <page name="AdminProductPage" url="admin/catalog/product/view" module="Magento_Catalog">
         <section name="StorefrontProductInfoMainSection" />
         <section name="StorefrontProductInfoDetailsSection" />
         <section name="StorefrontProductImageSection" />
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Config/Data/braintreeData.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Config/Data/braintreeData.xml
deleted file mode 100644
index ae5bfd17fe8..00000000000
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Config/Data/braintreeData.xml
+++ /dev/null
@@ -1,65 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- /**
-  * Copyright © Magento, Inc. All rights reserved.
-  * See COPYING.txt for license details.
-  */
--->
-
-<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataProfileSchema.xsd">
-    <entity name="sampleBraintreeConfig" type="braintree_config_state">
-        <required-entity type="title">sampleTitle</required-entity>
-        <required-entity type="payment_action">samplePaymentAction</required-entity>
-        <required-entity type="environment">sampleEnvironment</required-entity>
-        <required-entity type="merchant_id">sampleMerchantId</required-entity>
-        <required-entity type="public_key">samplePublicKey</required-entity>
-        <required-entity type="private_key">samplePrivateKey</required-entity>
-    </entity>
-    <entity name="sampleTitle" type="title">
-        <data key="value">Sample Braintree Config</data>
-    </entity>
-    <entity name="samplePaymentAction" type="payment_action">
-        <data key="value">authorize</data>
-    </entity>
-    <entity name="sampleEnvironment" type="environment">
-        <data key="value">sandbox</data>
-    </entity>
-    <entity name="sampleMerchantId" type="merchant_id">
-        <data key="value">someMerchantId</data>
-    </entity>
-    <entity name="samplePublicKey" type="public_key">
-        <data key="value">somePublicKey</data>
-    </entity>
-    <entity name="samplePrivateKey" type="private_key">
-        <data key="value">somePrivateKey</data>
-    </entity>
-
-    <!-- default configuration used to restore Magento config -->
-    <entity name="defaultBraintreeConfig" type="braintree_config_state">
-        <required-entity type="title">defaultTitle</required-entity>
-        <required-entity type="payment_action">defaultPaymentAction</required-entity>
-        <required-entity type="environment">defaultEnvironment</required-entity>
-        <required-entity type="merchant_id">defaultMerchantId</required-entity>
-        <required-entity type="public_key">defaultPublicKey</required-entity>
-        <required-entity type="private_key">defaultPrivateKey</required-entity>
-    </entity>
-    <entity name="defaultTitle" type="title">
-        <data key="value"/>
-    </entity>
-    <entity name="defaultPaymentAction" type="payment_action">
-        <data key="value"/>
-    </entity>
-    <entity name="defaultEnvironment" type="environment">
-        <data key="value"/>
-    </entity>
-    <entity name="defaultMerchantId" type="merchant_id">
-        <data key="value"/>
-    </entity>
-    <entity name="defaultPublicKey" type="public_key">
-        <data key="value"/>
-    </entity>
-    <entity name="defaultPrivateKey" type="private_key">
-        <data key="value"/>
-    </entity>
-</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Config/Data/paypalData.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Config/Data/paypalData.xml
deleted file mode 100644
index 3f1190a408a..00000000000
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Config/Data/paypalData.xml
+++ /dev/null
@@ -1,61 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- /**
-  * Copyright © Magento, Inc. All rights reserved.
-  * See COPYING.txt for license details.
-  */
--->
-
-<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataProfileSchema.xsd">
-    <entity name="samplePaypalConfig" type="paypal_config_state">
-        <required-entity type="business_account">sampleBusinessAccount</required-entity>
-        <required-entity type="api_username">sampleApiUsername</required-entity>
-        <required-entity type="api_password">sampleApiPassword</required-entity>
-        <required-entity type="api_signature">sampleApiSignature</required-entity>
-        <required-entity type="api_authentication">sampleApiAuthentication</required-entity>
-        <required-entity type="sandbox_flag">sampleSandboxFlag</required-entity>
-        <required-entity type="use_proxy">sampleUseProxy</required-entity>
-    </entity>
-    <entity name="sampleBusinessAccount" type="business_account">
-        <data key="value">myBusinessAccount@magento.com</data>
-    </entity>
-    <entity name="sampleApiUsername" type="api_username">
-        <data key="value">myApiUsername.magento.com</data>
-    </entity>
-    <entity name="sampleApiPassword" type="api_password">
-        <data key="value">somePassword</data>
-    </entity>
-    <entity name="sampleApiSignature" type="api_signature">
-        <data key="value">someApiSignature</data>
-    </entity>
-    <entity name="sampleApiAuthentication" type="api_authentication">
-        <data key="value">0</data>
-    </entity>
-    <entity name="sampleSandboxFlag" type="sandbox_flag">
-        <data key="value">0</data>
-    </entity>
-    <entity name="sampleUseProxy" type="use_proxy">
-        <data key="value">0</data>
-    </entity>
-
-    <!-- default configuration used to restore Magento config -->
-    <entity name="defaultPayPalConfig" type="paypal_config_state">
-        <required-entity type="business_account">defaultBusinessAccount</required-entity>
-        <required-entity type="api_username">defaultApiUsername</required-entity>
-        <required-entity type="api_password">defaultApiPassword</required-entity>
-        <required-entity type="api_signature">defaultApiSignature</required-entity>
-    </entity>
-    <entity name="defaultBusinessAccount" type="business_account">
-        <data key="value"/>
-    </entity>
-    <entity name="defaultApiUsername" type="api_username">
-        <data key="value"/>
-    </entity>
-    <entity name="defaultApiPassword" type="api_password">
-        <data key="value"/>
-    </entity>
-    <entity name="defaultApiSignature" type="api_signature">
-        <data key="value"/>
-    </entity>
-</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Paypal/Data/PaypalData.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Paypal/Data/PaypalData.xml
new file mode 100644
index 00000000000..6d2fed324c7
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Paypal/Data/PaypalData.xml
@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
+
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataProfileSchema.xsd">
+    <entity name="SamplePaypalConfig" type="paypal_config_state">
+        <required-entity type="business_account">SampleBusinessAccount</required-entity>
+        <required-entity type="api_username">SampleApiUsername</required-entity>
+        <required-entity type="api_password">SampleApiPassword</required-entity>
+        <required-entity type="api_signature">SampleApiSignature</required-entity>
+        <required-entity type="api_authentication">SampleApiAuthentication</required-entity>
+        <required-entity type="sandbox_flag">SampleSandboxFlag</required-entity>
+        <required-entity type="use_proxy">SampleUseProxy</required-entity>
+    </entity>
+    <entity name="SampleBusinessAccount" type="business_account">
+        <data key="value">myBusinessAccount@magento.com</data>
+    </entity>
+    <entity name="SampleApiUsername" type="api_username">
+        <data key="value">myApiUsername.magento.com</data>
+    </entity>
+    <entity name="SampleApiPassword" type="api_password">
+        <data key="value">somePassword</data>
+    </entity>
+    <entity name="SampleApiSignature" type="api_signature">
+        <data key="value">someApiSignature</data>
+    </entity>
+    <entity name="SampleApiAuthentication" type="api_authentication">
+        <data key="value">0</data>
+    </entity>
+    <entity name="SampleSandboxFlag" type="sandbox_flag">
+        <data key="value">0</data>
+    </entity>
+    <entity name="SampleUseProxy" type="use_proxy">
+        <data key="value">0</data>
+    </entity>
+
+    <!-- default configuration used to restore Magento config -->
+    <entity name="DefaultPayPalConfig" type="paypal_config_state">
+        <required-entity type="business_account">DefaultBusinessAccount</required-entity>
+        <required-entity type="api_username">DefaultApiUsername</required-entity>
+        <required-entity type="api_password">DefaultApiPassword</required-entity>
+        <required-entity type="api_signature">DefaultApiSignature</required-entity>
+    </entity>
+    <entity name="DefaultBusinessAccount" type="business_account">
+        <data key="value"/>
+    </entity>
+    <entity name="DefaultApiUsername" type="api_username">
+        <data key="value"/>
+    </entity>
+    <entity name="DefaultApiPassword" type="api_password">
+        <data key="value"/>
+    </entity>
+    <entity name="DefaultApiSignature" type="api_signature">
+        <data key="value"/>
+    </entity>
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Config/Metadata/paypal_config-meta.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Paypal/Metadata/paypal_config-meta.xml
similarity index 98%
rename from dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Config/Metadata/paypal_config-meta.xml
rename to dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Paypal/Metadata/paypal_config-meta.xml
index 2e58876103d..043287868cf 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Config/Metadata/paypal_config-meta.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Paypal/Metadata/paypal_config-meta.xml
@@ -7,7 +7,7 @@
 -->
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataOperation.xsd">
-    <operation name="createPaypalConfigState" dataType="paypal_config_state" type="create" auth="adminFormKey" url="/admin/system_config/save/section/payment/" method="POST">
+    <operation name="CreatePaypalConfigState" dataType="paypal_config_state" type="create" auth="adminFormKey" url="/admin/system_config/save/section/payment/" method="POST">
         <object key="groups" dataType="paypal_config_state">
             <object key="paypal_alternative_payment_methods" dataType="paypal_config_state">
                 <object key="groups" dataType="paypal_config_state">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/CreateSalesRuleByApiCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/CreateSalesRuleByApiCest.xml
index 8ee7a705eb5..bdbca5862a2 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/CreateSalesRuleByApiCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/CreateSalesRuleByApiCest.xml
@@ -20,4 +20,4 @@
             <!--see mergeKey="test" userInput="$$saleRule.store_labels[0][store_id]$$" selector="test"/-->
         </test>
     </cest>
-</config>
\ No newline at end of file
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/SetPaymentConfigurationCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/SetPaymentConfigurationCest.xml
index 51d07d501e3..60b1f945e6b 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/SetPaymentConfigurationCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/SetPaymentConfigurationCest.xml
@@ -10,12 +10,12 @@
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Test/etc/testSchema.xsd">
     <cest name="SetPaymentConfigurationCest">
         <test name="SetPaypalConfigurationTest">
-            <createData entity="samplePaypalConfig" mergeKey="createSamplePaypalConfig"/>
-            <createData entity="defaultPaypalConfig" mergeKey="restoreDefaultPaypalConfig"/>
+            <createData entity="SamplePaypalConfig" mergeKey="createSamplePaypalConfig"/>
+            <createData entity="DefaultPayPalConfig" mergeKey="restoreDefaultPaypalConfig"/>
         </test>
         <test name="SetBraintreeConfigurationTest">
-            <createData entity="sampleBraintreeConfig" mergeKey="createSampleBraintreeConfig"/>
-            <createData entity="defaultBraintreeConfig" mergeKey="restoreDefaultBraintreeConfig"/>
+            <createData entity="SampleBraintreeConfig" mergeKey="createSampleBraintreeConfig"/>
+            <createData entity="DefaultBraintreeConfig" mergeKey="restoreDefaultBraintreeConfig"/>
         </test>
     </cest>
 </config>
-- 
GitLab


From 8c09efddad1a77dfc0a27a92e13b06198e113175 Mon Sep 17 00:00:00 2001
From: Alex Kolesnyk <okolesnyk@magento.com>
Date: Mon, 27 Nov 2017 13:26:44 +0200
Subject: [PATCH 193/380] MQE-523: Create mainline PRs for previous sprint (12)

- Update file name to follow uppercase name convention
---
 .../SalesRule/Data/{salesRuleData.xml => SalesRuleData.xml}       | 0
 1 file changed, 0 insertions(+), 0 deletions(-)
 rename dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesRule/Data/{salesRuleData.xml => SalesRuleData.xml} (100%)

diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesRule/Data/salesRuleData.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesRule/Data/SalesRuleData.xml
similarity index 100%
rename from dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesRule/Data/salesRuleData.xml
rename to dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesRule/Data/SalesRuleData.xml
-- 
GitLab


From 9192d61851e32ef96e3d6a26727e6d3a42124ac6 Mon Sep 17 00:00:00 2001
From: Ji Lu <jilu1@magento.com>
Date: Thu, 9 Nov 2017 21:20:01 +0200
Subject: [PATCH 194/380] MQE-235: updated sample cest and data with a set of
 codeception assert functions.

---
 .../SampleTests/Cest/SampleCest.xml           | 64 +++++++++++++++++++
 .../SampleTests/Data/SampleData.xml           |  5 ++
 2 files changed, 69 insertions(+)

diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/SampleCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/SampleCest.xml
index e3ff7be39cb..f00c27f7d19 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/SampleCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/SampleCest.xml
@@ -18,10 +18,12 @@
         <before>
             <amOnUrl url="http://127.0.0.1:32772/admin/" mergeKey="amOnPage"/>
             <createData entity="CustomerEntity1" mergeKey="createData1"/>
+            <createData entity="AssertThis" mergeKey="createData2"/>
         </before>
         <after>
             <amOnUrl url="http://127.0.0.1:32772/admin/admin/auth/logout" mergeKey="amOnPage"/>
             <deleteData createDataKey="createData1" mergeKey="deleteData1"/>
+            <deleteData createDataKey="createData2" mergeKey="deleteData2"/>
         </after>
         <test name="AllCodeceptionMethodsTest">
             <annotations>
@@ -170,6 +172,51 @@
             <waitForJS function="return $.active == 0;" time="30" mergeKey="waitForJS"/>
             <waitForText userInput="foo" time="30" mergeKey="waitForText1"/>
             <waitForText userInput="foo" selector=".title" time="30" mergeKey="waitForText2"/>
+            <!-- Codeception Assert -->
+            <assertArrayHasKey mergeKey="assertArrayHasKey" expected="apple" actualArray="[['orange' => 2], ['apple' => 1]" message="pass"/>
+            <assertArrayNotHasKey mergeKey="assertArrayNotHasKey" expected="kiwi" actualArray="[['orange' => 2], ['apple' => 1]" message="pass"/>
+            <assertArraySubset mergeKey="assertArraySubset" expectedArray="[1, 2]" actualArray="[5, 3, 2, 1]" message="pass"/>
+            <assertContains mergeKey="assertContains" expected="ab" actualArray="[['item1' => 'a'], ['item2' => 'ab']" message="pass"/>
+            <assertCount mergeKey="assertCount" expected="2" actualArray="['a', 'b']" message="pass"/>
+            <assertEmpty mergeKey="assertEmpty1" actual="''" message="pass"/>
+            <assertEmpty mergeKey="assertEmpty2" actual="[]" message="pass"/>
+            <assertEmpty mergeKey="assertEmpty3" actualVariable="value1" message="pass"/>
+            <assertEquals mergeKey="assertEquals1" expected="abc" actual="abc" message="pass"/>
+            <assertEquals mergeKey="assertEquals2" expected="2" actualVariable="value1" message="pass"/>
+            <assertFalse mergeKey="assertFalse" actualVariable="value1" message="pass"/>
+            <assertFileExists mergeKey="assertFileExists1" actual="/out.txt" message="pass"/>
+            <assertFileExists mergeKey="assertFileExists2" actualVariable="value1" message="pass"/>
+            <assertFileNotExists mergeKey="assertFileNotExists1" actual="/out.txt" message="pass"/>
+            <assertFileNotExists mergeKey="assertFileNotExists2" actual="file" message="pass"/>
+            <assertGreaterOrEquals mergeKey="assertGreaterOrEquals" expected="5" actual="2" message="pass"/>
+            <assertGreaterThan mergeKey="assertGreaterThan" expected="5" actual="2" message="pass"/>
+            <assertGreaterThanOrEqual mergeKey="assertGreaterThanOrEqual" expected="5" actual="2" message="pass"/>
+            <assertInstanceOf mergeKey="assertInstanceOf" class="User::class" actualVariable="value1" message="pass"/>
+            <assertInternalType mergeKey="assertInternalType1" expected="string" actual="xyz" message="pass"/>
+            <assertInternalType mergeKey="assertInternalType2" type="string" actual="xyz" message="pass"/>
+            <assertInternalType mergeKey="assertInternalType3" type="string" actualVariable="value1" message="pass"/>
+            <assertIsEmpty mergeKey="assertIsEmpty" actualVariable="value1" message="pass"/>
+            <assertLessOrEquals mergeKey="assertLessOrEquals" expected="2" actual="5" message="pass"/>
+            <assertLessThan mergeKey="assertLessThan" expected="2" actual="5" message="pass"/>
+            <assertLessThanOrEqual mergeKey="assertLessThanOrEqual" expected="2" actual="5" message="pass"/>
+            <assertNotContains mergeKey="assertNotContains1" expected="bc" actualArray="[['item1' => 'a'], ['item2' => 'ab']" message="pass"/>
+            <assertNotContains mergeKey="assertNotContains2" expected="bc" actualVariable="value1" message="pass"/>
+            <assertNotEmpty mergeKey="assertNotEmpty1" actual="[1, 2]" message="pass"/>
+            <assertNotEmpty mergeKey="assertNotEmpty2" actualVariable="value1" message="pass"/>
+            <assertNotEquals mergeKey="assertNotEquals" expected="2" actual="5" message="pass" delta=""/>
+            <assertNotInstanceOf mergeKey="assertNotInstanceOf" expected="RuntimeException::class" actual="21" message="pass"/>
+            <assertNotNull mergeKey="assertNotNull1" actual="abc" message="pass"/>
+            <assertNotNull mergeKey="assertNotNull2" actualVariable="value1" message="pass"/>
+            <assertNotRegExp mergeKey="assertNotRegExp" expected="/foo/" actual="bar" message="pass"/>
+            <assertNotSame mergeKey="assertNotSame" expected="log" actual="tag" message="pass"/>
+            <assertNull mergeKey="assertNull" actualVariable="value1" message="pass"/>
+            <assertRegExp mergeKey="assertRegExp" expected="/foo/" actual="foo" message="pass"/>
+            <assertSame mergeKey="assertSame" expected="bar" actual="bar" message="pass"/>
+            <assertStringStartsNotWith mergeKey="assertStringStartsNotWith" expected="a" actual="banana" message="pass"/>
+            <assertStringStartsWith mergeKey="assertStringStartsWith" expected="a" actual="apple" message="pass"/>
+            <assertTrue mergeKey="assertTrue" actual="true" message="pass"/>
+            <expectException mergeKey="expectException" class="new MyException('exception msg')" function="function() {$this->doSomethingBad();}"/>
+            <fail mergeKey="fail" message="fail"/>
         </test>
         <test name="AllCustomMethodsTest">
             <annotations>
@@ -258,6 +305,7 @@
             </annotations>
 
             <createData entity="CustomerEntity1" mergeKey="testScopeData"/>
+            <createData entity="AssertThis" mergeKey="testScopeData2"/>
 
             <!-- parameterized url that uses literal params -->
             <amOnPage url="{{SamplePage.url('success','success2')}}" mergeKey="a0"/>
@@ -286,6 +334,22 @@
             <!-- userInput that uses created data -->
             <fillField selector="#sample" userInput="Hello $testScopeData.firstname$ $testScopeData.lastname$" mergeKey="f1"/>
             <fillField selector="#sample" userInput="Hello $$createData1.firstname$$ $$createData1.lastname$$" mergeKey="f2"/>
+
+            <!-- expected, actual that use created data -->
+            <assertStringStartsNotWith mergeKey="assert1" expected="D" actual="$$createData2.lastname$$, $$createData2.firstname$$" message="fail"/>
+            <assertStringStartsWith mergeKey="assert2" expected="W" actual="$testScopeData2.firstname$ $testScopeData2.lastname$" message="pass"/>
+            <assertEquals mergeKey="assert5" expected="$$createData1.lastname$$" actual="$$createData1.lastname$$" message="pass"/>
+            <assertFileExists mergeKey="assert6" actual="../Data/SampleData.xml" message="pass"/>
+
+            <!-- expectedArray, actualArray that use created data -->
+            <assertArraySubset mergeKey="assert9" expectedArray="[$$createData2.lastname$$, $$createData2.firstname$$]" actualArray="[$$createData2.lastname$$, $$createData2.firstname$$, 1]" message="pass"/>
+            <assertArraySubset mergeKey="assert10" expectedArray="[$testScopeData2.firstname$, $testScopeData2.lastname$]" actualArray="[$testScopeData2.firstname$, $testScopeData2.lastname$, 1]" message="pass"/>
+            <assertArrayHasKey mergeKey="assert3" expected="lastname" actualArray="[['lastname' => $$createData1.lastname$$], ['firstname' => $$createData1.firstname$$]" message="pass"/>
+            <assertArrayHasKey mergeKey="assert4" expected="lastname" actualArray="[['lastname' => $testScopeData.lastname$], ['firstname' => $testScopeData.firstname$]" message="pass"/>
+
+            <!-- message that uses created data -->
+            <fail mergeKey="assert7" message="$testScopeData.firstname$ $testScopeData.lastname$"/>
+            <fail mergeKey="assert8" message="$$createData1.firstname$$ $$createData1.lastname$$"/>
         </test>
     </cest>
 </config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Data/SampleData.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Data/SampleData.xml
index 9e431fec66e..222d81d1df1 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Data/SampleData.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Data/SampleData.xml
@@ -24,4 +24,9 @@
         <data key="section">appearance</data>
         <data key="fieldName">min_height</data>
     </entity>
+    <entity name="AssertThis" type="samplePerson">
+        <data key="firstname">Well</data>
+        <data key="lastname">Done</data>
+        <data key="email" unique="prefix">.email@gmail.com</data>
+    </entity>
 </config>
-- 
GitLab


From af626ce0923e9ca18acc10bc199d7602e14b60f9 Mon Sep 17 00:00:00 2001
From: Ji Lu <jilu1@magento.com>
Date: Thu, 26 Oct 2017 17:20:27 +0300
Subject: [PATCH 195/380] MQE-472: resolved array data input in MFTF; updated
 configurable test.

---
 .../Catalog/Data/ProductData.xml              |  4 +-
 .../Catalog/Metadata/category-meta.xml        |  2 -
 .../Catalog/Metadata/product-meta.xml         | 59 +++++++++++++++++--
 .../Metadata/product_attribute-meta.xml       |  6 +-
 .../product_attribute_option-meta.xml         |  6 +-
 .../Metadata/product_attribute_set-meta.xml   | 10 +++-
 .../product_link_extension_attribute-meta.xml |  4 +-
 .../Checkout/Metadata/coupon-meta.xml         |  7 +--
 .../Data/ConfigurableProductData.xml          |  2 +-
 .../configurable_product_add_child-meta.xml   |  1 -
 .../configurable_product_options-meta.xml     |  1 -
 .../Customer/Metadata/customer-meta.xml       |  1 -
 .../Metadata/TemplateMetaFile.xml             |  4 +-
 .../CreateConfigurableProductByApiCest.xml    | 12 +++-
 .../Cest/UpdateSimpleProductByApiCest.xml     |  7 +--
 15 files changed, 86 insertions(+), 40 deletions(-)

diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Data/ProductData.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Data/ProductData.xml
index ea57af75d63..827589493d8 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Data/ProductData.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Data/ProductData.xml
@@ -31,12 +31,11 @@
         <data key="status">1</data>
         <required-entity type="product_extension_attribute">EavStockItem</required-entity>
         <required-entity type="custom_attribute_array">CustomAttributeCategoryIds</required-entity>
-        <!--required-entity type="custom_attribute">CustomAttributeProductUrlKey</required-entity-->
     </entity>
     <entity name="NewSimpleProduct" type="product">
         <data key="price">321.00</data>
     </entity>
-    <entity name="SimpleOne" type="product">
+    <entity name="SimpleOne" type="product2">
         <data key="sku" unique="suffix">SimpleOne</data>
         <data key="type_id">simple</data>
         <data key="attribute_set_id">4</data>
@@ -45,7 +44,6 @@
         <data key="visibility">4</data>
         <data key="status">1</data>
         <required-entity type="product_extension_attribute">EavStockItem</required-entity>
-        <!--required-entity type="custom_attribute_array">CustomAttributeCategoryIds</required-entity-->
         <required-entity type="custom_attribute">CustomAttributeProductAttribute</required-entity>
     </entity>
 </config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/category-meta.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/category-meta.xml
index e88c454d694..d22c2bc1f77 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/category-meta.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/category-meta.xml
@@ -32,7 +32,6 @@
 
     <operation name="UpdateCategory" dataType="category" type="update" auth="adminOauth" url="/V1/categories/{id}" method="PUT">
         <contentType>application/json</contentType>
-        <param key="id" type="path">{id}</param>
         <object key="category" dataType="category">
             <field key="id">integer</field>
             <field key="parent_id">integer</field>
@@ -57,6 +56,5 @@
 
     <operation name="DeleteCategory" dataType="category" type="delete" auth="adminOauth" url="/V1/categories/{id}" method="DELETE">
         <contentType>application/json</contentType>
-        <param key="id" type="path">{id}</param>
     </operation>
 </config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product-meta.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product-meta.xml
index 6103c6cc3f4..2a478c3ee51 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product-meta.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product-meta.xml
@@ -27,7 +27,6 @@
             </array>
             <array key="custom_attributes">
                 <value>custom_attribute_array</value>
-                <value>custom_attribute</value>
             </array>
             <array key="options">
                 <value>product_option</value>
@@ -36,7 +35,6 @@
     </operation>
     <operation name="UpdateProduct" dataType="product" type="update" auth="adminOauth" url="/V1/products/{sku}" method="PUT">
         <contentType>application/json</contentType>
-        <param key="sku" type="path">{sku}</param>
         <object dataType="product" key="product">
             <field key="id">integer</field>
             <field key="sku">string</field>
@@ -55,7 +53,6 @@
             </array>
             <array key="custom_attributes">
                 <value>custom_attribute_array</value>
-                <value>custom_attribute</value>
             </array>
             <array key="options">
                 <value>product_option</value>
@@ -65,6 +62,60 @@
     </operation>
     <operation name="deleteProduct" dataType="product" type="delete" auth="adminOauth" url="/V1/products/{sku}" method="DELETE">
         <contentType>application/json</contentType>
-        <param key="sku" type="path">{sku}</param>
+    </operation>
+    <operation name="CreateProduct2" dataType="product2" type="create" auth="adminOauth" url="/V1/products" method="POST">
+        <contentType>application/json</contentType>
+        <object dataType="product2" key="product">
+            <field key="sku">string</field>
+            <field key="name">string</field>
+            <field key="attribute_set_id">integer</field>
+            <field key="price">integer</field>
+            <field key="status">integer</field>
+            <field key="visibility">integer</field>
+            <field key="type_id">string</field>
+            <field key="created_at">string</field>
+            <field key="updated_at">string</field>
+            <field key="weight">integer</field>
+            <field key="extension_attributes">product_extension_attribute</field>
+            <array key="product_links">
+                <value>product_link</value>
+            </array>
+            <array key="custom_attributes">
+                <value>custom_attribute</value>
+            </array>
+            <array key="options">
+                <value>product_option</value>
+            </array>
+        </object>
+    </operation>
+    <operation name="UpdateProduct2" dataType="product2" type="update" auth="adminOauth" url="/V1/products/{sku}" method="PUT">
+        <contentType>application/json</contentType>
+        <object dataType="product2" key="product">
+            <field key="id">integer</field>
+            <field key="sku">string</field>
+            <field key="name">string</field>
+            <field key="attribute_set_id">integer</field>
+            <field key="price">integer</field>
+            <field key="status">integer</field>
+            <field key="visibility">integer</field>
+            <field key="type_id">string</field>
+            <field key="created_at">string</field>
+            <field key="updated_at">string</field>
+            <field key="weight">integer</field>
+            <field key="extension_attributes">product_extension_attribute</field>
+            <array key="product_links">
+                <value>product_link</value>
+            </array>
+            <array key="custom_attributes">
+                <value>custom_attribute</value>
+            </array>
+            <array key="options">
+                <value>product_option</value>
+            </array>
+        </object>
+        <field key="saveOptions">boolean</field>
+    </operation>
+    <operation name="deleteProduct2" dataType="product2" type="delete" auth="adminOauth" url="/V1/products/{sku}" method="DELETE">
+        <contentType>application/json</contentType>
     </operation>
 </config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product_attribute-meta.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product_attribute-meta.xml
index a517d6cd80a..3a2bfb76d06 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product_attribute-meta.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product_attribute-meta.xml
@@ -58,9 +58,8 @@
             </array>
         </object>
     </operation>
-    <operation name="UpdateProductAttribute" dataType="ProductAttribute" type="update" auth="adminOauth" url="/V1/products/attributes/{attributeCode}" method="PUT">
+    <operation name="UpdateProductAttribute" dataType="ProductAttribute" type="update" auth="adminOauth" url="/V1/products/attributes/{attribute_code}" method="PUT">
         <contentType>application/json</contentType>
-        <param key="attributeCode" type="path">{attributeCode}</param>
         <object dataType="ProductAttribute" key="attribute">
             <field key="attribute_code">string</field>
             <field key="attribute_id">string</field>
@@ -110,8 +109,7 @@
             </array>
         </object>
     </operation>
-    <operation name="DeleteProductAttribute" dataType="ProductAttribute" type="delete" auth="adminOauth" url="/V1/products/attributes/{attributeCode}" method="DELETE">
+    <operation name="DeleteProductAttribute" dataType="ProductAttribute" type="delete" auth="adminOauth" url="/V1/products/attributes/{attribute_code}" method="DELETE">
         <contentType>application/json</contentType>
-        <param key="attributeCode" type="path">{attributeCode}</param>
     </operation>
 </config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product_attribute_option-meta.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product_attribute_option-meta.xml
index bb5a37229fd..81fbc4d313e 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product_attribute_option-meta.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product_attribute_option-meta.xml
@@ -10,7 +10,6 @@
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataOperation.xsd">
     <operation name="CreateProductAttributeOption" dataType="ProductAttributeOption" type="create" auth="adminOauth" url="/V1/products/attributes/{attribute_code}/options" method="POST">
         <contentType>application/json</contentType>
-        <param key="attribute_code" type="path">{attribute_code}</param>
         <object dataType="ProductAttributeOption" key="option">
             <field key="label">string</field>
             <field key="value">string</field>
@@ -21,13 +20,10 @@
             </array>
         </object>
     </operation>
-    <operation name="DeleteProductAttributeOption" dataType="ProductAttributeOption" type="delete" auth="adminOauth" url="/V1/products/attributes/{attribute_code}/options/{optionId}" method="DELETE">
+    <operation name="DeleteProductAttributeOption" dataType="ProductAttributeOption" type="delete" auth="adminOauth" url="/V1/products/attributes/{attribute_code}/options/{option_id}" method="DELETE">
         <contentType>application/json</contentType>
-        <param key="attribute_code" type="path">{attribute_code}</param>
-        <param key="optionId" type="path">{optionId}</param>
     </operation>
     <operation name="GetProductAttributeOption" dataType="ProductAttributeOption" type="get" auth="adminOauth" url="/V1/products/attributes/{attribute_code}/options/" method="GET">
         <contentType>application/json</contentType>
-        <param key="attribute_code" type="path">{attribute_code}</param>
     </operation>
 </config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product_attribute_set-meta.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product_attribute_set-meta.xml
index c15fb764a7f..dde27a54a4a 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product_attribute_set-meta.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product_attribute_set-meta.xml
@@ -15,9 +15,13 @@
         <field key="attributeCode">string</field>
         <field key="sortOrder">integer</field>
     </operation>
-    <operation name="DeleteProductAttributeFromAttributeSet" dataType="ProductAttributeSet" type="delete" auth="adminOauth" url="/V1/products/attribute-sets/{attributeSetId}/attributes/{attributeCode}" method="DELETE">
+    <operation name="DeleteProductAttributeFromAttributeSet" dataType="ProductAttributeSet" type="delete" auth="adminOauth" url="/V1/products/attribute-sets/{attribute_set_id}/attributes/{attribute_code}" method="DELETE">
+        <contentType>application/json</contentType>
+    </operation>
+    <operation name="GetProductAttributesFromDefaultSet" dataType="ProductAttributesFromDefaultSet" type="get" auth="adminOauth" url="/V1/products/attribute-sets/4/attributes" method="GET">
+        <contentType>application/json</contentType>
+    </operation>
+    <operation name="GetDefaultProductAttributeSetInfo" dataType="DefaultProductAttributeSetInfo" type="get" auth="adminOauth" url="/V1/products/attribute-sets/4" method="GET">
         <contentType>application/json</contentType>
-        <param key="attributeSetId" type="path">{attributeSetId}</param>
-        <param key="attributeCode" type="path">{attributeCode}</param>
     </operation>
 </config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product_link_extension_attribute-meta.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product_link_extension_attribute-meta.xml
index eaeedafe042..b0b1c840afd 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product_link_extension_attribute-meta.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product_link_extension_attribute-meta.xml
@@ -9,11 +9,11 @@
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataOperation.xsd">
     <operation name="CreateProductLinkExtensionAttribute" dataType="product_link_extension_attribute" type="create">
-        <header param="Content-Type">application/json</header>
+        <contentType>application/json</contentType>
         <field key="qty">integer</field>
     </operation>
     <operation name="UpdateProductLinkExtensionAttribute" dataType="product_link_extension_attribute" type="update">
-        <header param="Content-Type">application/json</header>
+        <contentType>application/json</contentType>
         <field key="qty">integer</field>
     </operation>
 </config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Metadata/coupon-meta.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Metadata/coupon-meta.xml
index 5e2eeee9cce..58a2204de7e 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Metadata/coupon-meta.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Metadata/coupon-meta.xml
@@ -10,7 +10,7 @@
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataOperation.xsd">
     <operation name="CreateCoupon" dataType="coupon" type="create" auth="adminOauth" url="/rest/V1/coupons" method="POST">
-        <header param="Content-Type">application/json</header>
+        <contentType>application/json</contentType>
         <object key="coupon" dataType="coupon">
             <field key="rule_id" required="true">integer</field>
             <field key="times_used" required="true">integer</field>
@@ -25,8 +25,7 @@
         </object>
     </operation>
 
-    <operation name="DeleteCoupon" dataType="coupon" type="delete" auth="adminOauth" url="/rest/V1/coupons/{couponId}" method="DELETE">
-        <header param="Content-Type">application/json</header>
-        <param key="couponId" type="path">{couponId}</param>
+    <operation name="DeleteCoupon" dataType="coupon" type="delete" auth="adminOauth" url="/rest/V1/coupons/{coupon_id}" method="DELETE">
+        <contentType>application/json</contentType>
     </operation>
 </config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/Data/ConfigurableProductData.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/Data/ConfigurableProductData.xml
index c00794af79c..ce15d793ac5 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/Data/ConfigurableProductData.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/Data/ConfigurableProductData.xml
@@ -23,6 +23,6 @@
     </entity>
     <entity name="ConfigurableProductAddChild" type="ConfigurableProductAddChild">
         <var key="sku" entityKey="sku" entityType="product" />
-        <var key="childSku" entityKey="sku" entityType="product"/>
+        <var key="childSku" entityKey="sku" entityType="product2"/>
     </entity>
 </config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/Metadata/configurable_product_add_child-meta.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/Metadata/configurable_product_add_child-meta.xml
index 625cb160c58..a438c92753a 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/Metadata/configurable_product_add_child-meta.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/Metadata/configurable_product_add_child-meta.xml
@@ -10,7 +10,6 @@
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataOperation.xsd">
     <operation name="ConfigurableProductAddChild" dataType="ConfigurableProductAddChild" type="create" auth="adminOauth" url="/V1/configurable-products/{sku}/child" method="POST">
         <contentType>application/json</contentType>
-        <param key="sku" type="path">{sku}</param>
         <field key="childSku">string</field>
     </operation>
 </config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/Metadata/configurable_product_options-meta.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/Metadata/configurable_product_options-meta.xml
index e3c10d88f53..4792eafaf06 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/Metadata/configurable_product_options-meta.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/Metadata/configurable_product_options-meta.xml
@@ -10,7 +10,6 @@
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataOperation.xsd">
     <operation name="CreateConfigurableProductOption" dataType="ConfigurableProductOption" type="create" auth="adminOauth" url="/V1/configurable-products/{sku}/options" method="POST">
         <contentType>application/json</contentType>
-        <param key="sku" type="path">{sku}</param>
         <object dataType="ConfigurableProductOption" key="option">
             <field key="attribute_id">integer</field>
             <field key="label">string</field>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Metadata/customer-meta.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Metadata/customer-meta.xml
index a8ef5dcce9b..908b5daa9cc 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Metadata/customer-meta.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Metadata/customer-meta.xml
@@ -43,6 +43,5 @@
     </operation>
     <operation name="DeleteCustomer" dataType="customer" type="delete" auth="adminOauth" url="/V1/customers/{id}" method="DELETE">
         <contentType>application/json</contentType>
-        <param key="id" type="path">{id}</param>
     </operation>
 </config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTemplates/Metadata/TemplateMetaFile.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTemplates/Metadata/TemplateMetaFile.xml
index 3610dc97935..89c9c1b3208 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTemplates/Metadata/TemplateMetaFile.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTemplates/Metadata/TemplateMetaFile.xml
@@ -9,8 +9,8 @@
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataOperation.xsd">
     <operation name="" dataType="" type="" auth="adminOauth" url="" method="">
-        <header param="">application/json</header>
-        <param key="" type="">{}</param>
+        <contentType>application/json</contentType>
+        <param key=""></param>
         <object dataType="" key="">
             <field key=""></field>
             <array key="">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/CreateConfigurableProductByApiCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/CreateConfigurableProductByApiCest.xml
index f90270ae718..690b008fe29 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/CreateConfigurableProductByApiCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/CreateConfigurableProductByApiCest.xml
@@ -58,12 +58,18 @@
                 <required-entity createDataKey="childProductHandle1"/>
                 <required-entity createDataKey="baseConfigProductHandle"/>
             </createData>
-            <!--Uncomment this when MQE-472 is fixed-->
-            <!--createData mergeKey="configProductHandle2" entity="ConfigurableProductAddChild">
+            <createData mergeKey="configProductHandle2" entity="ConfigurableProductAddChild">
                 <required-entity createDataKey="childProductHandle2"/>
                 <required-entity createDataKey="baseConfigProductHandle"/>
-            </createData-->
+            </createData>
         </before>
+        <after>
+            <deleteData mergeKey="d2" createDataKey="childProductHandle1"/>
+            <deleteData mergeKey="d3" createDataKey="childProductHandle2"/>
+            <deleteData mergeKey="d7" createDataKey="baseConfigProductHandle"/>
+            <deleteData mergeKey="d8" createDataKey="categoryHandle"/>
+            <deleteData mergeKey="d6" createDataKey="productAttributeHandle"/>
+        </after>
         <test name="CreateConfigurableProductByApiTest">
         </test>
     </cest>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/UpdateSimpleProductByApiCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/UpdateSimpleProductByApiCest.xml
index aaf5439b3b5..7d80719a227 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/UpdateSimpleProductByApiCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/UpdateSimpleProductByApiCest.xml
@@ -19,11 +19,10 @@
         </annotations>
         <before>
             <createData mergeKey="categoryHandle" entity="SimpleSubCategory"/>
-            <createData mergeKey="originalProductHandle" entity="SimpleProduct" >
+            <createData mergeKey="productHandle" entity="SimpleProduct" >
                 <required-entity createDataKey="categoryHandle"/>
             </createData>
-            <updateData mergeKey="productHandle" entity="NewSimpleProduct" createDataKey="originalProductHandle">
-            </updateData>
+            <updateData mergeKey="updateProduct" entity="NewSimpleProduct" createDataKey="productHandle"/>
         </before>
         <after>
             <deleteData mergeKey="delete" createDataKey="productHandle"/>
@@ -31,4 +30,4 @@
         <test name="UpdateSimpleProductByApiTest">
         </test>
     </cest>
-</config>
+</config>
\ No newline at end of file
-- 
GitLab


From 22b3f7ade06a4dc86b777d8ca9f014f07a0d277c Mon Sep 17 00:00:00 2001
From: Tom Reece <treece@magento.com>
Date: Wed, 15 Nov 2017 18:09:20 +0200
Subject: [PATCH 196/380] MQE-282: Stable MFTF Tests build plan for teams

- Skip AdminCreateCmsPageCest:CreateNewPage (failing on Jenkins)
- Add firefox env to all tests
- Remove any other env from all tests
---
 .../Magento/FunctionalTest/Backend/Cest/AdminLoginCest.xml   | 3 ---
 .../FunctionalTest/Catalog/Cest/AdminCreateCategoryCest.xml  | 3 +--
 .../Catalog/Cest/AdminCreateSimpleProductCest.xml            | 3 +--
 .../Checkout/Cest/StorefrontCustomerCheckoutCest.xml         | 3 +--
 .../Checkout/Cest/StorefrontGuestCheckoutCest.xml            | 3 +--
 .../FunctionalTest/Cms/Cest/AdminCreateCmsPageCest.xml       | 4 ++--
 .../Cest/AdminCreateConfigurableProductCest.xml              | 2 +-
 .../FunctionalTest/Customer/Cest/AdminCreateCustomerCest.xml | 3 +--
 .../Customer/Cest/StorefrontCreateCustomerCest.xml           | 4 +---
 .../Customer/Cest/StorefrontPersistedCustomerLoginCest.xml   | 3 ---
 .../FunctionalTest/Sales/Cest/AdminCreateInvoiceCest.xml     | 3 +--
 .../FunctionalTest/SampleTests/Cest/MinimumTestCest.xml      | 3 ---
 .../SampleTests/Cest/UpdateSimpleProductByApiCest.xml        | 5 +----
 .../FunctionalTest/Store/Cest/AdminCreateStoreGroupCest.xml  | 2 --
 .../Wishlist/Cest/StorefrontDeletePersistedWishlistCest.xml  | 2 --
 15 files changed, 11 insertions(+), 35 deletions(-)

diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/Cest/AdminLoginCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/Cest/AdminLoginCest.xml
index a50d75c167c..2689f07d9f4 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/Cest/AdminLoginCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/Cest/AdminLoginCest.xml
@@ -21,10 +21,7 @@
                 <testCaseId value="MAGETWO-71572"/>
                 <group value="example"/>
                 <group value="login"/>
-                <env value="chrome"/>
                 <env value="firefox"/>
-                <env value="phantomjs"/>
-                <env value="headless"/>
             </annotations>
             <amOnPage url="{{AdminLoginPage.url}}" mergeKey="amOnAdminLoginPage"/>
             <fillField selector="{{AdminLoginFormSection.username}}" userInput="{{_ENV.MAGENTO_ADMIN_USERNAME}}" mergeKey="fillUsername"/>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Cest/AdminCreateCategoryCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Cest/AdminCreateCategoryCest.xml
index 550e668b080..1441a686ed3 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Cest/AdminCreateCategoryCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Cest/AdminCreateCategoryCest.xml
@@ -23,8 +23,7 @@
                 <severity value="CRITICAL"/>
                 <testCaseId value="MAGETWO-72102"/>
                 <group value="category"/>
-                <env value="chrome"/>
-                <env value="headless"/>
+                <env value="firefox"/>
             </annotations>
             <amOnPage url="{{AdminLoginPage.url}}" mergeKey="amOnAdminLoginPage"/>
             <fillField selector="{{AdminLoginFormSection.username}}" userInput="{{_ENV.MAGENTO_ADMIN_USERNAME}}" mergeKey="fillUsername"/>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Cest/AdminCreateSimpleProductCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Cest/AdminCreateSimpleProductCest.xml
index f649580554e..5e55b86263e 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Cest/AdminCreateSimpleProductCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Cest/AdminCreateSimpleProductCest.xml
@@ -23,8 +23,7 @@
                 <severity value="CRITICAL"/>
                 <testCaseId value="MAGETWO-23414"/>
                 <group value="product"/>
-                <env value="chrome"/>
-                <env value="headless"/>
+                <env value="firefox"/>
             </annotations>
             <amOnPage url="{{AdminLoginPage.url}}" mergeKey="navigateToAdmin"/>
             <fillField userInput="{{_ENV.MAGENTO_ADMIN_USERNAME}}" selector="{{AdminLoginFormSection.username}}" mergeKey="fillUsername"/>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Cest/StorefrontCustomerCheckoutCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Cest/StorefrontCustomerCheckoutCest.xml
index 5e97a6ab03b..f8ab2c472f7 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Cest/StorefrontCustomerCheckoutCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Cest/StorefrontCustomerCheckoutCest.xml
@@ -32,8 +32,7 @@
                 <severity value="CRITICAL"/>
                 <testCaseId value="#"/>
                 <group value="checkout"/>
-                <env value="chrome"/>
-                <env value="headless"/>
+                <env value="firefox"/>
             </annotations>
 
             <amOnPage mergeKey="s1"  url="customer/account/login/"/>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Cest/StorefrontGuestCheckoutCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Cest/StorefrontGuestCheckoutCest.xml
index fa441fd6737..31a0546dd35 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Cest/StorefrontGuestCheckoutCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Cest/StorefrontGuestCheckoutCest.xml
@@ -30,8 +30,7 @@
                 <severity value="CRITICAL"/>
                 <testCaseId value="MAGETWO-72094"/>
                 <group value="checkout"/>
-                <env value="chrome"/>
-                <env value="headless"/>
+                <env value="firefox"/>
             </annotations>
             <amOnPage url="{{StorefrontCategoryPage.url($$createCategory.name$$)}}" mergeKey="onCategoryPage"/>
             <waitForPageLoad mergeKey="waitForPageLoad1"/>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Cest/AdminCreateCmsPageCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Cest/AdminCreateCmsPageCest.xml
index 9e1525c3670..328a8cd84d0 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Cest/AdminCreateCmsPageCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Cest/AdminCreateCmsPageCest.xml
@@ -23,9 +23,8 @@
                 <severity value="CRITICAL"/>
                 <testCaseId value="MAGETWO-25580"/>
                 <group value="cms"/>
-                <env value="chrome"/>
+                <group value="skip"/>
                 <env value="firefox"/>
-                <env value="headless"/>
             </annotations>
             <amOnPage url="{{AdminLoginPage.url}}" mergeKey="navigateToAdmin"/>
             <fillField selector="{{AdminLoginFormSection.username}}" userInput="{{_ENV.MAGENTO_ADMIN_USERNAME}}" mergeKey="fillUsername"/>
@@ -37,6 +36,7 @@
             <fillField selector="{{CmsNewPagePageBasicFieldsSection.pageTitle}}" userInput="{{_defaultCmsPage.title}}" mergeKey="fillFieldTitle"/>
             <click selector="{{CmsNewPagePageContentSection.header}}" mergeKey="clickExpandContent"/>
             <fillField selector="{{CmsNewPagePageContentSection.contentHeading}}" userInput="{{_defaultCmsPage.content_heading}}" mergeKey="fillFieldContentHeading"/>
+            <!-- As of 2017/11/15, this test is failing to find the selector below (Jenkins only, works locally). See MQE-282. -->
             <fillField selector="{{CmsNewPagePageContentSection.content}}" userInput="{{_defaultCmsPage.content}}" mergeKey="fillFieldContent"/>
             <click selector="{{CmsNewPagePageSeoSection.header}}" mergeKey="clickExpandSearchEngineOptimisation"/>
             <fillField selector="{{CmsNewPagePageSeoSection.urlKey}}" userInput="{{_defaultCmsPage.identifier}}" mergeKey="fillFieldUrlKey"/>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/Cest/AdminCreateConfigurableProductCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/Cest/AdminCreateConfigurableProductCest.xml
index fbcc2581b40..291ff8b45f5 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/Cest/AdminCreateConfigurableProductCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/Cest/AdminCreateConfigurableProductCest.xml
@@ -27,7 +27,7 @@
                 <testCaseId value="MAGETWO-26041"/>
                 <group value="configurable"/>
                 <group value="product"/>
-                <env value="chrome"/>
+                <env value="firefox"/>
             </annotations>
 
             <amOnPage url="{{AdminCategoryPage.url}}" mergeKey="amOnCategoryGridPage"/>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Cest/AdminCreateCustomerCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Cest/AdminCreateCustomerCest.xml
index b577bca92e3..94ce61a1f7f 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Cest/AdminCreateCustomerCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Cest/AdminCreateCustomerCest.xml
@@ -21,8 +21,7 @@
                 <testCaseId value="MAGETWO-72095"/>
                 <group value="customer"/>
                 <group value="create"/>
-                <env value="chrome"/>
-                <env value="headless"/>
+                <env value="firefox"/>
             </annotations>
             <amOnPage url="{{AdminLoginPage.url}}" mergeKey="navigateToAdmin"/>
             <fillField userInput="{{_ENV.MAGENTO_ADMIN_USERNAME}}" selector="{{AdminLoginFormSection.username}}" mergeKey="fillUsername"/>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Cest/StorefrontCreateCustomerCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Cest/StorefrontCreateCustomerCest.xml
index 37fe0017b86..d8435ff1b84 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Cest/StorefrontCreateCustomerCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Cest/StorefrontCreateCustomerCest.xml
@@ -21,9 +21,7 @@
                 <testCaseId value="MAGETWO-23546"/>
                 <group value="customer"/>
                 <group value="create"/>
-                <env value="chrome"/>
                 <env value="firefox"/>
-                <env value="headless"/>
             </annotations>
             <amOnPage mergeKey="amOnStorefrontPage"  url="/"/>
             <click mergeKey="clickOnCreateAccountLink" selector="{{StorefrontPanelHeaderSection.createAnAccountLink}}"/>
@@ -39,4 +37,4 @@
             <see mergeKey="seeEmail" userInput="{{CustomerEntityOne.email}}" selector="{{StorefrontCustomerDashboardAccountInformationSection.ContactInformation}}" />
         </test>
     </cest>
-</config>
\ No newline at end of file
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Cest/StorefrontPersistedCustomerLoginCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Cest/StorefrontPersistedCustomerLoginCest.xml
index 2e039b51bf1..8c1398851b4 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Cest/StorefrontPersistedCustomerLoginCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Cest/StorefrontPersistedCustomerLoginCest.xml
@@ -26,10 +26,7 @@
                 <severity value="CRITICAL"/>
                 <testCaseId value="MAGETWO-72103"/>
                 <group value="customer"/>
-                <env value="chrome"/>
                 <env value="firefox"/>
-                <env value="phantomjs"/>
-                <env value="headless"/>
             </annotations>
             <amOnPage mergeKey="amOnSignInPage"  url="{{StorefrontCustomerSignInPage.url}}"/>
             <fillField  mergeKey="fillEmail" userInput="$$customer.email$$" selector="{{StorefrontCustomerSignInFormSection.emailField}}"/>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Cest/AdminCreateInvoiceCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Cest/AdminCreateInvoiceCest.xml
index c043fe298f7..606ba4c3784 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Cest/AdminCreateInvoiceCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Cest/AdminCreateInvoiceCest.xml
@@ -27,8 +27,7 @@
                 <severity value="NORMAL"/>
                 <testCaseId value="MAGETWO-72096"/>
                 <group value="sales"/>
-                <env value="chrome"/>
-                <env value="headless"/>
+                <env value="firefox"/>
             </annotations>
 
             <!-- todo: Create an order via the api instead of driving the browser  -->
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/MinimumTestCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/MinimumTestCest.xml
index b1cfc787acb..07da32b7e68 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/MinimumTestCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/MinimumTestCest.xml
@@ -21,10 +21,7 @@
                 <title value="Minimum Test"/>
                 <description value="Minimum Test"/>
                 <group value="example"/>
-                <env value="chrome"/>
                 <env value="firefox"/>
-                <env value="phantomjs"/>
-                <env value="headless"/>
             </annotations>
             <amOnPage url="{{AdminLoginPage.url}}" mergeKey="navigateToAdmin"/>
             <fillField selector="{{AdminLoginFormSection.username}}" userInput="{{_ENV.MAGENTO_ADMIN_USERNAME}}" mergeKey="fillUsername"/>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/UpdateSimpleProductByApiCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/UpdateSimpleProductByApiCest.xml
index 7d80719a227..0aa79f74150 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/UpdateSimpleProductByApiCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/UpdateSimpleProductByApiCest.xml
@@ -12,10 +12,7 @@
             <features value="Update simple product by api test."/>
             <stories value="Update simple product by api test."/>
             <group value="example"/>
-            <env value="chrome"/>
             <env value="firefox"/>
-            <env value="phantomjs"/>
-            <env value="headless"/>
         </annotations>
         <before>
             <createData mergeKey="categoryHandle" entity="SimpleSubCategory"/>
@@ -30,4 +27,4 @@
         <test name="UpdateSimpleProductByApiTest">
         </test>
     </cest>
-</config>
\ No newline at end of file
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/Cest/AdminCreateStoreGroupCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/Cest/AdminCreateStoreGroupCest.xml
index 53692f3f41d..b933f7a7ada 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/Cest/AdminCreateStoreGroupCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/Cest/AdminCreateStoreGroupCest.xml
@@ -11,9 +11,7 @@
         <annotations>
             <features value="Create a store group in admin"/>
             <stories value="Create a store group in admin"/>
-            <env value="chrome"/>
             <env value="firefox"/>
-            <env value="phantomjs"/>
             <group value="store"/>
         </annotations>
         <before>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Wishlist/Cest/StorefrontDeletePersistedWishlistCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Wishlist/Cest/StorefrontDeletePersistedWishlistCest.xml
index b1f452ac565..9ff95363e6f 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Wishlist/Cest/StorefrontDeletePersistedWishlistCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Wishlist/Cest/StorefrontDeletePersistedWishlistCest.xml
@@ -11,9 +11,7 @@
         <annotations>
             <features value="Delete a persist wishlist for a customer"/>
             <stories value="Delete a persist wishlist for a customer"/>
-            <env value="chrome"/>
             <env value="firefox"/>
-            <env value="phantomjs"/>
             <group value="wishlist"/>
         </annotations>
         <before>
-- 
GitLab


From 21687d5e138432fd90147405e071f478e9359354 Mon Sep 17 00:00:00 2001
From: Tom Reece <treece@magento.com>
Date: Wed, 15 Nov 2017 21:09:27 +0200
Subject: [PATCH 197/380] MQE-282: Stable MFTF Tests build plan for teams

- Revert all @env changes

This reverts commit 147214469fa8867d5154f755e1bff36e808206bb.
---
 .../Magento/FunctionalTest/Backend/Cest/AdminLoginCest.xml   | 3 +++
 .../FunctionalTest/Catalog/Cest/AdminCreateCategoryCest.xml  | 3 ++-
 .../Catalog/Cest/AdminCreateSimpleProductCest.xml            | 3 ++-
 .../Checkout/Cest/StorefrontCustomerCheckoutCest.xml         | 3 ++-
 .../Checkout/Cest/StorefrontGuestCheckoutCest.xml            | 3 ++-
 .../FunctionalTest/Cms/Cest/AdminCreateCmsPageCest.xml       | 4 +++-
 .../Cest/AdminCreateConfigurableProductCest.xml              | 2 +-
 .../FunctionalTest/Customer/Cest/AdminCreateCustomerCest.xml | 3 ++-
 .../Customer/Cest/StorefrontCreateCustomerCest.xml           | 4 +++-
 .../Customer/Cest/StorefrontPersistedCustomerLoginCest.xml   | 3 +++
 .../FunctionalTest/Sales/Cest/AdminCreateInvoiceCest.xml     | 3 ++-
 .../FunctionalTest/SampleTests/Cest/MinimumTestCest.xml      | 3 +++
 .../SampleTests/Cest/UpdateSimpleProductByApiCest.xml        | 5 ++++-
 .../FunctionalTest/Store/Cest/AdminCreateStoreGroupCest.xml  | 2 ++
 .../Wishlist/Cest/StorefrontDeletePersistedWishlistCest.xml  | 2 ++
 15 files changed, 36 insertions(+), 10 deletions(-)

diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/Cest/AdminLoginCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/Cest/AdminLoginCest.xml
index 2689f07d9f4..a50d75c167c 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/Cest/AdminLoginCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/Cest/AdminLoginCest.xml
@@ -21,7 +21,10 @@
                 <testCaseId value="MAGETWO-71572"/>
                 <group value="example"/>
                 <group value="login"/>
+                <env value="chrome"/>
                 <env value="firefox"/>
+                <env value="phantomjs"/>
+                <env value="headless"/>
             </annotations>
             <amOnPage url="{{AdminLoginPage.url}}" mergeKey="amOnAdminLoginPage"/>
             <fillField selector="{{AdminLoginFormSection.username}}" userInput="{{_ENV.MAGENTO_ADMIN_USERNAME}}" mergeKey="fillUsername"/>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Cest/AdminCreateCategoryCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Cest/AdminCreateCategoryCest.xml
index 1441a686ed3..550e668b080 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Cest/AdminCreateCategoryCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Cest/AdminCreateCategoryCest.xml
@@ -23,7 +23,8 @@
                 <severity value="CRITICAL"/>
                 <testCaseId value="MAGETWO-72102"/>
                 <group value="category"/>
-                <env value="firefox"/>
+                <env value="chrome"/>
+                <env value="headless"/>
             </annotations>
             <amOnPage url="{{AdminLoginPage.url}}" mergeKey="amOnAdminLoginPage"/>
             <fillField selector="{{AdminLoginFormSection.username}}" userInput="{{_ENV.MAGENTO_ADMIN_USERNAME}}" mergeKey="fillUsername"/>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Cest/AdminCreateSimpleProductCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Cest/AdminCreateSimpleProductCest.xml
index 5e55b86263e..f649580554e 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Cest/AdminCreateSimpleProductCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Cest/AdminCreateSimpleProductCest.xml
@@ -23,7 +23,8 @@
                 <severity value="CRITICAL"/>
                 <testCaseId value="MAGETWO-23414"/>
                 <group value="product"/>
-                <env value="firefox"/>
+                <env value="chrome"/>
+                <env value="headless"/>
             </annotations>
             <amOnPage url="{{AdminLoginPage.url}}" mergeKey="navigateToAdmin"/>
             <fillField userInput="{{_ENV.MAGENTO_ADMIN_USERNAME}}" selector="{{AdminLoginFormSection.username}}" mergeKey="fillUsername"/>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Cest/StorefrontCustomerCheckoutCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Cest/StorefrontCustomerCheckoutCest.xml
index f8ab2c472f7..5e97a6ab03b 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Cest/StorefrontCustomerCheckoutCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Cest/StorefrontCustomerCheckoutCest.xml
@@ -32,7 +32,8 @@
                 <severity value="CRITICAL"/>
                 <testCaseId value="#"/>
                 <group value="checkout"/>
-                <env value="firefox"/>
+                <env value="chrome"/>
+                <env value="headless"/>
             </annotations>
 
             <amOnPage mergeKey="s1"  url="customer/account/login/"/>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Cest/StorefrontGuestCheckoutCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Cest/StorefrontGuestCheckoutCest.xml
index 31a0546dd35..fa441fd6737 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Cest/StorefrontGuestCheckoutCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Cest/StorefrontGuestCheckoutCest.xml
@@ -30,7 +30,8 @@
                 <severity value="CRITICAL"/>
                 <testCaseId value="MAGETWO-72094"/>
                 <group value="checkout"/>
-                <env value="firefox"/>
+                <env value="chrome"/>
+                <env value="headless"/>
             </annotations>
             <amOnPage url="{{StorefrontCategoryPage.url($$createCategory.name$$)}}" mergeKey="onCategoryPage"/>
             <waitForPageLoad mergeKey="waitForPageLoad1"/>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Cest/AdminCreateCmsPageCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Cest/AdminCreateCmsPageCest.xml
index 328a8cd84d0..e6dfb969fe2 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Cest/AdminCreateCmsPageCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Cest/AdminCreateCmsPageCest.xml
@@ -24,7 +24,9 @@
                 <testCaseId value="MAGETWO-25580"/>
                 <group value="cms"/>
                 <group value="skip"/>
+                <env value="chrome"/>
                 <env value="firefox"/>
+                <env value="headless"/>
             </annotations>
             <amOnPage url="{{AdminLoginPage.url}}" mergeKey="navigateToAdmin"/>
             <fillField selector="{{AdminLoginFormSection.username}}" userInput="{{_ENV.MAGENTO_ADMIN_USERNAME}}" mergeKey="fillUsername"/>
@@ -36,7 +38,7 @@
             <fillField selector="{{CmsNewPagePageBasicFieldsSection.pageTitle}}" userInput="{{_defaultCmsPage.title}}" mergeKey="fillFieldTitle"/>
             <click selector="{{CmsNewPagePageContentSection.header}}" mergeKey="clickExpandContent"/>
             <fillField selector="{{CmsNewPagePageContentSection.contentHeading}}" userInput="{{_defaultCmsPage.content_heading}}" mergeKey="fillFieldContentHeading"/>
-            <!-- As of 2017/11/15, this test is failing to find the selector below (Jenkins only, works locally). See MQE-282. -->
+            <!-- As of 2017/11/15, this test is failing here (Jenkins only, works locally). See MQE-282. -->
             <fillField selector="{{CmsNewPagePageContentSection.content}}" userInput="{{_defaultCmsPage.content}}" mergeKey="fillFieldContent"/>
             <click selector="{{CmsNewPagePageSeoSection.header}}" mergeKey="clickExpandSearchEngineOptimisation"/>
             <fillField selector="{{CmsNewPagePageSeoSection.urlKey}}" userInput="{{_defaultCmsPage.identifier}}" mergeKey="fillFieldUrlKey"/>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/Cest/AdminCreateConfigurableProductCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/Cest/AdminCreateConfigurableProductCest.xml
index 291ff8b45f5..fbcc2581b40 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/Cest/AdminCreateConfigurableProductCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/Cest/AdminCreateConfigurableProductCest.xml
@@ -27,7 +27,7 @@
                 <testCaseId value="MAGETWO-26041"/>
                 <group value="configurable"/>
                 <group value="product"/>
-                <env value="firefox"/>
+                <env value="chrome"/>
             </annotations>
 
             <amOnPage url="{{AdminCategoryPage.url}}" mergeKey="amOnCategoryGridPage"/>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Cest/AdminCreateCustomerCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Cest/AdminCreateCustomerCest.xml
index 94ce61a1f7f..b577bca92e3 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Cest/AdminCreateCustomerCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Cest/AdminCreateCustomerCest.xml
@@ -21,7 +21,8 @@
                 <testCaseId value="MAGETWO-72095"/>
                 <group value="customer"/>
                 <group value="create"/>
-                <env value="firefox"/>
+                <env value="chrome"/>
+                <env value="headless"/>
             </annotations>
             <amOnPage url="{{AdminLoginPage.url}}" mergeKey="navigateToAdmin"/>
             <fillField userInput="{{_ENV.MAGENTO_ADMIN_USERNAME}}" selector="{{AdminLoginFormSection.username}}" mergeKey="fillUsername"/>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Cest/StorefrontCreateCustomerCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Cest/StorefrontCreateCustomerCest.xml
index d8435ff1b84..37fe0017b86 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Cest/StorefrontCreateCustomerCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Cest/StorefrontCreateCustomerCest.xml
@@ -21,7 +21,9 @@
                 <testCaseId value="MAGETWO-23546"/>
                 <group value="customer"/>
                 <group value="create"/>
+                <env value="chrome"/>
                 <env value="firefox"/>
+                <env value="headless"/>
             </annotations>
             <amOnPage mergeKey="amOnStorefrontPage"  url="/"/>
             <click mergeKey="clickOnCreateAccountLink" selector="{{StorefrontPanelHeaderSection.createAnAccountLink}}"/>
@@ -37,4 +39,4 @@
             <see mergeKey="seeEmail" userInput="{{CustomerEntityOne.email}}" selector="{{StorefrontCustomerDashboardAccountInformationSection.ContactInformation}}" />
         </test>
     </cest>
-</config>
+</config>
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Cest/StorefrontPersistedCustomerLoginCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Cest/StorefrontPersistedCustomerLoginCest.xml
index 8c1398851b4..2e039b51bf1 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Cest/StorefrontPersistedCustomerLoginCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Cest/StorefrontPersistedCustomerLoginCest.xml
@@ -26,7 +26,10 @@
                 <severity value="CRITICAL"/>
                 <testCaseId value="MAGETWO-72103"/>
                 <group value="customer"/>
+                <env value="chrome"/>
                 <env value="firefox"/>
+                <env value="phantomjs"/>
+                <env value="headless"/>
             </annotations>
             <amOnPage mergeKey="amOnSignInPage"  url="{{StorefrontCustomerSignInPage.url}}"/>
             <fillField  mergeKey="fillEmail" userInput="$$customer.email$$" selector="{{StorefrontCustomerSignInFormSection.emailField}}"/>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Cest/AdminCreateInvoiceCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Cest/AdminCreateInvoiceCest.xml
index 606ba4c3784..c043fe298f7 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Cest/AdminCreateInvoiceCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Cest/AdminCreateInvoiceCest.xml
@@ -27,7 +27,8 @@
                 <severity value="NORMAL"/>
                 <testCaseId value="MAGETWO-72096"/>
                 <group value="sales"/>
-                <env value="firefox"/>
+                <env value="chrome"/>
+                <env value="headless"/>
             </annotations>
 
             <!-- todo: Create an order via the api instead of driving the browser  -->
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/MinimumTestCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/MinimumTestCest.xml
index 07da32b7e68..b1cfc787acb 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/MinimumTestCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/MinimumTestCest.xml
@@ -21,7 +21,10 @@
                 <title value="Minimum Test"/>
                 <description value="Minimum Test"/>
                 <group value="example"/>
+                <env value="chrome"/>
                 <env value="firefox"/>
+                <env value="phantomjs"/>
+                <env value="headless"/>
             </annotations>
             <amOnPage url="{{AdminLoginPage.url}}" mergeKey="navigateToAdmin"/>
             <fillField selector="{{AdminLoginFormSection.username}}" userInput="{{_ENV.MAGENTO_ADMIN_USERNAME}}" mergeKey="fillUsername"/>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/UpdateSimpleProductByApiCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/UpdateSimpleProductByApiCest.xml
index 0aa79f74150..7d80719a227 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/UpdateSimpleProductByApiCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/UpdateSimpleProductByApiCest.xml
@@ -12,7 +12,10 @@
             <features value="Update simple product by api test."/>
             <stories value="Update simple product by api test."/>
             <group value="example"/>
+            <env value="chrome"/>
             <env value="firefox"/>
+            <env value="phantomjs"/>
+            <env value="headless"/>
         </annotations>
         <before>
             <createData mergeKey="categoryHandle" entity="SimpleSubCategory"/>
@@ -27,4 +30,4 @@
         <test name="UpdateSimpleProductByApiTest">
         </test>
     </cest>
-</config>
+</config>
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/Cest/AdminCreateStoreGroupCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/Cest/AdminCreateStoreGroupCest.xml
index b933f7a7ada..53692f3f41d 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/Cest/AdminCreateStoreGroupCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/Cest/AdminCreateStoreGroupCest.xml
@@ -11,7 +11,9 @@
         <annotations>
             <features value="Create a store group in admin"/>
             <stories value="Create a store group in admin"/>
+            <env value="chrome"/>
             <env value="firefox"/>
+            <env value="phantomjs"/>
             <group value="store"/>
         </annotations>
         <before>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Wishlist/Cest/StorefrontDeletePersistedWishlistCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Wishlist/Cest/StorefrontDeletePersistedWishlistCest.xml
index 9ff95363e6f..b1f452ac565 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Wishlist/Cest/StorefrontDeletePersistedWishlistCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Wishlist/Cest/StorefrontDeletePersistedWishlistCest.xml
@@ -11,7 +11,9 @@
         <annotations>
             <features value="Delete a persist wishlist for a customer"/>
             <stories value="Delete a persist wishlist for a customer"/>
+            <env value="chrome"/>
             <env value="firefox"/>
+            <env value="phantomjs"/>
             <group value="wishlist"/>
         </annotations>
         <before>
-- 
GitLab


From c8be042fdb298d34ab34719e1f2886131f8ea98f Mon Sep 17 00:00:00 2001
From: Kevin Kozan <kkozan@magento.com>
Date: Wed, 15 Nov 2017 21:34:42 +0200
Subject: [PATCH 198/380] MQE-497: Add useCaseId annotation

- allure ignoreAnnotations change.
---
 dev/tests/acceptance/codeception.dist.yml | 1 +
 1 file changed, 1 insertion(+)

diff --git a/dev/tests/acceptance/codeception.dist.yml b/dev/tests/acceptance/codeception.dist.yml
index 81fcd113db3..207671b27a1 100644
--- a/dev/tests/acceptance/codeception.dist.yml
+++ b/dev/tests/acceptance/codeception.dist.yml
@@ -22,6 +22,7 @@ extensions:
             ignoredAnnotations:
                 - env
                 - zephyrId
+                - useCaseId
 params:
     - .env
 modules:
-- 
GitLab


From c219a8fd5ae8ce03f1e01c394523b84f50a3fef1 Mon Sep 17 00:00:00 2001
From: Ji Lu <jilu1@magento.com>
Date: Thu, 16 Nov 2017 21:43:13 +0200
Subject: [PATCH 199/380] MQE-235: added sample cest for Codeception Asserts.

---
 .../SampleTests/Cest/AssertsCest.xml          | 95 +++++++++++++++++++
 .../SampleTests/Cest/SampleCest.xml           | 61 ------------
 2 files changed, 95 insertions(+), 61 deletions(-)
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/AssertsCest.xml

diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/AssertsCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/AssertsCest.xml
new file mode 100644
index 00000000000..23fc0a9a836
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/AssertsCest.xml
@@ -0,0 +1,95 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
+<!-- Test XML Example -->
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Test/etc/testSchema.xsd">
+    <cest name="AssertCest">
+        <annotations>
+            <features value="Test Asserts"/>
+            <group value="skip"/>
+        </annotations>
+        <before>
+            <createData entity="Simple_US_Customer" mergeKey="createData1"/>
+        </before>
+        <after>
+            <deleteData createDataKey="createData1" mergeKey="deleteData1"/>
+        </after>
+        <test name="AssertTest">
+            <createData entity="Simple_US_Customer" mergeKey="createData2"/>
+            <amOnUrl url="http://magento3.loc/index.php/simplesubcategory5a05d3129ab3d2.html" mergeKey="amOnPage"/>
+            <grabTextFrom returnVariable="text" selector=".copyright>span" mergeKey="grabTextFrom1"/>
+
+            <!-- asserts without variable replacement -->
+            <comment mergeKey="c1" userInput="asserts without variable replacement"/>
+            <assertArrayHasKey mergeKey="assertArrayHasKey" expected="apple" expectedType="string" actual="['orange' => 2, 'apple' => 1]" actualType="const" message="pass"/>
+            <assertArrayNotHasKey mergeKey="assertArrayNotHasKey" expected="kiwi" expectedType="string" actual="['orange' => 2, 'apple' => 1]" message="pass"/>
+            <assertArraySubset mergeKey="assertArraySubset" expected="[1, 2]" actual="[1, 2, 3, 5]" message="pass"/>
+            <assertContains mergeKey="assertContains" expected="ab" expectedType="string" actual="['item1' => 'a', 'item2' => 'ab']" message="pass"/>
+            <assertCount mergeKey="assertCount" expected="2" expectedType="int" actual="['a', 'b']" message="pass"/>
+            <assertEmpty mergeKey="assertEmpty" actual="[]" message="pass"/>
+            <assertEquals mergeKey="assertEquals1" expected="text" expectedType="variable" actual="Copyright © 2013-2017 Magento, Inc. All rights reserved." actualType="string" message="pass"/>
+            <assertEquals mergeKey="assertEquals2" expected="Copyright © 2013-2017 Magento, Inc. All rights reserved." expectedType="string" actual="text" actualType="variable" message="pass"/>
+            <assertFalse mergeKey="assertFalse1" actual="0" actualType="bool" message="pass"/>
+            <assertFileNotExists mergeKey="assertFileNotExists1" actual="/out.txt" actualType="string" message="pass"/>
+            <assertFileNotExists mergeKey="assertFileNotExists2" actual="text" actualType="variable" message="pass"/>
+            <assertGreaterOrEquals mergeKey="assertGreaterOrEquals" expected="2" expectedType="int" actual="5" actualType="int" message="pass"/>
+            <assertGreaterThan mergeKey="assertGreaterThan" expected="2" expectedType="int" actual="5" actualType="int" message="pass"/>
+            <assertGreaterThanOrEqual mergeKey="assertGreaterThanOrEqual" expected="2" expectedType="int" actual="5" actualType="int" message="pass"/>
+            <assertInternalType mergeKey="assertInternalType1" expected="string" expectedType="string" actual="xyz" actualType="string" message="pass"/>
+            <assertInternalType mergeKey="assertInternalType2" expected="int" expectedType="string" actual="21" actualType="int" message="pass"/>
+            <assertInternalType mergeKey="assertInternalType3" expected="string" expectedType="string" actual="text" actualType="variable" message="pass"/>
+            <assertLessOrEquals mergeKey="assertLessOrEquals" expected="5" expectedType="int" actual="2" actualType="int" message="pass"/>
+            <assertLessThan mergeKey="assertLessThan" expected="5" expectedType="int" actual="2" actualType="int" message="pass"/>
+            <assertLessThanOrEqual mergeKey="assertLessThanOrEqual" expected="5" expectedType="int" actual="2" actualType="int" message="pass"/>
+            <assertNotContains mergeKey="assertNotContains1" expected="bc" expectedType="string" actual="['item1' => 'a', 'item2' => 'ab']" message="pass"/>
+            <assertNotContains mergeKey="assertNotContains2" expected="bc" expectedType="string" actual="text" actualType="variable" message="pass"/>
+            <assertNotEmpty mergeKey="assertNotEmpty1" actual="[1, 2]" message="pass"/>
+            <assertNotEmpty mergeKey="assertNotEmpty2" actual="text" actualType="variable" message="pass"/>
+            <assertNotEquals mergeKey="assertNotEquals" expected="2" expectedType="int" actual="5" actualType="int" message="pass" delta=""/>
+            <assertNotNull mergeKey="assertNotNull1" actual="abc" actualType="string" message="pass"/>
+            <assertNotNull mergeKey="assertNotNull2" actual="text" actualType="variable" message="pass"/>
+            <assertNotRegExp mergeKey="assertNotRegExp" expected="/foo/" expectedType="string" actual="bar" actualType="string" message="pass"/>
+            <assertNotSame mergeKey="assertNotSame" expected="log" expectedType="string" actual="tag" actualType="string" message="pass"/>
+            <assertRegExp mergeKey="assertRegExp" expected="/foo/" expectedType="string" actual="foo" actualType="string" message="pass"/>
+            <assertSame mergeKey="assertSame" expected="bar" expectedType="string" actual="bar" actualType="string" message="pass"/>
+            <assertStringStartsNotWith mergeKey="assertStringStartsNotWith" expected="a" expectedType="string" actual="banana" actualType="string" message="pass"/>
+            <assertStringStartsWith mergeKey="assertStringStartsWith" expected="a" expectedType="string" actual="apple" actualType="string" message="pass"/>
+            <assertTrue mergeKey="assertTrue" actual="1" actualType="bool" message="pass"/>
+
+            <!-- string type that use created data -->
+            <comment mergeKey="c2" userInput="string type that use created data"/>
+            <assertStringStartsWith mergeKey="assert1" expected="D" expectedType="string" actual="$$createData1.lastname$$, $$createData1.firstname$$" actualType="string" message="fail"/>
+            <assertStringStartsNotWith mergeKey="assert2" expected="W" expectedType="string" actual="$createData2.firstname$ $createData2.lastname$" actualType="string" message="pass"/>
+            <assertEquals mergeKey="assert5" expected="$$createData1.lastname$$" expectedType="string" actual="$$createData1.lastname$$" actualType="string" message="pass"/>
+
+            <!-- array type that use created data -->
+            <comment mergeKey="c3" userInput="array type that use created data"/>
+            <assertArraySubset mergeKey="assert9" expected="[$$createData1.lastname$$, $$createData1.firstname$$]" expectedType="array" actual="[$$createData1.lastname$$, $$createData1.firstname$$, 1]" actualType="array" message="pass"/>
+            <assertArraySubset mergeKey="assert10" expected="[$createData2.firstname$, $createData2.lastname$]" expectedType="array" actual="[$createData2.firstname$, $createData2.lastname$, 1]" actualType="array" message="pass"/>
+            <assertArrayHasKey mergeKey="assert3" expected="lastname" expectedType="string" actual="['lastname' => $$createData1.lastname$$, 'firstname' => $$createData1.firstname$$]" actualType="array" message="pass"/>
+            <assertArrayHasKey mergeKey="assert4" expected="lastname" expectedType="string" actual="['lastname' => $createData2.lastname$, 'firstname' => $createData2.firstname$]" actualType="array" message="pass"/>
+
+            <!-- comment this section before running this test -->
+            <comment mergeKey="c4" userInput="comment this section before running this test"/>
+            <assertInstanceOf mergeKey="assertInstanceOf" expected="User::class" actual="text" actualType="variable" message="pass"/>
+            <assertNotInstanceOf mergeKey="assertNotInstanceOf" expected="User::class" actual="21" actualType="int" message="pass"/>
+            <assertFileExists mergeKey="assertFileExists2" actual="text" actualType="variable" message="pass"/>
+            <assertFileExists mergeKey="assert6" actual="AssertCest.php" actualType="string" message="pass"/>
+            <assertIsEmpty mergeKey="assertIsEmpty" actual="text" actualType="variable" message="pass"/>
+            <assertNull mergeKey="assertNull" actual="text" actualType="variable" message="pass"/>
+            <expectException mergeKey="expectException" expected="new MyException('exception msg')" actual="function() {$this->doSomethingBad();}"/>
+            <fail mergeKey="fail" message="fail"/>
+            <fail mergeKey="assert7" message="$createData2.firstname$ $createData2.lastname$"/>
+            <fail mergeKey="assert8" message="$$createData1.firstname$$ $$createData1.lastname$$"/>
+            <!-- comment end -->
+            <comment mergeKey="c5" userInput="comment end"/>
+
+            <deleteData createDataKey="createData2" mergeKey="deleteData2"/>
+        </test>
+    </cest>
+</config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/SampleCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/SampleCest.xml
index f00c27f7d19..b07e73bbbaa 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/SampleCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/SampleCest.xml
@@ -172,51 +172,6 @@
             <waitForJS function="return $.active == 0;" time="30" mergeKey="waitForJS"/>
             <waitForText userInput="foo" time="30" mergeKey="waitForText1"/>
             <waitForText userInput="foo" selector=".title" time="30" mergeKey="waitForText2"/>
-            <!-- Codeception Assert -->
-            <assertArrayHasKey mergeKey="assertArrayHasKey" expected="apple" actualArray="[['orange' => 2], ['apple' => 1]" message="pass"/>
-            <assertArrayNotHasKey mergeKey="assertArrayNotHasKey" expected="kiwi" actualArray="[['orange' => 2], ['apple' => 1]" message="pass"/>
-            <assertArraySubset mergeKey="assertArraySubset" expectedArray="[1, 2]" actualArray="[5, 3, 2, 1]" message="pass"/>
-            <assertContains mergeKey="assertContains" expected="ab" actualArray="[['item1' => 'a'], ['item2' => 'ab']" message="pass"/>
-            <assertCount mergeKey="assertCount" expected="2" actualArray="['a', 'b']" message="pass"/>
-            <assertEmpty mergeKey="assertEmpty1" actual="''" message="pass"/>
-            <assertEmpty mergeKey="assertEmpty2" actual="[]" message="pass"/>
-            <assertEmpty mergeKey="assertEmpty3" actualVariable="value1" message="pass"/>
-            <assertEquals mergeKey="assertEquals1" expected="abc" actual="abc" message="pass"/>
-            <assertEquals mergeKey="assertEquals2" expected="2" actualVariable="value1" message="pass"/>
-            <assertFalse mergeKey="assertFalse" actualVariable="value1" message="pass"/>
-            <assertFileExists mergeKey="assertFileExists1" actual="/out.txt" message="pass"/>
-            <assertFileExists mergeKey="assertFileExists2" actualVariable="value1" message="pass"/>
-            <assertFileNotExists mergeKey="assertFileNotExists1" actual="/out.txt" message="pass"/>
-            <assertFileNotExists mergeKey="assertFileNotExists2" actual="file" message="pass"/>
-            <assertGreaterOrEquals mergeKey="assertGreaterOrEquals" expected="5" actual="2" message="pass"/>
-            <assertGreaterThan mergeKey="assertGreaterThan" expected="5" actual="2" message="pass"/>
-            <assertGreaterThanOrEqual mergeKey="assertGreaterThanOrEqual" expected="5" actual="2" message="pass"/>
-            <assertInstanceOf mergeKey="assertInstanceOf" class="User::class" actualVariable="value1" message="pass"/>
-            <assertInternalType mergeKey="assertInternalType1" expected="string" actual="xyz" message="pass"/>
-            <assertInternalType mergeKey="assertInternalType2" type="string" actual="xyz" message="pass"/>
-            <assertInternalType mergeKey="assertInternalType3" type="string" actualVariable="value1" message="pass"/>
-            <assertIsEmpty mergeKey="assertIsEmpty" actualVariable="value1" message="pass"/>
-            <assertLessOrEquals mergeKey="assertLessOrEquals" expected="2" actual="5" message="pass"/>
-            <assertLessThan mergeKey="assertLessThan" expected="2" actual="5" message="pass"/>
-            <assertLessThanOrEqual mergeKey="assertLessThanOrEqual" expected="2" actual="5" message="pass"/>
-            <assertNotContains mergeKey="assertNotContains1" expected="bc" actualArray="[['item1' => 'a'], ['item2' => 'ab']" message="pass"/>
-            <assertNotContains mergeKey="assertNotContains2" expected="bc" actualVariable="value1" message="pass"/>
-            <assertNotEmpty mergeKey="assertNotEmpty1" actual="[1, 2]" message="pass"/>
-            <assertNotEmpty mergeKey="assertNotEmpty2" actualVariable="value1" message="pass"/>
-            <assertNotEquals mergeKey="assertNotEquals" expected="2" actual="5" message="pass" delta=""/>
-            <assertNotInstanceOf mergeKey="assertNotInstanceOf" expected="RuntimeException::class" actual="21" message="pass"/>
-            <assertNotNull mergeKey="assertNotNull1" actual="abc" message="pass"/>
-            <assertNotNull mergeKey="assertNotNull2" actualVariable="value1" message="pass"/>
-            <assertNotRegExp mergeKey="assertNotRegExp" expected="/foo/" actual="bar" message="pass"/>
-            <assertNotSame mergeKey="assertNotSame" expected="log" actual="tag" message="pass"/>
-            <assertNull mergeKey="assertNull" actualVariable="value1" message="pass"/>
-            <assertRegExp mergeKey="assertRegExp" expected="/foo/" actual="foo" message="pass"/>
-            <assertSame mergeKey="assertSame" expected="bar" actual="bar" message="pass"/>
-            <assertStringStartsNotWith mergeKey="assertStringStartsNotWith" expected="a" actual="banana" message="pass"/>
-            <assertStringStartsWith mergeKey="assertStringStartsWith" expected="a" actual="apple" message="pass"/>
-            <assertTrue mergeKey="assertTrue" actual="true" message="pass"/>
-            <expectException mergeKey="expectException" class="new MyException('exception msg')" function="function() {$this->doSomethingBad();}"/>
-            <fail mergeKey="fail" message="fail"/>
         </test>
         <test name="AllCustomMethodsTest">
             <annotations>
@@ -334,22 +289,6 @@
             <!-- userInput that uses created data -->
             <fillField selector="#sample" userInput="Hello $testScopeData.firstname$ $testScopeData.lastname$" mergeKey="f1"/>
             <fillField selector="#sample" userInput="Hello $$createData1.firstname$$ $$createData1.lastname$$" mergeKey="f2"/>
-
-            <!-- expected, actual that use created data -->
-            <assertStringStartsNotWith mergeKey="assert1" expected="D" actual="$$createData2.lastname$$, $$createData2.firstname$$" message="fail"/>
-            <assertStringStartsWith mergeKey="assert2" expected="W" actual="$testScopeData2.firstname$ $testScopeData2.lastname$" message="pass"/>
-            <assertEquals mergeKey="assert5" expected="$$createData1.lastname$$" actual="$$createData1.lastname$$" message="pass"/>
-            <assertFileExists mergeKey="assert6" actual="../Data/SampleData.xml" message="pass"/>
-
-            <!-- expectedArray, actualArray that use created data -->
-            <assertArraySubset mergeKey="assert9" expectedArray="[$$createData2.lastname$$, $$createData2.firstname$$]" actualArray="[$$createData2.lastname$$, $$createData2.firstname$$, 1]" message="pass"/>
-            <assertArraySubset mergeKey="assert10" expectedArray="[$testScopeData2.firstname$, $testScopeData2.lastname$]" actualArray="[$testScopeData2.firstname$, $testScopeData2.lastname$, 1]" message="pass"/>
-            <assertArrayHasKey mergeKey="assert3" expected="lastname" actualArray="[['lastname' => $$createData1.lastname$$], ['firstname' => $$createData1.firstname$$]" message="pass"/>
-            <assertArrayHasKey mergeKey="assert4" expected="lastname" actualArray="[['lastname' => $testScopeData.lastname$], ['firstname' => $testScopeData.firstname$]" message="pass"/>
-
-            <!-- message that uses created data -->
-            <fail mergeKey="assert7" message="$testScopeData.firstname$ $testScopeData.lastname$"/>
-            <fail mergeKey="assert8" message="$$createData1.firstname$$ $$createData1.lastname$$"/>
         </test>
     </cest>
 </config>
-- 
GitLab


From 388f0fbe97592e7a744c0fa19ac309fcaf813e22 Mon Sep 17 00:00:00 2001
From: Ji Lu <jilu1@magento.com>
Date: Thu, 16 Nov 2017 22:37:04 +0200
Subject: [PATCH 200/380] MQE-235: added sample cest for Codeception Asserts
 (fixed sample url).

---
 .../FunctionalTest/SampleTests/Cest/AssertsCest.xml      | 9 +++++----
 1 file changed, 5 insertions(+), 4 deletions(-)

diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/AssertsCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/AssertsCest.xml
index 23fc0a9a836..e6b3f9b5631 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/AssertsCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/AssertsCest.xml
@@ -21,8 +21,9 @@
         </after>
         <test name="AssertTest">
             <createData entity="Simple_US_Customer" mergeKey="createData2"/>
-            <amOnUrl url="http://magento3.loc/index.php/simplesubcategory5a05d3129ab3d2.html" mergeKey="amOnPage"/>
-            <grabTextFrom returnVariable="text" selector=".copyright>span" mergeKey="grabTextFrom1"/>
+            <amOnUrl url="https://www.yahoo.com" mergeKey="amOnPage"/>
+            <waitForElementVisible mergeKey="wait1" selector="#uh-logo" time="10"/>
+            <grabTextFrom returnVariable="text" selector="#uh-logo" mergeKey="grabTextFrom1"/>
 
             <!-- asserts without variable replacement -->
             <comment mergeKey="c1" userInput="asserts without variable replacement"/>
@@ -32,8 +33,8 @@
             <assertContains mergeKey="assertContains" expected="ab" expectedType="string" actual="['item1' => 'a', 'item2' => 'ab']" message="pass"/>
             <assertCount mergeKey="assertCount" expected="2" expectedType="int" actual="['a', 'b']" message="pass"/>
             <assertEmpty mergeKey="assertEmpty" actual="[]" message="pass"/>
-            <assertEquals mergeKey="assertEquals1" expected="text" expectedType="variable" actual="Copyright © 2013-2017 Magento, Inc. All rights reserved." actualType="string" message="pass"/>
-            <assertEquals mergeKey="assertEquals2" expected="Copyright © 2013-2017 Magento, Inc. All rights reserved." expectedType="string" actual="text" actualType="variable" message="pass"/>
+            <assertEquals mergeKey="assertEquals1" expected="text" expectedType="variable" actual="Yahoo" actualType="string" message="pass"/>
+            <assertEquals mergeKey="assertEquals2" expected="Yahoo" expectedType="string" actual="text" actualType="variable" message="pass"/>
             <assertFalse mergeKey="assertFalse1" actual="0" actualType="bool" message="pass"/>
             <assertFileNotExists mergeKey="assertFileNotExists1" actual="/out.txt" actualType="string" message="pass"/>
             <assertFileNotExists mergeKey="assertFileNotExists2" actual="text" actualType="variable" message="pass"/>
-- 
GitLab


From 8aeb71b9c99b241ca1376f94e9adeb0338c0e7b1 Mon Sep 17 00:00:00 2001
From: David Manners <dmanners87@gmail.com>
Date: Mon, 27 Nov 2017 14:32:42 +0000
Subject: [PATCH 201/380] Update image label values on product entity on admin
 product save

---
 .../Model/Product/Gallery/CreateHandler.php   | 21 +++++++++++++++++++
 1 file changed, 21 insertions(+)

diff --git a/app/code/Magento/Catalog/Model/Product/Gallery/CreateHandler.php b/app/code/Magento/Catalog/Model/Product/Gallery/CreateHandler.php
index 03d418f3ba0..3be10de96ec 100644
--- a/app/code/Magento/Catalog/Model/Product/Gallery/CreateHandler.php
+++ b/app/code/Magento/Catalog/Model/Product/Gallery/CreateHandler.php
@@ -167,8 +167,11 @@ class CreateHandler implements ExtensionInterface
             if (empty($attrData) && empty($clearImages) && empty($newImages) && empty($existImages)) {
                 continue;
             }
+            $resetLabel = false;
             if (in_array($attrData, $clearImages)) {
                 $product->setData($mediaAttrCode, 'no_selection');
+                $product->setData($mediaAttrCode . '_label', null);
+                $resetLabel = true;
             }
 
             if (in_array($attrData, array_keys($newImages))) {
@@ -179,6 +182,11 @@ class CreateHandler implements ExtensionInterface
             if (in_array($attrData, array_keys($existImages)) && isset($existImages[$attrData]['label'])) {
                 $product->setData($mediaAttrCode . '_label', $existImages[$attrData]['label']);
             }
+
+            if ($attrData === 'no_selection' && !empty($product->getData($mediaAttrCode . '_label'))) {
+                $product->setData($mediaAttrCode . '_label', null);
+                $resetLabel = true;
+            }
             if (!empty($product->getData($mediaAttrCode))) {
                 $product->addAttributeUpdate(
                     $mediaAttrCode,
@@ -186,6 +194,19 @@ class CreateHandler implements ExtensionInterface
                     $product->getStoreId()
                 );
             }
+            if (
+                in_array($mediaAttrCode, ['image', 'small_image', 'thumbnail'])
+                && (
+                    !empty($product->getData($mediaAttrCode . '_label'))
+                    || $resetLabel === true
+                )
+            ) {
+                $product->addAttributeUpdate(
+                    $mediaAttrCode  . '_label',
+                    $product->getData($mediaAttrCode . '_label'),
+                    $product->getStoreId()
+                );
+            }
         }
 
         $product->setData($attrCode, $value);
-- 
GitLab


From 15113774593671c0c760d81140aa83969b9da143 Mon Sep 17 00:00:00 2001
From: David Manners <dmanners87@gmail.com>
Date: Mon, 27 Nov 2017 14:44:41 +0000
Subject: [PATCH 202/380] Fix code style for empty label check if statement

---
 .../Magento/Catalog/Model/Product/Gallery/CreateHandler.php  | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)

diff --git a/app/code/Magento/Catalog/Model/Product/Gallery/CreateHandler.php b/app/code/Magento/Catalog/Model/Product/Gallery/CreateHandler.php
index 3be10de96ec..22340801c0a 100644
--- a/app/code/Magento/Catalog/Model/Product/Gallery/CreateHandler.php
+++ b/app/code/Magento/Catalog/Model/Product/Gallery/CreateHandler.php
@@ -194,9 +194,8 @@ class CreateHandler implements ExtensionInterface
                     $product->getStoreId()
                 );
             }
-            if (
-                in_array($mediaAttrCode, ['image', 'small_image', 'thumbnail'])
-                && (
+            if (in_array($mediaAttrCode, ['image', 'small_image', 'thumbnail']) &&
+                (
                     !empty($product->getData($mediaAttrCode . '_label'))
                     || $resetLabel === true
                 )
-- 
GitLab


From 8aa3da1ec3cd5204e0857f43e46abef824d4d13d Mon Sep 17 00:00:00 2001
From: magento-engcom-team <mikola.malevanec@transoftgroup.com>
Date: Mon, 27 Nov 2017 18:14:39 +0200
Subject: [PATCH 203/380] 8255: Export Products action doesn't consider
 hide_for_product_page value.

---
 .../Model/Export/Product.php                  | 33 +++++--------------
 .../_files/product_simple_multistore.php      |  6 ++--
 2 files changed, 12 insertions(+), 27 deletions(-)

diff --git a/app/code/Magento/CatalogImportExport/Model/Export/Product.php b/app/code/Magento/CatalogImportExport/Model/Export/Product.php
index 4174fbefd90..45530ed6d7b 100644
--- a/app/code/Magento/CatalogImportExport/Model/Export/Product.php
+++ b/app/code/Magento/CatalogImportExport/Model/Export/Product.php
@@ -905,7 +905,7 @@ class Product extends \Magento\ImportExport\Model\Export\Entity\AbstractEntity
                         $dataRow = array_merge($dataRow, $stockItemRows[$productId]);
                     }
                     $this->appendMultirowData($dataRow, $multirawData);
-                    if ($dataRow && !$this->skipRow($dataRow)) {
+                    if ($dataRow) {
                         $exportData[] = $dataRow;
                     }
                 }
@@ -1169,14 +1169,17 @@ class Product extends \Magento\ImportExport\Model\Export\Entity\AbstractEntity
         $productLinkId = $dataRow['product_link_id'];
         $storeId = $dataRow['store_id'];
         $sku = $dataRow[self::COL_SKU];
+        $type = $dataRow[self::COL_TYPE];
+        $attributeSet = $dataRow[self::COL_ATTR_SET];
 
         unset($dataRow['product_id']);
         unset($dataRow['product_link_id']);
         unset($dataRow['store_id']);
         unset($dataRow[self::COL_SKU]);
-
+        unset($dataRow[self::COL_STORE]);
+        unset($dataRow[self::COL_ATTR_SET]);
+        unset($dataRow[self::COL_TYPE]);
         if (Store::DEFAULT_STORE_ID == $storeId) {
-            unset($dataRow[self::COL_STORE]);
             $this->updateDataWithCategoryColumns($dataRow, $multiRawData['rowCategories'], $productId);
             if (!empty($multiRawData['rowWebsites'][$productId])) {
                 $websiteCodes = [];
@@ -1274,6 +1277,9 @@ class Product extends \Magento\ImportExport\Model\Export\Entity\AbstractEntity
             $dataRow[self::COL_STORE] = $this->_storeIdToCode[$storeId];
         }
         $dataRow[self::COL_SKU] = $sku;
+        $dataRow[self::COL_ATTR_SET] = $attributeSet;
+        $dataRow[self::COL_TYPE] = $type;
+
         return $dataRow;
     }
 
@@ -1512,25 +1518,4 @@ class Product extends \Magento\ImportExport\Model\Export\Entity\AbstractEntity
         }
         return $this->productEntityLinkField;
     }
-
-    /**
-     * Check if row has valuable information to export.
-     *
-     * @param array $dataRow
-     * @return bool
-     */
-    private function skipRow(array $dataRow)
-    {
-        $baseInfo = [
-            self::COL_STORE,
-            self::COL_ATTR_SET,
-            self::COL_TYPE,
-            self::COL_SKU,
-            'store_id',
-            'product_id',
-            'product_link_id',
-        ];
-
-        return empty(array_diff(array_keys($dataRow), $baseInfo));
-    }
 }
diff --git a/dev/tests/integration/testsuite/Magento/Catalog/_files/product_simple_multistore.php b/dev/tests/integration/testsuite/Magento/Catalog/_files/product_simple_multistore.php
index 7829797c54e..4d4eb7fd8cd 100644
--- a/dev/tests/integration/testsuite/Magento/Catalog/_files/product_simple_multistore.php
+++ b/dev/tests/integration/testsuite/Magento/Catalog/_files/product_simple_multistore.php
@@ -19,7 +19,8 @@ $product->setTypeId(
     1
 )->setAttributeSetId(
     4
-)->setStoreId(
+)->setCustomAttribute(
+    'tax_class_id',
     1
 )->setWebsiteIds(
     [1]
@@ -42,8 +43,7 @@ $product->setTypeId(
 )->save();
 
 $product = $objectManager->create(\Magento\Catalog\Model\Product::class);
-$product->setStoreId(1)
-    ->load(1)
+$product->load(1)
     ->setStoreId($store->getId())
     ->setName('StoreTitle')
     ->save();
-- 
GitLab


From 03ac5b5b9f66dea7b50eccd4ee275579c50c5ebe Mon Sep 17 00:00:00 2001
From: Oscar Recio <osrecio@gmail.com>
Date: Sun, 5 Nov 2017 13:23:21 +0100
Subject: [PATCH 204/380] Generate new FormKey and replace for oldRequestParams

---
 .../Model/Plugin/CustomerFlushFormKey.php     | 53 +++++++++++++++++++
 app/code/Magento/Customer/etc/di.xml          |  3 ++
 2 files changed, 56 insertions(+)
 create mode 100644 app/code/Magento/Customer/Model/Plugin/CustomerFlushFormKey.php

diff --git a/app/code/Magento/Customer/Model/Plugin/CustomerFlushFormKey.php b/app/code/Magento/Customer/Model/Plugin/CustomerFlushFormKey.php
new file mode 100644
index 00000000000..b7b462b3cc3
--- /dev/null
+++ b/app/code/Magento/Customer/Model/Plugin/CustomerFlushFormKey.php
@@ -0,0 +1,53 @@
+<?php
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Customer\Model\Plugin;
+
+use Magento\Customer\Model\Session;
+use Magento\Framework\Data\Form\FormKey as DataFormKey;
+use Magento\PageCache\Observer\FlushFormKey;
+
+class CustomerFlushFormKey
+{
+    /**
+     * @var Session
+     */
+    private $session;
+
+    /**
+     * @var DataFormKey
+     */
+    private $dataFormKey;
+
+    /**
+     * Initialize dependencies.
+     *
+     * @param Session $session
+     * @param DataFormKey $dataFormKey
+     */
+    public function __construct(Session $session, DataFormKey $dataFormKey)
+    {
+        $this->session = $session;
+        $this->dataFormKey = $dataFormKey;
+    }
+
+    /**
+     * @SuppressWarnings(PHPMD.UnusedFormalParameter)
+     * @param FlushFormKey $subject
+     * @param callable $proceed
+     * @param $args
+     */
+    public function aroundExecute(FlushFormKey $subject, callable $proceed, ...$args)
+    {
+        $currentFormKey = $this->dataFormKey->getFormKey();
+        $proceed(...$args);
+        $beforeParams = $this->session->getBeforeRequestParams();
+        if ($beforeParams['form_key'] == $currentFormKey) {
+            $beforeParams['form_key'] = $this->dataFormKey->getFormKey();
+            $this->session->setBeforeRequestParams($beforeParams);
+        }
+    }
+}
diff --git a/app/code/Magento/Customer/etc/di.xml b/app/code/Magento/Customer/etc/di.xml
index 6eea4e1582a..40ef7301207 100644
--- a/app/code/Magento/Customer/etc/di.xml
+++ b/app/code/Magento/Customer/etc/di.xml
@@ -323,6 +323,9 @@
     <type name="Magento\Framework\App\Action\AbstractAction">
         <plugin name="customerNotification" type="Magento\Customer\Model\Plugin\CustomerNotification"/>
     </type>
+    <type name="Magento\PageCache\Observer\FlushFormKey">
+        <plugin name="customerFlushFormKey" type="Magento\Customer\Model\Plugin\CustomerFlushFormKey"/>
+    </type>
     <type name="Magento\Customer\Model\Customer\NotificationStorage">
         <arguments>
             <argument name="cache" xsi:type="object">Magento\Customer\Model\Cache\Type\Notification</argument>
-- 
GitLab


From 7edc2d46c69894d378bb35c7ced0d300f323a84c Mon Sep 17 00:00:00 2001
From: Oscar Recio <osrecio@gmail.com>
Date: Mon, 27 Nov 2017 22:12:45 +0100
Subject: [PATCH 205/380] Add Test CustomerFlushFormKey Plugin

---
 .../Model/Plugin/CustomerFlushFormKeyTest.php | 110 ++++++++++++++++++
 1 file changed, 110 insertions(+)
 create mode 100644 app/code/Magento/Customer/Test/Unit/Model/Plugin/CustomerFlushFormKeyTest.php

diff --git a/app/code/Magento/Customer/Test/Unit/Model/Plugin/CustomerFlushFormKeyTest.php b/app/code/Magento/Customer/Test/Unit/Model/Plugin/CustomerFlushFormKeyTest.php
new file mode 100644
index 00000000000..c06805e94ea
--- /dev/null
+++ b/app/code/Magento/Customer/Test/Unit/Model/Plugin/CustomerFlushFormKeyTest.php
@@ -0,0 +1,110 @@
+<?php
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Customer\Test\Unit\Model\Plugin;
+
+use Magento\Customer\Model\Plugin\CustomerFlushFormKey;
+use Magento\Customer\Model\Session;
+use Magento\Framework\App\PageCache\FormKey as CookieFormKey;
+use Magento\Framework\Data\Form\FormKey as DataFormKey;
+use Magento\PageCache\Observer\FlushFormKey;
+use PHPUnit\Framework\TestCase;
+use PHPUnit_Framework_MockObject_MockObject as MockObject;
+
+class CustomerFlushFormKeyTest extends TestCase
+{
+    const CLOSURE_VALUE = 'CLOSURE';
+
+    /**
+     * @var CookieFormKey | MockObject
+     */
+    private $cookieFormKey;
+
+    /**
+     * @var Session | MockObject
+     */
+    private $customerSession;
+
+    /**
+     * @var DataFormKey | MockObject
+     */
+    private $dataFormKey;
+
+    /**
+     * @var \Closure
+     */
+    private $closure;
+
+    protected function setUp()
+    {
+
+        /** @var CookieFormKey | MockObject */
+        $this->cookieFormKey = $this->getMockBuilder(CookieFormKey::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        /** @var DataFormKey | MockObject */
+        $this->dataFormKey = $this->getMockBuilder(DataFormKey::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        /** @var Session | MockObject */
+        $this->customerSession = $this->getMockBuilder(Session::class)
+            ->disableOriginalConstructor()
+            ->setMethods(['getBeforeRequestParams', 'setBeforeRequestParams'])
+            ->getMock();
+
+        $this->closure = function () {
+            return static::CLOSURE_VALUE;
+        };
+    }
+
+    /**
+     * @dataProvider aroundFlushFormKeyProvider
+     * @param $beforeFormKey
+     * @param $currentFormKey
+     * @param $getFormKeyTimes
+     * @param $setBeforeParamsTimes
+     */
+    public function testAroundFlushFormKey(
+        $beforeFormKey,
+        $currentFormKey,
+        $getFormKeyTimes,
+        $setBeforeParamsTimes
+    ) {
+        $observer = new FlushFormKey($this->cookieFormKey, $this->dataFormKey);
+        $plugin = new CustomerFlushFormKey($this->customerSession, $this->dataFormKey);
+
+        $beforeParams['form_key'] = $beforeFormKey;
+
+        $this->dataFormKey->expects($this->exactly($getFormKeyTimes))
+            ->method('getFormKey')
+            ->willReturn($currentFormKey);
+
+        $this->customerSession->expects($this->once())
+            ->method('getBeforeRequestParams')
+            ->willReturn($beforeParams);
+
+        $this->customerSession->expects($this->exactly($setBeforeParamsTimes))
+            ->method('setBeforeRequestParams')
+            ->with($beforeParams);
+
+        $plugin->aroundExecute($observer, $this->closure, $observer);
+    }
+
+    /**
+     * Data provider for testAroundFlushFormKey
+     *
+     * @return array
+     */
+    public function aroundFlushFormKeyProvider()
+    {
+        return [
+            ['form_key_value', 'form_key_value', 2, 1],
+            ['form_old_key_value', 'form_key_value', 1, 0],
+            [null, 'form_key_value', 1, 0]
+        ];
+    }
+}
-- 
GitLab


From 147f6380f77ce76d2616ae40bff278215ca8d27a Mon Sep 17 00:00:00 2001
From: RomanKis <romaikiss@gmail.com>
Date: Mon, 27 Nov 2017 15:07:37 +0200
Subject: [PATCH 206/380] 9742: Default welcome message returns after being
 deleted #9742

---
 .../Theme/Model/Design/Config/Storage.php     |  7 +++-
 .../Magento/Theme/Model/Design/ConfigTest.php | 40 +++++++++++++++++++
 .../Magento/Theme/_files/config_data.php      | 19 +++++++++
 .../Theme/_files/config_data_rollback.php     | 13 ++++++
 4 files changed, 77 insertions(+), 2 deletions(-)
 create mode 100644 dev/tests/integration/testsuite/Magento/Theme/Model/Design/ConfigTest.php
 create mode 100644 dev/tests/integration/testsuite/Magento/Theme/_files/config_data.php
 create mode 100644 dev/tests/integration/testsuite/Magento/Theme/_files/config_data_rollback.php

diff --git a/app/code/Magento/Theme/Model/Design/Config/Storage.php b/app/code/Magento/Theme/Model/Design/Config/Storage.php
index a73f70efa0a..c97114f963a 100644
--- a/app/code/Magento/Theme/Model/Design/Config/Storage.php
+++ b/app/code/Magento/Theme/Model/Design/Config/Storage.php
@@ -87,10 +87,13 @@ class Storage
                 $scopeId,
                 $fieldData->getFieldConfig()
             );
-            if ($value !== null) {
-                $fieldData->setValue($value);
+
+            if ($value === null) {
+                $value = '';
             }
+            $fieldData->setValue($value);
         }
+
         return $designConfig;
     }
 
diff --git a/dev/tests/integration/testsuite/Magento/Theme/Model/Design/ConfigTest.php b/dev/tests/integration/testsuite/Magento/Theme/Model/Design/ConfigTest.php
new file mode 100644
index 00000000000..0ff43a5fd41
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Theme/Model/Design/ConfigTest.php
@@ -0,0 +1,40 @@
+<?php
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Theme\Model\Design;
+
+/**
+ * Test for \Magento\Theme\Model\Design\Config\Storage.
+ */
+class ConfigTest extends \PHPUnit\Framework\TestCase
+{
+    /**
+     * @var \Magento\Theme\Model\Design\Config\Storage
+     */
+    private $storage;
+
+    protected function setUp()
+    {
+        $this->storage = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create(
+            \Magento\Theme\Model\Design\Config\Storage::class
+        );
+    }
+
+    /**
+     * Test design/header/welcome if it is saved in db as empty(null) it should be shown on backend as empty.
+     *
+     * @magentoDataFixture Magento/Theme/_files/config_data.php
+     */
+    public function testLoad()
+    {
+        $data = $this->storage->load('stores', 1);
+        foreach ($data->getExtensionAttributes()->getDesignConfigData() as $configData) {
+            if ($configData->getPath() == 'design/header/welcome') {
+                $this->assertSame('', $configData->getValue());
+            }
+        }
+    }
+}
diff --git a/dev/tests/integration/testsuite/Magento/Theme/_files/config_data.php b/dev/tests/integration/testsuite/Magento/Theme/_files/config_data.php
new file mode 100644
index 00000000000..b8cbebc1f67
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Theme/_files/config_data.php
@@ -0,0 +1,19 @@
+<?php
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+use Magento\Config\Model\Config\Factory;
+use Magento\TestFramework\Helper\Bootstrap;
+
+$objectManager = Bootstrap::getObjectManager();
+
+/** @var Factory $configFactory */
+$configFactory = $objectManager->create(Factory::class);
+/** @var \Magento\Config\Model\Config $config */
+$config = $configFactory->create();
+$config->setScope('stores');
+$config->setStore('default');
+$config->setDataByPath('design/header/welcome', null);
+$config->save();
diff --git a/dev/tests/integration/testsuite/Magento/Theme/_files/config_data_rollback.php b/dev/tests/integration/testsuite/Magento/Theme/_files/config_data_rollback.php
new file mode 100644
index 00000000000..ac02e98b493
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Theme/_files/config_data_rollback.php
@@ -0,0 +1,13 @@
+<?php
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+$objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
+/** @var \Magento\Framework\App\ResourceConnection $resource */
+$resource = $objectManager->get(\Magento\Framework\App\ResourceConnection::class);
+$connection = $resource->getConnection();
+$tableName = $resource->getTableName('core_config_data');
+
+$connection->query("DELETE FROM $tableName WHERE path = 'design/header/welcome';");
-- 
GitLab


From 399ebc7568c727c818b6d70a326dc37a7bb21148 Mon Sep 17 00:00:00 2001
From: Atish Goswami <atishgoswami@gmail.com>
Date: Tue, 28 Nov 2017 16:29:16 +0530
Subject: [PATCH 207/380] Product item xtags not needed when display mode for
 category is static block only

---
 .../Magento/Catalog/Block/Product/ListProduct.php  | 14 +++++++++++---
 1 file changed, 11 insertions(+), 3 deletions(-)

diff --git a/app/code/Magento/Catalog/Block/Product/ListProduct.php b/app/code/Magento/Catalog/Block/Product/ListProduct.php
index db592353da4..33488ee1c93 100644
--- a/app/code/Magento/Catalog/Block/Product/ListProduct.php
+++ b/app/code/Magento/Catalog/Block/Product/ListProduct.php
@@ -334,13 +334,21 @@ class ListProduct extends AbstractProduct implements IdentityInterface
     public function getIdentities()
     {
         $identities = [];
-        foreach ($this->_getProductCollection() as $item) {
-            $identities = array_merge($identities, $item->getIdentities());
-        }
+
         $category = $this->getLayer()->getCurrentCategory();
         if ($category) {
             $identities[] = Product::CACHE_PRODUCT_CATEGORY_TAG . '_' . $category->getId();
         }
+
+        //Check if category page shows only static block (No products)
+        if ($category->getData('display_mode') == Category::DM_PAGE) {
+            return $identities;
+        }
+
+        foreach ($this->_getProductCollection() as $item) {
+            $identities = array_merge($identities, $item->getIdentities());
+        }
+
         return $identities;
     }
 
-- 
GitLab


From bea9012786145fc7fd031c08aa9939e9fd172b67 Mon Sep 17 00:00:00 2001
From: Atish Goswami <atishgoswami@gmail.com>
Date: Tue, 28 Nov 2017 16:50:29 +0530
Subject: [PATCH 208/380] Addes fixes for xtags entities test case

---
 .../Magento/Catalog/Test/Unit/Block/Product/ListProductTest.php | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/app/code/Magento/Catalog/Test/Unit/Block/Product/ListProductTest.php b/app/code/Magento/Catalog/Test/Unit/Block/Product/ListProductTest.php
index b42357db890..fe07f69e804 100644
--- a/app/code/Magento/Catalog/Test/Unit/Block/Product/ListProductTest.php
+++ b/app/code/Magento/Catalog/Test/Unit/Block/Product/ListProductTest.php
@@ -192,7 +192,7 @@ class ListProductTest extends \PHPUnit\Framework\TestCase
             ->will($this->returnValue($this->toolbarMock));
 
         $this->assertEquals(
-            [$productTag, $categoryTag],
+            [$categoryTag, $productTag],
             $this->block->getIdentities()
         );
         $this->assertEquals(
-- 
GitLab


From 56802d3b79d8df232e3a3c303890db012943f4d2 Mon Sep 17 00:00:00 2001
From: Roman Chumak <chumakrom@gmail.com>
Date: Tue, 28 Nov 2017 14:42:31 +0200
Subject: [PATCH 209/380] Added namespace to product videos fotorama events

---
 .../web/js/fotorama-add-video-events.js       | 22 +++++++++----------
 1 file changed, 11 insertions(+), 11 deletions(-)

diff --git a/app/code/Magento/ProductVideo/view/frontend/web/js/fotorama-add-video-events.js b/app/code/Magento/ProductVideo/view/frontend/web/js/fotorama-add-video-events.js
index 1dfcc95a552..c0036b71ac8 100644
--- a/app/code/Magento/ProductVideo/view/frontend/web/js/fotorama-add-video-events.js
+++ b/app/code/Magento/ProductVideo/view/frontend/web/js/fotorama-add-video-events.js
@@ -175,10 +175,10 @@ define([
          */
         clearEvents: function () {
             this.fotoramaItem.off(
-                'fotorama:show ' +
-                'fotorama:showend ' +
-                'fotorama:fullscreenenter ' +
-                'fotorama:fullscreenexit'
+                'fotorama:show.' + this.PV +
+                ' fotorama:showend.' + this.PV +
+                ' fotorama:fullscreenenter.' + this.PV +
+                ' fotorama:fullscreenexit.' + this.PV
             );
         },
 
@@ -232,11 +232,11 @@ define([
          * @private
          */
         _listenForFullscreen: function () {
-            this.fotoramaItem.on('fotorama:fullscreenenter', $.proxy(function () {
+            this.fotoramaItem.on('fotorama:fullscreenenter.' + this.PV, $.proxy(function () {
                 this.isFullscreen = true;
             }, this));
 
-            this.fotoramaItem.on('fotorama:fullscreenexit', $.proxy(function () {
+            this.fotoramaItem.on('fotorama:fullscreenexit.' + this.PV, $.proxy(function () {
                 this.isFullscreen = false;
                 this._hideVideoArrows();
             }, this));
@@ -468,7 +468,7 @@ define([
                 t;
 
             if (!fotorama.activeFrame.$navThumbFrame) {
-                this.fotoramaItem.on('fotorama:showend', $.proxy(function (evt, fotoramaData) {
+                this.fotoramaItem.on('fotorama:showend.' + this.PV, $.proxy(function (evt, fotoramaData) {
                     $(fotoramaData.activeFrame.$stageFrame).removeAttr('href');
                 }, this));
 
@@ -486,7 +486,7 @@ define([
                 this._checkForVideo(e, fotorama, t + 1);
             }
 
-            this.fotoramaItem.on('fotorama:showend', $.proxy(function (evt, fotoramaData) {
+            this.fotoramaItem.on('fotorama:showend.' + this.PV, $.proxy(function (evt, fotoramaData) {
                 $(fotoramaData.activeFrame.$stageFrame).removeAttr('href');
             }, this));
         },
@@ -528,15 +528,15 @@ define([
          * @private
          */
         _attachFotoramaEvents: function () {
-            this.fotoramaItem.on('fotorama:showend', $.proxy(function (e, fotorama) {
+            this.fotoramaItem.on('fotorama:showend.' + this.PV, $.proxy(function (e, fotorama) {
                 this._startPrepareForPlayer(e, fotorama);
             }, this));
 
-            this.fotoramaItem.on('fotorama:show', $.proxy(function (e, fotorama) {
+            this.fotoramaItem.on('fotorama:show.' + this.PV, $.proxy(function (e, fotorama) {
                 this._unloadVideoPlayer(fotorama.activeFrame.$stageFrame.parent(), fotorama, true);
             }, this));
 
-            this.fotoramaItem.on('fotorama:fullscreenexit', $.proxy(function (e, fotorama) {
+            this.fotoramaItem.on('fotorama:fullscreenexit.' + this.PV, $.proxy(function (e, fotorama) {
                 fotorama.activeFrame.$stageFrame.find('.' + this.PV).remove();
                 this._startPrepareForPlayer(e, fotorama);
             }, this));
-- 
GitLab


From cbbcc1ed356d0fa8aa193d912614352fc9e91aac Mon Sep 17 00:00:00 2001
From: magento-engcom-team <mikola.malevanec@transoftgroup.com>
Date: Tue, 28 Nov 2017 15:30:53 +0200
Subject: [PATCH 210/380] 11882: It's not possible to enable "log to file"
 (debugging) in production mode. Psr logger debug method does not work by the
 default in developer mode.

---
 .../Backend/Test/Block/System/Config/Form.php | 50 +++++++++++++++----
 .../AssertDeveloperSectionVisibility.php      | 43 +++++++++++++---
 2 files changed, 75 insertions(+), 18 deletions(-)

diff --git a/dev/tests/functional/tests/app/Magento/Backend/Test/Block/System/Config/Form.php b/dev/tests/functional/tests/app/Magento/Backend/Test/Block/System/Config/Form.php
index 61a39a441c9..31fadc2cf4f 100644
--- a/dev/tests/functional/tests/app/Magento/Backend/Test/Block/System/Config/Form.php
+++ b/dev/tests/functional/tests/app/Magento/Backend/Test/Block/System/Config/Form.php
@@ -60,17 +60,7 @@ class Form extends Block
      */
     public function getGroup($tabName, $groupName)
     {
-        $this->baseUrl = $this->getBrowserUrl();
-        if (substr($this->baseUrl, -1) !== '/') {
-            $this->baseUrl = $this->baseUrl . '/';
-        }
-
-        $tabUrl = $this->getTabUrl($tabName);
-
-        if ($this->getBrowserUrl() !== $tabUrl) {
-            $this->browser->open($tabUrl);
-        }
-        $this->waitForElementNotVisible($this->tabReadiness);
+        $this->openTab($tabName);
 
         $groupElement = $this->_rootElement->find(
             sprintf($this->groupBlock, $tabName, $groupName),
@@ -95,6 +85,24 @@ class Form extends Block
         return $blockFactory->getMagentoBackendSystemConfigFormGroup($groupElement);
     }
 
+    /**
+     * Check whether specified group presented on page.
+     *
+     * @param string $tabName
+     * @param string $groupName
+     *
+     * @return bool
+     */
+    public function isGroupVisible(string $tabName, string $groupName)
+    {
+        $this->openTab($tabName);
+
+        return $this->_rootElement->find(
+            sprintf($this->groupBlockLink, $tabName, $groupName),
+            Locator::SELECTOR_CSS
+        )->isVisible();
+    }
+
     /**
      * Retrieve url associated with the form.
      */
@@ -137,4 +145,24 @@ class Form extends Block
 
         return $tabUrl;
     }
+
+    /**
+     * Open specified tab.
+     *
+     * @param string $tabName
+     * @return void
+     */
+    private function openTab(string $tabName)
+    {
+        $this->baseUrl = $this->getBrowserUrl();
+        if (substr($this->baseUrl, -1) !== '/') {
+            $this->baseUrl = $this->baseUrl . '/';
+        }
+        $tabUrl = $this->getTabUrl($tabName);
+
+        if ($this->getBrowserUrl() !== $tabUrl) {
+            $this->browser->open($tabUrl);
+        }
+        $this->waitForElementNotVisible($this->tabReadiness);
+    }
 }
diff --git a/dev/tests/functional/tests/app/Magento/Backend/Test/Constraint/AssertDeveloperSectionVisibility.php b/dev/tests/functional/tests/app/Magento/Backend/Test/Constraint/AssertDeveloperSectionVisibility.php
index 1e73bb4867e..5e2982c1ce3 100644
--- a/dev/tests/functional/tests/app/Magento/Backend/Test/Constraint/AssertDeveloperSectionVisibility.php
+++ b/dev/tests/functional/tests/app/Magento/Backend/Test/Constraint/AssertDeveloperSectionVisibility.php
@@ -9,12 +9,29 @@ use Magento\Mtf\Constraint\AbstractConstraint;
 use Magento\Backend\Test\Page\Adminhtml\SystemConfigEdit;
 
 /**
- * Assert that Developer section is not present in production mode.
+ * Assert that all groups in Developer section is not present in production mode except debug group "Log to File" field.
  */
 class AssertDeveloperSectionVisibility extends AbstractConstraint
 {
     /**
-     * Assert Developer section is not present in production mode.
+     * List of groups not visible in production mode.
+     *
+     * @var array
+     */
+    private $groups = [
+        'front_end_development_workflow',
+        'restrict',
+        'template',
+        'translate_inline',
+        'js',
+        'css',
+        'image',
+        'static',
+        'grid',
+    ];
+
+    /**
+     * Assert all groups in Developer section is not present in production mode except debug group "Log to File" field.
      *
      * @param SystemConfigEdit $configEdit
      * @return void
@@ -22,14 +39,26 @@ class AssertDeveloperSectionVisibility extends AbstractConstraint
     public function processAssert(SystemConfigEdit $configEdit)
     {
         if ($_ENV['mage_mode'] === 'production') {
-            \PHPUnit_Framework_Assert::assertFalse(
-                in_array('Developer', $configEdit->getTabs()->getSubTabsNames('Advanced')),
-                'Developer section should be hidden in production mode.'
+            foreach ($this->groups as $group) {
+                \PHPUnit_Framework_Assert::assertFalse(
+                    $configEdit->getForm()->isGroupVisible('dev', $group),
+                    sprintf('%s group should be hidden in production mode.', $group)
+                );
+            }
+            \PHPUnit_Framework_Assert::assertTrue(
+                $configEdit->getForm()->getGroup('dev', 'debug')->isFieldVisible('dev', 'debug_debug', 'logging'),
+                '"Log to File" should be presented in production mode.'
             );
         } else {
+            foreach ($this->groups as $group) {
+                \PHPUnit_Framework_Assert::assertTrue(
+                    $configEdit->getForm()->isGroupVisible('dev', $group),
+                    sprintf('%s group should be visible in developer mode.', $group)
+                );
+            }
             \PHPUnit_Framework_Assert::assertTrue(
-                in_array('Developer', $configEdit->getTabs()->getSubTabsNames('Advanced')),
-                'Developer section should be not hidden in developer or default mode.'
+                $configEdit->getForm()->isGroupVisible('dev', 'debug'),
+                'Debug group should be visible in developer mode.'
             );
         }
     }
-- 
GitLab


From a22d2233be0773e0297bd49e97db05068161d964 Mon Sep 17 00:00:00 2001
From: magento-engcom-team <mikola.malevanec@transoftgroup.com>
Date: Tue, 28 Nov 2017 16:07:25 +0200
Subject: [PATCH 211/380] 8255: Export Products action doesn't consider
 hide_for_product_page value.

---
 .../Model/Import/Product/MediaGalleryProcessor.php              | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/app/code/Magento/CatalogImportExport/Model/Import/Product/MediaGalleryProcessor.php b/app/code/Magento/CatalogImportExport/Model/Import/Product/MediaGalleryProcessor.php
index 045f0942021..d45881b88c6 100644
--- a/app/code/Magento/CatalogImportExport/Model/Import/Product/MediaGalleryProcessor.php
+++ b/app/code/Magento/CatalogImportExport/Model/Import/Product/MediaGalleryProcessor.php
@@ -110,7 +110,7 @@ class MediaGalleryProcessor
     {
         $this->initMediaGalleryResources();
         $mediaGalleryData = $this->restoreDisabledImage($mediaGalleryData);
-        $mediaGalleryDataGlobal = array_merge(...$mediaGalleryData);
+        $mediaGalleryDataGlobal = array_replace_recursive(...$mediaGalleryData);
         $imageNames = [];
         $multiInsertData = [];
         $valueToProductId = [];
-- 
GitLab


From 907552be9e6f0359110c235c523a9910ae8d764b Mon Sep 17 00:00:00 2001
From: rossbrandon <rbrandon@magento.com>
Date: Tue, 28 Nov 2017 10:58:29 -0600
Subject: [PATCH 212/380] MAGETWO-84650: Missing periods in Release
 Notification modal

---
 .../Magento/ReleaseNotification/i18n/en_US.csv   | 16 ++++++++--------
 .../ui_component/release_notification.xml        |  8 ++++----
 2 files changed, 12 insertions(+), 12 deletions(-)

diff --git a/app/code/Magento/ReleaseNotification/i18n/en_US.csv b/app/code/Magento/ReleaseNotification/i18n/en_US.csv
index 0f4a1f87b8b..4a3cd02782b 100644
--- a/app/code/Magento/ReleaseNotification/i18n/en_US.csv
+++ b/app/code/Magento/ReleaseNotification/i18n/en_US.csv
@@ -15,7 +15,7 @@
     payment and shipping information to skip tedious checkout steps.</p>
     </div>
     <div class=""email-marketing-highlight"">
-    <h3>Email Marketing Automation</span></h3>
+    <h3>Email Marketing Automation</h3>
     <p>Send smarter, faster email campaigns with marketing automation from dotmailer, powered by
     your Magento store's live data.</p>
     </div>
@@ -34,7 +34,7 @@
     payment and shipping information to skip tedious checkout steps.</p>
     </div>
     <div class=""email-marketing-highlight"">
-    <h3>Email Marketing Automation</span></h3>
+    <h3>Email Marketing Automation</h3>
     <p>Send smarter, faster email campaigns with marketing automation from dotmailer, powered by
     your Magento store's live data.</p>
     </div>
@@ -65,26 +65,26 @@
     features include:
     </p>
     <ul>
-    <li><span>Configurable “Instant Purchase” button to place orders</span></li>
+    <li><span>Configurable “Instant Purchase” button to place orders.</span></li>
     <li><span>Support for all payment solutions using Braintree Vault, including Braintree Credit
     Card, Braintree PayPal, and PayPal Payflow Pro.</span></li>
     <li><span>Shipping to the customer’s default address using the lowest cost, available shipping
-    method</span></li>
+    method.</span></li>
     <li><span>Ability for developers to customize the Instant Purchase business logic to meet
-    merchant needs</span></li>
+    merchant needs.</span></li>
     </ul>","<p>Now you can deliver an Amazon-like experience with a new, streamlined checkout option.
     Logged-in customers can use previously-stored payment credentials and shipping information
     to skip steps, making the process faster and easier, especially for mobile shoppers. Key
     features include:
     </p>
     <ul>
-    <li><span>Configurable “Instant Purchase” button to place orders</span></li>
+    <li><span>Configurable “Instant Purchase” button to place orders.</span></li>
     <li><span>Support for all payment solutions using Braintree Vault, including Braintree Credit
     Card, Braintree PayPal, and PayPal Payflow Pro.</span></li>
     <li><span>Shipping to the customer’s default address using the lowest cost, available shipping
-    method</span></li>
+    method.</span></li>
     <li><span>Ability for developers to customize the Instant Purchase business logic to meet
-    merchant needs</span></li>
+    merchant needs.</span></li>
     </ul>"
 "Email Marketing Automation","Email Marketing Automation"
 "<p>Unlock an unparalleled level of insight and control of your eCommerce marketing with
diff --git a/app/code/Magento/ReleaseNotification/view/adminhtml/ui_component/release_notification.xml b/app/code/Magento/ReleaseNotification/view/adminhtml/ui_component/release_notification.xml
index 1ddfde5cafb..0364750d56a 100644
--- a/app/code/Magento/ReleaseNotification/view/adminhtml/ui_component/release_notification.xml
+++ b/app/code/Magento/ReleaseNotification/view/adminhtml/ui_component/release_notification.xml
@@ -73,7 +73,7 @@
                         payment and shipping information to skip tedious checkout steps.</p>
                         </div>
                         <div class="email-marketing-highlight">
-                        <h3>Email Marketing Automation</span></h3>
+                        <h3>Email Marketing Automation</h3>
                         <p>Send smarter, faster email campaigns with marketing automation from dotmailer, powered by
                         your Magento store's live data.</p>
                         </div>
@@ -226,13 +226,13 @@
                         features include:
                         </p>
                         <ul>
-                        <li><span>Configurable “Instant Purchase” button to place orders</span></li>
+                        <li><span>Configurable “Instant Purchase” button to place orders.</span></li>
                         <li><span>Support for all payment solutions using Braintree Vault, including Braintree Credit
                         Card, Braintree PayPal, and PayPal Payflow Pro.</span></li>
                         <li><span>Shipping to the customer’s default address using the lowest cost, available shipping
-                        method</span></li>
+                        method.</span></li>
                         <li><span>Ability for developers to customize the Instant Purchase business logic to meet
-                        merchant needs</span></li>
+                        merchant needs.</span></li>
                         </ul>]]>
                         </item>
                     </item>
-- 
GitLab


From 5206728775e3bdee11511acc4ccd1492e1e8b882 Mon Sep 17 00:00:00 2001
From: Oleksii Korshenko <okorshenko@magento.com>
Date: Tue, 28 Nov 2017 13:35:51 -0600
Subject: [PATCH 213/380] =?UTF-8?q?MAGETWO-82949:=20do=20the=20stock=20che?=
 =?UTF-8?q?ck=20on=20default=20level=20because=20the=20stock=20on=20websit?=
 =?UTF-8?q?e=20leve=E2=80=A6=20#11485?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

 - fixed unit tests
---
 .../Product/StockStatusBaseSelectProcessorTest.php        | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/app/code/Magento/CatalogInventory/Test/Unit/Model/ResourceModel/Product/StockStatusBaseSelectProcessorTest.php b/app/code/Magento/CatalogInventory/Test/Unit/Model/ResourceModel/Product/StockStatusBaseSelectProcessorTest.php
index 9a46dc99ee0..0598fe7e9fe 100644
--- a/app/code/Magento/CatalogInventory/Test/Unit/Model/ResourceModel/Product/StockStatusBaseSelectProcessorTest.php
+++ b/app/code/Magento/CatalogInventory/Test/Unit/Model/ResourceModel/Product/StockStatusBaseSelectProcessorTest.php
@@ -56,9 +56,13 @@ class StockStatusBaseSelectProcessorTest extends \PHPUnit\Framework\TestCase
                 []
             )
             ->willReturnSelf();
-        $this->select->expects($this->once())
+
+        $this->select->expects($this->exactly(2))
             ->method('where')
-            ->with('stock.stock_status = ?', Stock::STOCK_IN_STOCK)
+            ->withConsecutive(
+                ['stock.stock_status = ?', Stock::STOCK_IN_STOCK, null],
+                ['stock.website_id = ?', 0, null]
+            )
             ->willReturnSelf();
 
         $this->stockStatusBaseSelectProcessor->process($this->select);
-- 
GitLab


From 97735bbca7cbe4224dce5fe91fecf6757a14e60e Mon Sep 17 00:00:00 2001
From: "Kristof Ringleff, Fooman" <kristof@fooman.co.nz>
Date: Wed, 29 Nov 2017 13:07:42 +1300
Subject: [PATCH 214/380] Skipping stock deploy, adding new command.

---
 .../Console/Command/DeployMarker.php          | 59 +++++++++++++++++++
 .../Model/Cron/ReportNewRelicCron.php         |  1 -
 .../Model/ServiceShellUser.php                | 22 +++++++
 .../Model/Cron/ReportNewRelicCronTest.php     | 28 ---------
 app/code/Magento/NewRelicReporting/etc/di.xml |  8 +++
 5 files changed, 89 insertions(+), 29 deletions(-)
 create mode 100644 app/code/Magento/NewRelicReporting/Console/Command/DeployMarker.php
 create mode 100644 app/code/Magento/NewRelicReporting/Model/ServiceShellUser.php

diff --git a/app/code/Magento/NewRelicReporting/Console/Command/DeployMarker.php b/app/code/Magento/NewRelicReporting/Console/Command/DeployMarker.php
new file mode 100644
index 00000000000..272b7592cbd
--- /dev/null
+++ b/app/code/Magento/NewRelicReporting/Console/Command/DeployMarker.php
@@ -0,0 +1,59 @@
+<?php
+
+namespace Magento\NewRelicReporting\Console\Command;
+
+use Symfony\Component\Console\Command\Command;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Output\OutputInterface;
+use Symfony\Component\Console\Input\InputArgument;
+
+use Magento\NewRelicReporting\Model\Apm\DeploymentsFactory;
+use Magento\NewRelicReporting\Model\ServiceShellUser;
+
+class DeployMarker extends Command
+{
+    protected $deploymentsFactory;
+    protected $serviceShellUser;
+
+    public function __construct(
+        DeploymentsFactory $deploymentsFactory,
+        ServiceShellUser $serviceShellUser,
+        $name = null
+    ) {
+        $this->deploymentsFactory = $deploymentsFactory;
+        $this->serviceShellUser = $serviceShellUser;
+        parent::__construct($name);
+    }
+
+    protected function configure()
+    {
+        $this->setName("newrelic:create:deploy-marker");
+        $this->setDescription("Check the deploy queue for entries and create an appropriate deploy marker.")
+             ->addArgument(
+                 'message',
+                 InputArgument::REQUIRED,
+                 'Deploy Message?'
+             )
+             ->addArgument(
+                 'changelog',
+                 InputArgument::REQUIRED,
+                 'Change Log?'
+             )
+             ->addArgument(
+                 'user',
+                 InputArgument::OPTIONAL,
+                 'Deployment User'
+             );
+        parent::configure();
+    }
+
+    protected function execute(InputInterface $input, OutputInterface $output)
+    {
+        $this->deploymentsFactory->create()->setDeployment(
+            $input->getArgument('message'),
+            $input->getArgument('changelog'),
+            $this->serviceShellUser->get($input->getArgument('user'))
+        );
+        $output->writeln('<info>NewRelic deployment information sent</info>');
+    }
+}
diff --git a/app/code/Magento/NewRelicReporting/Model/Cron/ReportNewRelicCron.php b/app/code/Magento/NewRelicReporting/Model/Cron/ReportNewRelicCron.php
index a4a7d30b44f..6b2bd50dc45 100644
--- a/app/code/Magento/NewRelicReporting/Model/Cron/ReportNewRelicCron.php
+++ b/app/code/Magento/NewRelicReporting/Model/Cron/ReportNewRelicCron.php
@@ -175,7 +175,6 @@ class ReportNewRelicCron
     public function report()
     {
         if ($this->config->isNewRelicEnabled()) {
-            $this->reportModules();
             $this->reportCounts();
         }
 
diff --git a/app/code/Magento/NewRelicReporting/Model/ServiceShellUser.php b/app/code/Magento/NewRelicReporting/Model/ServiceShellUser.php
new file mode 100644
index 00000000000..8262428d9bf
--- /dev/null
+++ b/app/code/Magento/NewRelicReporting/Model/ServiceShellUser.php
@@ -0,0 +1,22 @@
+<?php
+
+namespace Magento\NewRelicReporting\Model;
+
+class ServiceShellUser
+{
+    const DEFAULT_USER = 'cron';
+
+    public function get($userFromArgument = false)
+    {
+        if ($userFromArgument) {
+            return $userFromArgument;
+        }
+
+        $user = `echo \$USER`;
+        if ($user) {
+            return $user;
+        }
+
+        return self::DEFAULT_USER;
+    }
+}
diff --git a/app/code/Magento/NewRelicReporting/Test/Unit/Model/Cron/ReportNewRelicCronTest.php b/app/code/Magento/NewRelicReporting/Test/Unit/Model/Cron/ReportNewRelicCronTest.php
index 70fdcd0b619..400bcefa982 100644
--- a/app/code/Magento/NewRelicReporting/Test/Unit/Model/Cron/ReportNewRelicCronTest.php
+++ b/app/code/Magento/NewRelicReporting/Test/Unit/Model/Cron/ReportNewRelicCronTest.php
@@ -144,24 +144,10 @@ class ReportNewRelicCronTest extends \PHPUnit\Framework\TestCase
      */
     public function testReportNewRelicCron()
     {
-        $testModuleData = [
-            'changes' => [
-                ['name' => 'name', 'setup_version' => '2.0.0', 'type' => 'enabled'],
-                ['name' => 'name', 'setup_version' => '2.0.0', 'type' => 'disabled'],
-                ['name' => 'name', 'setup_version' => '2.0.0', 'type' => 'installed'],
-                ['name' => 'name', 'setup_version' => '2.0.0', 'type' => 'uninstalled'],
-            ],
-            'enabled' => 1,
-            'disabled' => 1,
-            'installed' => 1,
-        ];
 
         $this->config->expects($this->once())
             ->method('isNewRelicEnabled')
             ->willReturn(true);
-        $this->collect->expects($this->once())
-            ->method('getModuleData')
-            ->willReturn($testModuleData);
         $this->counter->expects($this->once())
             ->method('getAllProductsCount');
         $this->counter->expects($this->once())
@@ -198,24 +184,10 @@ class ReportNewRelicCronTest extends \PHPUnit\Framework\TestCase
      */
     public function testReportNewRelicCronRequestFailed()
     {
-        $testModuleData = [
-            'changes' => [
-                ['name' => 'name', 'setup_version' => '2.0.0', 'type' => 'enabled'],
-                ['name' => 'name', 'setup_version' => '2.0.0', 'type' => 'disabled'],
-                ['name' => 'name', 'setup_version' => '2.0.0', 'type' => 'installed'],
-                ['name' => 'name', 'setup_version' => '2.0.0', 'type' => 'uninstalled'],
-            ],
-            'enabled' => 1,
-            'disabled' => 1,
-            'installed' => 1,
-        ];
 
         $this->config->expects($this->once())
             ->method('isNewRelicEnabled')
             ->willReturn(true);
-        $this->collect->expects($this->once())
-            ->method('getModuleData')
-            ->willReturn($testModuleData);
         $this->counter->expects($this->once())
             ->method('getAllProductsCount');
         $this->counter->expects($this->once())
diff --git a/app/code/Magento/NewRelicReporting/etc/di.xml b/app/code/Magento/NewRelicReporting/etc/di.xml
index cba92f91cd4..9cfe909571a 100644
--- a/app/code/Magento/NewRelicReporting/etc/di.xml
+++ b/app/code/Magento/NewRelicReporting/etc/di.xml
@@ -30,4 +30,12 @@
     <type name="Magento\Framework\App\Http">
         <plugin name="framework-http-newrelic" type="Magento\NewRelicReporting\Plugin\HttpPlugin"/>
     </type>
+    <type name="Magento\Framework\Console\CommandList">
+        <arguments>
+            <argument name="commands" xsi:type="array">
+                <item name="magento_new_relic_reporting_command_deploy_marker"
+                      xsi:type="object">Magento\NewRelicReporting\Console\Command\DeployMarker</item>
+            </argument>
+        </arguments>
+    </type>
 </config>
-- 
GitLab


From 3e8619710a566877da8e023ab5c7ad2579426bd8 Mon Sep 17 00:00:00 2001
From: magento-engcom-team <mikola.malevanec@transoftgroup.com>
Date: Wed, 29 Nov 2017 11:10:48 +0200
Subject: [PATCH 215/380] 11882: It's not possible to enable "log to file"
 (debugging) in production mode. Psr logger debug method does not work by the
 default in developer mode.

---
 .../Backend/Test/Constraint/AssertDeveloperSectionVisibility.php | 1 +
 1 file changed, 1 insertion(+)

diff --git a/dev/tests/functional/tests/app/Magento/Backend/Test/Constraint/AssertDeveloperSectionVisibility.php b/dev/tests/functional/tests/app/Magento/Backend/Test/Constraint/AssertDeveloperSectionVisibility.php
index 5e2982c1ce3..e443ef5a205 100644
--- a/dev/tests/functional/tests/app/Magento/Backend/Test/Constraint/AssertDeveloperSectionVisibility.php
+++ b/dev/tests/functional/tests/app/Magento/Backend/Test/Constraint/AssertDeveloperSectionVisibility.php
@@ -38,6 +38,7 @@ class AssertDeveloperSectionVisibility extends AbstractConstraint
      */
     public function processAssert(SystemConfigEdit $configEdit)
     {
+        $configEdit->open();
         if ($_ENV['mage_mode'] === 'production') {
             foreach ($this->groups as $group) {
                 \PHPUnit_Framework_Assert::assertFalse(
-- 
GitLab


From bab1a384116544e3ef346dd377a791d6c51f84f4 Mon Sep 17 00:00:00 2001
From: David Manners <dmanners87@gmail.com>
Date: Wed, 29 Nov 2017 10:09:12 +0000
Subject: [PATCH 216/380] Extract image and lavel processing for media
 attributes into their own method

---
 .../Model/Product/Gallery/CreateHandler.php   | 110 +++++++++++-------
 1 file changed, 71 insertions(+), 39 deletions(-)

diff --git a/app/code/Magento/Catalog/Model/Product/Gallery/CreateHandler.php b/app/code/Magento/Catalog/Model/Product/Gallery/CreateHandler.php
index 22340801c0a..528ebd66321 100644
--- a/app/code/Magento/Catalog/Model/Product/Gallery/CreateHandler.php
+++ b/app/code/Magento/Catalog/Model/Product/Gallery/CreateHandler.php
@@ -167,45 +167,13 @@ class CreateHandler implements ExtensionInterface
             if (empty($attrData) && empty($clearImages) && empty($newImages) && empty($existImages)) {
                 continue;
             }
-            $resetLabel = false;
-            if (in_array($attrData, $clearImages)) {
-                $product->setData($mediaAttrCode, 'no_selection');
-                $product->setData($mediaAttrCode . '_label', null);
-                $resetLabel = true;
-            }
-
-            if (in_array($attrData, array_keys($newImages))) {
-                $product->setData($mediaAttrCode, $newImages[$attrData]['new_file']);
-                $product->setData($mediaAttrCode . '_label', $newImages[$attrData]['label']);
-            }
-
-            if (in_array($attrData, array_keys($existImages)) && isset($existImages[$attrData]['label'])) {
-                $product->setData($mediaAttrCode . '_label', $existImages[$attrData]['label']);
-            }
-
-            if ($attrData === 'no_selection' && !empty($product->getData($mediaAttrCode . '_label'))) {
-                $product->setData($mediaAttrCode . '_label', null);
-                $resetLabel = true;
-            }
-            if (!empty($product->getData($mediaAttrCode))) {
-                $product->addAttributeUpdate(
-                    $mediaAttrCode,
-                    $product->getData($mediaAttrCode),
-                    $product->getStoreId()
-                );
-            }
-            if (in_array($mediaAttrCode, ['image', 'small_image', 'thumbnail']) &&
-                (
-                    !empty($product->getData($mediaAttrCode . '_label'))
-                    || $resetLabel === true
-                )
-            ) {
-                $product->addAttributeUpdate(
-                    $mediaAttrCode  . '_label',
-                    $product->getData($mediaAttrCode . '_label'),
-                    $product->getStoreId()
-                );
-            }
+            $this->processMediaAttribute(
+                $product,
+                $mediaAttrCode,
+                $clearImages,
+                $newImages,
+                $existImages
+            );
         }
 
         $product->setData($attrCode, $value);
@@ -468,4 +436,68 @@ class CreateHandler implements ExtensionInterface
         }
         return $this->mediaAttributeCodes;
     }
+
+    /**
+     * @param \Magento\Catalog\Model\Product $product
+     * @param $attrData
+     * @param array $clearImages
+     * @param $mediaAttrCode
+     * @param array $newImages
+     * @param array $existImages
+     */
+    /**
+     * @param \Magento\Catalog\Model\Product $product
+     * @param $mediaAttrCode
+     * @param array $clearImages
+     * @param array $newImages
+     * @param array $existImages
+     */
+    private function processMediaAttribute(
+        \Magento\Catalog\Model\Product $product,
+        $mediaAttrCode,
+        array $clearImages,
+        array $newImages,
+        array $existImages
+    ) {
+        $resetLabel = false;
+        $attrData = $product->getData($mediaAttrCode);
+        if (in_array($attrData, $clearImages)) {
+            $product->setData($mediaAttrCode, 'no_selection');
+            $product->setData($mediaAttrCode . '_label', null);
+            $resetLabel = true;
+        }
+
+        if (in_array($attrData, array_keys($newImages))) {
+            $product->setData($mediaAttrCode, $newImages[$attrData]['new_file']);
+            $product->setData($mediaAttrCode . '_label', $newImages[$attrData]['label']);
+        }
+
+        if (in_array($attrData, array_keys($existImages)) && isset($existImages[$attrData]['label'])) {
+            $product->setData($mediaAttrCode . '_label', $existImages[$attrData]['label']);
+        }
+
+        if ($attrData === 'no_selection' && !empty($product->getData($mediaAttrCode . '_label'))) {
+            $product->setData($mediaAttrCode . '_label', null);
+            $resetLabel = true;
+        }
+        if (in_array($mediaAttrCode, ['image', 'small_image', 'thumbnail']) &&
+            (
+                !empty($product->getData($mediaAttrCode . '_label'))
+                || $resetLabel === true
+            )
+        ) {
+            $product->addAttributeUpdate(
+                $mediaAttrCode . '_label',
+                $product->getData($mediaAttrCode . '_label'),
+                $product->getStoreId()
+            );
+        }
+        if (!empty($product->getData($mediaAttrCode))) {
+            $product->addAttributeUpdate(
+                $mediaAttrCode,
+                $product->getData($mediaAttrCode),
+                $product->getStoreId()
+            );
+        }
+    }
 }
-- 
GitLab


From d6fa9dbdfc1c54802df495aed1ec085813198470 Mon Sep 17 00:00:00 2001
From: David Manners <dmanners87@gmail.com>
Date: Wed, 29 Nov 2017 11:27:48 +0000
Subject: [PATCH 217/380] Solve some complexity issues with the save handler

---
 .../Model/Product/Gallery/CreateHandler.php   | 56 ++++++++++++-------
 1 file changed, 36 insertions(+), 20 deletions(-)

diff --git a/app/code/Magento/Catalog/Model/Product/Gallery/CreateHandler.php b/app/code/Magento/Catalog/Model/Product/Gallery/CreateHandler.php
index 528ebd66321..976e9e2448a 100644
--- a/app/code/Magento/Catalog/Model/Product/Gallery/CreateHandler.php
+++ b/app/code/Magento/Catalog/Model/Product/Gallery/CreateHandler.php
@@ -171,9 +171,17 @@ class CreateHandler implements ExtensionInterface
                 $product,
                 $mediaAttrCode,
                 $clearImages,
-                $newImages,
-                $existImages
+                $newImages
             );
+            if (in_array($mediaAttrCode, ['image', 'small_image', 'thumbnail'])) {
+                $this->processMediaAttributeLabel(
+                    $product,
+                    $mediaAttrCode,
+                    $clearImages,
+                    $newImages,
+                    $existImages
+                );
+            }
         }
 
         $product->setData($attrCode, $value);
@@ -439,12 +447,32 @@ class CreateHandler implements ExtensionInterface
 
     /**
      * @param \Magento\Catalog\Model\Product $product
-     * @param $attrData
-     * @param array $clearImages
      * @param $mediaAttrCode
+     * @param array $clearImages
      * @param array $newImages
-     * @param array $existImages
      */
+    private function processMediaAttribute(
+        \Magento\Catalog\Model\Product $product,
+        $mediaAttrCode,
+        array $clearImages,
+        array $newImages
+    ) {
+        $attrData = $product->getData($mediaAttrCode);
+        if (in_array($attrData, $clearImages)) {
+            $product->setData($mediaAttrCode, 'no_selection');
+        }
+
+        if (in_array($attrData, array_keys($newImages))) {
+            $product->setData($mediaAttrCode, $newImages[$attrData]['new_file']);
+        }
+        if (!empty($product->getData($mediaAttrCode))) {
+            $product->addAttributeUpdate(
+                $mediaAttrCode,
+                $product->getData($mediaAttrCode),
+                $product->getStoreId()
+            );
+        }
+    }
     /**
      * @param \Magento\Catalog\Model\Product $product
      * @param $mediaAttrCode
@@ -452,7 +480,7 @@ class CreateHandler implements ExtensionInterface
      * @param array $newImages
      * @param array $existImages
      */
-    private function processMediaAttribute(
+    private function processMediaAttributeLabel(
         \Magento\Catalog\Model\Product $product,
         $mediaAttrCode,
         array $clearImages,
@@ -462,13 +490,11 @@ class CreateHandler implements ExtensionInterface
         $resetLabel = false;
         $attrData = $product->getData($mediaAttrCode);
         if (in_array($attrData, $clearImages)) {
-            $product->setData($mediaAttrCode, 'no_selection');
             $product->setData($mediaAttrCode . '_label', null);
             $resetLabel = true;
         }
 
         if (in_array($attrData, array_keys($newImages))) {
-            $product->setData($mediaAttrCode, $newImages[$attrData]['new_file']);
             $product->setData($mediaAttrCode . '_label', $newImages[$attrData]['label']);
         }
 
@@ -480,11 +506,8 @@ class CreateHandler implements ExtensionInterface
             $product->setData($mediaAttrCode . '_label', null);
             $resetLabel = true;
         }
-        if (in_array($mediaAttrCode, ['image', 'small_image', 'thumbnail']) &&
-            (
-                !empty($product->getData($mediaAttrCode . '_label'))
-                || $resetLabel === true
-            )
+        if (!empty($product->getData($mediaAttrCode . '_label'))
+            || $resetLabel === true
         ) {
             $product->addAttributeUpdate(
                 $mediaAttrCode . '_label',
@@ -492,12 +515,5 @@ class CreateHandler implements ExtensionInterface
                 $product->getStoreId()
             );
         }
-        if (!empty($product->getData($mediaAttrCode))) {
-            $product->addAttributeUpdate(
-                $mediaAttrCode,
-                $product->getData($mediaAttrCode),
-                $product->getStoreId()
-            );
-        }
     }
 }
-- 
GitLab


From ae5454a71ff3b01545f3e8a090d472a391f3449b Mon Sep 17 00:00:00 2001
From: David Manners <dmanners87@gmail.com>
Date: Wed, 29 Nov 2017 11:31:34 +0000
Subject: [PATCH 218/380] Make sure there is a space between the two new
 methods

---
 app/code/Magento/Catalog/Model/Product/Gallery/CreateHandler.php | 1 +
 1 file changed, 1 insertion(+)

diff --git a/app/code/Magento/Catalog/Model/Product/Gallery/CreateHandler.php b/app/code/Magento/Catalog/Model/Product/Gallery/CreateHandler.php
index 976e9e2448a..cb045aee208 100644
--- a/app/code/Magento/Catalog/Model/Product/Gallery/CreateHandler.php
+++ b/app/code/Magento/Catalog/Model/Product/Gallery/CreateHandler.php
@@ -473,6 +473,7 @@ class CreateHandler implements ExtensionInterface
             );
         }
     }
+
     /**
      * @param \Magento\Catalog\Model\Product $product
      * @param $mediaAttrCode
-- 
GitLab


From e46c8fdd6a28f422bf4e008924af21dbfd3ffffb Mon Sep 17 00:00:00 2001
From: magento-engcom-team <mikola.malevanec@transoftgroup.com>
Date: Wed, 29 Nov 2017 17:27:09 +0200
Subject: [PATCH 219/380] 8255: Export Products action doesn't consider
 hide_for_product_page value.

---
 .../Model/Import/Product.php                  | 19 ++--------
 .../Import/Product/MediaGalleryProcessor.php  | 38 +------------------
 .../Model/Import/ProductTest.php              |  2 +-
 3 files changed, 6 insertions(+), 53 deletions(-)

diff --git a/app/code/Magento/CatalogImportExport/Model/Import/Product.php b/app/code/Magento/CatalogImportExport/Model/Import/Product.php
index 43d39b92978..9dbeaeaba69 100644
--- a/app/code/Magento/CatalogImportExport/Model/Import/Product.php
+++ b/app/code/Magento/CatalogImportExport/Model/Import/Product.php
@@ -1670,17 +1670,10 @@ class Product extends \Magento\ImportExport\Model\Import\Entity\AbstractEntity
                     $disabledImages = array_flip(
                         explode($this->getMultipleValueSeparator(), $rowData['_media_is_disabled'])
                     );
-                    foreach ($disabledImages as $disabledImage => $position) {
-                        $uploadedFile = $this->uploadMediaFiles($disabledImage, true);
-                        $uploadedFile = $uploadedFile ?: $this->getSystemFile($disabledImage);
-                        $mediaGallery[$storeId][$rowSku][$uploadedFile] = [
-                            'attribute_id' => $this->getMediaGalleryAttributeId(),
-                            'label' => $rowLabels[self::COL_MEDIA_IMAGE][$position] ?? '',
-                            'position' => $position,
-                            'disabled' => 1,
-                            'value' => $disabledImage,
-                            'store_id' => $storeId,
-                        ];
+                    if (empty($rowImages)) {
+                        foreach (array_keys($disabledImages) as $disabledImage) {
+                            $rowImages[self::COL_MEDIA_IMAGE][] = $disabledImage;
+                        }
                     }
                 }
                 $rowData[self::COL_MEDIA_IMAGE] = [];
@@ -1740,10 +1733,6 @@ class Product extends \Magento\ImportExport\Model\Import\Entity\AbstractEntity
                     }
                 }
 
-                //Add images to restore "hide from product page" value for specified store and product.
-                if (empty($mediaGallery[$storeId][$rowSku])) {
-                    $mediaGallery[$storeId][$rowSku]['all'] = ['restore' => true];
-                }
                 // 6. Attributes phase
                 $rowStore = (self::SCOPE_STORE == $rowScope)
                     ? $this->storeResolver->getStoreCodeToId($rowData[self::COL_STORE])
diff --git a/app/code/Magento/CatalogImportExport/Model/Import/Product/MediaGalleryProcessor.php b/app/code/Magento/CatalogImportExport/Model/Import/Product/MediaGalleryProcessor.php
index d45881b88c6..ec7c6a11729 100644
--- a/app/code/Magento/CatalogImportExport/Model/Import/Product/MediaGalleryProcessor.php
+++ b/app/code/Magento/CatalogImportExport/Model/Import/Product/MediaGalleryProcessor.php
@@ -109,7 +109,6 @@ class MediaGalleryProcessor
     public function saveMediaGallery(array $mediaGalleryData)
     {
         $this->initMediaGalleryResources();
-        $mediaGalleryData = $this->restoreDisabledImage($mediaGalleryData);
         $mediaGalleryDataGlobal = array_replace_recursive(...$mediaGalleryData);
         $imageNames = [];
         $multiInsertData = [];
@@ -134,9 +133,7 @@ class MediaGalleryProcessor
             $this->connection->select()->from($this->mediaGalleryTableName, ['value_id', 'value'])
                 ->where('value IN (?)', $imageNames)
         );
-        if (!empty($multiInsertData)) {
-            $this->connection->insertOnDuplicate($this->mediaGalleryTableName, $multiInsertData);
-        }
+        $this->connection->insertOnDuplicate($this->mediaGalleryTableName, $multiInsertData);
         $newMediaSelect = $this->connection->select()->from($this->mediaGalleryTableName, ['value_id', 'value'])
             ->where('value IN (?)', $imageNames);
         if (array_keys($oldMediaValues)) {
@@ -263,39 +260,6 @@ class MediaGalleryProcessor
         }
     }
 
-    /**
-     * Set product images 'disable' = 0 for specified store.
-     *
-     * @param array $mediaGalleryData
-     * @return array
-     */
-    private function restoreDisabledImage(array $mediaGalleryData)
-    {
-        $restoreData = [];
-        foreach (array_keys($mediaGalleryData) as $storeId) {
-            foreach ($mediaGalleryData[$storeId] as $productSku => $mediaGalleryRows) {
-                $productId = $this->skuProcessor->getNewSku($productSku)[$this->getProductEntityLinkField()];
-                $restoreData[] = sprintf(
-                    'store_id = %s and %s = %s',
-                    $storeId,
-                    $this->getProductEntityLinkField(),
-                    $productId
-                );
-                if (isset($mediaGalleryRows['all']['restore'])) {
-                    unset($mediaGalleryData[$storeId][$productSku]);
-                }
-            }
-        }
-
-        $this->connection->update(
-            $this->mediaGalleryValueTableName,
-            ['disabled' => 0],
-            new \Zend_Db_Expr(implode(' or ', $restoreData))
-        );
-
-        return $mediaGalleryData;
-    }
-
     /**
      * Save media gallery data per store.
      *
diff --git a/dev/tests/integration/testsuite/Magento/CatalogImportExport/Model/Import/ProductTest.php b/dev/tests/integration/testsuite/Magento/CatalogImportExport/Model/Import/ProductTest.php
index 3d4dd7c9cf8..6c673ad4712 100644
--- a/dev/tests/integration/testsuite/Magento/CatalogImportExport/Model/Import/ProductTest.php
+++ b/dev/tests/integration/testsuite/Magento/CatalogImportExport/Model/Import/ProductTest.php
@@ -1983,7 +1983,7 @@ class ProductTest extends \Magento\TestFramework\Indexer\TestCase
         $product = $this->getProductBySku('simple_with_images');
         $mediaGallery = $product->getData('media_gallery');
         foreach ($mediaGallery['images'] as $image) {
-            $image['file'] === 'magento_image.jpg'
+            $image['file'] === '/m/a/magento_image.jpg'
                 ? self::assertSame('1', $image['disabled'])
                 : self::assertSame('0', $image['disabled']);
         }
-- 
GitLab


From 617b57fdfec249641b297aa1621e39b401a4a645 Mon Sep 17 00:00:00 2001
From: RomanKis <romaikiss@gmail.com>
Date: Wed, 29 Nov 2017 18:01:22 +0200
Subject: [PATCH 220/380] 12468: Sort by Price not working on CatalogSearch
 Page in Magento 2

---
 .../Catalog/view/frontend/web/js/product/list/toolbar.js       | 3 ---
 1 file changed, 3 deletions(-)

diff --git a/app/code/Magento/Catalog/view/frontend/web/js/product/list/toolbar.js b/app/code/Magento/Catalog/view/frontend/web/js/product/list/toolbar.js
index 88be03a04e7..c620675a31a 100644
--- a/app/code/Magento/Catalog/view/frontend/web/js/product/list/toolbar.js
+++ b/app/code/Magento/Catalog/view/frontend/web/js/product/list/toolbar.js
@@ -99,9 +99,6 @@ define([
             }
             paramData[paramName] = paramValue;
 
-            if (paramValue == defaultValue) { //eslint-disable-line eqeqeq
-                delete paramData[paramName];
-            }
             paramData = $.param(paramData);
 
             location.href = baseUrl + (paramData.length ? '?' + paramData : '');
-- 
GitLab


From 110c14240f65e4c6b7df488454d1616a64f386bd Mon Sep 17 00:00:00 2001
From: rossbrandon <rbrandon@magento.com>
Date: Wed, 29 Nov 2017 14:40:26 -0600
Subject: [PATCH 221/380] MAGETWO-84649: Add Cloud deployment support for
 Advanced Reporting configurations

---
 app/code/Magento/Analytics/etc/di.xml | 18 ++++++++++++++++++
 1 file changed, 18 insertions(+)

diff --git a/app/code/Magento/Analytics/etc/di.xml b/app/code/Magento/Analytics/etc/di.xml
index 56657b58475..b9bb9cc9ff0 100644
--- a/app/code/Magento/Analytics/etc/di.xml
+++ b/app/code/Magento/Analytics/etc/di.xml
@@ -254,4 +254,22 @@
             <argument name="responseResolver" xsi:type="object">NotifyDataChangedResponseResolver</argument>
         </arguments>
     </type>
+    <type name="Magento\Config\Model\Config\TypePool">
+        <arguments>
+            <argument name="sensitive" xsi:type="array">
+                <item name="analytics/url/signup" xsi:type="string">1</item>
+                <item name="analytics/url/update" xsi:type="string">1</item>
+                <item name="analytics/url/bi_essentials" xsi:type="string">1</item>
+                <item name="analytics/url/otp" xsi:type="string">1</item>
+                <item name="analytics/url/report" xsi:type="string">1</item>
+                <item name="analytics/url/notify_data_changed" xsi:type="string">1</item>
+                <item name="analytics/general/token" xsi:type="string">1</item>
+            </argument>
+            <argument name="environment" xsi:type="array">
+                <item name="crontab/default/jobs/analytics_collect_data/schedule/cron_expr" xsi:type="string">1</item>
+                <item name="crontab/default/jobs/analytics_update/schedule/cron_expr" xsi:type="string">1</item>
+                <item name="crontab/default/jobs/analytics_subscribe/schedule/cron_expr" xsi:type="string">1</item>
+            </argument>
+        </arguments>
+    </type>
 </config>
-- 
GitLab


From fe7e75f59b9950866956d4e7299aef4b252cc88e Mon Sep 17 00:00:00 2001
From: Cy Kirsch <cykirsch@gmail.com>
Date: Wed, 29 Nov 2017 22:27:49 -0600
Subject: [PATCH 222/380] Format generated config files using the short array
 syntax

---
 .../DeploymentConfig/Writer/PhpFormatter.php  | 27 ++++++++++++++++++-
 .../Writer/PhpFormatterTest.php               | 26 +++++++++++++++++-
 2 files changed, 51 insertions(+), 2 deletions(-)

diff --git a/lib/internal/Magento/Framework/App/DeploymentConfig/Writer/PhpFormatter.php b/lib/internal/Magento/Framework/App/DeploymentConfig/Writer/PhpFormatter.php
index b419b3827e5..c1e7d557479 100644
--- a/lib/internal/Magento/Framework/App/DeploymentConfig/Writer/PhpFormatter.php
+++ b/lib/internal/Magento/Framework/App/DeploymentConfig/Writer/PhpFormatter.php
@@ -11,6 +11,8 @@ namespace Magento\Framework\App\DeploymentConfig\Writer;
  */
 class PhpFormatter implements FormatterInterface
 {
+    const INDENT = '  ';
+
     /**
      * Format deployment configuration.
      * If $comments is present, each item will be added
@@ -23,7 +25,7 @@ class PhpFormatter implements FormatterInterface
         if (!empty($comments) && is_array($data)) {
             return "<?php\nreturn array (\n" . $this->formatData($data, $comments) . "\n);\n";
         }
-        return "<?php\nreturn " . var_export($data, true) . ";\n";
+        return "<?php\nreturn " . $this->varExportShort($data, true) . ";\n";
     }
 
     /**
@@ -65,4 +67,27 @@ class PhpFormatter implements FormatterInterface
 
         return var_export($data, true);
     }
+
+    /**
+     * If variable to export is an array, format with the php >= 5.4 short array syntax. Otherwise use
+     * default var_export functionality.
+     *
+     * @param mixed   $var
+     * @param integer $depth
+     * @return string
+     */
+    private function varExportShort($var, $depth=0) {
+        if (gettype($var) === 'array') {
+            $indexed = array_keys($var) === range(0, count($var) - 1);
+            $r = [];
+            foreach ($var as $key => $value) {
+                $r[] = str_repeat(self::INDENT, $depth)
+                    . ($indexed ? '' : $this->varExportShort($key) . ' => ')
+                    . $this->varExportShort($value, $depth + 1);
+            }
+            return sprintf("[\n%s\n%s]", implode(",\n", $r), str_repeat(self::INDENT, $depth - 1));
+        }
+
+        return var_export($var, TRUE);
+    }
 }
diff --git a/lib/internal/Magento/Framework/App/Test/Unit/DeploymentConfig/Writer/PhpFormatterTest.php b/lib/internal/Magento/Framework/App/Test/Unit/DeploymentConfig/Writer/PhpFormatterTest.php
index a1fdedc701e..7e6ad7b02fc 100644
--- a/lib/internal/Magento/Framework/App/Test/Unit/DeploymentConfig/Writer/PhpFormatterTest.php
+++ b/lib/internal/Magento/Framework/App/Test/Unit/DeploymentConfig/Writer/PhpFormatterTest.php
@@ -129,13 +129,37 @@ return array (
   'ns4' => 'just text',
 );
 
+TEXT;
+
+        $expectedResult3 = <<<TEXT
+<?php
+return [
+  'ns1' => [
+    's1' => [
+      's11',
+      's12'
+    ],
+    's2' => [
+      's21',
+      's22'
+    ]
+  ],
+  'ns2' => [
+    's1' => [
+      's11'
+    ]
+  ],
+  'ns3' => 'just text',
+  'ns4' => 'just text'
+];
+
 TEXT;
         return [
             ['string', [], "<?php\nreturn 'string';\n"],
             ['string', ['comment'], "<?php\nreturn 'string';\n"],
-            [$array, [], "<?php\nreturn " . var_export($array, true) . ";\n"],
             [$array, $comments1, $expectedResult1],
             [$array, $comments2, $expectedResult2],
+            [$array, [], $expectedResult3],
         ];
     }
 }
-- 
GitLab


From d5188385a449b4a14db73b11ff79ed5e4e8618b4 Mon Sep 17 00:00:00 2001
From: RomanKis <romaikiss@gmail.com>
Date: Thu, 30 Nov 2017 10:54:54 +0200
Subject: [PATCH 223/380] 12468: Sort by Price not working on CatalogSearch
 Page in Magento 2

---
 .../Catalog/view/frontend/web/js/product/list/toolbar.js       | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/app/code/Magento/Catalog/view/frontend/web/js/product/list/toolbar.js b/app/code/Magento/Catalog/view/frontend/web/js/product/list/toolbar.js
index c620675a31a..259ca979206 100644
--- a/app/code/Magento/Catalog/view/frontend/web/js/product/list/toolbar.js
+++ b/app/code/Magento/Catalog/view/frontend/web/js/product/list/toolbar.js
@@ -78,6 +78,7 @@ define([
             );
         },
 
+        /*eslint-disable no-unused-vars*/
         /**
          * @param {String} paramName
          * @param {*} paramValue
@@ -105,5 +106,7 @@ define([
         }
     });
 
+    /*eslint-enable no-unused-vars*/
+
     return $.mage.productListToolbarForm;
 });
-- 
GitLab


From fe3033e36ff583598e443cb85aa53b031c2551a4 Mon Sep 17 00:00:00 2001
From: Vova Yatsyuk <vova.yatsyuk@gmail.com>
Date: Thu, 30 Nov 2017 13:24:06 +0200
Subject: [PATCH 224/380] Fixed invalid parameter type in phpdoc block

---
 app/code/Magento/Theme/Block/Html/Topmenu.php | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/app/code/Magento/Theme/Block/Html/Topmenu.php b/app/code/Magento/Theme/Block/Html/Topmenu.php
index b1b22e06d71..1052eb604f6 100644
--- a/app/code/Magento/Theme/Block/Html/Topmenu.php
+++ b/app/code/Magento/Theme/Block/Html/Topmenu.php
@@ -331,7 +331,7 @@ class Topmenu extends Template implements IdentityInterface
     /**
      * Add identity
      *
-     * @param array $identity
+     * @param string $identity
      * @return void
      */
     public function addIdentity($identity)
-- 
GitLab


From 8e426fe9a0b4e5dcaba084224d0b0a98c82e5e07 Mon Sep 17 00:00:00 2001
From: RomanKis <romaikiss@gmail.com>
Date: Thu, 30 Nov 2017 14:24:59 +0200
Subject: [PATCH 225/380] 12482: Sitemap image links in MultiStore

---
 app/code/Magento/Sitemap/Model/Sitemap.php               | 1 +
 app/code/Magento/Sitemap/Test/Unit/Model/SitemapTest.php | 4 ++++
 2 files changed, 5 insertions(+)

diff --git a/app/code/Magento/Sitemap/Model/Sitemap.php b/app/code/Magento/Sitemap/Model/Sitemap.php
index f6a5f029eaf..cad8023bd27 100644
--- a/app/code/Magento/Sitemap/Model/Sitemap.php
+++ b/app/code/Magento/Sitemap/Model/Sitemap.php
@@ -273,6 +273,7 @@ class Sitemap extends \Magento\Framework\Model\AbstractModel implements \Magento
         /** @var $helper \Magento\Sitemap\Helper\Data */
         $helper = $this->_sitemapData;
         $storeId = $this->getStoreId();
+        $this->_storeManager->setCurrentStore($storeId);
 
         $this->addSitemapItem(new DataObject(
             [
diff --git a/app/code/Magento/Sitemap/Test/Unit/Model/SitemapTest.php b/app/code/Magento/Sitemap/Test/Unit/Model/SitemapTest.php
index 83210c57897..4f55653fad3 100644
--- a/app/code/Magento/Sitemap/Test/Unit/Model/SitemapTest.php
+++ b/app/code/Magento/Sitemap/Test/Unit/Model/SitemapTest.php
@@ -253,6 +253,8 @@ class SitemapTest extends \PHPUnit\Framework\TestCase
             $expectedWrites,
             null
         );
+        $this->storeManagerMock->expects($this->once())->method('setCurrentStore')->with(1);
+
         $model->generateXml();
 
         $this->assertCount(count($expectedFile), $actualData, 'Number of generated files is incorrect');
@@ -360,6 +362,8 @@ class SitemapTest extends \PHPUnit\Framework\TestCase
             $expectedWrites,
             $robotsInfo
         );
+        $this->storeManagerMock->expects($this->once())->method('setCurrentStore')->with(1);
+
         $model->generateXml();
     }
 
-- 
GitLab


From c8ddf6ba9c0b3095db46ee1243f708891817af10 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Ra=C3=BAl=20Mateos?= <raumatbel@gmail.com>
Date: Sat, 21 Oct 2017 14:28:30 +0200
Subject: [PATCH 226/380] Fix re saving product attribute

---
 .../Adminhtml/Product/Attribute/Save.php      | 146 +++++++++++-------
 .../Adminhtml/Product/AttributeTest.php       |   4 +-
 2 files changed, 93 insertions(+), 57 deletions(-)

diff --git a/app/code/Magento/Catalog/Controller/Adminhtml/Product/Attribute/Save.php b/app/code/Magento/Catalog/Controller/Adminhtml/Product/Attribute/Save.php
index f2803c23994..98d5182bbad 100644
--- a/app/code/Magento/Catalog/Controller/Adminhtml/Product/Attribute/Save.php
+++ b/app/code/Magento/Catalog/Controller/Adminhtml/Product/Attribute/Save.php
@@ -5,79 +5,95 @@
  * See COPYING.txt for license details.
  */
 
-// @codingStandardsIgnoreFile
-
 namespace Magento\Catalog\Controller\Adminhtml\Product\Attribute;
 
+use Magento\Backend\App\Action\Context;
+use Magento\Backend\Model\View\Result\Redirect;
+use Magento\Catalog\Controller\Adminhtml\Product\Attribute;
+use Magento\Catalog\Model\Product\AttributeSet\BuildFactory;
+use Magento\Catalog\Helper\Product;
+use Magento\Catalog\Api\Data\ProductAttributeInterface;
+use Magento\Catalog\Model\ResourceModel\Eav\AttributeFactory;
+use Magento\Eav\Model\Entity\Attribute\Set;
+use Magento\Eav\Model\Adminhtml\System\Config\Source\Inputtype\Validator;
+use Magento\Eav\Model\Adminhtml\System\Config\Source\Inputtype\ValidatorFactory;
+use Magento\Eav\Model\ResourceModel\Entity\Attribute\Group\CollectionFactory;
+use Magento\Framework\Cache\FrontendInterface;
 use Magento\Framework\Controller\ResultFactory;
+use Magento\Framework\Controller\Result\Json;
 use Magento\Framework\Exception\AlreadyExistsException;
+use Magento\Framework\Exception\LocalizedException;
+use Magento\Framework\Filter\FilterManager;
+use Magento\Framework\Registry;
+use Magento\Framework\View\LayoutFactory;
+use Magento\Framework\View\Result\PageFactory;
 
 /**
  * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
  */
-class Save extends \Magento\Catalog\Controller\Adminhtml\Product\Attribute
+class Save extends Attribute
 {
     /**
-     * @var \Magento\Catalog\Model\Product\AttributeSet\BuildFactory
+     * @var BuildFactory
      */
     protected $buildFactory;
 
     /**
-     * @var \Magento\Framework\Filter\FilterManager
+     * @var FilterManager
      */
     protected $filterManager;
 
     /**
-     * @var \Magento\Catalog\Helper\Product
+     * @var Product
      */
     protected $productHelper;
 
     /**
-     * @var \Magento\Catalog\Model\ResourceModel\Eav\AttributeFactory
+     * @var AttributeFactory
      */
     protected $attributeFactory;
 
     /**
-     * @var \Magento\Eav\Model\Adminhtml\System\Config\Source\Inputtype\ValidatorFactory
+     * @var ValidatorFactory
      */
     protected $validatorFactory;
 
     /**
-     * @var \Magento\Eav\Model\ResourceModel\Entity\Attribute\Group\CollectionFactory
+     * @var CollectionFactory
      */
     protected $groupCollectionFactory;
 
     /**
-     * @var \Magento\Framework\View\LayoutFactory
+     * @var LayoutFactory
      */
     private $layoutFactory;
 
     /**
-     * @param \Magento\Backend\App\Action\Context $context
-     * @param \Magento\Framework\Cache\FrontendInterface $attributeLabelCache
-     * @param \Magento\Framework\Registry $coreRegistry
-     * @param \Magento\Catalog\Model\Product\AttributeSet\BuildFactory $buildFactory
-     * @param \Magento\Framework\View\Result\PageFactory $resultPageFactory
-     * @param \Magento\Catalog\Model\ResourceModel\Eav\AttributeFactory $attributeFactory
-     * @param \Magento\Eav\Model\Adminhtml\System\Config\Source\Inputtype\ValidatorFactory $validatorFactory
-     * @param \Magento\Eav\Model\ResourceModel\Entity\Attribute\Group\CollectionFactory $groupCollectionFactory
-     * @param \Magento\Framework\Filter\FilterManager $filterManager
-     * @param \Magento\Catalog\Helper\Product $productHelper
-     * @param \Magento\Framework\View\LayoutFactory $layoutFactory
+     * @param Context $context
+     * @param FrontendInterface $attributeLabelCache
+     * @param Registry $coreRegistry
+     * @param BuildFactory $buildFactory
+     * @param PageFactory $resultPageFactory
+     * @param AttributeFactory $attributeFactory
+     * @param ValidatorFactory $validatorFactory
+     * @param CollectionFactory $groupCollectionFactory
+     * @param FilterManager $filterManager
+     * @param Product $productHelper
+     * @param LayoutFactory $layoutFactory
      * @SuppressWarnings(PHPMD.ExcessiveParameterList)
      */
     public function __construct(
-        \Magento\Backend\App\Action\Context $context,
-        \Magento\Framework\Cache\FrontendInterface $attributeLabelCache,
-        \Magento\Framework\Registry $coreRegistry,
-        \Magento\Framework\View\Result\PageFactory $resultPageFactory,
-        \Magento\Catalog\Model\Product\AttributeSet\BuildFactory $buildFactory,
-        \Magento\Catalog\Model\ResourceModel\Eav\AttributeFactory $attributeFactory,
-        \Magento\Eav\Model\Adminhtml\System\Config\Source\Inputtype\ValidatorFactory $validatorFactory,
-        \Magento\Eav\Model\ResourceModel\Entity\Attribute\Group\CollectionFactory $groupCollectionFactory,
-        \Magento\Framework\Filter\FilterManager $filterManager,
-        \Magento\Catalog\Helper\Product $productHelper,
-        \Magento\Framework\View\LayoutFactory $layoutFactory
+        Context $context,
+        FrontendInterface $attributeLabelCache,
+        Registry $coreRegistry,
+        PageFactory $resultPageFactory,
+        BuildFactory $buildFactory,
+        AttributeFactory $attributeFactory,
+        ValidatorFactory $validatorFactory,
+        CollectionFactory $groupCollectionFactory,
+        FilterManager $filterManager,
+        Product $productHelper,
+        LayoutFactory $layoutFactory
     ) {
         parent::__construct($context, $attributeLabelCache, $coreRegistry, $resultPageFactory);
         $this->buildFactory = $buildFactory;
@@ -90,7 +106,7 @@ class Save extends \Magento\Catalog\Controller\Adminhtml\Product\Attribute
     }
 
     /**
-     * @return \Magento\Backend\Model\View\Result\Redirect
+     * @return Redirect
      * @SuppressWarnings(PHPMD.CyclomaticComplexity)
      * @SuppressWarnings(PHPMD.NPathComplexity)
      * @SuppressWarnings(PHPMD.ExcessiveMethodLength)
@@ -107,36 +123,51 @@ class Save extends \Magento\Catalog\Controller\Adminhtml\Product\Attribute
                 $name = trim($name);
 
                 try {
-                    /** @var $attributeSet \Magento\Eav\Model\Entity\Attribute\Set */
+                    /** @var $attributeSet Set */
                     $attributeSet = $this->buildFactory->create()
                         ->setEntityTypeId($this->_entityTypeId)
                         ->setSkeletonId($setId)
                         ->setName($name)
                         ->getAttributeSet();
                 } catch (AlreadyExistsException $alreadyExists) {
-                    $this->messageManager->addError(__('An attribute set named \'%1\' already exists.', $name));
+                    $this->messageManager->addErrorMessage(__('An attribute set named \'%1\' already exists.', $name));
                     $this->_session->setAttributeData($data);
+
                     return $this->returnResult('catalog/*/edit', ['_current' => true], ['error' => true]);
-                } catch (\Magento\Framework\Exception\LocalizedException $e) {
-                    $this->messageManager->addError($e->getMessage());
+                } catch (LocalizedException $e) {
+                    $this->messageManager->addErrorMessage($e->getMessage());
                 } catch (\Exception $e) {
-                    $this->messageManager->addException($e, __('Something went wrong while saving the attribute.'));
+                    $this->messageManager->addExceptionMessage(
+                        $e,
+                        __('Something went wrong while saving the attribute.')
+                    );
                 }
             }
 
             $attributeId = $this->getRequest()->getParam('attribute_id');
-            $attributeCode = $this->getRequest()->getParam('attribute_code')
-                ?: $this->generateCode($this->getRequest()->getParam('frontend_label')[0]);
+
+            /** @var $model ProductAttributeInterface */
+            $model = $this->attributeFactory->create();
+            if ($attributeId) {
+                $model->load($attributeId);
+            }
+            $attributeCode = $model && $model->getId()
+                ? $model->getAttributeCode()
+                : $this->getRequest()->getParam('attribute_code');
+            $attributeCode = $attributeCode ?: $this->generateCode($this->getRequest()->getParam('frontend_label')[0]);
             if (strlen($attributeCode) > 0) {
-                $validatorAttrCode = new \Zend_Validate_Regex(['pattern' => '/^[a-z\x{600}-\x{6FF}][a-z\x{600}-\x{6FF}_0-9]{0,30}$/u']);
+                $validatorAttrCode = new \Zend_Validate_Regex(
+                    ['pattern' => '/^[a-z\x{600}-\x{6FF}][a-z\x{600}-\x{6FF}_0-9]{0,30}$/u']
+                );
                 if (!$validatorAttrCode->isValid($attributeCode)) {
-                    $this->messageManager->addError(
+                    $this->messageManager->addErrorMessage(
                         __(
                             'Attribute code "%1" is invalid. Please use only letters (a-z), ' .
                             'numbers (0-9) or underscore(_) in this field, first character should be a letter.',
                             $attributeCode
                         )
                     );
+
                     return $this->returnResult(
                         'catalog/*/edit',
                         ['attribute_id' => $attributeId, '_current' => true],
@@ -148,12 +179,13 @@ class Save extends \Magento\Catalog\Controller\Adminhtml\Product\Attribute
 
             //validate frontend_input
             if (isset($data['frontend_input'])) {
-                /** @var $inputType \Magento\Eav\Model\Adminhtml\System\Config\Source\Inputtype\Validator */
+                /** @var $inputType Validator */
                 $inputType = $this->validatorFactory->create();
                 if (!$inputType->isValid($data['frontend_input'])) {
                     foreach ($inputType->getMessages() as $message) {
-                        $this->messageManager->addError($message);
+                        $this->messageManager->addErrorMessage($message);
                     }
+
                     return $this->returnResult(
                         'catalog/*/edit',
                         ['attribute_id' => $attributeId, '_current' => true],
@@ -162,19 +194,17 @@ class Save extends \Magento\Catalog\Controller\Adminhtml\Product\Attribute
                 }
             }
 
-            /* @var $model \Magento\Catalog\Model\ResourceModel\Eav\Attribute */
-            $model = $this->attributeFactory->create();
-
             if ($attributeId) {
-                $model->load($attributeId);
                 if (!$model->getId()) {
-                    $this->messageManager->addError(__('This attribute no longer exists.'));
+                    $this->messageManager->addErrorMessage(__('This attribute no longer exists.'));
+
                     return $this->returnResult('catalog/*/', [], ['error' => true]);
                 }
                 // entity type check
                 if ($model->getEntityTypeId() != $this->_entityTypeId) {
-                    $this->messageManager->addError(__('We can\'t update the attribute.'));
+                    $this->messageManager->addErrorMessage(__('We can\'t update the attribute.'));
                     $this->_session->setAttributeData($data);
+
                     return $this->returnResult('catalog/*/', [], ['error' => true]);
                 }
 
@@ -195,7 +225,7 @@ class Save extends \Magento\Catalog\Controller\Adminhtml\Product\Attribute
 
             $data += ['is_filterable' => 0, 'is_filterable_in_search' => 0];
 
-            if (is_null($model->getIsUserDefined()) || $model->getIsUserDefined() != 0) {
+            if ($model->getIsUserDefined() === null || $model->getIsUserDefined() != 0) {
                 $data['backend_type'] = $model->getBackendTypeByInput($data['frontend_input']);
             }
 
@@ -241,7 +271,7 @@ class Save extends \Magento\Catalog\Controller\Adminhtml\Product\Attribute
 
             try {
                 $model->save();
-                $this->messageManager->addSuccess(__('You saved the product attribute.'));
+                $this->messageManager->addSuccessMessage(__('You saved the product attribute.'));
 
                 $this->_attributeLabelCache->clean();
                 $this->_session->setAttributeData(false);
@@ -252,9 +282,10 @@ class Save extends \Magento\Catalog\Controller\Adminhtml\Product\Attribute
                         '_current' => true,
                         'product_tab' => $this->getRequest()->getParam('product_tab'),
                     ];
-                    if (!is_null($attributeSet)) {
+                    if ($attributeSet !== null) {
                         $requestParams['new_attribute_set_id'] = $attributeSet->getId();
                     }
+
                     return $this->returnResult('catalog/product/addAttribute', $requestParams, ['error' => false]);
                 } elseif ($this->getRequest()->getParam('back', false)) {
                     return $this->returnResult(
@@ -263,10 +294,12 @@ class Save extends \Magento\Catalog\Controller\Adminhtml\Product\Attribute
                         ['error' => false]
                     );
                 }
+
                 return $this->returnResult('catalog/*/', [], ['error' => false]);
             } catch (\Exception $e) {
-                $this->messageManager->addError($e->getMessage());
+                $this->messageManager->addErrorMessage($e->getMessage());
                 $this->_session->setAttributeData($data);
+
                 return $this->returnResult(
                     'catalog/*/edit',
                     ['attribute_id' => $attributeId, '_current' => true],
@@ -274,6 +307,7 @@ class Save extends \Magento\Catalog\Controller\Adminhtml\Product\Attribute
                 );
             }
         }
+
         return $this->returnResult('catalog/*/', [], ['error' => true]);
     }
 
@@ -281,7 +315,7 @@ class Save extends \Magento\Catalog\Controller\Adminhtml\Product\Attribute
      * @param string $path
      * @param array $params
      * @param array $response
-     * @return \Magento\Framework\Controller\Result\Json|\Magento\Backend\Model\View\Result\Redirect
+     * @return Json|Redirect
      */
     private function returnResult($path = '', array $params = [], array $response = [])
     {
@@ -291,8 +325,10 @@ class Save extends \Magento\Catalog\Controller\Adminhtml\Product\Attribute
 
             $response['messages'] = [$layout->getMessagesBlock()->getGroupedHtml()];
             $response['params'] = $params;
+
             return $this->resultFactory->create(ResultFactory::TYPE_JSON)->setData($response);
         }
+
         return $this->resultFactory->create(ResultFactory::TYPE_REDIRECT)->setPath($path, $params);
     }
 
diff --git a/dev/tests/integration/testsuite/Magento/Catalog/Controller/Adminhtml/Product/AttributeTest.php b/dev/tests/integration/testsuite/Magento/Catalog/Controller/Adminhtml/Product/AttributeTest.php
index 48928b4c5c9..6e93f61c1eb 100644
--- a/dev/tests/integration/testsuite/Magento/Catalog/Controller/Adminhtml/Product/AttributeTest.php
+++ b/dev/tests/integration/testsuite/Magento/Catalog/Controller/Adminhtml/Product/AttributeTest.php
@@ -128,12 +128,12 @@ class AttributeTest extends \Magento\TestFramework\TestCase\AbstractBackendContr
      */
     public function testWrongAttributeCode()
     {
-        $postData = $this->_getAttributeData() + ['attribute_id' => '2', 'attribute_code' => '_()&&&?'];
+        $postData = $this->_getAttributeData() + ['attribute_code' => '_()&&&?'];
         $this->getRequest()->setPostValue($postData);
         $this->dispatch('backend/catalog/product_attribute/save');
         $this->assertEquals(302, $this->getResponse()->getHttpResponseCode());
         $this->assertContains(
-            'catalog/product_attribute/edit/attribute_id/2',
+            'catalog/product_attribute/edit',
             $this->getResponse()->getHeader('Location')->getFieldValue()
         );
         /** @var \Magento\Framework\Message\Collection $messages */
-- 
GitLab


From 80520c5b7d5579603a514e5c45e47ec2cce40000 Mon Sep 17 00:00:00 2001
From: Vova Yatsyuk <vovayatsyuk@users.noreply.github.com>
Date: Thu, 30 Nov 2017 15:56:52 +0200
Subject: [PATCH 227/380] Add array type, as it is allowed to use too

---
 app/code/Magento/Theme/Block/Html/Topmenu.php | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/app/code/Magento/Theme/Block/Html/Topmenu.php b/app/code/Magento/Theme/Block/Html/Topmenu.php
index 1052eb604f6..77475769880 100644
--- a/app/code/Magento/Theme/Block/Html/Topmenu.php
+++ b/app/code/Magento/Theme/Block/Html/Topmenu.php
@@ -331,7 +331,7 @@ class Topmenu extends Template implements IdentityInterface
     /**
      * Add identity
      *
-     * @param string $identity
+     * @param string|array $identity
      * @return void
      */
     public function addIdentity($identity)
-- 
GitLab


From 4597c4fd70f35966405b03a5292276256eba0091 Mon Sep 17 00:00:00 2001
From: Cy Kirsch <cykirsch@gmail.com>
Date: Thu, 30 Nov 2017 09:30:25 -0600
Subject: [PATCH 228/380] Fix the config formatter scenarios with $comments to
 also use short array syntax

---
 .../DeploymentConfig/Writer/PhpFormatter.php  | 10 ++--
 .../Writer/PhpFormatterTest.php               | 48 +++++++++----------
 2 files changed, 29 insertions(+), 29 deletions(-)

diff --git a/lib/internal/Magento/Framework/App/DeploymentConfig/Writer/PhpFormatter.php b/lib/internal/Magento/Framework/App/DeploymentConfig/Writer/PhpFormatter.php
index c1e7d557479..ef0b3a5d290 100644
--- a/lib/internal/Magento/Framework/App/DeploymentConfig/Writer/PhpFormatter.php
+++ b/lib/internal/Magento/Framework/App/DeploymentConfig/Writer/PhpFormatter.php
@@ -23,7 +23,7 @@ class PhpFormatter implements FormatterInterface
     public function format($data, array $comments = [])
     {
         if (!empty($comments) && is_array($data)) {
-            return "<?php\nreturn array (\n" . $this->formatData($data, $comments) . "\n);\n";
+            return "<?php\nreturn [\n" . $this->formatData($data, $comments) . "\n];\n";
         }
         return "<?php\nreturn " . $this->varExportShort($data, true) . ";\n";
     }
@@ -53,13 +53,13 @@ class PhpFormatter implements FormatterInterface
                     $elements[] = $prefix . " */";
                 }
 
-                $elements[] = $prefix . var_export($key, true) . ' => ' .
-                    (!is_array($value) ? var_export($value, true) . ',' : '');
+                $elements[] = $prefix . $this->varExportShort($key) . ' => ' .
+                    (!is_array($value) ? $this->varExportShort($value) . ',' : '');
 
                 if (is_array($value)) {
-                    $elements[] = $prefix . 'array (';
+                    $elements[] = $prefix . '[';
                     $elements[] = $this->formatData($value, [], '  ' . $prefix);
-                    $elements[] = $prefix . '),';
+                    $elements[] = $prefix . '],';
                 }
             }
             return implode("\n", $elements);
diff --git a/lib/internal/Magento/Framework/App/Test/Unit/DeploymentConfig/Writer/PhpFormatterTest.php b/lib/internal/Magento/Framework/App/Test/Unit/DeploymentConfig/Writer/PhpFormatterTest.php
index 7e6ad7b02fc..cc673e084c3 100644
--- a/lib/internal/Magento/Framework/App/Test/Unit/DeploymentConfig/Writer/PhpFormatterTest.php
+++ b/lib/internal/Magento/Framework/App/Test/Unit/DeploymentConfig/Writer/PhpFormatterTest.php
@@ -55,68 +55,68 @@ class PhpFormatterTest extends \PHPUnit\Framework\TestCase
         ];
         $expectedResult1 = <<<TEXT
 <?php
-return array (
+return [
   'ns1' => 
-  array (
+  [
     's1' => 
-    array (
+    [
       0 => 's11',
       1 => 's12',
-    ),
+    ],
     's2' => 
-    array (
+    [
       0 => 's21',
       1 => 's22',
-    ),
-  ),
+    ],
+  ],
   /**
    * For the section: ns2
    * comment for namespace 2
    */
   'ns2' => 
-  array (
+  [
     's1' => 
-    array (
+    [
       0 => 's11',
-    ),
-  ),
+    ],
+  ],
   'ns3' => 'just text',
   'ns4' => 'just text',
-);
+];
 
 TEXT;
         $expectedResult2 = <<<TEXT
 <?php
-return array (
+return [
   /**
    * For the section: ns1
    * comment for' namespace 1
    */
   'ns1' => 
-  array (
+  [
     's1' => 
-    array (
+    [
       0 => 's11',
       1 => 's12',
-    ),
+    ],
     's2' => 
-    array (
+    [
       0 => 's21',
       1 => 's22',
-    ),
-  ),
+    ],
+  ],
   /**
    * For the section: ns2
    * comment for namespace 2.
    * Next comment for' namespace 2
    */
   'ns2' => 
-  array (
+  [
     's1' => 
-    array (
+    [
       0 => 's11',
-    ),
-  ),
+    ],
+  ],
   /**
    * For the section: ns3
    * comment for" namespace 3
@@ -127,7 +127,7 @@ return array (
    * comment for namespace 4
    */
   'ns4' => 'just text',
-);
+];
 
 TEXT;
 
-- 
GitLab


From b1b604e8afec254d5d82fcd96a6c5cf9010fa442 Mon Sep 17 00:00:00 2001
From: Volodymyr Kublytskyi <vkublytskyi@magento.com>
Date: Thu, 30 Nov 2017 18:31:42 +0200
Subject: [PATCH 229/380] MAGETWO-80111: Keep maintenance mode on if it was
 previously enabled #11052

 - revert backward incompatible changes
 - fix temporal coupling in \Magento\Framework\App\Console\MaintenanceModeEnabler
 - cover maintenance mode with unit test
 - revert changes in unit test to ensure code have same behavior after refactoring
---
 app/code/Magento/Deploy/Model/Mode.php        |  54 ++++----
 .../Deploy/Test/Unit/Model/ModeTest.php       |   8 +-
 .../Console/Command/ThemeUninstallCommand.php |  69 ++++++----
 .../Command/ThemeUninstallCommandTest.php     |  16 ++-
 .../App/Console/MaintenanceModeEnabler.php    |  30 ++++-
 .../Console/MaintenanceModeEnablerTest.php    | 122 ++++++++++++++++++
 .../Setup/Console/Command/BackupCommand.php   |  88 +++++++------
 .../Command/ModuleUninstallCommand.php        |  92 +++++++------
 .../Setup/Console/Command/RollbackCommand.php |  71 +++++-----
 .../Console/Command/BackupCommandTest.php     |  19 ++-
 .../Command/ModuleUninstallCommandTest.php    |   8 +-
 .../Console/Command/RollbackCommandTest.php   |  22 ++--
 12 files changed, 405 insertions(+), 194 deletions(-)
 create mode 100644 lib/internal/Magento/Framework/App/Test/Unit/Console/MaintenanceModeEnablerTest.php

diff --git a/app/code/Magento/Deploy/Model/Mode.php b/app/code/Magento/Deploy/Model/Mode.php
index 58ffad17fd2..2aca266dcef 100644
--- a/app/code/Magento/Deploy/Model/Mode.php
+++ b/app/code/Magento/Deploy/Model/Mode.php
@@ -12,6 +12,7 @@ use Magento\Framework\App\Console\MaintenanceModeEnabler;
 use Magento\Framework\App\DeploymentConfig\Reader;
 use Magento\Framework\App\DeploymentConfig\Writer;
 use Magento\Framework\App\Filesystem\DirectoryList;
+use Magento\Framework\App\MaintenanceMode;
 use Magento\Framework\App\State;
 use Magento\Framework\Config\File\ConfigFilePool;
 use Symfony\Component\Console\Input\InputInterface;
@@ -49,11 +50,6 @@ class Mode
      */
     private $reader;
 
-    /**
-     * @var MaintenanceModeEnabler
-     */
-    private $maintenanceMode;
-
     /**
      * @var Filesystem
      */
@@ -78,33 +74,41 @@ class Mode
      */
     private $emulatedAreaProcessor;
 
+    /**
+     * @var MaintenanceModeEnabler
+     */
+    private $maintenanceModeEnabler;
+
     /**
      * @param InputInterface $input
      * @param OutputInterface $output
      * @param Writer $writer
      * @param Reader $reader
-     * @param MaintenanceModeEnabler $maintenanceMode
+     * @param MaintenanceMode $maintenanceMode deprecated, use $maintenanceModeEnabler instead
      * @param Filesystem $filesystem
      * @param ConfigProvider $configProvider
      * @param ProcessorFacadeFactory $processorFacadeFactory
      * @param EmulatedAdminhtmlAreaProcessor $emulatedAreaProcessor
+     * @param MaintenanceModeEnabler $maintenanceModeEnabler
+     *
+     * @SuppressWarnings(PHPMD.UnusedFormalParameter)
      */
     public function __construct(
         InputInterface $input,
         OutputInterface $output,
         Writer $writer,
         Reader $reader,
-        MaintenanceModeEnabler $maintenanceMode,
+        MaintenanceMode $maintenanceMode,
         Filesystem $filesystem,
         ConfigProvider $configProvider = null,
         ProcessorFacadeFactory $processorFacadeFactory = null,
-        EmulatedAdminhtmlAreaProcessor $emulatedAreaProcessor = null
+        EmulatedAdminhtmlAreaProcessor $emulatedAreaProcessor = null,
+        MaintenanceModeEnabler $maintenanceModeEnabler = null
     ) {
         $this->input = $input;
         $this->output = $output;
         $this->writer = $writer;
         $this->reader = $reader;
-        $this->maintenanceMode = $maintenanceMode;
         $this->filesystem = $filesystem;
 
         $this->configProvider =
@@ -113,6 +117,8 @@ class Mode
             $processorFacadeFactory ?: ObjectManager::getInstance()->get(ProcessorFacadeFactory::class);
         $this->emulatedAreaProcessor =
             $emulatedAreaProcessor ?: ObjectManager::getInstance()->get(EmulatedAdminhtmlAreaProcessor::class);
+        $this->maintenanceModeEnabler =
+            $maintenanceModeEnabler ?: ObjectManager::getInstance()->get(MaintenanceModeEnabler::class);
     }
 
     /**
@@ -123,19 +129,23 @@ class Mode
      */
     public function enableProductionMode()
     {
-        $this->maintenanceMode->enableMaintenanceMode($this->output);
-        $previousMode = $this->getMode();
-        try {
-            // We have to turn on production mode before generation.
-            // We need this to enable generation of the "min" files.
-            $this->setStoreMode(State::MODE_PRODUCTION);
-            $this->filesystem->regenerateStatic($this->output);
-        } catch (LocalizedException $e) {
-            // We have to return store mode to previous state in case of error.
-            $this->setStoreMode($previousMode);
-            throw $e;
-        }
-        $this->maintenanceMode->disableMaintenanceMode($this->output);
+        $this->maintenanceModeEnabler->executeInMaintenanceMode(
+            function () {
+                $previousMode = $this->getMode();
+                try {
+                    // We have to turn on production mode before generation.
+                    // We need this to enable generation of the "min" files.
+                    $this->setStoreMode(State::MODE_PRODUCTION);
+                    $this->filesystem->regenerateStatic($this->output);
+                } catch (LocalizedException $e) {
+                    // We have to return store mode to previous state in case of error.
+                    $this->setStoreMode($previousMode);
+                    throw $e;
+                }
+            },
+            $this->output,
+            false
+        );
     }
 
     /**
diff --git a/app/code/Magento/Deploy/Test/Unit/Model/ModeTest.php b/app/code/Magento/Deploy/Test/Unit/Model/ModeTest.php
index 3a171228a88..a108153d65e 100644
--- a/app/code/Magento/Deploy/Test/Unit/Model/ModeTest.php
+++ b/app/code/Magento/Deploy/Test/Unit/Model/ModeTest.php
@@ -15,6 +15,7 @@ use Magento\Framework\App\Config\ScopeConfigInterface;
 use Magento\Framework\App\Console\MaintenanceModeEnabler;
 use Magento\Framework\App\DeploymentConfig\Reader;
 use Magento\Framework\App\DeploymentConfig\Writer;
+use Magento\Framework\App\MaintenanceMode;
 use Magento\Framework\App\State;
 use PHPUnit_Framework_MockObject_MockObject as Mock;
 use Symfony\Component\Console\Input\InputInterface;
@@ -54,7 +55,7 @@ class ModeTest extends \PHPUnit\Framework\TestCase
     private $writerMock;
 
     /**
-     * @var MaintenanceModeEnabler|Mock
+     * @var MaintenanceMode|Mock
      */
     private $maintenanceMock;
 
@@ -95,7 +96,7 @@ class ModeTest extends \PHPUnit\Framework\TestCase
         $this->readerMock = $this->getMockBuilder(Reader::class)
             ->disableOriginalConstructor()
             ->getMock();
-        $this->maintenanceMock = $this->getMockBuilder(MaintenanceModeEnabler::class)
+        $this->maintenanceMock = $this->getMockBuilder(MaintenanceMode::class)
             ->disableOriginalConstructor()
             ->getMock();
         $this->filesystemMock = $this->getMockBuilder(Filesystem::class)
@@ -124,7 +125,8 @@ class ModeTest extends \PHPUnit\Framework\TestCase
             $this->filesystemMock,
             $this->configProvider,
             $this->processorFacadeFactory,
-            $this->emulatedAreaProcessor
+            $this->emulatedAreaProcessor,
+            new MaintenanceModeEnabler($this->maintenanceMock)
         );
     }
 
diff --git a/app/code/Magento/Theme/Console/Command/ThemeUninstallCommand.php b/app/code/Magento/Theme/Console/Command/ThemeUninstallCommand.php
index def73c33e8a..540fd962a4f 100644
--- a/app/code/Magento/Theme/Console/Command/ThemeUninstallCommand.php
+++ b/app/code/Magento/Theme/Console/Command/ThemeUninstallCommand.php
@@ -6,9 +6,10 @@
 
 namespace Magento\Theme\Console\Command;
 
-use Magento\Framework\App\Area;
 use Magento\Framework\App\Cache;
+use Magento\Framework\App\MaintenanceMode;
 use Magento\Framework\App\Console\MaintenanceModeEnabler;
+use Magento\Framework\App\ObjectManager;
 use Magento\Framework\App\State\CleanupFiles;
 use Magento\Framework\Composer\ComposerInformation;
 use Magento\Framework\Composer\DependencyChecker;
@@ -39,11 +40,6 @@ class ThemeUninstallCommand extends Command
     const INPUT_KEY_THEMES = 'theme';
     const INPUT_KEY_CLEAR_STATIC_CONTENT = 'clear-static-content';
 
-    /**
-     * @var MaintenanceModeEnabler
-     */
-    private $maintenanceMode;
-
     /**
      * Composer general dependency checker
      *
@@ -114,13 +110,18 @@ class ThemeUninstallCommand extends Command
      */
     private $themeDependencyChecker;
 
+    /**
+     * @var MaintenanceModeEnabler
+     */
+    private $maintenanceModeEnabler;
+
     /**
      * Constructor
      *
      * @param Cache $cache
      * @param CleanupFiles $cleanupFiles
      * @param ComposerInformation $composer
-     * @param MaintenanceModeEnabler $maintenanceMode
+     * @param MaintenanceMode $maintenanceMode deprecated, use $maintenanceModeEnabler instead
      * @param DependencyChecker $dependencyChecker
      * @param Collection $themeCollection
      * @param BackupRollbackFactory $backupRollbackFactory
@@ -128,24 +129,27 @@ class ThemeUninstallCommand extends Command
      * @param ThemePackageInfo $themePackageInfo
      * @param ThemeUninstaller $themeUninstaller
      * @param ThemeDependencyChecker $themeDependencyChecker
+     * @param MaintenanceModeEnabler $maintenanceModeEnabler
+     *
+     * @SuppressWarnings(PHPMD.UnusedFormalParameter)
      */
     public function __construct(
         Cache $cache,
         CleanupFiles $cleanupFiles,
         ComposerInformation $composer,
-        MaintenanceModeEnabler $maintenanceMode,
+        MaintenanceMode $maintenanceMode,
         DependencyChecker $dependencyChecker,
         Collection $themeCollection,
         BackupRollbackFactory $backupRollbackFactory,
         ThemeValidator $themeValidator,
         ThemePackageInfo $themePackageInfo,
         ThemeUninstaller $themeUninstaller,
-        ThemeDependencyChecker $themeDependencyChecker
+        ThemeDependencyChecker $themeDependencyChecker,
+        MaintenanceModeEnabler $maintenanceModeEnabler = null
     ) {
         $this->cache = $cache;
         $this->cleanupFiles = $cleanupFiles;
         $this->composer = $composer;
-        $this->maintenanceMode = $maintenanceMode;
         $this->dependencyChecker = $dependencyChecker;
         $this->themeCollection = $themeCollection;
         $this->backupRollbackFactory = $backupRollbackFactory;
@@ -153,6 +157,8 @@ class ThemeUninstallCommand extends Command
         $this->themePackageInfo = $themePackageInfo;
         $this->themeUninstaller = $themeUninstaller;
         $this->themeDependencyChecker = $themeDependencyChecker;
+        $this->maintenanceModeEnabler =
+            $maintenanceModeEnabler ?: ObjectManager::getInstance()->get(MaintenanceModeEnabler::class);
         parent::__construct();
     }
 
@@ -212,25 +218,32 @@ class ThemeUninstallCommand extends Command
             return \Magento\Framework\Console\Cli::RETURN_FAILURE;
         }
 
-        try {
-            $this->maintenanceMode->enableMaintenanceMode($output);
-            if ($input->getOption(self::INPUT_KEY_BACKUP_CODE)) {
-                $time = time();
-                $codeBackup = $this->backupRollbackFactory->create($output);
-                $codeBackup->codeBackup($time);
-            }
-
-            $this->themeUninstaller->uninstallRegistry($output, $themePaths);
-            $this->themeUninstaller->uninstallCode($output, $themePaths);
+        $result = $this->maintenanceModeEnabler->executeInMaintenanceMode(
+            function () use ($input, $output, $themePaths) {
+                try {
+                    if ($input->getOption(self::INPUT_KEY_BACKUP_CODE)) {
+                        $time = time();
+                        $codeBackup = $this->backupRollbackFactory->create($output);
+                        $codeBackup->codeBackup($time);
+                    }
+
+                    $this->themeUninstaller->uninstallRegistry($output, $themePaths);
+                    $this->themeUninstaller->uninstallCode($output, $themePaths);
+
+                    $this->cleanup($input, $output);
+                    return \Magento\Framework\Console\Cli::RETURN_SUCCESS;
+                } catch (\Exception $e) {
+                    $output->writeln('<error>' . $e->getMessage() . '</error>');
+                    $output->writeln('<error>Please disable maintenance mode after you resolved above issues</error>');
+                    // we must have an exit code higher than zero to indicate something was wrong
+                    return \Magento\Framework\Console\Cli::RETURN_FAILURE;
+                }
+            },
+            $output,
+            true
+        );
 
-            $this->cleanup($input, $output);
-            $this->maintenanceMode->disableMaintenanceMode($output);
-        } catch (\Exception $e) {
-            $output->writeln('<error>' . $e->getMessage() . '</error>');
-            $output->writeln('<error>Please disable maintenance mode after you resolved above issues</error>');
-            // we must have an exit code higher than zero to indicate something was wrong
-            return \Magento\Framework\Console\Cli::RETURN_FAILURE;
-        }
+        return $result;
     }
 
     /**
diff --git a/app/code/Magento/Theme/Test/Unit/Console/Command/ThemeUninstallCommandTest.php b/app/code/Magento/Theme/Test/Unit/Console/Command/ThemeUninstallCommandTest.php
index ff6a0409487..2ae889e69bb 100644
--- a/app/code/Magento/Theme/Test/Unit/Console/Command/ThemeUninstallCommandTest.php
+++ b/app/code/Magento/Theme/Test/Unit/Console/Command/ThemeUninstallCommandTest.php
@@ -6,6 +6,7 @@
 
 namespace Magento\Theme\Test\Unit\Console\Command;
 
+use Magento\Framework\App\Console\MaintenanceModeEnabler;
 use Magento\Theme\Console\Command\ThemeUninstallCommand;
 use Magento\Theme\Model\Theme\themePackageInfo;
 use Magento\Theme\Model\Theme\ThemeUninstaller;
@@ -19,7 +20,7 @@ use Magento\Framework\Setup\BackupRollbackFactory;
 class ThemeUninstallCommandTest extends \PHPUnit\Framework\TestCase
 {
     /**
-     * @var \Magento\Framework\App\Console\MaintenanceModeEnabler|\PHPUnit_Framework_MockObject_MockObject
+     * @var \Magento\Framework\App\Console\MaintenanceMode|\PHPUnit_Framework_MockObject_MockObject
      */
     private $maintenanceMode;
 
@@ -82,7 +83,7 @@ class ThemeUninstallCommandTest extends \PHPUnit\Framework\TestCase
 
     protected function setUp()
     {
-        $this->maintenanceMode = $this->createMock(\Magento\Framework\App\Console\MaintenanceModeEnabler::class);
+        $this->maintenanceMode = $this->createMock(\Magento\Framework\App\MaintenanceMode::class);
         $composerInformation = $this->createMock(\Magento\Framework\Composer\ComposerInformation::class);
         $composerInformation->expects($this->any())
             ->method('getRootRequiredPackages')
@@ -107,7 +108,8 @@ class ThemeUninstallCommandTest extends \PHPUnit\Framework\TestCase
             $this->themeValidator,
             $this->themePackageInfo,
             $this->themeUninstaller,
-            $this->themeDependencyChecker
+            $this->themeDependencyChecker,
+            new MaintenanceModeEnabler($this->maintenanceMode)
         );
         $this->tester = new CommandTester($this->command);
     }
@@ -304,9 +306,9 @@ class ThemeUninstallCommandTest extends \PHPUnit\Framework\TestCase
     {
         $this->setUpExecute();
         $this->cleanupFiles->expects($this->never())->method('clearMaterializedViewFiles');
-        $this->maintenanceMode->expects($this->once())->method('enableMaintenanceMode');
-        $this->maintenanceMode->expects($this->once())->method('disableMaintenanceMode');
         $this->tester->execute(['theme' => ['area/vendor/test']]);
+        $this->assertContains('Enabling maintenance mode', $this->tester->getDisplay());
+        $this->assertContains('Disabling maintenance mode', $this->tester->getDisplay());
         $this->assertContains('Alert: Generated static view files were not cleared.', $this->tester->getDisplay());
         $this->assertNotContains('Generated static view files cleared successfully', $this->tester->getDisplay());
     }
@@ -315,9 +317,9 @@ class ThemeUninstallCommandTest extends \PHPUnit\Framework\TestCase
     {
         $this->setUpExecute();
         $this->cleanupFiles->expects($this->once())->method('clearMaterializedViewFiles');
-        $this->maintenanceMode->expects($this->once())->method('enableMaintenanceMode');
-        $this->maintenanceMode->expects($this->once())->method('disableMaintenanceMode');
         $this->tester->execute(['theme' => ['area/vendor/test'], '-c' => true]);
+        $this->assertContains('Enabling maintenance mode', $this->tester->getDisplay());
+        $this->assertContains('Disabling maintenance mode', $this->tester->getDisplay());
         $this->assertNotContains('Alert: Generated static view files were not cleared.', $this->tester->getDisplay());
         $this->assertContains('Generated static view files cleared successfully', $this->tester->getDisplay());
     }
diff --git a/lib/internal/Magento/Framework/App/Console/MaintenanceModeEnabler.php b/lib/internal/Magento/Framework/App/Console/MaintenanceModeEnabler.php
index f2d106c5d36..6f834d50c51 100644
--- a/lib/internal/Magento/Framework/App/Console/MaintenanceModeEnabler.php
+++ b/lib/internal/Magento/Framework/App/Console/MaintenanceModeEnabler.php
@@ -38,7 +38,7 @@ class MaintenanceModeEnabler
      * @param OutputInterface $output
      * @return void
      */
-    public function enableMaintenanceMode(OutputInterface $output)
+    private function enableMaintenanceMode(OutputInterface $output)
     {
         if ($this->maintenanceMode->isOn()) {
             $this->skipDisableMaintenanceMode = true;
@@ -57,7 +57,7 @@ class MaintenanceModeEnabler
      * @param OutputInterface $output
      * @return void
      */
-    public function disableMaintenanceMode(OutputInterface $output)
+    private function disableMaintenanceMode(OutputInterface $output)
     {
         if ($this->skipDisableMaintenanceMode) {
             $output->writeln('<info>Skipped disabling maintenance mode</info>');
@@ -67,4 +67,30 @@ class MaintenanceModeEnabler
         $this->maintenanceMode->set(false);
         $output->writeln('<info>Disabling maintenance mode</info>');
     }
+
+    /**
+     * Run task in maintenance mode
+     *
+     * @param callable $task
+     * @param OutputInterface $output
+     * @param bool $holdMaintenanceOnFailure
+     * @return mixed
+     * @throws \Throwable if error occurred
+     */
+    public function executeInMaintenanceMode(callable $task, OutputInterface $output, bool $holdMaintenanceOnFailure)
+    {
+        $this->enableMaintenanceMode($output);
+
+        try {
+            $result = call_user_func($task);
+        } catch (\Throwable $e) {
+            if (!$holdMaintenanceOnFailure) {
+                $this->disableMaintenanceMode($output);
+            }
+            throw $e;
+        }
+
+        $this->disableMaintenanceMode($output);
+        return $result;
+    }
 }
diff --git a/lib/internal/Magento/Framework/App/Test/Unit/Console/MaintenanceModeEnablerTest.php b/lib/internal/Magento/Framework/App/Test/Unit/Console/MaintenanceModeEnablerTest.php
new file mode 100644
index 00000000000..ebd47c0dc89
--- /dev/null
+++ b/lib/internal/Magento/Framework/App/Test/Unit/Console/MaintenanceModeEnablerTest.php
@@ -0,0 +1,122 @@
+<?php
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Framework\App\Test\Unit\Console;
+
+use Magento\Framework\App\Console\MaintenanceModeEnabler;
+use Magento\Framework\App\MaintenanceMode;
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\Console\Output\OutputInterface;
+
+class MaintenanceModeEnablerTest extends TestCase
+{
+    /**
+     * @dataProvider initialAppStateProvider
+     */
+    public function testSuccessfulTask(bool $maintenanceModeEnabledInitially)
+    {
+        $maintenanceMode = $this->createMaintenanceMode($maintenanceModeEnabledInitially);
+        $enabler = new MaintenanceModeEnabler($maintenanceMode);
+        $successTask = function () {
+            // do nothing
+        };
+
+        $enabler->executeInMaintenanceMode(
+            $successTask,
+            $this->createOutput(),
+            true
+        );
+
+        $this->assertEquals(
+            $maintenanceModeEnabledInitially,
+            $maintenanceMode->isOn(),
+            'Initial state is not restored'
+        );
+    }
+
+    /**
+     * @dataProvider initialAppStateProvider
+     */
+    public function testFailedTaskWithMaintenanceModeOnFailure(bool $maintenanceModeEnabledInitially)
+    {
+        $maintenanceMode = $this->createMaintenanceMode($maintenanceModeEnabledInitially);
+        $enabler = new MaintenanceModeEnabler($maintenanceMode);
+        $failedTask = function () {
+            throw new \Exception('Woops!');
+        };
+
+        try {
+            $enabler->executeInMaintenanceMode(
+                $failedTask,
+                $this->createOutput(),
+                true
+            );
+        } catch (\Exception $e) {
+            $this->assertEquals(
+                true,
+                $maintenanceMode->isOn(),
+                'Maintenance mode is not active after failure'
+            );
+        }
+    }
+
+    /**
+     * @dataProvider initialAppStateProvider
+     */
+    public function testFailedTaskWithRestoredModeOnFailure(bool $maintenanceModeEnabledInitially)
+    {
+        $maintenanceMode = $this->createMaintenanceMode($maintenanceModeEnabledInitially);
+        $enabler = new MaintenanceModeEnabler($maintenanceMode);
+        $failedTask = function () {
+            throw new \Exception('Woops!');
+        };
+
+        try {
+            $enabler->executeInMaintenanceMode(
+                $failedTask,
+                $this->createOutput(),
+                false
+            );
+        } catch (\Exception $e) {
+            $this->assertEquals(
+                $maintenanceModeEnabledInitially,
+                $maintenanceMode->isOn(),
+                'Initial state is not restored'
+            );
+        }
+    }
+
+    public function initialAppStateProvider()
+    {
+        return [
+            'Maintenance mode disabled initially' => [false],
+            'Maintenance mode enabled initially' => [true],
+        ];
+    }
+
+    private function createMaintenanceMode(bool $isOn): MaintenanceMode
+    {
+        $maintenanceMode = $this->getMockBuilder(MaintenanceMode::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $maintenanceMode->method('isOn')->willReturnCallback(function () use (&$isOn) {
+                return $isOn;
+        });
+        $maintenanceMode->method('set')->willReturnCallback(function ($newValue) use (&$isOn) {
+            $isOn = (bool)$newValue;
+            return true;
+        });
+
+        return $maintenanceMode;
+    }
+
+    private function createOutput(): OutputInterface
+    {
+        $output = $this->getMockBuilder(OutputInterface::class)
+            ->getMockForAbstractClass();
+        return $output;
+    }
+}
diff --git a/setup/src/Magento/Setup/Console/Command/BackupCommand.php b/setup/src/Magento/Setup/Console/Command/BackupCommand.php
index 88164f96065..0c65d3db1f7 100644
--- a/setup/src/Magento/Setup/Console/Command/BackupCommand.php
+++ b/setup/src/Magento/Setup/Console/Command/BackupCommand.php
@@ -7,6 +7,7 @@ namespace Magento\Setup\Console\Command;
 
 use Magento\Framework\App\Console\MaintenanceModeEnabler;
 use Magento\Framework\App\DeploymentConfig;
+use Magento\Framework\App\MaintenanceMode;
 use Magento\Framework\Backup\Factory;
 use Magento\Framework\ObjectManagerInterface;
 use Magento\Framework\Setup\BackupRollbackFactory;
@@ -36,11 +37,6 @@ class BackupCommand extends AbstractSetupCommand
      */
     private $objectManager;
 
-    /**
-     * @var MaintenanceModeEnabler
-     */
-    private $maintenanceMode;
-
     /**
      * Factory for BackupRollback
      *
@@ -55,22 +51,32 @@ class BackupCommand extends AbstractSetupCommand
      */
     private $deploymentConfig;
 
+    /**
+     * @var MaintenanceModeEnabler
+     */
+    private $maintenanceModeEnabler;
+
     /**
      * Constructor
      *
      * @param ObjectManagerProvider $objectManagerProvider
-     * @param MaintenanceModeEnabler $maintenanceMode
+     * @param MaintenanceMode $maintenanceMode deprecated, use $maintenanceModeEnabler instead
      * @param DeploymentConfig $deploymentConfig
+     * @param MaintenanceModeEnabler $maintenanceModeEnabler
+     *
+     * @SuppressWarnings(PHPMD.UnusedFormalParameter)
      */
     public function __construct(
         ObjectManagerProvider $objectManagerProvider,
-        MaintenanceModeEnabler $maintenanceMode,
-        DeploymentConfig $deploymentConfig
+        MaintenanceMode $maintenanceMode,
+        DeploymentConfig $deploymentConfig,
+        MaintenanceModeEnabler $maintenanceModeEnabler = null
     ) {
         $this->objectManager = $objectManagerProvider->get();
-        $this->maintenanceMode = $maintenanceMode;
         $this->backupRollbackFactory = $this->objectManager->get(\Magento\Framework\Setup\BackupRollbackFactory::class);
         $this->deploymentConfig = $deploymentConfig;
+        $this->maintenanceModeEnabler =
+            $maintenanceModeEnabler ?: $this->objectManager->get(MaintenanceModeEnabler::class);
         parent::__construct();
     }
 
@@ -117,36 +123,40 @@ class BackupCommand extends AbstractSetupCommand
             // We need exit code higher than 0 here as an indication
             return \Magento\Framework\Console\Cli::RETURN_FAILURE;
         }
-        $returnValue = \Magento\Framework\Console\Cli::RETURN_SUCCESS;
-        try {
-            $inputOptionProvided = false;
-            $this->maintenanceMode->enableMaintenanceMode($output);
-            $time = time();
-            $backupHandler = $this->backupRollbackFactory->create($output);
-            if ($input->getOption(self::INPUT_KEY_CODE)) {
-                $backupHandler->codeBackup($time);
-                $inputOptionProvided = true;
-            }
-            if ($input->getOption(self::INPUT_KEY_MEDIA)) {
-                $backupHandler->codeBackup($time, Factory::TYPE_MEDIA);
-                $inputOptionProvided = true;
-            }
-            if ($input->getOption(self::INPUT_KEY_DB)) {
-                $this->setAreaCode();
-                $backupHandler->dbBackup($time);
-                $inputOptionProvided = true;
-            }
-            if (!$inputOptionProvided) {
-                throw new \InvalidArgumentException(
-                    'Not enough information provided to take backup.'
-                );
-            }
-        } catch (\Exception $e) {
-            $output->writeln('<error>' . $e->getMessage() . '</error>');
-            $returnValue =  \Magento\Framework\Console\Cli::RETURN_FAILURE;
-        } finally {
-            $this->maintenanceMode->disableMaintenanceMode($output);
-        }
+
+        $returnValue = $this->maintenanceModeEnabler->executeInMaintenanceMode(
+            function () use ($input, $output) {
+                try {
+                    $inputOptionProvided = false;
+                    $time = time();
+                    $backupHandler = $this->backupRollbackFactory->create($output);
+                    if ($input->getOption(self::INPUT_KEY_CODE)) {
+                        $backupHandler->codeBackup($time);
+                        $inputOptionProvided = true;
+                    }
+                    if ($input->getOption(self::INPUT_KEY_MEDIA)) {
+                        $backupHandler->codeBackup($time, Factory::TYPE_MEDIA);
+                        $inputOptionProvided = true;
+                    }
+                    if ($input->getOption(self::INPUT_KEY_DB)) {
+                        $this->setAreaCode();
+                        $backupHandler->dbBackup($time);
+                        $inputOptionProvided = true;
+                    }
+                    if (!$inputOptionProvided) {
+                        throw new \InvalidArgumentException(
+                            'Not enough information provided to take backup.'
+                        );
+                    }
+                    return \Magento\Framework\Console\Cli::RETURN_SUCCESS;
+                } catch (\Exception $e) {
+                    $output->writeln('<error>' . $e->getMessage() . '</error>');
+                    return \Magento\Framework\Console\Cli::RETURN_FAILURE;
+                }
+            },
+            $output,
+            false
+        );
         return $returnValue;
     }
 
diff --git a/setup/src/Magento/Setup/Console/Command/ModuleUninstallCommand.php b/setup/src/Magento/Setup/Console/Command/ModuleUninstallCommand.php
index 15dee6e2ee3..9740efa1a74 100644
--- a/setup/src/Magento/Setup/Console/Command/ModuleUninstallCommand.php
+++ b/setup/src/Magento/Setup/Console/Command/ModuleUninstallCommand.php
@@ -7,6 +7,7 @@ namespace Magento\Setup\Console\Command;
 
 use Magento\Framework\App\Console\MaintenanceModeEnabler;
 use Magento\Framework\App\DeploymentConfig;
+use Magento\Framework\App\MaintenanceMode;
 use Magento\Framework\Backup\Factory;
 use Magento\Framework\Composer\ComposerInformation;
 use Magento\Framework\Module\DependencyChecker;
@@ -38,11 +39,6 @@ class ModuleUninstallCommand extends AbstractModuleCommand
     const INPUT_KEY_BACKUP_MEDIA = 'backup-media';
     const INPUT_KEY_BACKUP_DB = 'backup-db';
 
-    /**
-     * @var MaintenanceModeEnabler
-     */
-    private $maintenanceMode;
-
     /**
      * Deployment Configuration
      *
@@ -106,32 +102,40 @@ class ModuleUninstallCommand extends AbstractModuleCommand
      */
     private $moduleRegistryUninstaller;
 
+    /**
+     * @var MaintenanceModeEnabler
+     */
+    private $maintenanceModeEnabler;
+
     /**
      * Constructor
      *
      * @param ComposerInformation $composer
      * @param DeploymentConfig $deploymentConfig
      * @param FullModuleList $fullModuleList
-     * @param MaintenanceModeEnabler $maintenanceMode
+     * @param MaintenanceMode $maintenanceMode deprecated, use $maintenanceModeEnabler instead
      * @param ObjectManagerProvider $objectManagerProvider
      * @param UninstallCollector $collector
      * @param ModuleUninstaller $moduleUninstaller
      * @param ModuleRegistryUninstaller $moduleRegistryUninstaller
+     * @param MaintenanceModeEnabler $maintenanceModeEnabler
+     *
+     * @SuppressWarnings(PHPMD.UnusedFormalParameter)
      */
     public function __construct(
         ComposerInformation $composer,
         DeploymentConfig $deploymentConfig,
         FullModuleList $fullModuleList,
-        MaintenanceModeEnabler $maintenanceMode,
+        MaintenanceMode $maintenanceMode,
         ObjectManagerProvider $objectManagerProvider,
         UninstallCollector $collector,
         ModuleUninstaller $moduleUninstaller,
-        ModuleRegistryUninstaller $moduleRegistryUninstaller
+        ModuleRegistryUninstaller $moduleRegistryUninstaller,
+        MaintenanceModeEnabler $maintenanceModeEnabler = null
     ) {
         parent::__construct($objectManagerProvider);
         $this->composer = $composer;
         $this->deploymentConfig = $deploymentConfig;
-        $this->maintenanceMode = $maintenanceMode;
         $this->fullModuleList = $fullModuleList;
         $this->packageInfo = $this->objectManager->get(\Magento\Framework\Module\PackageInfoFactory::class)->create();
         $this->collector = $collector;
@@ -139,6 +143,8 @@ class ModuleUninstallCommand extends AbstractModuleCommand
         $this->backupRollbackFactory = $this->objectManager->get(\Magento\Framework\Setup\BackupRollbackFactory::class);
         $this->moduleUninstaller = $moduleUninstaller;
         $this->moduleRegistryUninstaller = $moduleRegistryUninstaller;
+        $this->maintenanceModeEnabler =
+            $maintenanceModeEnabler ?: $this->objectManager->get(MaintenanceModeEnabler::class);
     }
 
     /**
@@ -225,39 +231,47 @@ class ModuleUninstallCommand extends AbstractModuleCommand
         if (!$helper->ask($input, $output, $question) && $input->isInteractive()) {
             return \Magento\Framework\Console\Cli::RETURN_FAILURE;
         }
-        try {
-            $this->maintenanceMode->enableMaintenanceMode($output);
-            $this->takeBackup($input, $output);
-            $dbBackupOption = $input->getOption(self::INPUT_KEY_BACKUP_DB);
-            if ($input->getOption(self::INPUT_KEY_REMOVE_DATA)) {
-                $this->removeData($modules, $output, $dbBackupOption);
-            } else {
-                if (!empty($this->collector->collectUninstall())) {
-                    $question = new ConfirmationQuestion(
-                        'You are about to remove a module(s) that might have database data. '
-                        . 'Do you want to remove the data from database?[y/N]',
-                        false
-                    );
-                    if ($helper->ask($input, $output, $question) || !$input->isInteractive()) {
+
+        $result = $this->maintenanceModeEnabler->executeInMaintenanceMode(
+            function () use ($input, $output, $modules, $helper) {
+                try {
+                    $this->takeBackup($input, $output);
+                    $dbBackupOption = $input->getOption(self::INPUT_KEY_BACKUP_DB);
+                    if ($input->getOption(self::INPUT_KEY_REMOVE_DATA)) {
                         $this->removeData($modules, $output, $dbBackupOption);
+                    } else {
+                        if (!empty($this->collector->collectUninstall())) {
+                            $question = new ConfirmationQuestion(
+                                'You are about to remove a module(s) that might have database data. '
+                                . 'Do you want to remove the data from database?[y/N]',
+                                false
+                            );
+                            if ($helper->ask($input, $output, $question) || !$input->isInteractive()) {
+                                $this->removeData($modules, $output, $dbBackupOption);
+                            }
+                        } else {
+                            $output->writeln(
+                                '<info>You are about to remove a module(s) that might have database data. '
+                                . 'Remove the database data manually after uninstalling, if desired.</info>'
+                            );
+                        }
                     }
-                } else {
-                    $output->writeln(
-                        '<info>You are about to remove a module(s) that might have database data. '
-                        . 'Remove the database data manually after uninstalling, if desired.</info>'
-                    );
+                    $this->moduleRegistryUninstaller->removeModulesFromDb($output, $modules);
+                    $this->moduleRegistryUninstaller->removeModulesFromDeploymentConfig($output, $modules);
+                    $this->moduleUninstaller->uninstallCode($output, $modules);
+                    $this->cleanup($input, $output);
+                    return \Magento\Framework\Console\Cli::RETURN_SUCCESS;
+                } catch (\Exception $e) {
+                    $output->writeln('<error>' . $e->getMessage() . '</error>');
+                    $output->writeln('<error>Please disable maintenance mode after you resolved above issues</error>');
+                    return \Magento\Framework\Console\Cli::RETURN_FAILURE;
                 }
-            }
-            $this->moduleRegistryUninstaller->removeModulesFromDb($output, $modules);
-            $this->moduleRegistryUninstaller->removeModulesFromDeploymentConfig($output, $modules);
-            $this->moduleUninstaller->uninstallCode($output, $modules);
-            $this->cleanup($input, $output);
-            $this->maintenanceMode->disableMaintenanceMode($output);
-        } catch (\Exception $e) {
-            $output->writeln('<error>' . $e->getMessage() . '</error>');
-            $output->writeln('<error>Please disable maintenance mode after you resolved above issues</error>');
-            return \Magento\Framework\Console\Cli::RETURN_FAILURE;
-        }
+            },
+            $output,
+            true
+        );
+
+        return $result;
     }
 
     /**
diff --git a/setup/src/Magento/Setup/Console/Command/RollbackCommand.php b/setup/src/Magento/Setup/Console/Command/RollbackCommand.php
index afe433d55c1..d67e7f0a537 100644
--- a/setup/src/Magento/Setup/Console/Command/RollbackCommand.php
+++ b/setup/src/Magento/Setup/Console/Command/RollbackCommand.php
@@ -7,6 +7,7 @@ namespace Magento\Setup\Console\Command;
 
 use Magento\Framework\App\Console\MaintenanceModeEnabler;
 use Magento\Framework\App\DeploymentConfig;
+use Magento\Framework\App\MaintenanceMode;
 use Magento\Framework\Backup\Factory;
 use Magento\Framework\ObjectManagerInterface;
 use Magento\Framework\Setup\BackupRollbackFactory;
@@ -37,11 +38,6 @@ class RollbackCommand extends AbstractSetupCommand
      */
     private $objectManager;
 
-    /**
-     * @var MaintenanceModeEnabler
-     */
-    private $maintenanceMode;
-
     /**
      * @var BackupRollbackFactory
      */
@@ -54,22 +50,33 @@ class RollbackCommand extends AbstractSetupCommand
      */
     private $deploymentConfig;
 
+    /**
+     * @var MaintenanceModeEnabler
+     */
+    private $maintenanceModeEnabler;
+
     /**
      * Constructor
      *
      * @param ObjectManagerProvider $objectManagerProvider
-     * @param MaintenanceModeEnabler $maintenanceMode
+     * @param MaintenanceMode $maintenanceMode deprecated, use $maintenanceModeEnabler instead
      * @param DeploymentConfig $deploymentConfig
+     * @param MaintenanceModeEnabler $maintenanceModeEnabler
+     *
+     * @SuppressWarnings(PHPMD.UnusedFormalParameter)
      */
     public function __construct(
         ObjectManagerProvider $objectManagerProvider,
-        MaintenanceModeEnabler $maintenanceMode,
-        DeploymentConfig $deploymentConfig
+        MaintenanceMode $maintenanceMode,
+        DeploymentConfig $deploymentConfig,
+        MaintenanceModeEnabler $maintenanceModeEnabler = null
     ) {
         $this->objectManager = $objectManagerProvider->get();
-        $this->maintenanceMode = $maintenanceMode;
+        $this->maintenanceModeEnabler = $maintenanceMode;
         $this->backupRollbackFactory = $this->objectManager->get(\Magento\Framework\Setup\BackupRollbackFactory::class);
         $this->deploymentConfig = $deploymentConfig;
+        $this->maintenanceModeEnabler =
+            $maintenanceModeEnabler ?: $this->objectManager->get(MaintenanceModeEnabler::class);
         parent::__construct();
     }
 
@@ -115,26 +122,32 @@ class RollbackCommand extends AbstractSetupCommand
             // we must have an exit code higher than zero to indicate something was wrong
             return \Magento\Framework\Console\Cli::RETURN_FAILURE;
         }
-        $returnValue = \Magento\Framework\Console\Cli::RETURN_SUCCESS;
-        try {
-            $this->maintenanceMode->enableMaintenanceMode($output);
-            $helper = $this->getHelper('question');
-            $question = new ConfirmationQuestion(
-                '<info>You are about to remove current code and/or database tables. Are you sure?[y/N]<info>',
-                false
-            );
-            if (!$helper->ask($input, $output, $question) && $input->isInteractive()) {
-                return \Magento\Framework\Console\Cli::RETURN_FAILURE;
-            }
-            $this->doRollback($input, $output);
-            $output->writeln('<info>Please set file permission of bin/magento to executable</info>');
-        } catch (\Exception $e) {
-            $output->writeln('<error>' . $e->getMessage() . '</error>');
-            // we must have an exit code higher than zero to indicate something was wrong
-            $returnValue = \Magento\Framework\Console\Cli::RETURN_FAILURE;
-        } finally {
-            $this->maintenanceMode->disableMaintenanceMode($output);
-        }
+
+        $returnValue = $this->maintenanceModeEnabler->executeInMaintenanceMode(
+            function () use ($input, $output, &$returnValue) {
+                try {
+                    $helper = $this->getHelper('question');
+                    $question = new ConfirmationQuestion(
+                        '<info>You are about to remove current code and/or database tables. Are you sure?[y/N]<info>',
+                        false
+                    );
+                    if (!$helper->ask($input, $output, $question) && $input->isInteractive()) {
+                        return \Magento\Framework\Console\Cli::RETURN_FAILURE;
+                    }
+                    $this->doRollback($input, $output);
+                    $output->writeln('<info>Please set file permission of bin/magento to executable</info>');
+
+                    return \Magento\Framework\Console\Cli::RETURN_SUCCESS;
+                } catch (\Exception $e) {
+                    $output->writeln('<error>' . $e->getMessage() . '</error>');
+                    // we must have an exit code higher than zero to indicate something was wrong
+                    return \Magento\Framework\Console\Cli::RETURN_FAILURE;
+                }
+            },
+            $output,
+            false
+        );
+
         return $returnValue;
     }
 
diff --git a/setup/src/Magento/Setup/Test/Unit/Console/Command/BackupCommandTest.php b/setup/src/Magento/Setup/Test/Unit/Console/Command/BackupCommandTest.php
index f28d7756f7d..e8179cff4a9 100644
--- a/setup/src/Magento/Setup/Test/Unit/Console/Command/BackupCommandTest.php
+++ b/setup/src/Magento/Setup/Test/Unit/Console/Command/BackupCommandTest.php
@@ -5,6 +5,7 @@
  */
 namespace Magento\Setup\Test\Unit\Console\Command;
 
+use Magento\Framework\App\Console\MaintenanceModeEnabler;
 use Magento\Setup\Console\Command\BackupCommand;
 use Symfony\Component\Console\Tester\CommandTester;
 
@@ -35,14 +36,9 @@ class BackupCommandTest extends \PHPUnit\Framework\TestCase
      */
     private $deploymentConfig;
 
-    /**
-     * @var \Magento\Framework\App\Console\MaintenanceModeEnabler|\PHPUnit_Framework_MockObject_MockObject
-     */
-    private $maintenanceMode;
-
     public function setUp()
     {
-        $this->maintenanceMode = $this->createMock(\Magento\Framework\App\Console\MaintenanceModeEnabler::class);
+        $maintenanceMode = $this->createMock(\Magento\Framework\App\MaintenanceMode::class);
         $objectManagerProvider = $this->createMock(\Magento\Setup\Model\ObjectManagerProvider::class);
         $this->objectManager = $this->getMockForAbstractClass(
             \Magento\Framework\ObjectManagerInterface::class,
@@ -77,8 +73,9 @@ class BackupCommandTest extends \PHPUnit\Framework\TestCase
             );
         $command = new BackupCommand(
             $objectManagerProvider,
-            $this->maintenanceMode,
-            $this->deploymentConfig
+            $maintenanceMode,
+            $this->deploymentConfig,
+            new MaintenanceModeEnabler($maintenanceMode)
         );
         $this->tester = new CommandTester($command);
     }
@@ -133,10 +130,10 @@ class BackupCommandTest extends \PHPUnit\Framework\TestCase
         $this->deploymentConfig->expects($this->once())
             ->method('isAvailable')
             ->will($this->returnValue(false));
-        $this->maintenanceMode->expects($this->once())->method('enableMaintenanceMode');
-        $this->maintenanceMode->expects($this->once())->method('disableMaintenanceMode');
         $this->tester->execute([]);
-        $expected = 'Not enough information provided to take backup.' . PHP_EOL;
+        $expected = 'Enabling maintenance mode' . PHP_EOL
+            . 'Not enough information provided to take backup.' . PHP_EOL
+            . 'Disabling maintenance mode' . PHP_EOL;
         $this->assertSame($expected, $this->tester->getDisplay());
     }
 }
diff --git a/setup/src/Magento/Setup/Test/Unit/Console/Command/ModuleUninstallCommandTest.php b/setup/src/Magento/Setup/Test/Unit/Console/Command/ModuleUninstallCommandTest.php
index 50bdce4e425..b6674c9aac9 100644
--- a/setup/src/Magento/Setup/Test/Unit/Console/Command/ModuleUninstallCommandTest.php
+++ b/setup/src/Magento/Setup/Test/Unit/Console/Command/ModuleUninstallCommandTest.php
@@ -5,6 +5,7 @@
  */
 namespace Magento\Setup\Test\Unit\Console\Command;
 
+use Magento\Framework\App\Console\MaintenanceModeEnabler;
 use Magento\Setup\Console\Command\ModuleUninstallCommand;
 use Magento\Setup\Model\ModuleUninstaller;
 use Symfony\Component\Console\Tester\CommandTester;
@@ -26,7 +27,7 @@ class ModuleUninstallCommandTest extends \PHPUnit\Framework\TestCase
     private $fullModuleList;
 
     /**
-     * @var \Magento\Framework\App\Console\MaintenanceModeEnabler|\PHPUnit_Framework_MockObject_MockObject
+     * @var \Magento\Framework\App\MaintenanceMode|\PHPUnit_Framework_MockObject_MockObject
      */
     private $maintenanceMode;
 
@@ -102,7 +103,7 @@ class ModuleUninstallCommandTest extends \PHPUnit\Framework\TestCase
     {
         $this->deploymentConfig = $this->createMock(\Magento\Framework\App\DeploymentConfig::class);
         $this->fullModuleList = $this->createMock(\Magento\Framework\Module\FullModuleList::class);
-        $this->maintenanceMode = $this->createMock(\Magento\Framework\App\Console\MaintenanceModeEnabler::class);
+        $this->maintenanceMode = $this->createMock(\Magento\Framework\App\MaintenanceMode::class);
         $objectManagerProvider = $this->createMock(\Magento\Setup\Model\ObjectManagerProvider::class);
         $objectManager = $this->getMockForAbstractClass(
             \Magento\Framework\ObjectManagerInterface::class,
@@ -158,7 +159,8 @@ class ModuleUninstallCommandTest extends \PHPUnit\Framework\TestCase
             $objectManagerProvider,
             $this->uninstallCollector,
             $this->moduleUninstaller,
-            $this->moduleRegistryUninstaller
+            $this->moduleRegistryUninstaller,
+            new MaintenanceModeEnabler($this->maintenanceMode)
         );
         $this->question = $this->createMock(\Symfony\Component\Console\Helper\QuestionHelper::class);
         $this->question
diff --git a/setup/src/Magento/Setup/Test/Unit/Console/Command/RollbackCommandTest.php b/setup/src/Magento/Setup/Test/Unit/Console/Command/RollbackCommandTest.php
index 300caaa0333..9ced38c3166 100644
--- a/setup/src/Magento/Setup/Test/Unit/Console/Command/RollbackCommandTest.php
+++ b/setup/src/Magento/Setup/Test/Unit/Console/Command/RollbackCommandTest.php
@@ -5,9 +5,13 @@
  */
 namespace Magento\Setup\Test\Unit\Console\Command;
 
+use Magento\Framework\App\Console\MaintenanceModeEnabler;
 use Magento\Setup\Console\Command\RollbackCommand;
 use Symfony\Component\Console\Tester\CommandTester;
 
+/**
+ * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
+ */
 class RollbackCommandTest extends \PHPUnit\Framework\TestCase
 {
     /**
@@ -50,15 +54,10 @@ class RollbackCommandTest extends \PHPUnit\Framework\TestCase
      */
     private $command;
 
-    /**
-     * @var \Magento\Framework\App\Console\MaintenanceModeEnabler|\PHPUnit_Framework_MockObject_MockObject
-     */
-    private $maintenanceMode;
-
     public function setUp()
     {
         $this->deploymentConfig = $this->createMock(\Magento\Framework\App\DeploymentConfig::class);
-        $this->maintenanceMode = $this->createMock(\Magento\Framework\App\Console\MaintenanceModeEnabler::class);
+        $maintenanceMode = $this->createMock(\Magento\Framework\App\MaintenanceMode::class);
         $this->objectManager = $this->getMockForAbstractClass(
             \Magento\Framework\ObjectManagerInterface::class,
             [],
@@ -100,8 +99,9 @@ class RollbackCommandTest extends \PHPUnit\Framework\TestCase
             ->will($this->returnValue($this->question));
         $this->command = new RollbackCommand(
             $objectManagerProvider,
-            $this->maintenanceMode,
-            $this->deploymentConfig
+            $maintenanceMode,
+            $this->deploymentConfig,
+            new MaintenanceModeEnabler($maintenanceMode)
         );
         $this->command->setHelperSet($this->helperSet);
         $this->tester = new CommandTester($this->command);
@@ -157,10 +157,10 @@ class RollbackCommandTest extends \PHPUnit\Framework\TestCase
         $this->deploymentConfig->expects($this->once())
             ->method('isAvailable')
             ->will($this->returnValue(true));
-        $this->maintenanceMode->expects($this->once())->method('enableMaintenanceMode');
-        $this->maintenanceMode->expects($this->once())->method('disableMaintenanceMode');
         $this->tester->execute([]);
-        $expected = 'Not enough information provided to roll back.' . PHP_EOL;
+        $expected = 'Enabling maintenance mode' . PHP_EOL
+            . 'Not enough information provided to roll back.' . PHP_EOL
+            . 'Disabling maintenance mode' . PHP_EOL;
         $this->assertSame($expected, $this->tester->getDisplay());
     }
 
-- 
GitLab


From ed2886fe1bf7b93761266f718322e940e27eaa77 Mon Sep 17 00:00:00 2001
From: Cy Kirsch <cykirsch@gmail.com>
Date: Thu, 30 Nov 2017 11:48:13 -0600
Subject: [PATCH 230/380] Fix code style issues

---
 .../Framework/App/DeploymentConfig/Writer/PhpFormatter.php   | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/lib/internal/Magento/Framework/App/DeploymentConfig/Writer/PhpFormatter.php b/lib/internal/Magento/Framework/App/DeploymentConfig/Writer/PhpFormatter.php
index ef0b3a5d290..6556a0472f9 100644
--- a/lib/internal/Magento/Framework/App/DeploymentConfig/Writer/PhpFormatter.php
+++ b/lib/internal/Magento/Framework/App/DeploymentConfig/Writer/PhpFormatter.php
@@ -76,7 +76,8 @@ class PhpFormatter implements FormatterInterface
      * @param integer $depth
      * @return string
      */
-    private function varExportShort($var, $depth=0) {
+    private function varExportShort($var, $depth = 0)
+    {
         if (gettype($var) === 'array') {
             $indexed = array_keys($var) === range(0, count($var) - 1);
             $r = [];
@@ -88,6 +89,6 @@ class PhpFormatter implements FormatterInterface
             return sprintf("[\n%s\n%s]", implode(",\n", $r), str_repeat(self::INDENT, $depth - 1));
         }
 
-        return var_export($var, TRUE);
+        return var_export($var, true);
     }
 }
-- 
GitLab


From 9c5420fb378d2de46be4fdcd842e514e7206dfbc Mon Sep 17 00:00:00 2001
From: Pascal Brouwers <pascal@h-o.nl>
Date: Fri, 1 Dec 2017 10:31:29 +0100
Subject: [PATCH 231/380] Issue 12506: Fixup typo getDispretionPath ->
 getDispersionPath

---
 app/code/Magento/Catalog/Model/Product/Gallery/Processor.php  | 2 +-
 .../Catalog/Model/Product/Option/Type/File/ValidatorFile.php  | 2 +-
 app/code/Magento/Customer/Model/FileProcessor.php             | 2 +-
 .../Controller/Adminhtml/Product/Gallery/RetrieveImage.php    | 4 ++--
 lib/internal/Magento/Framework/File/Uploader.php              | 4 ++--
 5 files changed, 7 insertions(+), 7 deletions(-)

diff --git a/app/code/Magento/Catalog/Model/Product/Gallery/Processor.php b/app/code/Magento/Catalog/Model/Product/Gallery/Processor.php
index 31e322f4e38..ac2a01f9c5a 100644
--- a/app/code/Magento/Catalog/Model/Product/Gallery/Processor.php
+++ b/app/code/Magento/Catalog/Model/Product/Gallery/Processor.php
@@ -149,7 +149,7 @@ class Processor
         }
 
         $fileName = \Magento\MediaStorage\Model\File\Uploader::getCorrectFileName($pathinfo['basename']);
-        $dispretionPath = \Magento\MediaStorage\Model\File\Uploader::getDispretionPath($fileName);
+        $dispretionPath = \Magento\MediaStorage\Model\File\Uploader::getDispersionPath($fileName);
         $fileName = $dispretionPath . '/' . $fileName;
 
         $fileName = $this->getNotDuplicatedFilename($fileName, $dispretionPath);
diff --git a/app/code/Magento/Catalog/Model/Product/Option/Type/File/ValidatorFile.php b/app/code/Magento/Catalog/Model/Product/Option/Type/File/ValidatorFile.php
index af6c4dba784..b54c66d75a0 100644
--- a/app/code/Magento/Catalog/Model/Product/Option/Type/File/ValidatorFile.php
+++ b/app/code/Magento/Catalog/Model/Product/Option/Type/File/ValidatorFile.php
@@ -150,7 +150,7 @@ class ValidatorFile extends Validator
             $extension = pathinfo(strtolower($fileInfo['name']), PATHINFO_EXTENSION);
 
             $fileName = \Magento\MediaStorage\Model\File\Uploader::getCorrectFileName($fileInfo['name']);
-            $dispersion = \Magento\MediaStorage\Model\File\Uploader::getDispretionPath($fileName);
+            $dispersion = \Magento\MediaStorage\Model\File\Uploader::getDispersionPath($fileName);
 
             $filePath = $dispersion;
 
diff --git a/app/code/Magento/Customer/Model/FileProcessor.php b/app/code/Magento/Customer/Model/FileProcessor.php
index 2d6917efdaf..6a8472758c1 100644
--- a/app/code/Magento/Customer/Model/FileProcessor.php
+++ b/app/code/Magento/Customer/Model/FileProcessor.php
@@ -202,7 +202,7 @@ class FileProcessor
     {
         $fileName = ltrim($fileName, '/');
 
-        $dispersionPath = \Magento\MediaStorage\Model\File\Uploader::getDispretionPath($fileName);
+        $dispersionPath = \Magento\MediaStorage\Model\File\Uploader::getDispersionPath($fileName);
         $destinationPath = $this->entityTypeCode . $dispersionPath;
 
         if (!$this->mediaDirectory->create($destinationPath)) {
diff --git a/app/code/Magento/ProductVideo/Controller/Adminhtml/Product/Gallery/RetrieveImage.php b/app/code/Magento/ProductVideo/Controller/Adminhtml/Product/Gallery/RetrieveImage.php
index 3658e36a82e..9950526182e 100644
--- a/app/code/Magento/ProductVideo/Controller/Adminhtml/Product/Gallery/RetrieveImage.php
+++ b/app/code/Magento/ProductVideo/Controller/Adminhtml/Product/Gallery/RetrieveImage.php
@@ -110,7 +110,7 @@ class RetrieveImage extends \Magento\Backend\App\Action
             $remoteFileUrl = $this->getRequest()->getParam('remote_image');
             $this->validateRemoteFile($remoteFileUrl);
             $localFileName = Uploader::getCorrectFileName(basename($remoteFileUrl));
-            $localTmpFileName = Uploader::getDispretionPath($localFileName) . DIRECTORY_SEPARATOR . $localFileName;
+            $localTmpFileName = Uploader::getDispersionPath($localFileName) . DIRECTORY_SEPARATOR . $localFileName;
             $localFilePath = $baseTmpMediaPath . ($localTmpFileName);
             $localUniqFilePath = $this->appendNewFileName($localFilePath);
             $this->validateRemoteFileExtensions($localUniqFilePath);
@@ -174,7 +174,7 @@ class RetrieveImage extends \Magento\Backend\App\Action
     protected function appendResultSaveRemoteImage($fileName)
     {
         $fileInfo = pathinfo($fileName);
-        $tmpFileName = Uploader::getDispretionPath($fileInfo['basename']) . DIRECTORY_SEPARATOR . $fileInfo['basename'];
+        $tmpFileName = Uploader::getDispersionPath($fileInfo['basename']) . DIRECTORY_SEPARATOR . $fileInfo['basename'];
         $result['name'] = $fileInfo['basename'];
         $result['type'] = $this->imageAdapter->getMimeType();
         $result['error'] = 0;
diff --git a/lib/internal/Magento/Framework/File/Uploader.php b/lib/internal/Magento/Framework/File/Uploader.php
index c3316db7be0..e86277b905b 100644
--- a/lib/internal/Magento/Framework/File/Uploader.php
+++ b/lib/internal/Magento/Framework/File/Uploader.php
@@ -201,7 +201,7 @@ class Uploader
         if ($this->_enableFilesDispersion) {
             $fileName = $this->correctFileNameCase($fileName);
             $this->setAllowCreateFolders(true);
-            $this->_dispretionPath = self::getDispretionPath($fileName);
+            $this->_dispretionPath = self::getDispersionPath($fileName);
             $destinationFile .= $this->_dispretionPath;
             $this->_createDestinationFolder($destinationFile);
         }
@@ -611,7 +611,7 @@ class Uploader
      * @param string $fileName
      * @return string
      */
-    public static function getDispretionPath($fileName)
+    public static function getDispersionPath($fileName)
     {
         $char = 0;
         $dispertionPath = '';
-- 
GitLab


From 88f218d372f4654cebbe248f8e0a014e916c68ab Mon Sep 17 00:00:00 2001
From: magento-engcom-team <mikola.malevanec@transoftgroup.com>
Date: Fri, 1 Dec 2017 11:50:19 +0200
Subject: [PATCH 232/380] 12110: Missing cascade into attribute set deletion.

---
 .../RemoveProducts.php}                       | 42 ++++---------------
 .../Magento/Catalog/Setup/UpgradeSchema.php   | 22 ++++++++++
 .../RemoveProductsTest.php}                   | 38 ++++-------------
 app/code/Magento/Catalog/etc/adminhtml/di.xml |  3 ++
 app/code/Magento/Catalog/etc/module.xml       |  2 +-
 .../CatalogUrlRewrite/etc/adminhtml/di.xml    |  3 --
 .../RemoveProductsTest.php}                   | 20 ++++++---
 .../_files/attribute_set_with_product.php     |  0
 .../attribute_set_with_product_rollback.php   |  0
 9 files changed, 57 insertions(+), 73 deletions(-)
 rename app/code/Magento/{CatalogUrlRewrite/Plugin/Eav/AttributeSetRepository/RemoveProductUrlRewrite.php => Catalog/Plugin/Model/AttributeSetRepository/RemoveProducts.php} (50%)
 rename app/code/Magento/{CatalogUrlRewrite/Test/Unit/Plugin/Eav/AttributeSetRepository/RemoveProductUrlRewriteTest.php => Catalog/Test/Unit/Plugin/Model/AttributeSetRepository/RemoveProductsTest.php} (65%)
 rename dev/tests/integration/testsuite/Magento/{CatalogUrlRewrite/Plugin/Eav/AttributeSetRepository/RemoveProductUrlRewriteTest.php => Catalog/Plugin/Model/AttributeSetRepository/RemoveProductsTest.php} (67%)
 rename dev/tests/integration/testsuite/Magento/{CatalogUrlRewrite => Catalog}/_files/attribute_set_with_product.php (100%)
 rename dev/tests/integration/testsuite/Magento/{CatalogUrlRewrite => Catalog}/_files/attribute_set_with_product_rollback.php (100%)

diff --git a/app/code/Magento/CatalogUrlRewrite/Plugin/Eav/AttributeSetRepository/RemoveProductUrlRewrite.php b/app/code/Magento/Catalog/Plugin/Model/AttributeSetRepository/RemoveProducts.php
similarity index 50%
rename from app/code/Magento/CatalogUrlRewrite/Plugin/Eav/AttributeSetRepository/RemoveProductUrlRewrite.php
rename to app/code/Magento/Catalog/Plugin/Model/AttributeSetRepository/RemoveProducts.php
index 82a25531757..bc6de17f90c 100644
--- a/app/code/Magento/CatalogUrlRewrite/Plugin/Eav/AttributeSetRepository/RemoveProductUrlRewrite.php
+++ b/app/code/Magento/Catalog/Plugin/Model/AttributeSetRepository/RemoveProducts.php
@@ -4,50 +4,37 @@
  * See COPYING.txt for license details.
  */
 
-namespace Magento\CatalogUrlRewrite\Plugin\Eav\AttributeSetRepository;
+namespace Magento\Catalog\Plugin\Model\AttributeSetRepository;
 
 use Magento\Catalog\Model\ResourceModel\Product\Collection;
 use Magento\Catalog\Model\ResourceModel\Product\CollectionFactory;
-use Magento\CatalogUrlRewrite\Model\ProductUrlRewriteGenerator;
 use Magento\Eav\Api\AttributeSetRepositoryInterface;
 use Magento\Eav\Api\Data\AttributeSetInterface;
-use Magento\UrlRewrite\Model\UrlPersistInterface;
-use Magento\UrlRewrite\Service\V1\Data\UrlRewrite;
 
 /**
- * Remove url rewrites for products with given attribute set.
+ * Delete related products after attribute set successfully removed.
  */
-class RemoveProductUrlRewrite
+class RemoveProducts
 {
     /**
-     * @var int
-     */
-    private $chunkSize = 1000;
-
-    /**
-     * @var UrlPersistInterface
-     */
-    private $urlPersist;
-
-    /**
+     * Retrieve products related to specific attribute set.
+     *
      * @var CollectionFactory
      */
     private $collectionFactory;
 
     /**
-     * ProductUrlRewriteProcessor constructor.
+     * RemoveProducts constructor.
      *
-     * @param UrlPersistInterface $urlPersist
      * @param CollectionFactory $collectionFactory
      */
-    public function __construct(UrlPersistInterface $urlPersist, CollectionFactory $collectionFactory)
+    public function __construct(CollectionFactory $collectionFactory)
     {
-        $this->urlPersist = $urlPersist;
         $this->collectionFactory = $collectionFactory;
     }
 
     /**
-     * Remove url rewrites for products with given attribute set.
+     * Delete related to specific attribute set products, if attribute set was removed successfully.
      *
      * @param AttributeSetRepositoryInterface $subject
      * @param \Closure $proceed
@@ -64,19 +51,8 @@ class RemoveProductUrlRewrite
         /** @var Collection $productCollection */
         $productCollection = $this->collectionFactory->create();
         $productCollection->addFieldToFilter('attribute_set_id', ['eq' => $attributeSet->getId()]);
-        $productIds = $productCollection->getAllIds();
         $result = $proceed($attributeSet);
-        if (!empty($productIds)) {
-            $productIds = array_chunk($productIds, $this->chunkSize);
-            foreach ($productIds as $ids) {
-                $this->urlPersist->deleteByData(
-                    [
-                        UrlRewrite::ENTITY_ID => $ids,
-                        UrlRewrite::ENTITY_TYPE => ProductUrlRewriteGenerator::ENTITY_TYPE,
-                    ]
-                );
-            }
-        }
+        $productCollection->delete();
 
         return $result;
     }
diff --git a/app/code/Magento/Catalog/Setup/UpgradeSchema.php b/app/code/Magento/Catalog/Setup/UpgradeSchema.php
index 616bee43de0..ae09ff11136 100755
--- a/app/code/Magento/Catalog/Setup/UpgradeSchema.php
+++ b/app/code/Magento/Catalog/Setup/UpgradeSchema.php
@@ -126,6 +126,10 @@ class UpgradeSchema implements UpgradeSchemaInterface
             $this->fixCustomerGroupIdColumn($setup);
         }
 
+        if (version_compare($context->getVersion(), '2.2.4', '<')) {
+            $this->removeAttributeSetRelation($setup);
+        }
+
         $setup->endSetup();
     }
 
@@ -699,4 +703,22 @@ class UpgradeSchema implements UpgradeSchemaInterface
         );
         $setup->getConnection()->query($sql);
     }
+
+    /**
+     * Remove foreign key between catalog_product_entity and eav_attribute_set tables.
+     * Drop foreign key to delegate cascade on delete to plugin.
+     * @see \Magento\Catalog\Plugin\Model\AttributeSetRepository\RemoveProducts
+     *
+     * @param SchemaSetupInterface $setup
+     * @return void
+     */
+    private function removeAttributeSetRelation(SchemaSetupInterface $setup)
+    {
+        $productTable = $setup->getTable('catalog_product_entity');
+        $attributeSetTable = $setup->getTable('eav_attribute_set');
+        $setup->getConnection()->dropForeignKey(
+            $productTable,
+            $setup->getFkName($productTable, 'attribute_set_id', $attributeSetTable, 'attribute_set_id')
+        );
+    }
 }
diff --git a/app/code/Magento/CatalogUrlRewrite/Test/Unit/Plugin/Eav/AttributeSetRepository/RemoveProductUrlRewriteTest.php b/app/code/Magento/Catalog/Test/Unit/Plugin/Model/AttributeSetRepository/RemoveProductsTest.php
similarity index 65%
rename from app/code/Magento/CatalogUrlRewrite/Test/Unit/Plugin/Eav/AttributeSetRepository/RemoveProductUrlRewriteTest.php
rename to app/code/Magento/Catalog/Test/Unit/Plugin/Model/AttributeSetRepository/RemoveProductsTest.php
index cf2337bf7c7..a8eb757646e 100644
--- a/app/code/Magento/CatalogUrlRewrite/Test/Unit/Plugin/Eav/AttributeSetRepository/RemoveProductUrlRewriteTest.php
+++ b/app/code/Magento/Catalog/Test/Unit/Plugin/Model/AttributeSetRepository/RemoveProductsTest.php
@@ -4,26 +4,23 @@
  * See COPYING.txt for license details.
  */
 
-namespace Magento\CatalogUrlRewrite\Test\Unit\Plugin\Eav\AttributeSetRepository;
+namespace Magento\Catalog\Test\Unit\Plugin\Model\AttributeSetRepository;
 
 use Magento\Catalog\Model\ResourceModel\Product\Collection;
 use Magento\Catalog\Model\ResourceModel\Product\CollectionFactory;
-use Magento\CatalogUrlRewrite\Model\ProductUrlRewriteGenerator;
-use Magento\CatalogUrlRewrite\Plugin\Eav\AttributeSetRepository\RemoveProductUrlRewrite;
+use Magento\Catalog\Plugin\Model\AttributeSetRepository\RemoveProducts;
 use Magento\Eav\Api\AttributeSetRepositoryInterface;
 use Magento\Eav\Api\Data\AttributeSetInterface;
 use Magento\Framework\TestFramework\Unit\Helper\ObjectManager;
-use Magento\UrlRewrite\Model\UrlPersistInterface;
-use Magento\UrlRewrite\Service\V1\Data\UrlRewrite;
 use PHPUnit\Framework\TestCase;
 
 /**
- * Provide tests for RemoveProductUrlRewrite plugin.
+ * Provide tests for RemoveProducts plugin.
  */
-class RemoveProductUrlRewriteTest extends TestCase
+class RemoveProductsTest extends TestCase
 {
     /**
-     * @var RemoveProductUrlRewrite
+     * @var RemoveProducts
      */
     private $testSubject;
 
@@ -32,11 +29,6 @@ class RemoveProductUrlRewriteTest extends TestCase
      */
     private $collectionFactory;
 
-    /**
-     * @var UrlPersistInterface|\PHPUnit_Framework_MockObject_MockObject
-     */
-    private $urlPersist;
-
     /**
      * @inheritdoc
      */
@@ -47,25 +39,20 @@ class RemoveProductUrlRewriteTest extends TestCase
             ->disableOriginalConstructor()
             ->setMethods(['create'])
             ->getMock();
-        $this->urlPersist = $this->getMockBuilder(UrlPersistInterface::class)
-            ->disableOriginalConstructor()
-            ->getMockForAbstractClass();
         $this->testSubject = $objectManager->getObject(
-            RemoveProductUrlRewrite::class,
+            RemoveProducts::class,
             [
                 'collectionFactory' => $this->collectionFactory,
-                'urlPersist' => $this->urlPersist,
             ]
         );
     }
 
     /**
-     * Test plugin will delete all url rewrites for products with given attribute set.
+     * Test plugin will delete all related products for given attribute set.
      */
     public function testAroundDelete()
     {
         $attributeSetId = '1';
-        $productId = '1';
 
         /** @var Collection|\PHPUnit_Framework_MockObject_MockObject $collection */
         $collection = $this->getMockBuilder(Collection::class)
@@ -75,21 +62,12 @@ class RemoveProductUrlRewriteTest extends TestCase
             ->method('addFieldToFilter')
             ->with(self::identicalTo('attribute_set_id'), self::identicalTo(['eq' => $attributeSetId]));
         $collection->expects(self::once())
-            ->method('getAllIds')
-            ->willReturn([$productId]);
+            ->method('delete');
 
         $this->collectionFactory->expects(self::once())
             ->method('create')
             ->willReturn($collection);
 
-        $this->urlPersist->expects(self::once())
-            ->method('deleteByData')
-            ->with(self::identicalTo(
-                [
-                    UrlRewrite::ENTITY_ID => [$productId],
-                    UrlRewrite::ENTITY_TYPE => ProductUrlRewriteGenerator::ENTITY_TYPE,
-                ]
-            ));
         /** @var AttributeSetRepositoryInterface|\PHPUnit_Framework_MockObject_MockObject $attributeSetRepository */
         $attributeSetRepository = $this->getMockBuilder(AttributeSetRepositoryInterface::class)
             ->disableOriginalConstructor()
diff --git a/app/code/Magento/Catalog/etc/adminhtml/di.xml b/app/code/Magento/Catalog/etc/adminhtml/di.xml
index b97e6fc1aa3..34d08958090 100644
--- a/app/code/Magento/Catalog/etc/adminhtml/di.xml
+++ b/app/code/Magento/Catalog/etc/adminhtml/di.xml
@@ -184,4 +184,7 @@
             <argument name="scopeOverriddenValue" xsi:type="object">Magento\Catalog\Model\Attribute\ScopeOverriddenValue</argument>
         </arguments>
     </type>
+    <type name="Magento\Eav\Api\AttributeSetRepositoryInterface">
+        <plugin name="remove_products" type="Magento\Catalog\Plugin\Model\AttributeSetRepository\RemoveProducts"/>
+    </type>
 </config>
diff --git a/app/code/Magento/Catalog/etc/module.xml b/app/code/Magento/Catalog/etc/module.xml
index 18671a32bb4..26ed173420a 100644
--- a/app/code/Magento/Catalog/etc/module.xml
+++ b/app/code/Magento/Catalog/etc/module.xml
@@ -6,7 +6,7 @@
  */
 -->
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
-    <module name="Magento_Catalog" setup_version="2.2.3">
+    <module name="Magento_Catalog" setup_version="2.2.4">
         <sequence>
             <module name="Magento_Eav"/>
             <module name="Magento_Cms"/>
diff --git a/app/code/Magento/CatalogUrlRewrite/etc/adminhtml/di.xml b/app/code/Magento/CatalogUrlRewrite/etc/adminhtml/di.xml
index ebac217df5f..32ecc97d0f8 100644
--- a/app/code/Magento/CatalogUrlRewrite/etc/adminhtml/di.xml
+++ b/app/code/Magento/CatalogUrlRewrite/etc/adminhtml/di.xml
@@ -25,9 +25,6 @@
     <type name="Magento\Catalog\Model\Category\DataProvider">
         <plugin name="category_ui_form_url_key_plugin" type="Magento\CatalogUrlRewrite\Plugin\Catalog\Block\Adminhtml\Category\Tab\Attributes"/>
     </type>
-    <type name="Magento\Eav\Api\AttributeSetRepositoryInterface">
-        <plugin name="attribute_set_delete_plugin" type="Magento\CatalogUrlRewrite\Plugin\Eav\AttributeSetRepository\RemoveProductUrlRewrite"/>
-    </type>
     <virtualType name="Magento\Catalog\Ui\DataProvider\Product\Form\Modifier\Pool">
         <arguments>
             <argument name="modifiers" xsi:type="array">
diff --git a/dev/tests/integration/testsuite/Magento/CatalogUrlRewrite/Plugin/Eav/AttributeSetRepository/RemoveProductUrlRewriteTest.php b/dev/tests/integration/testsuite/Magento/Catalog/Plugin/Model/AttributeSetRepository/RemoveProductsTest.php
similarity index 67%
rename from dev/tests/integration/testsuite/Magento/CatalogUrlRewrite/Plugin/Eav/AttributeSetRepository/RemoveProductUrlRewriteTest.php
rename to dev/tests/integration/testsuite/Magento/Catalog/Plugin/Model/AttributeSetRepository/RemoveProductsTest.php
index da189b85932..724e2e62f23 100644
--- a/dev/tests/integration/testsuite/Magento/CatalogUrlRewrite/Plugin/Eav/AttributeSetRepository/RemoveProductUrlRewriteTest.php
+++ b/dev/tests/integration/testsuite/Magento/Catalog/Plugin/Model/AttributeSetRepository/RemoveProductsTest.php
@@ -7,6 +7,8 @@
 namespace Magento\CatalogUrlRewrite\Plugin\Eav\AttributeSetRepository;
 
 use Magento\Catalog\Api\ProductRepositoryInterface;
+use Magento\Catalog\Model\ResourceModel\Product\CollectionFactory;
+use Magento\Catalog\Plugin\Model\AttributeSetRepository\RemoveProducts;
 use Magento\Eav\Api\AttributeSetRepositoryInterface;
 use Magento\Eav\Model\Entity\Attribute\Set;
 use Magento\TestFramework\Helper\Bootstrap;
@@ -15,25 +17,25 @@ use Magento\UrlRewrite\Model\ResourceModel\UrlRewriteCollectionFactory;
 use PHPUnit\Framework\TestCase;
 
 /**
- * Provide tests for RemoveProductUrlRewrite plugin.
+ * Provide tests for RemoveProducts plugin.
  * @magentoAppArea adminhtml
  */
-class RemoveProductUrlRewriteTest extends TestCase
+class RemoveProductsTest extends TestCase
 {
     /**
      * @return void
      */
-    public function testRemoveProductUrlRewriteIsRegistered()
+    public function testRemoveProductsIsRegistered()
     {
         $pluginInfo = Bootstrap::getObjectManager()->get(PluginList::class)
             ->get(AttributeSetRepositoryInterface::class, []);
-        self::assertSame(RemoveProductUrlRewrite::class, $pluginInfo['attribute_set_delete_plugin']['instance']);
+        self::assertSame(RemoveProducts::class, $pluginInfo['remove_products']['instance']);
     }
 
     /**
-     * Test url rewrite will be removed for product with given attribute set, if one will be deleted.
+     * Test related to given attribute set products will be removed, if attribute set will be deleted.
      *
-     * @magentoDataFixture Magento/CatalogUrlRewrite/_files/attribute_set_with_product.php
+     * @magentoDataFixture Magento/Catalog/_files/attribute_set_with_product.php
      * @magentoDbIsolation enabled
      */
     public function testAroundDelete()
@@ -44,19 +46,25 @@ class RemoveProductUrlRewriteTest extends TestCase
         $productRepository = Bootstrap::getObjectManager()->get(ProductRepositoryInterface::class);
         $product = $productRepository->get('simple');
 
+        $productCollection = Bootstrap::getObjectManager()->get(CollectionFactory::class)->create();
+        $productCollection->addIdFilter($product->getId());
         $urlRewriteCollection = Bootstrap::getObjectManager()->get(UrlRewriteCollectionFactory::class)->create();
         $urlRewriteCollection->addFieldToFilter('entity_type', 'product');
         $urlRewriteCollection->addFieldToFilter('entity_id', $product->getId());
 
         self::assertSame(1, $urlRewriteCollection->getSize());
+        self::assertSame(1, $productCollection->getSize());
 
         $attributeSetRepository = Bootstrap::getObjectManager()->get(AttributeSetRepositoryInterface::class);
         $attributeSetRepository->deleteById($attributeSet->getAttributeSetId());
 
+        $productCollection = Bootstrap::getObjectManager()->get(CollectionFactory::class)->create();
+        $productCollection->addIdFilter($product->getId());
         $urlRewriteCollection = Bootstrap::getObjectManager()->get(UrlRewriteCollectionFactory::class)->create();
         $urlRewriteCollection->addFieldToFilter('entity_type', 'product');
         $urlRewriteCollection->addFieldToFilter('entity_id', $product->getId());
 
         self::assertSame(0, $urlRewriteCollection->getSize());
+        self::assertSame(0, $productCollection->getSize());
     }
 }
diff --git a/dev/tests/integration/testsuite/Magento/CatalogUrlRewrite/_files/attribute_set_with_product.php b/dev/tests/integration/testsuite/Magento/Catalog/_files/attribute_set_with_product.php
similarity index 100%
rename from dev/tests/integration/testsuite/Magento/CatalogUrlRewrite/_files/attribute_set_with_product.php
rename to dev/tests/integration/testsuite/Magento/Catalog/_files/attribute_set_with_product.php
diff --git a/dev/tests/integration/testsuite/Magento/CatalogUrlRewrite/_files/attribute_set_with_product_rollback.php b/dev/tests/integration/testsuite/Magento/Catalog/_files/attribute_set_with_product_rollback.php
similarity index 100%
rename from dev/tests/integration/testsuite/Magento/CatalogUrlRewrite/_files/attribute_set_with_product_rollback.php
rename to dev/tests/integration/testsuite/Magento/Catalog/_files/attribute_set_with_product_rollback.php
-- 
GitLab


From d06190d360a44b3fe8c854a6ffe5975194eb023e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Adri=C3=A1n=20Mart=C3=ADnez?=
 <adrian.martinez@interactiv4.com>
Date: Fri, 13 Oct 2017 17:24:58 +0200
Subject: [PATCH 233/380] Too many password reset requests even when disabled
 in settings #11409

---
 app/code/Magento/Security/Model/Config.php    | 11 +++-
 .../Model/Plugin/AccountManagement.php        | 26 ++++++--
 .../Security/Test/Unit/Model/ConfigTest.php   |  2 +-
 .../Model/Plugin/AccountManagementTest.php    | 65 ++++++++++++++-----
 .../Magento/Security/etc/adminhtml/di.xml     |  2 +-
 .../Customer/Api/AccountManagementTest.php    | 18 ++---
 .../Adminhtml/Index/ResetPasswordTest.php     | 63 +++++++++++++++---
 7 files changed, 141 insertions(+), 46 deletions(-)

diff --git a/app/code/Magento/Security/Model/Config.php b/app/code/Magento/Security/Model/Config.php
index 100f4630a45..2135b81eb82 100644
--- a/app/code/Magento/Security/Model/Config.php
+++ b/app/code/Magento/Security/Model/Config.php
@@ -24,10 +24,17 @@ class Config implements ConfigInterface
      */
     const XML_PATH_ADMIN_AREA = 'admin/security/';
 
+    /**
+     * Configuration path to frontend area
+     */
+    const XML_PATH_FRONTEND_AREA = 'customer/password/';
+
     /**
      * Configuration path to fronted area
+     * @deprecated
+     * @see \Magento\Security\Model\Config::XML_PATH_FRONTEND_AREA
      */
-    const XML_PATH_FRONTED_AREA = 'customer/password/';
+    const XML_PATH_FRONTED_AREA = self::XML_PATH_FRONTEND_AREA;
 
     /**
      * Configuration path to admin account sharing
@@ -134,7 +141,7 @@ class Config implements ConfigInterface
         if ($this->scope->getCurrentScope() == \Magento\Framework\App\Area::AREA_ADMINHTML) {
             return self::XML_PATH_ADMIN_AREA;
         }
-        return self::XML_PATH_FRONTED_AREA;
+        return self::XML_PATH_FRONTEND_AREA;
     }
 
     /**
diff --git a/app/code/Magento/Security/Model/Plugin/AccountManagement.php b/app/code/Magento/Security/Model/Plugin/AccountManagement.php
index dea54b19488..9476bf46df3 100644
--- a/app/code/Magento/Security/Model/Plugin/AccountManagement.php
+++ b/app/code/Magento/Security/Model/Plugin/AccountManagement.php
@@ -5,10 +5,12 @@
  */
 namespace Magento\Security\Model\Plugin;
 
-use Magento\Security\Model\SecurityManager;
 use Magento\Customer\Model\AccountManagement as AccountManagementOriginal;
+use Magento\Framework\App\ObjectManager;
+use Magento\Framework\Config\ScopeInterface;
 use Magento\Framework\Exception\SecurityViolationException;
 use Magento\Security\Model\PasswordResetRequestEvent;
+use Magento\Security\Model\SecurityManager;
 
 /**
  * Magento\Customer\Model\AccountManagement decorator
@@ -30,21 +32,29 @@ class AccountManagement
      */
     protected $passwordRequestEvent;
 
+    /**
+     * @var ScopeInterface
+     */
+    private $scope;
+
     /**
      * AccountManagement constructor.
      *
      * @param \Magento\Framework\App\RequestInterface $request
      * @param SecurityManager $securityManager
      * @param int $passwordRequestEvent
+     * @param ScopeInterface $scope
      */
     public function __construct(
         \Magento\Framework\App\RequestInterface $request,
         \Magento\Security\Model\SecurityManager $securityManager,
-        $passwordRequestEvent = PasswordResetRequestEvent::CUSTOMER_PASSWORD_RESET_REQUEST
+        $passwordRequestEvent = PasswordResetRequestEvent::CUSTOMER_PASSWORD_RESET_REQUEST,
+        ScopeInterface $scope = null
     ) {
         $this->request = $request;
         $this->securityManager = $securityManager;
         $this->passwordRequestEvent = $passwordRequestEvent;
+        $this->scope = $scope ?: ObjectManager::getInstance()->get(ScopeInterface::class);
     }
 
     /**
@@ -63,10 +73,14 @@ class AccountManagement
         $template,
         $websiteId = null
     ) {
-        $this->securityManager->performSecurityCheck(
-            $this->passwordRequestEvent,
-            $email
-        );
+        if ($this->scope->getCurrentScope() == \Magento\Framework\App\Area::AREA_FRONTEND
+            || $this->passwordRequestEvent == PasswordResetRequestEvent::ADMIN_PASSWORD_RESET_REQUEST) {
+            $this->securityManager->performSecurityCheck(
+                $this->passwordRequestEvent,
+                $email
+            );
+        }
+
         return [$email, $template, $websiteId];
     }
 }
diff --git a/app/code/Magento/Security/Test/Unit/Model/ConfigTest.php b/app/code/Magento/Security/Test/Unit/Model/ConfigTest.php
index 7186502df73..3ef8655539b 100644
--- a/app/code/Magento/Security/Test/Unit/Model/ConfigTest.php
+++ b/app/code/Magento/Security/Test/Unit/Model/ConfigTest.php
@@ -167,7 +167,7 @@ class ConfigTest extends \PHPUnit\Framework\TestCase
         if ($scope == \Magento\Framework\App\Area::AREA_ADMINHTML) {
             return \Magento\Security\Model\Config::XML_PATH_ADMIN_AREA;
         }
-        return \Magento\Security\Model\Config::XML_PATH_FRONTED_AREA;
+        return \Magento\Security\Model\Config::XML_PATH_FRONTEND_AREA;
     }
 
     /**
diff --git a/app/code/Magento/Security/Test/Unit/Model/Plugin/AccountManagementTest.php b/app/code/Magento/Security/Test/Unit/Model/Plugin/AccountManagementTest.php
index 0935dc003d5..8f8128d395a 100644
--- a/app/code/Magento/Security/Test/Unit/Model/Plugin/AccountManagementTest.php
+++ b/app/code/Magento/Security/Test/Unit/Model/Plugin/AccountManagementTest.php
@@ -6,7 +6,11 @@
 
 namespace Magento\Security\Test\Unit\Model\Plugin;
 
+use Magento\Customer\Model\AccountManagement;
+use Magento\Framework\App\Area;
+use Magento\Framework\Config\ScopeInterface;
 use Magento\Framework\TestFramework\Unit\Helper\ObjectManager;
+use Magento\Security\Model\PasswordResetRequestEvent;
 
 /**
  * Test class for \Magento\Security\Model\Plugin\AccountManagement testing
@@ -19,20 +23,25 @@ class AccountManagementTest extends \PHPUnit\Framework\TestCase
     protected $model;
 
     /**
-     * @var \Magento\Framework\App\RequestInterface
+     * @var \Magento\Framework\App\RequestInterface|\PHPUnit_Framework_MockObject_MockObject
      */
     protected $request;
 
     /**
-     * @var \Magento\Security\Model\SecurityManager
+     * @var \Magento\Security\Model\SecurityManager|\PHPUnit_Framework_MockObject_MockObject
      */
     protected $securityManager;
 
     /**
-     * @var \Magento\Customer\Model\AccountManagement
+     * @var AccountManagement|\PHPUnit_Framework_MockObject_MockObject
      */
     protected $accountManagement;
 
+    /**
+     * @var ScopeInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $scope;
+
     /**
      * @var  \Magento\Framework\TestFramework\Unit\Helper\ObjectManager
      */
@@ -46,35 +55,45 @@ class AccountManagementTest extends \PHPUnit\Framework\TestCase
     {
         $this->objectManager = new ObjectManager($this);
 
-        $this->request =  $this->createMock(\Magento\Framework\App\RequestInterface::class);
+        $this->request = $this->createMock(\Magento\Framework\App\RequestInterface::class);
 
         $this->securityManager = $this->createPartialMock(
             \Magento\Security\Model\SecurityManager::class,
             ['performSecurityCheck']
         );
 
-        $this->accountManagement =  $this->createMock(\Magento\Customer\Model\AccountManagement::class);
+        $this->accountManagement = $this->createMock(AccountManagement::class);
+        $this->scope = $this->createMock(ScopeInterface::class);
+    }
+
+    /**
+     * @param $area
+     * @param $passwordRequestEvent
+     * @param $expectedTimes
+     * @dataProvider beforeInitiatePasswordResetDataProvider
+     */
+    public function testBeforeInitiatePasswordReset($area, $passwordRequestEvent, $expectedTimes)
+    {
+        $email = 'test@example.com';
+        $template = AccountManagement::EMAIL_RESET;
 
         $this->model = $this->objectManager->getObject(
             \Magento\Security\Model\Plugin\AccountManagement::class,
             [
+                'passwordRequestEvent' => $passwordRequestEvent,
                 'request' => $this->request,
-                'securityManager' => $this->securityManager
+                'securityManager' => $this->securityManager,
+                'scope' => $this->scope
             ]
         );
-    }
 
-    /**
-     * @return void
-     */
-    public function testBeforeInitiatePasswordReset()
-    {
-        $email = 'test@example.com';
-        $template = \Magento\Customer\Model\AccountManagement::EMAIL_RESET;
+        $this->scope->expects($this->once())
+            ->method('getCurrentScope')
+            ->willReturn($area);
 
-        $this->securityManager->expects($this->once())
+        $this->securityManager->expects($this->exactly($expectedTimes))
             ->method('performSecurityCheck')
-            ->with(\Magento\Security\Model\PasswordResetRequestEvent::CUSTOMER_PASSWORD_RESET_REQUEST, $email)
+            ->with($passwordRequestEvent, $email)
             ->willReturnSelf();
 
         $this->model->beforeInitiatePasswordReset(
@@ -83,4 +102,18 @@ class AccountManagementTest extends \PHPUnit\Framework\TestCase
             $template
         );
     }
+
+    /**
+     * @return array
+     */
+    public function beforeInitiatePasswordResetDataProvider()
+    {
+        return [
+            [Area::AREA_ADMINHTML, PasswordResetRequestEvent::CUSTOMER_PASSWORD_RESET_REQUEST, 0],
+            [Area::AREA_ADMINHTML, PasswordResetRequestEvent::ADMIN_PASSWORD_RESET_REQUEST, 1],
+            [Area::AREA_FRONTEND, PasswordResetRequestEvent::CUSTOMER_PASSWORD_RESET_REQUEST, 1],
+            // This should never happen, but let's cover it with tests
+            [Area::AREA_FRONTEND, PasswordResetRequestEvent::ADMIN_PASSWORD_RESET_REQUEST, 1],
+        ];
+    }
 }
diff --git a/app/code/Magento/Security/etc/adminhtml/di.xml b/app/code/Magento/Security/etc/adminhtml/di.xml
index 6f07fb58049..c1188c2d405 100644
--- a/app/code/Magento/Security/etc/adminhtml/di.xml
+++ b/app/code/Magento/Security/etc/adminhtml/di.xml
@@ -17,7 +17,7 @@
     </type>
     <type name="Magento\Security\Model\Plugin\AccountManagement">
         <arguments>
-            <argument name="passwordRequestEvent" xsi:type="const">Magento\Security\Model\PasswordResetRequestEvent::ADMIN_PASSWORD_RESET_REQUEST</argument>
+            <argument name="passwordRequestEvent" xsi:type="const">Magento\Security\Model\PasswordResetRequestEvent::CUSTOMER_PASSWORD_RESET_REQUEST</argument>
         </arguments>
     </type>
     <type name="Magento\Security\Model\SecurityManager">
diff --git a/dev/tests/api-functional/testsuite/Magento/Customer/Api/AccountManagementTest.php b/dev/tests/api-functional/testsuite/Magento/Customer/Api/AccountManagementTest.php
index 48cc8b8384d..452a59d7e70 100644
--- a/dev/tests/api-functional/testsuite/Magento/Customer/Api/AccountManagementTest.php
+++ b/dev/tests/api-functional/testsuite/Magento/Customer/Api/AccountManagementTest.php
@@ -8,16 +8,12 @@ namespace Magento\Customer\Api;
 use Magento\Customer\Api\Data\CustomerInterface as Customer;
 use Magento\Customer\Model\AccountManagement;
 use Magento\Framework\Exception\InputException;
-use Magento\Framework\Exception\NoSuchEntityException;
+use Magento\Framework\Webapi\Exception as HTTPExceptionCodes;
+use Magento\Newsletter\Model\Subscriber;
+use Magento\Security\Model\Config;
 use Magento\TestFramework\Helper\Bootstrap;
 use Magento\TestFramework\Helper\Customer as CustomerHelper;
 use Magento\TestFramework\TestCase\WebapiAbstract;
-use Magento\Framework\Webapi\Exception as HTTPExceptionCodes;
-use Magento\Security\Model\Config;
-use Magento\Newsletter\Model\Plugin\CustomerPlugin;
-use Magento\Framework\Webapi\Rest\Request as RestRequest;
-use Magento\Newsletter\Model\Subscriber;
-use Magento\Customer\Model\Data\Customer as CustomerData;
 
 /**
  * Test class for Magento\Customer\Api\AccountManagementInterface
@@ -112,16 +108,16 @@ class AccountManagementTest extends WebapiAbstract
         $this->initSubscriber();
 
         if ($this->config->getConfigDataValue(
-            Config::XML_PATH_FRONTED_AREA .
+            Config::XML_PATH_FRONTEND_AREA .
             Config::XML_PATH_PASSWORD_RESET_PROTECTION_TYPE
         ) != 0) {
             $this->configValue = $this->config
                 ->getConfigDataValue(
-                    Config::XML_PATH_FRONTED_AREA .
+                    Config::XML_PATH_FRONTEND_AREA .
                     Config::XML_PATH_PASSWORD_RESET_PROTECTION_TYPE
                 );
             $this->config->setDataByPath(
-                Config::XML_PATH_FRONTED_AREA . Config::XML_PATH_PASSWORD_RESET_PROTECTION_TYPE,
+                Config::XML_PATH_FRONTEND_AREA . Config::XML_PATH_PASSWORD_RESET_PROTECTION_TYPE,
                 0
             );
             $this->config->save();
@@ -150,7 +146,7 @@ class AccountManagementTest extends WebapiAbstract
             }
         }
         $this->config->setDataByPath(
-            Config::XML_PATH_FRONTED_AREA . Config::XML_PATH_PASSWORD_RESET_PROTECTION_TYPE,
+            Config::XML_PATH_FRONTEND_AREA . Config::XML_PATH_PASSWORD_RESET_PROTECTION_TYPE,
             $this->configValue
         );
         $this->config->save();
diff --git a/dev/tests/integration/testsuite/Magento/Customer/Controller/Adminhtml/Index/ResetPasswordTest.php b/dev/tests/integration/testsuite/Magento/Customer/Controller/Adminhtml/Index/ResetPasswordTest.php
index fcbe7c51066..b5ca783d68c 100644
--- a/dev/tests/integration/testsuite/Magento/Customer/Controller/Adminhtml/Index/ResetPasswordTest.php
+++ b/dev/tests/integration/testsuite/Magento/Customer/Controller/Adminhtml/Index/ResetPasswordTest.php
@@ -20,10 +20,11 @@ class ResetPasswordTest extends \Magento\TestFramework\TestCase\AbstractBackendC
     protected $baseControllerUrl = 'http://localhost/index.php/backend/customer/index/';
 
     /**
-     * Checks reset password functionality with default settings and customer reset request event.
+     * Checks reset password functionality with no restrictive settings and customer reset request event.
+     * Admin is not affected by this security check, so reset password email must be sent.
      *
-     * @magentoConfigFixture current_store admin/security/limit_password_reset_requests_method 1
-     * @magentoConfigFixture current_store admin/security/min_time_between_password_reset_requests 10
+     * @magentoConfigFixture current_store customer/password/limit_password_reset_requests_method 0
+     * @magentoConfigFixture current_store customer/password/min_time_between_password_reset_requests 0
      * @magentoDataFixture Magento/Customer/_files/customer.php
      */
     public function testResetPasswordSuccess()
@@ -40,11 +41,57 @@ class ResetPasswordTest extends \Magento\TestFramework\TestCase\AbstractBackendC
         $this->assertRedirect($this->stringStartsWith($this->baseControllerUrl . 'edit'));
     }
 
+    /**
+     * Checks reset password functionality with default restrictive min time between
+     * password reset requests and customer reset request event.
+     * Admin is not affected by this security check, so reset password email must be sent.
+     *
+     * @magentoConfigFixture current_store customer/password/max_number_password_reset_requests 0
+     * @magentoConfigFixture current_store customer/password/min_time_between_password_reset_requests 10
+     * @magentoDataFixture Magento/Customer/_files/customer.php
+     */
+    public function testResetPasswordMinTimeError()
+    {
+        $this->passwordResetRequestEventCreate(
+            \Magento\Security\Model\PasswordResetRequestEvent::CUSTOMER_PASSWORD_RESET_REQUEST
+        );
+        $this->getRequest()->setPostValue(['customer_id' => '1']);
+        $this->dispatch('backend/customer/index/resetPassword');
+        $this->assertSessionMessages(
+            $this->equalTo(['The customer will receive an email with a link to reset password.']),
+            \Magento\Framework\Message\MessageInterface::TYPE_SUCCESS
+        );
+        $this->assertRedirect($this->stringStartsWith($this->baseControllerUrl . 'edit'));
+    }
+
+    /**
+     * Checks reset password functionality with default restrictive limited number
+     * password reset requests and customer reset request event.
+     * Admin is not affected by this security check, so reset password email must be sent.
+     *
+     * @magentoConfigFixture current_store customer/password/max_number_password_reset_requests 1
+     * @magentoConfigFixture current_store customer/password/min_time_between_password_reset_requests 0
+     * @magentoDataFixture Magento/Customer/_files/customer.php
+     */
+    public function testResetPasswordLimitError()
+    {
+        $this->passwordResetRequestEventCreate(
+            \Magento\Security\Model\PasswordResetRequestEvent::CUSTOMER_PASSWORD_RESET_REQUEST
+        );
+        $this->getRequest()->setPostValue(['customer_id' => '1']);
+        $this->dispatch('backend/customer/index/resetPassword');
+        $this->assertSessionMessages(
+            $this->equalTo(['The customer will receive an email with a link to reset password.']),
+            \Magento\Framework\Message\MessageInterface::TYPE_SUCCESS
+        );
+        $this->assertRedirect($this->stringStartsWith($this->baseControllerUrl . 'edit'));
+    }
+
     /**
      * Checks reset password functionality with default settings, customer and admin reset request events.
      *
-     * @magentoConfigFixture current_store admin/security/limit_password_reset_requests_method 1
-     * @magentoConfigFixture current_store admin/security/min_time_between_password_reset_requests 10
+     * @magentoConfigFixture current_store customer/password/limit_password_reset_requests_method 1
+     * @magentoConfigFixture current_store customer/password/min_time_between_password_reset_requests 10
      * @magentoConfigFixture current_store contact/email/recipient_email hello@example.com
      * @magentoDataFixture Magento/Customer/_files/customer.php
      */
@@ -59,10 +106,8 @@ class ResetPasswordTest extends \Magento\TestFramework\TestCase\AbstractBackendC
         $this->getRequest()->setPostValue(['customer_id' => '1']);
         $this->dispatch('backend/customer/index/resetPassword');
         $this->assertSessionMessages(
-            $this->equalTo(
-                ['Too many password reset requests. Please wait and try again or contact hello@example.com.']
-            ),
-            \Magento\Framework\Message\MessageInterface::TYPE_ERROR
+            $this->equalTo(['The customer will receive an email with a link to reset password.']),
+            \Magento\Framework\Message\MessageInterface::TYPE_SUCCESS
         );
         $this->assertRedirect($this->stringStartsWith($this->baseControllerUrl . 'edit'));
     }
-- 
GitLab


From daee4a8905ab50c6009f3baf304596644bc40d46 Mon Sep 17 00:00:00 2001
From: Pascal Brouwers <pascal@h-o.nl>
Date: Fri, 1 Dec 2017 12:25:03 +0100
Subject: [PATCH 234/380] issue 12506: added PR changes

---
 lib/internal/Magento/Framework/File/Uploader.php | 12 ++++++++++++
 1 file changed, 12 insertions(+)

diff --git a/lib/internal/Magento/Framework/File/Uploader.php b/lib/internal/Magento/Framework/File/Uploader.php
index e86277b905b..07de9941271 100644
--- a/lib/internal/Magento/Framework/File/Uploader.php
+++ b/lib/internal/Magento/Framework/File/Uploader.php
@@ -605,6 +605,18 @@ class Uploader
         return $destFileName;
     }
 
+    /**
+     * Get dispertion path
+     *
+     * @param string $fileName
+     * @return string
+     * @deprecated
+     */
+    public static function getDispretionPath($fileName)
+    {
+        return self::getDispersionPath($fileName);
+    }
+
     /**
      * Get dispertion path
      *
-- 
GitLab


From 6c6ca61e7831e544bf4d46feaba3640cf5138072 Mon Sep 17 00:00:00 2001
From: "Leandro F. L" <leandro.luvisotto@empiricus.com.br>
Date: Fri, 1 Dec 2017 11:48:57 -0200
Subject: [PATCH 235/380] Duplicate array key

---
 .../Adminhtml/Catalog/Product/Edit/Tab/Attributes/Extend.php   | 1 -
 app/code/Magento/Downloadable/Helper/File.php                  | 3 +--
 2 files changed, 1 insertion(+), 3 deletions(-)

diff --git a/app/code/Magento/Bundle/Block/Adminhtml/Catalog/Product/Edit/Tab/Attributes/Extend.php b/app/code/Magento/Bundle/Block/Adminhtml/Catalog/Product/Edit/Tab/Attributes/Extend.php
index 15808c9dd17..0e21e566d5e 100644
--- a/app/code/Magento/Bundle/Block/Adminhtml/Catalog/Product/Edit/Tab/Attributes/Extend.php
+++ b/app/code/Magento/Bundle/Block/Adminhtml/Catalog/Product/Edit/Tab/Attributes/Extend.php
@@ -142,7 +142,6 @@ class Extend extends \Magento\Catalog\Block\Adminhtml\Form\Renderer\Fieldset\Ele
             [
                 'name' => "product[{$switchAttributeCode}]",
                 'values' => $this->getOptions(),
-                'value' => $switchAttributeCode,
                 'class' => 'required-entry next-toinput',
                 'no_span' => true,
                 'disabled' => $this->isDisabledField(),
diff --git a/app/code/Magento/Downloadable/Helper/File.php b/app/code/Magento/Downloadable/Helper/File.php
index 6c248404d19..10ee9ff405e 100644
--- a/app/code/Magento/Downloadable/Helper/File.php
+++ b/app/code/Magento/Downloadable/Helper/File.php
@@ -766,7 +766,6 @@ class File extends \Magento\Framework\App\Helper\AbstractHelper
         'xxyz' => 'chemical/x-xyz',
         'xzaz' => 'application/vnd.zzazz.deck+xml',
         'xzip' => 'application/zip',
-        'xzmm' => 'application/vnd.handheld-entertainment+xml',
-        'xodt' => 'application/x-vnd.oasis.opendocument.spreadsheet',
+        'xzmm' => 'application/vnd.handheld-entertainment+xml'
     ];
 }
-- 
GitLab


From e66bea87c061a16ffa70cdbb2f26d06e3b66cd04 Mon Sep 17 00:00:00 2001
From: Cy Kirsch <cykirsch@gmail.com>
Date: Fri, 1 Dec 2017 08:28:32 -0600
Subject: [PATCH 236/380] Fixes per ishakhsuvarov code review: - const
 documenation - reverse condition for readability - better variable name -
 type and return hints

---
 .../DeploymentConfig/Writer/PhpFormatter.php  | 26 +++++++++++--------
 1 file changed, 15 insertions(+), 11 deletions(-)

diff --git a/lib/internal/Magento/Framework/App/DeploymentConfig/Writer/PhpFormatter.php b/lib/internal/Magento/Framework/App/DeploymentConfig/Writer/PhpFormatter.php
index 6556a0472f9..09f2bc888e3 100644
--- a/lib/internal/Magento/Framework/App/DeploymentConfig/Writer/PhpFormatter.php
+++ b/lib/internal/Magento/Framework/App/DeploymentConfig/Writer/PhpFormatter.php
@@ -11,6 +11,9 @@ namespace Magento\Framework\App\DeploymentConfig\Writer;
  */
 class PhpFormatter implements FormatterInterface
 {
+    /**
+     * 2 space indentation for array formatting
+     */
     const INDENT = '  ';
 
     /**
@@ -76,19 +79,20 @@ class PhpFormatter implements FormatterInterface
      * @param integer $depth
      * @return string
      */
-    private function varExportShort($var, $depth = 0)
+    private function varExportShort($var, int $depth = 0): string
     {
-        if (gettype($var) === 'array') {
-            $indexed = array_keys($var) === range(0, count($var) - 1);
-            $r = [];
-            foreach ($var as $key => $value) {
-                $r[] = str_repeat(self::INDENT, $depth)
-                    . ($indexed ? '' : $this->varExportShort($key) . ' => ')
-                    . $this->varExportShort($value, $depth + 1);
-            }
-            return sprintf("[\n%s\n%s]", implode(",\n", $r), str_repeat(self::INDENT, $depth - 1));
+        if (!is_array($var)) {
+            return var_export($var, true);
+        }
+
+        $indexed = array_keys($var) === range(0, count($var) - 1);
+        $expanded = [];
+        foreach ($var as $key => $value) {
+            $expanded[] = str_repeat(self::INDENT, $depth)
+                . ($indexed ? '' : $this->varExportShort($key) . ' => ')
+                . $this->varExportShort($value, $depth + 1);
         }
 
-        return var_export($var, true);
+        return sprintf("[\n%s\n%s]", implode(",\n", $expanded), str_repeat(self::INDENT, $depth - 1));
     }
 }
-- 
GitLab


From fe9221f2c75b66c981aaa7b385f52cf9133de5ff Mon Sep 17 00:00:00 2001
From: "Leandro F. L" <leandro.luvisotto@empiricus.com.br>
Date: Fri, 1 Dec 2017 12:34:31 -0200
Subject: [PATCH 237/380] The left and the right parts of assignment are equal

---
 app/code/Magento/Variable/Block/System/Variable/Edit.php | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)

diff --git a/app/code/Magento/Variable/Block/System/Variable/Edit.php b/app/code/Magento/Variable/Block/System/Variable/Edit.php
index be68814ea27..cf9a7489f3d 100644
--- a/app/code/Magento/Variable/Block/System/Variable/Edit.php
+++ b/app/code/Magento/Variable/Block/System/Variable/Edit.php
@@ -91,9 +91,7 @@ class Edit extends \Magento\Backend\Block\Widget\Form\Container
     public function getFormHtml()
     {
         $formHtml = parent::getFormHtml();
-        if (!$this->_storeManager->isSingleStoreMode() && $this->getVariable()->getId()) {
-            $formHtml = $formHtml;
-        }
+
         return $formHtml;
     }
 
-- 
GitLab


From 702d7fe27916ed66dbb72af5bd59d07c58d546bf Mon Sep 17 00:00:00 2001
From: "Leandro F. L" <leandro.luvisotto@empiricus.com.br>
Date: Fri, 1 Dec 2017 12:43:53 -0200
Subject: [PATCH 238/380] Case mismatch

---
 .../Model/Import/AdvancedPricing.php             |  2 +-
 .../AdvancedPricing/Validator/WebsiteTest.php    |  2 +-
 .../Block/System/Store/Edit/AbstractForm.php     |  2 +-
 .../Controller/Adminhtml/System/Account/Save.php |  6 +++---
 .../Unit/Block/Widget/Grid/ColumnSetTest.php     |  2 +-
 .../Test/Unit/Block/Widget/Grid/ColumnTest.php   |  2 +-
 .../view/adminhtml/templates/page/header.phtml   |  4 ++--
 .../view/adminhtml/templates/system/search.phtml |  8 ++++----
 .../templates/widget/grid/extended.phtml         |  8 ++++----
 .../Block/Product/View/Options/Type/Select.php   |  4 ++--
 .../Backend/GroupPrice/AbstractTest.php          |  2 +-
 .../catalog/product/tab/inventory.phtml          | 16 ++++++++--------
 app/code/Magento/Cms/Helper/Wysiwyg/Images.php   |  2 +-
 .../Cms/Test/Unit/Helper/Wysiwyg/ImagesTest.php  |  2 +-
 .../Structure/ElementVisibilityCompositeTest.php |  2 +-
 .../Model/Product/Cache/Tag/ConfigurableTest.php |  2 +-
 .../Block/Adminhtml/Edit/Tab/Newsletter.php      |  2 +-
 .../DeploymentConfig/ImporterFactoryTest.php     |  2 +-
 .../DeploymentConfig/ValidatorFactoryTest.php    |  2 +-
 .../Downloadable/Model/LinkRepository.php        |  2 +-
 .../Downloadable/Model/SampleRepository.php      |  2 +-
 .../Product/Form/Modifier/CompositeTest.php      |  2 +-
 .../Magento/Eav/Model/Entity/AbstractEntity.php  |  2 +-
 .../Unit/Block/Adminhtml/Template/EditTest.php   |  2 +-
 .../Model/Observer/ReportConcurrentAdmins.php    |  4 ++--
 .../ReportConcurrentAdminsToNewRelic.php         |  4 ++--
 .../ReportSystemCacheFlushToNewRelic.php         |  4 ++--
 .../Model/ResourceModel/Carrier/Tablerate.php    |  4 ++--
 .../Block/Adminhtml/Form/Field/ExportTest.php    |  2 +-
 .../Model/ResourceModel/Report/Settlement.php    |  2 +-
 .../Payflow/Service/Response/TransactionTest.php |  2 +-
 .../Review/Model/ResourceModel/Rating/Option.php |  2 +-
 .../Model/ResourceModel/AbstractResource.php     |  2 +-
 .../Block/Adminhtml/Items/AbstractItemsTest.php  |  2 +-
 .../Unit/Block/Adminhtml/Items/AbstractTest.php  |  2 +-
 .../Test/Unit/Model/Order/Payment/InfoTest.php   |  2 +-
 .../Test/Unit/Model/Order/Pdf/AbstractTest.php   |  2 +-
 .../Unit/Model/Order/Pdf/Config/ReaderTest.php   |  2 +-
 .../RowBaseAndTotalBaseCalculatorTestCase.php    |  2 +-
 .../Magento/Ui/Config/Converter/HtmlContent.php  |  2 +-
 .../Magento/User/Model/ResourceModel/User.php    |  2 +-
 app/code/Magento/User/Model/User.php             |  6 +++---
 .../Magento/User/Test/Unit/Model/UserTest.php    | 10 +++++-----
 app/code/Magento/Webapi/Model/Soap/Fault.php     |  2 +-
 .../Test/Unit/Model/Config/FileResolverTest.php  |  6 +++---
 45 files changed, 74 insertions(+), 74 deletions(-)

diff --git a/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing.php b/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing.php
index 23829d37251..0e8acb37104 100644
--- a/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing.php
+++ b/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing.php
@@ -394,7 +394,7 @@ class AdvancedPricing extends \Magento\ImportExport\Model\Import\Entity\Abstract
                             ? $rowData[self::COL_TIER_PRICE] : 0,
                         'percentage_value' => $rowData[self::COL_TIER_PRICE_TYPE] === self::TIER_PRICE_TYPE_PERCENT
                             ? $rowData[self::COL_TIER_PRICE] : null,
-                        'website_id' => $this->getWebsiteId($rowData[self::COL_TIER_PRICE_WEBSITE])
+                        'website_id' => $this->getWebSiteId($rowData[self::COL_TIER_PRICE_WEBSITE])
                     ];
                 }
             }
diff --git a/app/code/Magento/AdvancedPricingImportExport/Test/Unit/Model/Import/AdvancedPricing/Validator/WebsiteTest.php b/app/code/Magento/AdvancedPricingImportExport/Test/Unit/Model/Import/AdvancedPricing/Validator/WebsiteTest.php
index 5111b4932d7..9a380ff75da 100644
--- a/app/code/Magento/AdvancedPricingImportExport/Test/Unit/Model/Import/AdvancedPricing/Validator/WebsiteTest.php
+++ b/app/code/Magento/AdvancedPricingImportExport/Test/Unit/Model/Import/AdvancedPricing/Validator/WebsiteTest.php
@@ -27,7 +27,7 @@ class WebsiteTest extends \PHPUnit\Framework\TestCase
 
     protected function setUp()
     {
-        $this->webSiteModel = $this->getMockBuilder(\Magento\Store\Model\WebSite::class)
+        $this->webSiteModel = $this->getMockBuilder(\Magento\Store\Model\Website::class)
             ->setMethods(['getBaseCurrency'])
             ->disableOriginalConstructor()
             ->getMock();
diff --git a/app/code/Magento/Backend/Block/System/Store/Edit/AbstractForm.php b/app/code/Magento/Backend/Block/System/Store/Edit/AbstractForm.php
index f19799d2e49..034887c67d1 100644
--- a/app/code/Magento/Backend/Block/System/Store/Edit/AbstractForm.php
+++ b/app/code/Magento/Backend/Block/System/Store/Edit/AbstractForm.php
@@ -37,7 +37,7 @@ abstract class AbstractForm extends \Magento\Backend\Block\Widget\Form\Generic
             ['data' => ['id' => 'edit_form', 'action' => $this->getData('action'), 'method' => 'post']]
         );
 
-        $this->_prepareStoreFieldSet($form);
+        $this->_prepareStoreFieldset($form);
 
         $form->addField(
             'store_type',
diff --git a/app/code/Magento/Backend/Controller/Adminhtml/System/Account/Save.php b/app/code/Magento/Backend/Controller/Adminhtml/System/Account/Save.php
index c9bce1cbf38..421885a0c32 100644
--- a/app/code/Magento/Backend/Controller/Adminhtml/System/Account/Save.php
+++ b/app/code/Magento/Backend/Controller/Adminhtml/System/Account/Save.php
@@ -54,9 +54,9 @@ class Save extends \Magento\Backend\Controller\Adminhtml\System\Account
         $user = $this->_objectManager->create(\Magento\User\Model\User::class)->load($userId);
 
         $user->setId($userId)
-            ->setUsername($this->getRequest()->getParam('username', false))
-            ->setFirstname($this->getRequest()->getParam('firstname', false))
-            ->setLastname($this->getRequest()->getParam('lastname', false))
+            ->setUserName($this->getRequest()->getParam('username', false))
+            ->setFirstName($this->getRequest()->getParam('firstname', false))
+            ->setLastName($this->getRequest()->getParam('lastname', false))
             ->setEmail(strtolower($this->getRequest()->getParam('email', false)));
 
         if ($this->_objectManager->get(\Magento\Framework\Validator\Locale::class)->isValid($interfaceLocale)) {
diff --git a/app/code/Magento/Backend/Test/Unit/Block/Widget/Grid/ColumnSetTest.php b/app/code/Magento/Backend/Test/Unit/Block/Widget/Grid/ColumnSetTest.php
index be171a8ed40..df242a4cf61 100644
--- a/app/code/Magento/Backend/Test/Unit/Block/Widget/Grid/ColumnSetTest.php
+++ b/app/code/Magento/Backend/Test/Unit/Block/Widget/Grid/ColumnSetTest.php
@@ -117,7 +117,7 @@ class ColumnSetTest extends \PHPUnit\Framework\TestCase
 
     public function testGetRowUrlIfUrlPathNotSet()
     {
-        $this->assertEquals('#', $this->_block->getRowUrl(new \StdClass()));
+        $this->assertEquals('#', $this->_block->getRowUrl(new \stdClass()));
     }
 
     public function testGetRowUrl()
diff --git a/app/code/Magento/Backend/Test/Unit/Block/Widget/Grid/ColumnTest.php b/app/code/Magento/Backend/Test/Unit/Block/Widget/Grid/ColumnTest.php
index da13af87b71..c5c56fd75fb 100644
--- a/app/code/Magento/Backend/Test/Unit/Block/Widget/Grid/ColumnTest.php
+++ b/app/code/Magento/Backend/Test/Unit/Block/Widget/Grid/ColumnTest.php
@@ -351,7 +351,7 @@ class ColumnTest extends \PHPUnit\Framework\TestCase
 
         $this->_block->setFilter('StdClass');
 
-        $grid = new \StdClass();
+        $grid = new \stdClass();
         $this->_block->setGrid($grid);
         $this->assertEquals($grid, $this->_block->getGrid());
     }
diff --git a/app/code/Magento/Backend/view/adminhtml/templates/page/header.phtml b/app/code/Magento/Backend/view/adminhtml/templates/page/header.phtml
index 40b7173f474..8feccc9cf1b 100644
--- a/app/code/Magento/Backend/view/adminhtml/templates/page/header.phtml
+++ b/app/code/Magento/Backend/view/adminhtml/templates/page/header.phtml
@@ -29,7 +29,7 @@
                 data-mage-init='{"dropdown":{}}'
                 data-toggle="dropdown">
                 <span class="admin__action-dropdown-text">
-                    <span class="admin-user-account-text"><?= $block->escapeHtml($block->getUser()->getUsername()) ?></span>
+                    <span class="admin-user-account-text"><?= $block->escapeHtml($block->getUser()->getUserName()) ?></span>
                 </span>
             </a>
             <ul class="admin__action-dropdown-menu">
@@ -39,7 +39,7 @@
                         href="<?= /* @escapeNotVerified */ $block->getUrl('adminhtml/system_account/index') ?>"
                         <?= /* @escapeNotVerified */ $block->getUiId('user', 'account', 'settings') ?>
                         title="<?= $block->escapeHtml(__('Account Setting')) ?>">
-                        <?= /* @escapeNotVerified */ __('Account Setting') ?> (<span class="admin-user-name"><?= $block->escapeHtml($block->getUser()->getUsername()) ?></span>)
+                        <?= /* @escapeNotVerified */ __('Account Setting') ?> (<span class="admin-user-name"><?= $block->escapeHtml($block->getUser()->getUserName()) ?></span>)
                     </a>
                 </li>
                 <?php endif; ?>
diff --git a/app/code/Magento/Backend/view/adminhtml/templates/system/search.phtml b/app/code/Magento/Backend/view/adminhtml/templates/system/search.phtml
index a528133b2bc..b50183ced29 100644
--- a/app/code/Magento/Backend/view/adminhtml/templates/system/search.phtml
+++ b/app/code/Magento/Backend/view/adminhtml/templates/system/search.phtml
@@ -28,16 +28,16 @@
     <script data-template="search-suggest" type="text/x-magento-template">
         <ul class="search-global-menu">
         <li class="item">
-            <a id="searchPreviewProducts" href="<?= /* @escapeNotVerified */ $block->getURL('catalog/product/index/') ?>?search=<%- data.term%>" class="title">"<%- data.term%>" in Products</a>
+            <a id="searchPreviewProducts" href="<?= /* @escapeNotVerified */ $block->getUrl('catalog/product/index/') ?>?search=<%- data.term%>" class="title">"<%- data.term%>" in Products</a>
         </li>
         <li class="item">
-            <a id="searchPreviewOrders" href="<?= /* @escapeNotVerified */ $block->getURL('sales/order/index/') ?>?search=<%- data.term%>" class="title">"<%- data.term%>" in Orders</a>
+            <a id="searchPreviewOrders" href="<?= /* @escapeNotVerified */ $block->getUrl('sales/order/index/') ?>?search=<%- data.term%>" class="title">"<%- data.term%>" in Orders</a>
         </li>
         <li class="item">
-            <a id="searchPreviewCustomers" href="<?= /* @escapeNotVerified */ $block->getURL('customer/index/index/') ?>?search=<%- data.term%>" class="title">"<%- data.term%>" in Customers</a>
+            <a id="searchPreviewCustomers" href="<?= /* @escapeNotVerified */ $block->getUrl('customer/index/index/') ?>?search=<%- data.term%>" class="title">"<%- data.term%>" in Customers</a>
         </li>
         <li class="item">
-            <a id="searchPreviewPages" href="<?= /* @escapeNotVerified */ $block->getURL('cms/page/index/') ?>?search=<%- data.term%>" class="title">"<%- data.term%>" in Pages</a>
+            <a id="searchPreviewPages" href="<?= /* @escapeNotVerified */ $block->getUrl('cms/page/index/') ?>?search=<%- data.term%>" class="title">"<%- data.term%>" in Pages</a>
         </li>
             <% if (data.items.length) { %>
             <% _.each(data.items, function(value){ %>
diff --git a/app/code/Magento/Backend/view/adminhtml/templates/widget/grid/extended.phtml b/app/code/Magento/Backend/view/adminhtml/templates/widget/grid/extended.phtml
index a31bf4d23ab..f97db4ad993 100644
--- a/app/code/Magento/Backend/view/adminhtml/templates/widget/grid/extended.phtml
+++ b/app/code/Magento/Backend/view/adminhtml/templates/widget/grid/extended.phtml
@@ -72,7 +72,7 @@ $numColumns = sizeof($block->getColumns());
             <?php if ($block->getPagerVisibility()): ?>
                 <div class="admin__data-grid-pager-wrap">
                     <select name="<?= /* @escapeNotVerified */ $block->getVarNameLimit() ?>"
-                            id="<?= $block->escapeHTML($block->getHtmlId()) ?>_page-limit"
+                            id="<?= $block->escapeHtml($block->getHtmlId()) ?>_page-limit"
                             onchange="<?= /* @escapeNotVerified */ $block->getJsObjectName() ?>.loadByElement(this)"
                             class="admin__control-select">
                         <option value="20"<?php if ($block->getCollection()->getPageSize() == 20): ?>
@@ -91,7 +91,7 @@ $numColumns = sizeof($block->getColumns());
                             selected="selected"<?php endif; ?>>200
                         </option>
                     </select>
-                    <label for="<?= $block->escapeHTML($block->getHtmlId()) ?><?= $block->escapeHTML($block->getHtmlId()) ?>_page-limit"
+                    <label for="<?= $block->escapeHtml($block->getHtmlId()) ?><?= $block->escapeHtml($block->getHtmlId()) ?>_page-limit"
                         class="admin__control-support-text"><?= /* @escapeNotVerified */ __('per page') ?></label>
 
                     <div class="admin__data-grid-pager">
@@ -107,12 +107,12 @@ $numColumns = sizeof($block->getColumns());
                             <button type="button" class="action-previous disabled"><span><?= /* @escapeNotVerified */ __('Previous page') ?></span></button>
                         <?php endif; ?>
                         <input type="text"
-                               id="<?= $block->escapeHTML($block->getHtmlId()) ?>_page-current"
+                               id="<?= $block->escapeHtml($block->getHtmlId()) ?>_page-current"
                                name="<?= /* @escapeNotVerified */ $block->getVarNamePage() ?>"
                                value="<?= /* @escapeNotVerified */ $_curPage ?>"
                                class="admin__control-text"
                                onkeypress="<?= /* @escapeNotVerified */ $block->getJsObjectName() ?>.inputPage(event, '<?= /* @escapeNotVerified */ $_lastPage ?>')" <?= /* @escapeNotVerified */ $block->getUiId('current-page') ?> />
-                        <label class="admin__control-support-text" for="<?= $block->escapeHTML($block->getHtmlId()) ?>_page-current">
+                        <label class="admin__control-support-text" for="<?= $block->escapeHtml($block->getHtmlId()) ?>_page-current">
                             <?= /* @escapeNotVerified */ __('of %1', '<span>' . $block->getCollection()->getLastPageNumber() . '</span>') ?>
                         </label>
                         <?php if ($_curPage < $_lastPage): ?>
diff --git a/app/code/Magento/Catalog/Block/Product/View/Options/Type/Select.php b/app/code/Magento/Catalog/Block/Product/View/Options/Type/Select.php
index d546ef48313..7df9b972e15 100644
--- a/app/code/Magento/Catalog/Block/Product/View/Options/Type/Select.php
+++ b/app/code/Magento/Catalog/Block/Product/View/Options/Type/Select.php
@@ -44,9 +44,9 @@ class Select extends \Magento\Catalog\Block\Product\View\Options\AbstractOptions
                 ]
             );
             if ($_option->getType() == \Magento\Catalog\Api\Data\ProductCustomOptionInterface::OPTION_TYPE_DROP_DOWN) {
-                $select->setName('options[' . $_option->getid() . ']')->addOption('', __('-- Please Select --'));
+                $select->setName('options[' . $_option->getId() . ']')->addOption('', __('-- Please Select --'));
             } else {
-                $select->setName('options[' . $_option->getid() . '][]');
+                $select->setName('options[' . $_option->getId() . '][]');
                 $select->setClass('multiselect admin__control-multiselect' . $require . ' product-custom-option');
             }
             foreach ($_option->getValues() as $_value) {
diff --git a/app/code/Magento/Catalog/Test/Unit/Model/Product/Attribute/Backend/GroupPrice/AbstractTest.php b/app/code/Magento/Catalog/Test/Unit/Model/Product/Attribute/Backend/GroupPrice/AbstractTest.php
index 5963d8b1616..3003c2f8085 100644
--- a/app/code/Magento/Catalog/Test/Unit/Model/Product/Attribute/Backend/GroupPrice/AbstractTest.php
+++ b/app/code/Magento/Catalog/Test/Unit/Model/Product/Attribute/Backend/GroupPrice/AbstractTest.php
@@ -47,7 +47,7 @@ class AbstractTest extends \PHPUnit\Framework\TestCase
                 'scopeOverriddenValue' => $scopeOverriddenValue
             ]
         );
-        $resource = $this->createPartialMock(\StdClass::class, ['getMainTable']);
+        $resource = $this->createPartialMock(\stdClass::class, ['getMainTable']);
         $resource->expects($this->any())->method('getMainTable')->will($this->returnValue('table'));
 
         $this->_model->expects($this->any())->method('_getResource')->will($this->returnValue($resource));
diff --git a/app/code/Magento/Catalog/view/adminhtml/templates/catalog/product/tab/inventory.phtml b/app/code/Magento/Catalog/view/adminhtml/templates/catalog/product/tab/inventory.phtml
index 15c33c56e3a..2c62bbf8db3 100644
--- a/app/code/Magento/Catalog/view/adminhtml/templates/catalog/product/tab/inventory.phtml
+++ b/app/code/Magento/Catalog/view/adminhtml/templates/catalog/product/tab/inventory.phtml
@@ -27,7 +27,7 @@
             <option value="0"<?php if ($block->getFieldValue('manage_stock') == 0): ?> selected="selected"<?php endif; ?>><?= /* @escapeNotVerified */ __('No') ?></option>
         </select>
         <input type="hidden" id="inventory_manage_stock_default" value="<?= /* @escapeNotVerified */ $block->getDefaultConfigValue('manage_stock') ?>">
-        <?php $_checked = ($block->getFieldValue('use_config_manage_stock') || $block->IsNew()) ? 'checked="checked"' : '' ?>
+        <?php $_checked = ($block->getFieldValue('use_config_manage_stock') || $block->isNew()) ? 'checked="checked"' : '' ?>
         <input type="checkbox" id="inventory_use_config_manage_stock" name="<?= /* @escapeNotVerified */ $block->getFieldSuffix() ?>[stock_data][use_config_manage_stock]" value="1" <?= /* @escapeNotVerified */ $_checked ?> onclick="toggleValueElements(this, this.parentNode);" <?= /* @escapeNotVerified */ $_readonly ?>>
         <label for="inventory_use_config_manage_stock"><?= /* @escapeNotVerified */ __('Use Config Settings') ?></label>
         <?php if (!$block->isReadonly()): ?>
@@ -67,7 +67,7 @@ toggleValueElements($('inventory_use_config_manage_stock'), $('inventory_use_con
         <input type="text" class="input-text validate-number" id="inventory_min_qty" name="<?= /* @escapeNotVerified */ $block->getFieldSuffix() ?>[stock_data][min_qty]" value="<?= /* @escapeNotVerified */ $block->getFieldValue('min_qty') * 1 ?>" <?= /* @escapeNotVerified */ $_readonly ?>>
 
         <div class="control-inner-wrap">
-            <?php $_checked = ($block->getFieldValue('use_config_min_qty') || $block->IsNew()) ? 'checked="checked"' : '' ?>
+            <?php $_checked = ($block->getFieldValue('use_config_min_qty') || $block->isNew()) ? 'checked="checked"' : '' ?>
             <input type="checkbox" id="inventory_use_config_min_qty" name="<?= /* @escapeNotVerified */ $block->getFieldSuffix() ?>[stock_data][use_config_min_qty]" value="1" <?= /* @escapeNotVerified */ $_checked ?> onclick="toggleValueElements(this, this.parentNode);" <?= /* @escapeNotVerified */ $_readonly ?>>
             <label for="inventory_use_config_min_qty"><?= /* @escapeNotVerified */ __('Use Config Settings') ?></label>
         </div>
@@ -94,7 +94,7 @@ toggleValueElements($('inventory_use_config_min_qty'), $('inventory_use_config_m
                name="<?= /* @escapeNotVerified */ $block->getFieldSuffix() ?>[stock_data][min_sale_qty]"
                value="<?= /* @escapeNotVerified */ $block->getFieldValue('min_sale_qty') * 1 ?>" <?= /* @escapeNotVerified */ $_readonly ?>>
         <div class="control-inner-wrap">
-        <?php $_checked = ($block->getFieldValue('use_config_min_sale_qty') || $block->IsNew()) ? 'checked="checked"' : '' ?>
+        <?php $_checked = ($block->getFieldValue('use_config_min_sale_qty') || $block->isNew()) ? 'checked="checked"' : '' ?>
             <input type="checkbox" id="inventory_use_config_min_sale_qty" name="<?= /* @escapeNotVerified */ $block->getFieldSuffix() ?>[stock_data][use_config_min_sale_qty]" value="1" <?= /* @escapeNotVerified */ $_checked ?> onclick="toggleValueElements(this, this.parentNode);" class="checkbox" <?= /* @escapeNotVerified */ $_readonly ?>>
             <label for="inventory_use_config_min_sale_qty"><?= /* @escapeNotVerified */ __('Use Config Settings') ?></label>
         </div>
@@ -117,7 +117,7 @@ toggleValueElements($('inventory_use_config_min_sale_qty'), $('inventory_use_con
     </label>
     <div class="control">
         <input type="text" class="input-text validate-number" id="inventory_max_sale_qty" name="<?= /* @escapeNotVerified */ $block->getFieldSuffix() ?>[stock_data][max_sale_qty]" value="<?= /* @escapeNotVerified */ $block->getFieldValue('max_sale_qty') * 1 ?>" <?= /* @escapeNotVerified */ $_readonly ?>>
-        <?php $_checked = ($block->getFieldValue('use_config_max_sale_qty') || $block->IsNew()) ? 'checked="checked"' : '' ?>
+        <?php $_checked = ($block->getFieldValue('use_config_max_sale_qty') || $block->isNew()) ? 'checked="checked"' : '' ?>
         <div class="control-inner-wrap">
             <input type="checkbox" id="inventory_use_config_max_sale_qty" name="<?= /* @escapeNotVerified */ $block->getFieldSuffix() ?>[stock_data][use_config_max_sale_qty]" value="1" <?= /* @escapeNotVerified */ $_checked ?> onclick="toggleValueElements(this, this.parentNode);" class="checkbox" <?= /* @escapeNotVerified */ $_readonly ?>>
             <label for="inventory_use_config_max_sale_qty"><?= /* @escapeNotVerified */ __('Use Config Settings') ?></label>
@@ -182,7 +182,7 @@ toggleValueElements($('inventory_use_config_max_sale_qty'), $('inventory_use_con
         </select>
 
         <div class="control-inner-wrap">
-            <?php $_checked = ($block->getFieldValue('use_config_backorders') || $block->IsNew()) ? 'checked="checked"' : '' ?>
+            <?php $_checked = ($block->getFieldValue('use_config_backorders') || $block->isNew()) ? 'checked="checked"' : '' ?>
             <input type="checkbox" id="inventory_use_config_backorders" name="<?= /* @escapeNotVerified */ $block->getFieldSuffix() ?>[stock_data][use_config_backorders]" value="1" <?= /* @escapeNotVerified */ $_checked ?> onclick="toggleValueElements(this, this.parentNode);" <?= /* @escapeNotVerified */ $_readonly ?>>
             <label for="inventory_use_config_backorders"><?= /* @escapeNotVerified */ __('Use Config Settings') ?></label>
         </div>
@@ -207,7 +207,7 @@ toggleValueElements($('inventory_use_config_backorders'), $('inventory_use_confi
         <input type="text" class="input-text validate-number" id="inventory_notify_stock_qty" name="<?= /* @escapeNotVerified */ $block->getFieldSuffix() ?>[stock_data][notify_stock_qty]" value="<?= /* @escapeNotVerified */ $block->getFieldValue('notify_stock_qty') * 1 ?>" <?= /* @escapeNotVerified */ $_readonly ?>>
 
         <div class="control-inner-wrap">
-            <?php $_checked = ($block->getFieldValue('use_config_notify_stock_qty') || $block->IsNew()) ? 'checked="checked"' : '' ?>
+            <?php $_checked = ($block->getFieldValue('use_config_notify_stock_qty') || $block->isNew()) ? 'checked="checked"' : '' ?>
             <input type="checkbox" id="inventory_use_config_notify_stock_qty" name="<?= /* @escapeNotVerified */ $block->getFieldSuffix() ?>[stock_data][use_config_notify_stock_qty]" value="1" <?= /* @escapeNotVerified */ $_checked ?> onclick="toggleValueElements(this, this.parentNode);" <?= /* @escapeNotVerified */ $_readonly ?>>
             <label for="inventory_use_config_notify_stock_qty"><?= /* @escapeNotVerified */ __('Use Config Settings') ?></label>
         </div>
@@ -238,7 +238,7 @@ toggleValueElements($('inventory_use_config_notify_stock_qty'), $('inventory_use
         <input type="hidden" id="inventory_enable_qty_increments_default" value="<?= /* @escapeNotVerified */ $block->getDefaultConfigValue('enable_qty_increments') ?>">
 
         <div class="control-inner-wrap">
-            <?php $_checked = ($block->getFieldValue('use_config_enable_qty_inc') || $block->IsNew()) ? 'checked="checked"' : '' ?>
+            <?php $_checked = ($block->getFieldValue('use_config_enable_qty_inc') || $block->isNew()) ? 'checked="checked"' : '' ?>
             <input type="checkbox" id="inventory_use_config_enable_qty_increments" name="<?= /* @escapeNotVerified */ $block->getFieldSuffix() ?>[stock_data][use_config_enable_qty_increments]" value="1" <?= /* @escapeNotVerified */ $_checked ?> onclick="toggleValueElements(this, this.parentNode);" <?= /* @escapeNotVerified */ $_readonly ?>>
             <label for="inventory_use_config_enable_qty_increments"><?= /* @escapeNotVerified */ __('Use Config Settings') ?></label>
         </div>
@@ -262,7 +262,7 @@ toggleValueElements($('inventory_use_config_enable_qty_increments'), $('inventor
     <div class="control">
         <input type="text" class="input-text validate-digits" id="inventory_qty_increments" name="<?= /* @escapeNotVerified */ $block->getFieldSuffix() ?>[stock_data][qty_increments]" value="<?= /* @escapeNotVerified */ $block->getFieldValue('qty_increments') * 1 ?>" <?= /* @escapeNotVerified */ $_readonly ?>>
         <div class="control-inner-wrap">
-            <?php $_checked = ($block->getFieldValue('use_config_qty_increments') || $block->IsNew()) ? 'checked="checked"' : '' ?>
+            <?php $_checked = ($block->getFieldValue('use_config_qty_increments') || $block->isNew()) ? 'checked="checked"' : '' ?>
             <input type="checkbox" id="inventory_use_config_qty_increments" name="<?= /* @escapeNotVerified */ $block->getFieldSuffix() ?>[stock_data][use_config_qty_increments]" value="1" <?= /* @escapeNotVerified */ $_checked ?> onclick="toggleValueElements(this, this.parentNode);" <?= /* @escapeNotVerified */ $_readonly ?>>
             <label for="inventory_use_config_qty_increments"><?= /* @escapeNotVerified */ __('Use Config Settings') ?></label>
         </div>
diff --git a/app/code/Magento/Cms/Helper/Wysiwyg/Images.php b/app/code/Magento/Cms/Helper/Wysiwyg/Images.php
index a557e045c5e..d8a43d92f6d 100644
--- a/app/code/Magento/Cms/Helper/Wysiwyg/Images.php
+++ b/app/code/Magento/Cms/Helper/Wysiwyg/Images.php
@@ -148,7 +148,7 @@ class Images extends \Magento\Framework\App\Helper\AbstractHelper
      */
     public function isUsingStaticUrlsAllowed()
     {
-        $checkResult = new \StdClass();
+        $checkResult = new \stdClass();
         $checkResult->isAllowed = false;
         $this->_eventManager->dispatch(
             'cms_wysiwyg_images_static_urls_allowed',
diff --git a/app/code/Magento/Cms/Test/Unit/Helper/Wysiwyg/ImagesTest.php b/app/code/Magento/Cms/Test/Unit/Helper/Wysiwyg/ImagesTest.php
index 05dad459f06..67401797502 100644
--- a/app/code/Magento/Cms/Test/Unit/Helper/Wysiwyg/ImagesTest.php
+++ b/app/code/Magento/Cms/Test/Unit/Helper/Wysiwyg/ImagesTest.php
@@ -293,7 +293,7 @@ class ImagesTest extends \PHPUnit\Framework\TestCase
     {
         $storeId = 1;
         $this->imagesHelper->setStoreId($storeId);
-        $checkResult = new \StdClass();
+        $checkResult = new \stdClass();
         $checkResult->isAllowed = false;
         $this->eventManagerMock->expects($this->any())
             ->method('dispatch')
diff --git a/app/code/Magento/Config/Test/Unit/Model/Config/Structure/ElementVisibilityCompositeTest.php b/app/code/Magento/Config/Test/Unit/Model/Config/Structure/ElementVisibilityCompositeTest.php
index a3bdb6f008f..b779c29c931 100644
--- a/app/code/Magento/Config/Test/Unit/Model/Config/Structure/ElementVisibilityCompositeTest.php
+++ b/app/code/Magento/Config/Test/Unit/Model/Config/Structure/ElementVisibilityCompositeTest.php
@@ -44,7 +44,7 @@ class ElementVisibilityCompositeTest extends \PHPUnit\Framework\TestCase
     public function testException()
     {
         $visibility = [
-            'stdClass' => new \StdClass()
+            'stdClass' => new \stdClass()
         ];
 
         new ElementVisibilityComposite($visibility);
diff --git a/app/code/Magento/ConfigurableProduct/Test/Unit/Model/Product/Cache/Tag/ConfigurableTest.php b/app/code/Magento/ConfigurableProduct/Test/Unit/Model/Product/Cache/Tag/ConfigurableTest.php
index 519288a50c8..5b4a8d5b8a9 100644
--- a/app/code/Magento/ConfigurableProduct/Test/Unit/Model/Product/Cache/Tag/ConfigurableTest.php
+++ b/app/code/Magento/ConfigurableProduct/Test/Unit/Model/Product/Cache/Tag/ConfigurableTest.php
@@ -39,7 +39,7 @@ class ConfigurableTest extends \PHPUnit\Framework\TestCase
     public function testGetTagsWithObject()
     {
         $this->expectException(\InvalidArgumentException::class, 'Provided argument must be a product');
-        $this->model->getTags(new \StdClass());
+        $this->model->getTags(new \stdClass());
     }
 
     public function testGetTagsWithVariation()
diff --git a/app/code/Magento/Customer/Block/Adminhtml/Edit/Tab/Newsletter.php b/app/code/Magento/Customer/Block/Adminhtml/Edit/Tab/Newsletter.php
index 8506defbf90..032d1ae5d73 100644
--- a/app/code/Magento/Customer/Block/Adminhtml/Edit/Tab/Newsletter.php
+++ b/app/code/Magento/Customer/Block/Adminhtml/Edit/Tab/Newsletter.php
@@ -160,7 +160,7 @@ class Newsletter extends \Magento\Backend\Block\Widget\Form\Generic implements T
             ]
         );
 
-        if ($this->customerAccountManagement->isReadOnly($customerId)) {
+        if ($this->customerAccountManagement->isReadonly($customerId)) {
             $form->getElement('subscription')->setReadonly(true, true);
         }
         $isSubscribed = $subscriber->isSubscribed();
diff --git a/app/code/Magento/Deploy/Test/Unit/Model/DeploymentConfig/ImporterFactoryTest.php b/app/code/Magento/Deploy/Test/Unit/Model/DeploymentConfig/ImporterFactoryTest.php
index c9e101ed3a9..8a0284eb4f7 100644
--- a/app/code/Magento/Deploy/Test/Unit/Model/DeploymentConfig/ImporterFactoryTest.php
+++ b/app/code/Magento/Deploy/Test/Unit/Model/DeploymentConfig/ImporterFactoryTest.php
@@ -55,7 +55,7 @@ class ImporterFactoryTest extends \PHPUnit\Framework\TestCase
         $className = 'some/class/name';
 
         /** @var \StdClass|\PHPUnit_Framework_MockObject_MockObject $importerMock */
-        $importerMock = $this->getMockBuilder(\StdClass::class)
+        $importerMock = $this->getMockBuilder(\stdClass::class)
             ->disableOriginalConstructor()
             ->getMock();
 
diff --git a/app/code/Magento/Deploy/Test/Unit/Model/DeploymentConfig/ValidatorFactoryTest.php b/app/code/Magento/Deploy/Test/Unit/Model/DeploymentConfig/ValidatorFactoryTest.php
index 1da524b37ca..50960808781 100644
--- a/app/code/Magento/Deploy/Test/Unit/Model/DeploymentConfig/ValidatorFactoryTest.php
+++ b/app/code/Magento/Deploy/Test/Unit/Model/DeploymentConfig/ValidatorFactoryTest.php
@@ -56,7 +56,7 @@ class ValidatorFactoryTest extends \PHPUnit\Framework\TestCase
     {
         $className = 'className';
 
-        $stdMock = $this->getMockBuilder(\StdClass::class)
+        $stdMock = $this->getMockBuilder(\stdClass::class)
             ->disableOriginalConstructor()
             ->getMock();
         $this->objectManagerMock->expects($this->once())
diff --git a/app/code/Magento/Downloadable/Model/LinkRepository.php b/app/code/Magento/Downloadable/Model/LinkRepository.php
index 65239ad353c..b84a8284c90 100644
--- a/app/code/Magento/Downloadable/Model/LinkRepository.php
+++ b/app/code/Magento/Downloadable/Model/LinkRepository.php
@@ -207,7 +207,7 @@ class LinkRepository implements \Magento\Downloadable\Api\LinkRepositoryInterfac
         $isGlobalScopeContent
     ) {
         $linkData = [
-            'link_id' => (int)$link->getid(),
+            'link_id' => (int)$link->getId(),
             'is_delete' => 0,
             'type' => $link->getLinkType(),
             'sort_order' => $link->getSortOrder(),
diff --git a/app/code/Magento/Downloadable/Model/SampleRepository.php b/app/code/Magento/Downloadable/Model/SampleRepository.php
index 633243ac2eb..5b9e8e784b9 100644
--- a/app/code/Magento/Downloadable/Model/SampleRepository.php
+++ b/app/code/Magento/Downloadable/Model/SampleRepository.php
@@ -215,7 +215,7 @@ class SampleRepository implements \Magento\Downloadable\Api\SampleRepositoryInte
         $isGlobalScopeContent
     ) {
         $sampleData = [
-            'sample_id' => (int)$sample->getid(),
+            'sample_id' => (int)$sample->getId(),
             'is_delete' => 0,
             'type' => $sample->getSampleType(),
             'sort_order' => $sample->getSortOrder(),
diff --git a/app/code/Magento/Downloadable/Test/Unit/Ui/DataProvider/Product/Form/Modifier/CompositeTest.php b/app/code/Magento/Downloadable/Test/Unit/Ui/DataProvider/Product/Form/Modifier/CompositeTest.php
index 155f95874ee..5b04c83f4ff 100644
--- a/app/code/Magento/Downloadable/Test/Unit/Ui/DataProvider/Product/Form/Modifier/CompositeTest.php
+++ b/app/code/Magento/Downloadable/Test/Unit/Ui/DataProvider/Product/Form/Modifier/CompositeTest.php
@@ -156,7 +156,7 @@ class CompositeTest extends \PHPUnit\Framework\TestCase
      */
     protected function initModifiers()
     {
-        $this->modifierMock = $this->getMockBuilder(\StdClass::class)
+        $this->modifierMock = $this->getMockBuilder(\stdClass::class)
             ->setMethods(['modifyData', 'modifyMeta'])
             ->getMock();
         $this->modifierFactoryMock->expects($this->once())
diff --git a/app/code/Magento/Eav/Model/Entity/AbstractEntity.php b/app/code/Magento/Eav/Model/Entity/AbstractEntity.php
index 105bc0a0bec..0c74b84457d 100644
--- a/app/code/Magento/Eav/Model/Entity/AbstractEntity.php
+++ b/app/code/Magento/Eav/Model/Entity/AbstractEntity.php
@@ -1656,7 +1656,7 @@ abstract class AbstractEntity extends AbstractResource implements EntityInterfac
             $this->_processAttributeValues();
             $connection->commit();
         } catch (\Exception $e) {
-            $connection->rollback();
+            $connection->rollBack();
             throw $e;
         }
 
diff --git a/app/code/Magento/Email/Test/Unit/Block/Adminhtml/Template/EditTest.php b/app/code/Magento/Email/Test/Unit/Block/Adminhtml/Template/EditTest.php
index aa531e8189c..9a333e2d01a 100644
--- a/app/code/Magento/Email/Test/Unit/Block/Adminhtml/Template/EditTest.php
+++ b/app/code/Magento/Email/Test/Unit/Block/Adminhtml/Template/EditTest.php
@@ -66,7 +66,7 @@ class EditTest extends \PHPUnit\Framework\TestCase
             ['getFilesystem', '__wakeup', 'getPath', 'getDirectoryRead']
         );
 
-        $viewFilesystem = $this->getMockBuilder(\Magento\Framework\View\Filesystem::class)
+        $viewFilesystem = $this->getMockBuilder(\Magento\Framework\View\FileSystem::class)
             ->setMethods(['getTemplateFileName'])
             ->disableOriginalConstructor()
             ->getMock();
diff --git a/app/code/Magento/NewRelicReporting/Model/Observer/ReportConcurrentAdmins.php b/app/code/Magento/NewRelicReporting/Model/Observer/ReportConcurrentAdmins.php
index 615c80633cb..9dfd0e1e331 100644
--- a/app/code/Magento/NewRelicReporting/Model/Observer/ReportConcurrentAdmins.php
+++ b/app/code/Magento/NewRelicReporting/Model/Observer/ReportConcurrentAdmins.php
@@ -66,8 +66,8 @@ class ReportConcurrentAdmins implements ObserverInterface
                 $user = $this->backendAuthSession->getUser();
                 $jsonData = [
                     'id' => $user->getId(),
-                    'username' => $user->getUsername(),
-                    'name' => $user->getFirstname() . ' ' . $user->getLastname(),
+                    'username' => $user->getUserName(),
+                    'name' => $user->getFirstName() . ' ' . $user->getLastName(),
                 ];
 
                 $modelData = [
diff --git a/app/code/Magento/NewRelicReporting/Model/Observer/ReportConcurrentAdminsToNewRelic.php b/app/code/Magento/NewRelicReporting/Model/Observer/ReportConcurrentAdminsToNewRelic.php
index cff1b159d48..2f142f6ac81 100644
--- a/app/code/Magento/NewRelicReporting/Model/Observer/ReportConcurrentAdminsToNewRelic.php
+++ b/app/code/Magento/NewRelicReporting/Model/Observer/ReportConcurrentAdminsToNewRelic.php
@@ -58,10 +58,10 @@ class ReportConcurrentAdminsToNewRelic implements ObserverInterface
             if ($this->backendAuthSession->isLoggedIn()) {
                 $user = $this->backendAuthSession->getUser();
                 $this->newRelicWrapper->addCustomParameter(Config::ADMIN_USER_ID, $user->getId());
-                $this->newRelicWrapper->addCustomParameter(Config::ADMIN_USER, $user->getUsername());
+                $this->newRelicWrapper->addCustomParameter(Config::ADMIN_USER, $user->getUserName());
                 $this->newRelicWrapper->addCustomParameter(
                     Config::ADMIN_NAME,
-                    $user->getFirstname() . ' ' . $user->getLastname()
+                    $user->getFirstName() . ' ' . $user->getLastName()
                 );
             }
         }
diff --git a/app/code/Magento/NewRelicReporting/Model/Observer/ReportSystemCacheFlushToNewRelic.php b/app/code/Magento/NewRelicReporting/Model/Observer/ReportSystemCacheFlushToNewRelic.php
index 0e3ad1605f9..5500aba1959 100644
--- a/app/code/Magento/NewRelicReporting/Model/Observer/ReportSystemCacheFlushToNewRelic.php
+++ b/app/code/Magento/NewRelicReporting/Model/Observer/ReportSystemCacheFlushToNewRelic.php
@@ -58,8 +58,8 @@ class ReportSystemCacheFlushToNewRelic implements ObserverInterface
             if ($user->getId()) {
                 $this->deploymentsFactory->create()->setDeployment(
                     'Cache Flush',
-                    $user->getUsername() . ' flushed the cache.',
-                    $user->getUsername()
+                    $user->getUserName() . ' flushed the cache.',
+                    $user->getUserName()
                 );
             }
         }
diff --git a/app/code/Magento/OfflineShipping/Model/ResourceModel/Carrier/Tablerate.php b/app/code/Magento/OfflineShipping/Model/ResourceModel/Carrier/Tablerate.php
index 500ab253f2a..961958a54ac 100644
--- a/app/code/Magento/OfflineShipping/Model/ResourceModel/Carrier/Tablerate.php
+++ b/app/code/Magento/OfflineShipping/Model/ResourceModel/Carrier/Tablerate.php
@@ -232,10 +232,10 @@ class Tablerate extends \Magento\Framework\Model\ResourceModel\Db\AbstractDb
                 $this->_importedRows += count($values);
             }
         } catch (\Magento\Framework\Exception\LocalizedException $e) {
-            $connection->rollback();
+            $connection->rollBack();
             throw new \Magento\Framework\Exception\LocalizedException(__('Unable to import data'), $e);
         } catch (\Exception $e) {
-            $connection->rollback();
+            $connection->rollBack();
             $this->logger->critical($e);
             throw new \Magento\Framework\Exception\LocalizedException(
                 __('Something went wrong while importing table rates.')
diff --git a/app/code/Magento/OfflineShipping/Test/Unit/Block/Adminhtml/Form/Field/ExportTest.php b/app/code/Magento/OfflineShipping/Test/Unit/Block/Adminhtml/Form/Field/ExportTest.php
index cc164e504b6..3e2c7df9087 100644
--- a/app/code/Magento/OfflineShipping/Test/Unit/Block/Adminhtml/Form/Field/ExportTest.php
+++ b/app/code/Magento/OfflineShipping/Test/Unit/Block/Adminhtml/Form/Field/ExportTest.php
@@ -37,7 +37,7 @@ class ExportTest extends \PHPUnit\Framework\TestCase
         $requestMock = $this->createMock(\Magento\Framework\App\RequestInterface::class);
         $requestMock->expects($this->once())->method('getParam')->with('website')->will($this->returnValue(1));
 
-        $mockData = $this->createPartialMock(\StdClass::class, ['toHtml']);
+        $mockData = $this->createPartialMock(\stdClass::class, ['toHtml']);
         $mockData->expects($this->once())->method('toHtml')->will($this->returnValue($expected));
 
         $blockMock->expects($this->once())->method('getRequest')->will($this->returnValue($requestMock));
diff --git a/app/code/Magento/Paypal/Model/ResourceModel/Report/Settlement.php b/app/code/Magento/Paypal/Model/ResourceModel/Report/Settlement.php
index 0796c22db98..d4019c6c4a7 100644
--- a/app/code/Magento/Paypal/Model/ResourceModel/Report/Settlement.php
+++ b/app/code/Magento/Paypal/Model/ResourceModel/Report/Settlement.php
@@ -90,7 +90,7 @@ class Settlement extends \Magento\Framework\Model\ResourceModel\Db\AbstractDb
                 }
                 $connection->commit();
             } catch (\Exception $e) {
-                $connection->rollback();
+                $connection->rollBack();
             }
         }
 
diff --git a/app/code/Magento/Paypal/Test/Unit/Model/Payflow/Service/Response/TransactionTest.php b/app/code/Magento/Paypal/Test/Unit/Model/Payflow/Service/Response/TransactionTest.php
index f5c9ab9a3d9..93a10727824 100644
--- a/app/code/Magento/Paypal/Test/Unit/Model/Payflow/Service/Response/TransactionTest.php
+++ b/app/code/Magento/Paypal/Test/Unit/Model/Payflow/Service/Response/TransactionTest.php
@@ -67,7 +67,7 @@ class TransactionTest extends \PHPUnit\Framework\TestCase
     {
         return [
             "Input data is a string" => ['testInput'],
-            "Input data is an object" => [new \StdClass],
+            "Input data is an object" => [new \stdClass],
             "Input data is an array" => [['test' => 'input']]
         ];
     }
diff --git a/app/code/Magento/Review/Model/ResourceModel/Rating/Option.php b/app/code/Magento/Review/Model/ResourceModel/Rating/Option.php
index 6f68000a1ef..ef4acb6c90c 100644
--- a/app/code/Magento/Review/Model/ResourceModel/Rating/Option.php
+++ b/app/code/Magento/Review/Model/ResourceModel/Rating/Option.php
@@ -154,7 +154,7 @@ class Option extends \Magento\Framework\Model\ResourceModel\Db\AbstractDb
             }
             $connection->commit();
         } catch (\Exception $e) {
-            $connection->rollback();
+            $connection->rollBack();
             throw new \Exception($e->getMessage());
         }
         return $this;
diff --git a/app/code/Magento/Rule/Model/ResourceModel/AbstractResource.php b/app/code/Magento/Rule/Model/ResourceModel/AbstractResource.php
index 2fdb960521a..6e685a9a9b9 100644
--- a/app/code/Magento/Rule/Model/ResourceModel/AbstractResource.php
+++ b/app/code/Magento/Rule/Model/ResourceModel/AbstractResource.php
@@ -81,7 +81,7 @@ abstract class AbstractResource extends \Magento\Framework\Model\ResourceModel\D
         try {
             $this->_multiplyBunchInsert($ruleIds, $entityIds, $entityType);
         } catch (\Exception $e) {
-            $this->getConnection()->rollback();
+            $this->getConnection()->rollBack();
             throw $e;
         }
 
diff --git a/app/code/Magento/Sales/Test/Unit/Block/Adminhtml/Items/AbstractItemsTest.php b/app/code/Magento/Sales/Test/Unit/Block/Adminhtml/Items/AbstractItemsTest.php
index 20f7a7061b6..a390c432760 100644
--- a/app/code/Magento/Sales/Test/Unit/Block/Adminhtml/Items/AbstractItemsTest.php
+++ b/app/code/Magento/Sales/Test/Unit/Block/Adminhtml/Items/AbstractItemsTest.php
@@ -84,7 +84,7 @@ class AbstractItemsTest extends \PHPUnit\Framework\TestCase
      */
     public function testGetItemRendererThrowsExceptionForNonexistentRenderer()
     {
-        $renderer = $this->createMock(\StdClass::class);
+        $renderer = $this->createMock(\stdClass::class);
         $layout = $this->createPartialMock(
             \Magento\Framework\View\Layout::class,
             ['getChildName', 'getBlock', '__wakeup']
diff --git a/app/code/Magento/Sales/Test/Unit/Block/Adminhtml/Items/AbstractTest.php b/app/code/Magento/Sales/Test/Unit/Block/Adminhtml/Items/AbstractTest.php
index 311e5f69767..a34373f516c 100644
--- a/app/code/Magento/Sales/Test/Unit/Block/Adminhtml/Items/AbstractTest.php
+++ b/app/code/Magento/Sales/Test/Unit/Block/Adminhtml/Items/AbstractTest.php
@@ -62,7 +62,7 @@ class AbstractTest extends \PHPUnit\Framework\TestCase
      */
     public function testGetItemRendererThrowsExceptionForNonexistentRenderer()
     {
-        $renderer = $this->createMock(\StdClass::class);
+        $renderer = $this->createMock(\stdClass::class);
         $layout = $this->createPartialMock(
             \Magento\Framework\View\Layout::class,
             ['getChildName', 'getBlock', '__wakeup']
diff --git a/app/code/Magento/Sales/Test/Unit/Model/Order/Payment/InfoTest.php b/app/code/Magento/Sales/Test/Unit/Model/Order/Payment/InfoTest.php
index 70e5ad127e4..293c2eea123 100644
--- a/app/code/Magento/Sales/Test/Unit/Model/Order/Payment/InfoTest.php
+++ b/app/code/Magento/Sales/Test/Unit/Model/Order/Payment/InfoTest.php
@@ -179,7 +179,7 @@ class InfoTest extends \PHPUnit\Framework\TestCase
      */
     public function testSetAdditionalInformationException()
     {
-        $this->info->setAdditionalInformation('object', new \StdClass());
+        $this->info->setAdditionalInformation('object', new \stdClass());
     }
 
     /**
diff --git a/app/code/Magento/Sales/Test/Unit/Model/Order/Pdf/AbstractTest.php b/app/code/Magento/Sales/Test/Unit/Model/Order/Pdf/AbstractTest.php
index c91d4edb155..0761b5abb5d 100644
--- a/app/code/Magento/Sales/Test/Unit/Model/Order/Pdf/AbstractTest.php
+++ b/app/code/Magento/Sales/Test/Unit/Model/Order/Pdf/AbstractTest.php
@@ -19,7 +19,7 @@ class AbstractTest extends \PHPUnit\Framework\TestCase
         // Setup parameters, that will be passed to the tested model method
         $page = $this->createMock(\Zend_Pdf_Page::class);
 
-        $order = new \StdClass();
+        $order = new \stdClass();
         $source = $this->createMock(\Magento\Sales\Model\Order\Invoice::class);
         $source->expects($this->any())->method('getOrder')->will($this->returnValue($order));
 
diff --git a/app/code/Magento/Sales/Test/Unit/Model/Order/Pdf/Config/ReaderTest.php b/app/code/Magento/Sales/Test/Unit/Model/Order/Pdf/Config/ReaderTest.php
index b1b51c3f123..b808a4139e8 100644
--- a/app/code/Magento/Sales/Test/Unit/Model/Order/Pdf/Config/ReaderTest.php
+++ b/app/code/Magento/Sales/Test/Unit/Model/Order/Pdf/Config/ReaderTest.php
@@ -87,7 +87,7 @@ class ReaderTest extends \PHPUnit\Framework\TestCase
     public function testRead()
     {
         $expectedResult = new \stdClass();
-        $constraint = function (\DOMDOcument $actual) {
+        $constraint = function (\DOMDocument $actual) {
             try {
                 $expected = __DIR__ . '/_files/pdf_merged.xml';
                 \PHPUnit\Framework\Assert::assertXmlStringEqualsXmlFile($expected, $actual->saveXML());
diff --git a/app/code/Magento/Tax/Test/Unit/Model/Calculation/RowBaseAndTotalBaseCalculatorTestCase.php b/app/code/Magento/Tax/Test/Unit/Model/Calculation/RowBaseAndTotalBaseCalculatorTestCase.php
index abb8c490159..89800e3be87 100644
--- a/app/code/Magento/Tax/Test/Unit/Model/Calculation/RowBaseAndTotalBaseCalculatorTestCase.php
+++ b/app/code/Magento/Tax/Test/Unit/Model/Calculation/RowBaseAndTotalBaseCalculatorTestCase.php
@@ -9,7 +9,7 @@
 namespace Magento\Tax\Test\Unit\Model\Calculation;
 
 use Magento\Framework\TestFramework\Unit\Helper\ObjectManager;
-use Magento\Tax\Model\Calculation\RowbaseCalculator;
+use Magento\Tax\Model\Calculation\RowBaseCalculator;
 use Magento\Tax\Model\Calculation\TotalBaseCalculator;
 
 /**
diff --git a/app/code/Magento/Ui/Config/Converter/HtmlContent.php b/app/code/Magento/Ui/Config/Converter/HtmlContent.php
index f77b4a5285d..db874a302bd 100644
--- a/app/code/Magento/Ui/Config/Converter/HtmlContent.php
+++ b/app/code/Magento/Ui/Config/Converter/HtmlContent.php
@@ -23,7 +23,7 @@ class HtmlContent implements ConverterInterface
         if ($node->nodeType == XML_ELEMENT_NODE) {
             $xml = '<?xml version="1.0"?>' . "\n"
                 . '<layout xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">' . "\n"
-                . $node->ownerDocument->saveXml($node) . "\n"
+                . $node->ownerDocument->saveXML($node) . "\n"
                 . '</layout>';
             $items['layout']['xsi:type'] = 'string';
             $items['layout']['name'] = 'layout';
diff --git a/app/code/Magento/User/Model/ResourceModel/User.php b/app/code/Magento/User/Model/ResourceModel/User.php
index 880dec93fc9..b3e4936266a 100644
--- a/app/code/Magento/User/Model/ResourceModel/User.php
+++ b/app/code/Magento/User/Model/ResourceModel/User.php
@@ -222,7 +222,7 @@ class User extends \Magento\Framework\Model\ResourceModel\Db\AbstractDb
                     'role_type' => RoleUser::ROLE_TYPE,
                     'user_id' => $user->getId(),
                     'user_type' => UserContextInterface::USER_TYPE_ADMIN,
-                    'role_name' => $user->getFirstname(),
+                    'role_name' => $user->getFirstName(),
                 ]
             );
 
diff --git a/app/code/Magento/User/Model/User.php b/app/code/Magento/User/Model/User.php
index b1b655dddd0..2a7d43008f2 100644
--- a/app/code/Magento/User/Model/User.php
+++ b/app/code/Magento/User/Model/User.php
@@ -467,7 +467,7 @@ class User extends AbstractModel implements StorageInterface, UserInterface
             $changes[] = __('password');
         }
 
-        if ($this->getUsername() != $this->getOrigData('username') && $this->getOrigData('username')) {
+        if ($this->getUserName() != $this->getOrigData('username') && $this->getOrigData('username')) {
             $changes[] = __('username');
         }
 
@@ -515,7 +515,7 @@ class User extends AbstractModel implements StorageInterface, UserInterface
      */
     public function getName($separator = ' ')
     {
-        return $this->getFirstname() . $separator . $this->getLastname();
+        return $this->getFirstName() . $separator . $this->getLastName();
     }
 
     /**
@@ -547,7 +547,7 @@ class User extends AbstractModel implements StorageInterface, UserInterface
                 ['username' => $username, 'user' => $this]
             );
             $this->loadByUsername($username);
-            $sensitive = $config ? $username == $this->getUsername() : true;
+            $sensitive = $config ? $username == $this->getUserName() : true;
             if ($sensitive && $this->getId()) {
                 $result = $this->verifyIdentity($password);
             }
diff --git a/app/code/Magento/User/Test/Unit/Model/UserTest.php b/app/code/Magento/User/Test/Unit/Model/UserTest.php
index 3f02cedd32e..5e0a9a14c2b 100644
--- a/app/code/Magento/User/Test/Unit/Model/UserTest.php
+++ b/app/code/Magento/User/Test/Unit/Model/UserTest.php
@@ -183,11 +183,11 @@ class UserTest extends \PHPUnit\Framework\TestCase
         $this->model->setPassword($password);
         $this->model->setOrigData('password', $origPassword);
 
-        $this->model->setUsername($username);
+        $this->model->setUserName($username);
         $this->model->setOrigData('username', $origUsername);
 
-        $this->model->setFirstname($firstName);
-        $this->model->setLastname($lastName);
+        $this->model->setFirstName($firstName);
+        $this->model->setLastName($lastName);
 
         $this->configMock->expects($this->exactly(4))
             ->method('getValue')
@@ -255,8 +255,8 @@ class UserTest extends \PHPUnit\Framework\TestCase
         $lastName = 'Bar';
 
         $this->model->setEmail($email);
-        $this->model->setFirstname($firstName);
-        $this->model->setLastname($lastName);
+        $this->model->setFirstName($firstName);
+        $this->model->setLastName($lastName);
 
         $this->configMock->expects($this->at(0))
             ->method('getValue')
diff --git a/app/code/Magento/Webapi/Model/Soap/Fault.php b/app/code/Magento/Webapi/Model/Soap/Fault.php
index ee9c194e7c5..b8ddf4e47d4 100644
--- a/app/code/Magento/Webapi/Model/Soap/Fault.php
+++ b/app/code/Magento/Webapi/Model/Soap/Fault.php
@@ -355,7 +355,7 @@ FAULT_MESSAGE;
 
         $errorsXml = '';
         foreach ($wrappedErrors as $error) {
-            $errorsXml .= $this->_generateErrorNodeXml($error);
+            $errorsXml .= $this->_generateErrorNodeXML($error);
         }
         if (!empty($errorsXml)) {
             $wrappedErrorsNode = self::NODE_DETAIL_WRAPPED_ERRORS;
diff --git a/app/code/Magento/Widget/Test/Unit/Model/Config/FileResolverTest.php b/app/code/Magento/Widget/Test/Unit/Model/Config/FileResolverTest.php
index 65e45b73d88..301869a50a7 100644
--- a/app/code/Magento/Widget/Test/Unit/Model/Config/FileResolverTest.php
+++ b/app/code/Magento/Widget/Test/Unit/Model/Config/FileResolverTest.php
@@ -41,7 +41,7 @@ class FileResolverTest extends \PHPUnit\Framework\TestCase
 
     public function testGetGlobal()
     {
-        $expected = new \StdClass();
+        $expected = new \stdClass();
         $this->moduleReader
             ->expects($this->once())
             ->method('getConfigurationFiles')
@@ -52,7 +52,7 @@ class FileResolverTest extends \PHPUnit\Framework\TestCase
 
     public function testGetDesign()
     {
-        $expected = new \StdClass();
+        $expected = new \stdClass();
         $this->componentDirSearch->expects($this->once())
             ->method('collectFiles')
             ->with(ComponentRegistrar::THEME, 'etc/file')
@@ -63,7 +63,7 @@ class FileResolverTest extends \PHPUnit\Framework\TestCase
 
     public function testGetDefault()
     {
-        $expected = new \StdClass();
+        $expected = new \stdClass();
         $this->factory->expects($this->once())->method('create')->with([])->willReturn($expected);
         $this->assertSame($expected, $this->object->get('file', 'unknown'));
     }
-- 
GitLab


From a3ed399935e9b1582c0aa387cfd3fabd20b571e9 Mon Sep 17 00:00:00 2001
From: "Leandro F. L" <leandro.luvisotto@empiricus.com.br>
Date: Fri, 1 Dec 2017 12:45:09 -0200
Subject: [PATCH 239/380] The left and the right parts of assignment are equal

---
 app/code/Magento/Variable/Block/System/Variable/Edit.php | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)

diff --git a/app/code/Magento/Variable/Block/System/Variable/Edit.php b/app/code/Magento/Variable/Block/System/Variable/Edit.php
index cf9a7489f3d..ea119b88fa7 100644
--- a/app/code/Magento/Variable/Block/System/Variable/Edit.php
+++ b/app/code/Magento/Variable/Block/System/Variable/Edit.php
@@ -90,9 +90,7 @@ class Edit extends \Magento\Backend\Block\Widget\Form\Container
      */
     public function getFormHtml()
     {
-        $formHtml = parent::getFormHtml();
-
-        return $formHtml;
+        return parent::getFormHtml();
     }
 
     /**
-- 
GitLab


From 04a1c77802fb41ced137f274b2aceb03a3f3aa26 Mon Sep 17 00:00:00 2001
From: Volodymyr Kublytskyi <vkublytskyi@magento.com>
Date: Fri, 1 Dec 2017 16:55:07 +0200
Subject: [PATCH 240/380] MAGETWO-83287: #11825: Generate new FormKey and
 replace for oldRequestParams Wishlist #12038

 - fixed unit test
---
 .../Model/Plugin/CustomerFlushFormKeyTest.php | 19 +++++++------------
 1 file changed, 7 insertions(+), 12 deletions(-)

diff --git a/app/code/Magento/Customer/Test/Unit/Model/Plugin/CustomerFlushFormKeyTest.php b/app/code/Magento/Customer/Test/Unit/Model/Plugin/CustomerFlushFormKeyTest.php
index c06805e94ea..1b30fb5c60e 100644
--- a/app/code/Magento/Customer/Test/Unit/Model/Plugin/CustomerFlushFormKeyTest.php
+++ b/app/code/Magento/Customer/Test/Unit/Model/Plugin/CustomerFlushFormKeyTest.php
@@ -9,14 +9,13 @@ use Magento\Customer\Model\Plugin\CustomerFlushFormKey;
 use Magento\Customer\Model\Session;
 use Magento\Framework\App\PageCache\FormKey as CookieFormKey;
 use Magento\Framework\Data\Form\FormKey as DataFormKey;
+use Magento\Framework\Event\Observer;
 use Magento\PageCache\Observer\FlushFormKey;
 use PHPUnit\Framework\TestCase;
 use PHPUnit_Framework_MockObject_MockObject as MockObject;
 
 class CustomerFlushFormKeyTest extends TestCase
 {
-    const CLOSURE_VALUE = 'CLOSURE';
-
     /**
      * @var CookieFormKey | MockObject
      */
@@ -32,11 +31,6 @@ class CustomerFlushFormKeyTest extends TestCase
      */
     private $dataFormKey;
 
-    /**
-     * @var \Closure
-     */
-    private $closure;
-
     protected function setUp()
     {
 
@@ -55,10 +49,6 @@ class CustomerFlushFormKeyTest extends TestCase
             ->disableOriginalConstructor()
             ->setMethods(['getBeforeRequestParams', 'setBeforeRequestParams'])
             ->getMock();
-
-        $this->closure = function () {
-            return static::CLOSURE_VALUE;
-        };
     }
 
     /**
@@ -74,6 +64,7 @@ class CustomerFlushFormKeyTest extends TestCase
         $getFormKeyTimes,
         $setBeforeParamsTimes
     ) {
+        $observerDto = new Observer();
         $observer = new FlushFormKey($this->cookieFormKey, $this->dataFormKey);
         $plugin = new CustomerFlushFormKey($this->customerSession, $this->dataFormKey);
 
@@ -91,7 +82,11 @@ class CustomerFlushFormKeyTest extends TestCase
             ->method('setBeforeRequestParams')
             ->with($beforeParams);
 
-        $plugin->aroundExecute($observer, $this->closure, $observer);
+        $proceed = function ($observerDto) use ($observer) {
+            return $observer->execute($observerDto);
+        };
+
+        $plugin->aroundExecute($observer, $proceed, $observerDto);
     }
 
     /**
-- 
GitLab


From 66556661476c7727af7e7a2b75c2e37519aafc49 Mon Sep 17 00:00:00 2001
From: "Leandro F. L" <leandro.luvisotto@empiricus.com.br>
Date: Fri, 1 Dec 2017 12:57:47 -0200
Subject: [PATCH 241/380] Case mismatch

---
 .../Magento/Framework/Api/ExtensionAttributesFactory.php    | 2 +-
 lib/internal/Magento/Framework/App/State/CleanupFiles.php   | 2 +-
 .../Framework/App/Test/Unit/Cache/Tag/ResolverTest.php      | 2 +-
 .../App/Test/Unit/Cache/Tag/Strategy/DummyTest.php          | 2 +-
 .../App/Test/Unit/Cache/Tag/Strategy/FactoryTest.php        | 2 +-
 .../App/Test/Unit/Cache/Tag/Strategy/IdentifierTest.php     | 2 +-
 .../Magento/Framework/App/Test/Unit/Request/HttpTest.php    | 4 ++--
 .../Test/Unit/Reader/_files/ClassesForArgumentsReader.php   | 6 +++---
 .../Framework/Data/Test/Unit/Tree/Node/CollectionTest.php   | 2 +-
 lib/internal/Magento/Framework/Xml/Security.php             | 2 +-
 10 files changed, 13 insertions(+), 13 deletions(-)

diff --git a/lib/internal/Magento/Framework/Api/ExtensionAttributesFactory.php b/lib/internal/Magento/Framework/Api/ExtensionAttributesFactory.php
index d7a92460a7f..dab0650fc7f 100644
--- a/lib/internal/Magento/Framework/Api/ExtensionAttributesFactory.php
+++ b/lib/internal/Magento/Framework/Api/ExtensionAttributesFactory.php
@@ -97,7 +97,7 @@ class ExtensionAttributesFactory
         }
         $modelReflection = new \ReflectionClass($extensibleClassName);
         if ($modelReflection->isInterface()
-            && $modelReflection->isSubClassOf(self::EXTENSIBLE_INTERFACE_NAME)
+            && $modelReflection->isSubclassOf(self::EXTENSIBLE_INTERFACE_NAME)
             && $modelReflection->hasMethod('getExtensionAttributes')
         ) {
             $this->classInterfaceMap[$extensibleClassName] = $extensibleClassName;
diff --git a/lib/internal/Magento/Framework/App/State/CleanupFiles.php b/lib/internal/Magento/Framework/App/State/CleanupFiles.php
index 4202fd8883e..c95caf8310b 100644
--- a/lib/internal/Magento/Framework/App/State/CleanupFiles.php
+++ b/lib/internal/Magento/Framework/App/State/CleanupFiles.php
@@ -106,7 +106,7 @@ class CleanupFiles
                 $messages[] = $dirPath . $path;
                 try {
                     $dir->delete($path);
-                } catch (FilesystemException $e) {
+                } catch (FileSystemException $e) {
                     $messages[] = $e->getMessage();
                 }
             }
diff --git a/lib/internal/Magento/Framework/App/Test/Unit/Cache/Tag/ResolverTest.php b/lib/internal/Magento/Framework/App/Test/Unit/Cache/Tag/ResolverTest.php
index 4348177ef32..f4560ed31ae 100644
--- a/lib/internal/Magento/Framework/App/Test/Unit/Cache/Tag/ResolverTest.php
+++ b/lib/internal/Magento/Framework/App/Test/Unit/Cache/Tag/ResolverTest.php
@@ -47,7 +47,7 @@ class ResolverTest extends \PHPUnit\Framework\TestCase
     public function testGetTagsForObject()
     {
         $strategyReturnValue = ['test tag'];
-        $object = new \StdClass;
+        $object = new \stdClass;
         $this->strategy->expects($this->once())
             ->method('getTags')
             ->with($object)
diff --git a/lib/internal/Magento/Framework/App/Test/Unit/Cache/Tag/Strategy/DummyTest.php b/lib/internal/Magento/Framework/App/Test/Unit/Cache/Tag/Strategy/DummyTest.php
index e8c76048f4e..ad043260645 100644
--- a/lib/internal/Magento/Framework/App/Test/Unit/Cache/Tag/Strategy/DummyTest.php
+++ b/lib/internal/Magento/Framework/App/Test/Unit/Cache/Tag/Strategy/DummyTest.php
@@ -28,7 +28,7 @@ class DummyTest extends \PHPUnit\Framework\TestCase
     {
         $emptyArray = [];
 
-        $this->assertEquals($emptyArray, $this->model->getTags(new \StdClass));
+        $this->assertEquals($emptyArray, $this->model->getTags(new \stdClass));
 
         $identityInterface = $this->getMockForAbstractClass(\Magento\Framework\DataObject\IdentityInterface::class);
         $this->assertEquals($emptyArray, $this->model->getTags($identityInterface));
diff --git a/lib/internal/Magento/Framework/App/Test/Unit/Cache/Tag/Strategy/FactoryTest.php b/lib/internal/Magento/Framework/App/Test/Unit/Cache/Tag/Strategy/FactoryTest.php
index 7f570d9f135..8964bd70f0b 100644
--- a/lib/internal/Magento/Framework/App/Test/Unit/Cache/Tag/Strategy/FactoryTest.php
+++ b/lib/internal/Magento/Framework/App/Test/Unit/Cache/Tag/Strategy/FactoryTest.php
@@ -55,7 +55,7 @@ class FactoryTest extends \PHPUnit\Framework\TestCase
 
     public function testGetStrategyWithObject()
     {
-        $this->assertEquals($this->dummyStrategy, $this->model->getStrategy(new \StdClass));
+        $this->assertEquals($this->dummyStrategy, $this->model->getStrategy(new \stdClass));
     }
 
     public function testGetStrategyWithIdentityInterface()
diff --git a/lib/internal/Magento/Framework/App/Test/Unit/Cache/Tag/Strategy/IdentifierTest.php b/lib/internal/Magento/Framework/App/Test/Unit/Cache/Tag/Strategy/IdentifierTest.php
index e2039c0517c..d0fcf9d8a73 100644
--- a/lib/internal/Magento/Framework/App/Test/Unit/Cache/Tag/Strategy/IdentifierTest.php
+++ b/lib/internal/Magento/Framework/App/Test/Unit/Cache/Tag/Strategy/IdentifierTest.php
@@ -28,7 +28,7 @@ class IdentifierTest extends \PHPUnit\Framework\TestCase
 
     public function testGetTagsWithObject()
     {
-        $this->assertEquals([], $this->model->getTags(new \StdClass));
+        $this->assertEquals([], $this->model->getTags(new \stdClass));
     }
 
     public function testGetTagsWithIdentityInterface()
diff --git a/lib/internal/Magento/Framework/App/Test/Unit/Request/HttpTest.php b/lib/internal/Magento/Framework/App/Test/Unit/Request/HttpTest.php
index 450e1ed0b3a..66eee671e17 100644
--- a/lib/internal/Magento/Framework/App/Test/Unit/Request/HttpTest.php
+++ b/lib/internal/Magento/Framework/App/Test/Unit/Request/HttpTest.php
@@ -363,7 +363,7 @@ class HttpTest extends \PHPUnit\Framework\TestCase
     {
         $this->_model = $this->getModel();
         $_SERVER['REQUEST_METHOD'] = $httpMethod;
-        $this->assertEquals(true, $this->_model->IsSafeMethod());
+        $this->assertEquals(true, $this->_model->isSafeMethod());
     }
 
     /**
@@ -375,7 +375,7 @@ class HttpTest extends \PHPUnit\Framework\TestCase
     {
         $this->_model = $this->getModel();
         $_SERVER['REQUEST_METHOD'] = $httpMethod;
-        $this->assertEquals(false, $this->_model->IsSafeMethod());
+        $this->assertEquals(false, $this->_model->isSafeMethod());
     }
 
     public function httpSafeMethodProvider()
diff --git a/lib/internal/Magento/Framework/Code/Test/Unit/Reader/_files/ClassesForArgumentsReader.php b/lib/internal/Magento/Framework/Code/Test/Unit/Reader/_files/ClassesForArgumentsReader.php
index 4508bccf54c..7fc2b13442b 100644
--- a/lib/internal/Magento/Framework/Code/Test/Unit/Reader/_files/ClassesForArgumentsReader.php
+++ b/lib/internal/Magento/Framework/Code/Test/Unit/Reader/_files/ClassesForArgumentsReader.php
@@ -132,7 +132,7 @@ class FirstClassForParentCall
         $this->_arrayVariable = $arrayVariable;
     }
 }
-class ThirdClassForParentCall extends firstClassForParentCall
+class ThirdClassForParentCall extends FirstClassForParentCall
 {
     /**
      * @var stdClass
@@ -155,7 +155,7 @@ class ThirdClassForParentCall extends firstClassForParentCall
         $this->_secondClass = $secondClass;
     }
 }
-class WrongArgumentsOrder extends firstClassForParentCall
+class WrongArgumentsOrder extends FirstClassForParentCall
 {
     /**
      * @var stdClass
@@ -178,7 +178,7 @@ class WrongArgumentsOrder extends firstClassForParentCall
         $this->_secondClass = $secondClass;
     }
 }
-class ArgumentsOnSeparateLines extends firstClassForParentCall
+class ArgumentsOnSeparateLines extends FirstClassForParentCall
 {
     /**
      * @var stdClass
diff --git a/lib/internal/Magento/Framework/Data/Test/Unit/Tree/Node/CollectionTest.php b/lib/internal/Magento/Framework/Data/Test/Unit/Tree/Node/CollectionTest.php
index 58e63787590..e91ec72dae1 100644
--- a/lib/internal/Magento/Framework/Data/Test/Unit/Tree/Node/CollectionTest.php
+++ b/lib/internal/Magento/Framework/Data/Test/Unit/Tree/Node/CollectionTest.php
@@ -40,7 +40,7 @@ class CollectionTest extends \PHPUnit\Framework\TestCase
         $this->assertSame($this->collection->offsetExists('node1'), true);
         $this->collection->offsetSet('node1', 'Hello');
         $this->assertSame($this->collection->offsetExists('node1'), true);
-        $this->assertSame($this->collection->offsetget('node1'), 'Hello');
+        $this->assertSame($this->collection->offsetGet('node1'), 'Hello');
         $this->collection->offsetUnset('node1');
         $this->assertSame($this->collection->offsetExists('node1'), false);
     }
diff --git a/lib/internal/Magento/Framework/Xml/Security.php b/lib/internal/Magento/Framework/Xml/Security.php
index 72af506a329..e502429e451 100644
--- a/lib/internal/Magento/Framework/Xml/Security.php
+++ b/lib/internal/Magento/Framework/Xml/Security.php
@@ -72,7 +72,7 @@ class Security
             E_WARNING
         );
 
-        $result = (bool)$document->loadXml($xmlContent, LIBXML_NONET);
+        $result = (bool)$document->loadXML($xmlContent, LIBXML_NONET);
         restore_error_handler();
         // Entity load to previous setting
         libxml_disable_entity_loader($loadEntities);
-- 
GitLab


From aa08c78543b6bbe5376be2728ea7f41a465d6922 Mon Sep 17 00:00:00 2001
From: Ievgen Shakhsuvarov <ishakhsuvarov@magento.com>
Date: Fri, 1 Dec 2017 17:59:29 +0200
Subject: [PATCH 242/380] magento/magento2#12499: Format generated config files
 using the short array syntax  - minor coding style improvement

---
 .../Framework/App/DeploymentConfig/Writer/PhpFormatter.php    | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/lib/internal/Magento/Framework/App/DeploymentConfig/Writer/PhpFormatter.php b/lib/internal/Magento/Framework/App/DeploymentConfig/Writer/PhpFormatter.php
index 09f2bc888e3..ef7b654b66a 100644
--- a/lib/internal/Magento/Framework/App/DeploymentConfig/Writer/PhpFormatter.php
+++ b/lib/internal/Magento/Framework/App/DeploymentConfig/Writer/PhpFormatter.php
@@ -75,8 +75,8 @@ class PhpFormatter implements FormatterInterface
      * If variable to export is an array, format with the php >= 5.4 short array syntax. Otherwise use
      * default var_export functionality.
      *
-     * @param mixed   $var
-     * @param integer $depth
+     * @param mixed $var
+     * @param int $depth
      * @return string
      */
     private function varExportShort($var, int $depth = 0): string
-- 
GitLab


From fefb3f696cffdcc815fbbf01dd5cd04b76c77833 Mon Sep 17 00:00:00 2001
From: Oleksii Korshenko <okorshenko@magento.com>
Date: Fri, 1 Dec 2017 14:24:16 -0600
Subject: [PATCH 243/380] MAGETWO-84764: NewRelic: Disables Module Deployments,
 Creates new Deploy Marker Command #12477

 - fixed code style
 - added copyright
 - fixed di configuration
---
 .../Console/Command/DeployMarker.php          | 26 +++++++++++++++++--
 .../Model/ServiceShellUser.php                | 14 +++++++++-
 app/code/Magento/NewRelicReporting/etc/di.xml |  5 ++--
 3 files changed, 39 insertions(+), 6 deletions(-)

diff --git a/app/code/Magento/NewRelicReporting/Console/Command/DeployMarker.php b/app/code/Magento/NewRelicReporting/Console/Command/DeployMarker.php
index 272b7592cbd..9b19cc957ae 100644
--- a/app/code/Magento/NewRelicReporting/Console/Command/DeployMarker.php
+++ b/app/code/Magento/NewRelicReporting/Console/Command/DeployMarker.php
@@ -1,20 +1,36 @@
 <?php
-
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
 namespace Magento\NewRelicReporting\Console\Command;
 
 use Symfony\Component\Console\Command\Command;
 use Symfony\Component\Console\Input\InputInterface;
 use Symfony\Component\Console\Output\OutputInterface;
 use Symfony\Component\Console\Input\InputArgument;
-
 use Magento\NewRelicReporting\Model\Apm\DeploymentsFactory;
 use Magento\NewRelicReporting\Model\ServiceShellUser;
 
 class DeployMarker extends Command
 {
+    /**
+     * @var DeploymentsFactory
+     */
     protected $deploymentsFactory;
+
+    /**
+     * @var ServiceShellUser
+     */
     protected $serviceShellUser;
 
+    /**
+     * Initialize dependencies.
+     *
+     * @param DeploymentsFactory $deploymentsFactory
+     * @param ServiceShellUser $serviceShellUser
+     * @param null $name
+     */
     public function __construct(
         DeploymentsFactory $deploymentsFactory,
         ServiceShellUser $serviceShellUser,
@@ -25,6 +41,9 @@ class DeployMarker extends Command
         parent::__construct($name);
     }
 
+    /**
+     * {@inheritdoc}
+     */
     protected function configure()
     {
         $this->setName("newrelic:create:deploy-marker");
@@ -47,6 +66,9 @@ class DeployMarker extends Command
         parent::configure();
     }
 
+    /**
+     * {@inheritdoc}
+     */
     protected function execute(InputInterface $input, OutputInterface $output)
     {
         $this->deploymentsFactory->create()->setDeployment(
diff --git a/app/code/Magento/NewRelicReporting/Model/ServiceShellUser.php b/app/code/Magento/NewRelicReporting/Model/ServiceShellUser.php
index 8262428d9bf..c038be4fb2a 100644
--- a/app/code/Magento/NewRelicReporting/Model/ServiceShellUser.php
+++ b/app/code/Magento/NewRelicReporting/Model/ServiceShellUser.php
@@ -1,11 +1,23 @@
 <?php
-
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
 namespace Magento\NewRelicReporting\Model;
 
 class ServiceShellUser
 {
+    /**
+     * Default user name;
+     */
     const DEFAULT_USER = 'cron';
 
+    /**
+     * Get use name.
+     *
+     * @param bool $userFromArgument
+     * @return string
+     */
     public function get($userFromArgument = false)
     {
         if ($userFromArgument) {
diff --git a/app/code/Magento/NewRelicReporting/etc/di.xml b/app/code/Magento/NewRelicReporting/etc/di.xml
index 9cfe909571a..2dccc45c112 100644
--- a/app/code/Magento/NewRelicReporting/etc/di.xml
+++ b/app/code/Magento/NewRelicReporting/etc/di.xml
@@ -30,11 +30,10 @@
     <type name="Magento\Framework\App\Http">
         <plugin name="framework-http-newrelic" type="Magento\NewRelicReporting\Plugin\HttpPlugin"/>
     </type>
-    <type name="Magento\Framework\Console\CommandList">
+    <type name="Magento\Framework\Console\CommandListInterface">
         <arguments>
             <argument name="commands" xsi:type="array">
-                <item name="magento_new_relic_reporting_command_deploy_marker"
-                      xsi:type="object">Magento\NewRelicReporting\Console\Command\DeployMarker</item>
+                <item name="newrelicreporting_deploy_marker" xsi:type="object">Magento\NewRelicReporting\Console\Command\DeployMarker</item>
             </argument>
         </arguments>
     </type>
-- 
GitLab


From 63ec3f762bc64680fb4cd52169c453711defc06d Mon Sep 17 00:00:00 2001
From: Luke Rodgers <lukerodgers90@gmail.com>
Date: Sun, 3 Dec 2017 12:21:01 +0000
Subject: [PATCH 244/380] Remove indexer:status:mview command

---
 .../Command/IndexerStatusMviewCommand.php     |  98 -------
 .../Command/IndexerStatusMviewCommandTest.php | 262 ------------------
 2 files changed, 360 deletions(-)
 delete mode 100644 app/code/Magento/Indexer/Console/Command/IndexerStatusMviewCommand.php
 delete mode 100644 app/code/Magento/Indexer/Test/Unit/Console/Command/IndexerStatusMviewCommandTest.php

diff --git a/app/code/Magento/Indexer/Console/Command/IndexerStatusMviewCommand.php b/app/code/Magento/Indexer/Console/Command/IndexerStatusMviewCommand.php
deleted file mode 100644
index 37caabc613e..00000000000
--- a/app/code/Magento/Indexer/Console/Command/IndexerStatusMviewCommand.php
+++ /dev/null
@@ -1,98 +0,0 @@
-<?php
-/**
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
- */
-namespace Magento\Indexer\Console\Command;
-
-use Symfony\Component\Console\Input\InputInterface;
-use Symfony\Component\Console\Output\OutputInterface;
-use Symfony\Component\Console\Command\Command;
-use Magento\Framework\Mview\View;
-use Magento\Framework\Mview\View\CollectionFactory;
-use Magento\Framework\Console\Cli;
-
-/**
- * Command for displaying status of mview indexers.
- */
-class IndexerStatusMviewCommand extends Command
-{
-    /** @var \Magento\Framework\Mview\View\CollectionInterface $mviewCollection */
-    private $mviewCollection;
-
-    public function __construct(
-        CollectionFactory $collectionFactory
-    ) {
-        $this->mviewCollection = $collectionFactory->create();
-
-        parent::__construct();
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    protected function configure()
-    {
-        $this->setName('indexer:status:mview')
-            ->setDescription('Shows status of Mview Indexers and their queue status');
-
-        parent::configure();
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    protected function execute(InputInterface $input, OutputInterface $output)
-    {
-        try {
-            $table = $this->getHelperSet()->get('table');
-            $table->setHeaders(['ID', 'Mode', 'Status', 'Updated', 'Version ID', 'Backlog']);
-
-            $rows = [];
-
-            /** @var \Magento\Framework\Mview\View $view */
-            foreach ($this->mviewCollection as $view) {
-                $state = $view->getState();
-                $changelog = $view->getChangelog();
-
-                try {
-                    $currentVersionId = $changelog->getVersion();
-                } catch (View\ChangelogTableNotExistsException $e) {
-                    continue;
-                }
-
-                $pendingCount = $changelog->getListSize($state->getVersionId(), $currentVersionId);
-
-                $pendingString = "<error>$pendingCount</error>";
-                if ($pendingCount <= 0) {
-                    $pendingString = "<info>$pendingCount</info>";
-                }
-
-                $rows[] = [
-                    $view->getId(),
-                    $state->getMode(),
-                    $state->getStatus(),
-                    $state->getUpdated(),
-                    $state->getVersionId(),
-                    $pendingString,
-                ];
-            }
-
-            usort($rows, function ($comp1, $comp2) {
-                return strcmp($comp1[0], $comp2[0]);
-            });
-
-            $table->addRows($rows);
-            $table->render($output);
-
-            return Cli::RETURN_SUCCESS;
-        } catch (\Exception $e) {
-            $output->writeln('<error>' . $e->getMessage() . '</error>');
-            if ($output->getVerbosity() >= OutputInterface::VERBOSITY_VERBOSE) {
-                $output->writeln($e->getTraceAsString());
-            }
-
-            return Cli::RETURN_FAILURE;
-        }
-    }
-}
diff --git a/app/code/Magento/Indexer/Test/Unit/Console/Command/IndexerStatusMviewCommandTest.php b/app/code/Magento/Indexer/Test/Unit/Console/Command/IndexerStatusMviewCommandTest.php
deleted file mode 100644
index 4ae3ca83870..00000000000
--- a/app/code/Magento/Indexer/Test/Unit/Console/Command/IndexerStatusMviewCommandTest.php
+++ /dev/null
@@ -1,262 +0,0 @@
-<?php
-/**
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
- */
-namespace Magento\Indexer\Test\Unit\Console\Command;
-
-use \Magento\Framework\Mview;
-use Magento\Indexer\Console\Command\IndexerStatusMviewCommand;
-use Symfony\Component\Console\Tester\CommandTester;
-use Symfony\Component\Console\Helper\HelperSet;
-use Symfony\Component\Console\Helper\TableHelper;
-use Magento\Store\Model\Website;
-use Magento\Framework\Console\Cli;
-use Magento\Framework\Mview\View\CollectionFactory;
-
-/**
- * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
- */
-class IndexerStatusMviewCommandTest extends \PHPUnit\Framework\TestCase
-{
-    /**
-     * @var IndexerStatusMviewCommand
-     */
-    private $command;
-
-    /**
-     * @var \Magento\Framework\TestFramework\Unit\Helper\ObjectManager
-     */
-    private $objectManager;
-
-    /**
-     * @var \Magento\Framework\Mview\View\Collection
-     */
-    private $collection;
-
-    protected function setUp()
-    {
-        $this->objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
-
-        /** @var \Magento\Framework\Mview\View\Collection $collection */
-        $this->collection = $this->objectManager->getObject(Mview\View\Collection::class);
-
-        $reflectedCollection = new \ReflectionObject($this->collection);
-        $isLoadedProperty = $reflectedCollection->getProperty('_isCollectionLoaded');
-        $isLoadedProperty->setAccessible(true);
-        $isLoadedProperty->setValue($this->collection, true);
-
-        $collectionFactory = $this->getMockBuilder(CollectionFactory::class)
-            ->disableOriginalConstructor()
-            ->getMock();
-        $collectionFactory->method('create')
-            ->willReturn($this->collection);
-
-        $this->command = $this->objectManager->getObject(
-            IndexerStatusMviewCommand::class,
-            ['collectionFactory' => $collectionFactory]
-        );
-
-        /** @var HelperSet $helperSet */
-        $helperSet = $this->objectManager->getObject(
-            HelperSet::class,
-            ['helpers' => [$this->objectManager->getObject(TableHelper::class)]]
-        );
-
-        //Inject table helper for output
-        $this->command->setHelperSet($helperSet);
-    }
-
-    public function testExecute()
-    {
-        $mviews = [
-            [
-                'view' => [
-                    'view_id' => 'catalog_category_product',
-                ],
-                'state' => [
-                    'mode' => 'enabled',
-                    'status' => 'idle',
-                    'updated' => '2017-01-01 11:11:11',
-                    'version_id' => 100,
-                ],
-                'changelog' => [
-                    'version_id' => 110
-                ],
-            ],
-            [
-                'view' => [
-                    'view_id' => 'catalog_product_category',
-                ],
-                'state' => [
-                    'mode' => 'disabled',
-                    'status' => 'idle',
-                    'updated' => '2017-01-01 11:11:11',
-                    'version_id' => 100,
-                ],
-                'changelog' => [
-                    'version_id' => 200
-                ],
-            ],
-            [
-                'view' => [
-                    'view_id' => 'catalog_product_attribute',
-                ],
-                'state' => [
-                    'mode' => 'enabled',
-                    'status' => 'idle',
-                    'updated' => '2017-01-01 11:11:11',
-                    'version_id' => 100,
-                ],
-                'changelog' => [
-                    'version_id' => 100
-                ],
-            ],
-        ];
-
-        foreach ($mviews as $data) {
-            $this->collection->addItem($this->generateMviewStub($data['view'], $data['changelog'], $data['state']));
-        }
-        $this->collection->addItem($this->getNeverEnabledMviewIndexerWithNoTable());
-
-        $tester = new CommandTester($this->command);
-        $this->assertEquals(Cli::RETURN_SUCCESS, $tester->execute([]));
-
-        $linesOutput = array_filter(explode(PHP_EOL, $tester->getDisplay()));
-        $this->assertCount(7, $linesOutput, 'There should be 7 lines output. 3 Spacers, 1 header, 3 content.');
-        $this->assertEquals($linesOutput[0], $linesOutput[2], "Lines 0, 2, 7 should be spacer lines");
-        $this->assertEquals($linesOutput[2], $linesOutput[6], "Lines 0, 2, 6 should be spacer lines");
-
-        $headerValues = array_values(array_filter(explode('|', $linesOutput[1])));
-        $this->assertEquals('ID', trim($headerValues[0]));
-        $this->assertEquals('Mode', trim($headerValues[1]));
-        $this->assertEquals('Status', trim($headerValues[2]));
-        $this->assertEquals('Updated', trim($headerValues[3]));
-        $this->assertEquals('Version ID', trim($headerValues[4]));
-        $this->assertEquals('Backlog', trim($headerValues[5]));
-
-        $categoryProduct = array_values(array_filter(explode('|', $linesOutput[3])));
-        $this->assertEquals('catalog_category_product', trim($categoryProduct[0]));
-        $this->assertEquals('enabled', trim($categoryProduct[1]));
-        $this->assertEquals('idle', trim($categoryProduct[2]));
-        $this->assertEquals('2017-01-01 11:11:11', trim($categoryProduct[3]));
-        $this->assertEquals('100', trim($categoryProduct[4]));
-        $this->assertEquals('10', trim($categoryProduct[5]));
-        unset($categoryProduct);
-
-        $productAttribute = array_values(array_filter(explode('|', $linesOutput[4])));
-        $this->assertEquals('catalog_product_attribute', trim($productAttribute[0]));
-        $this->assertEquals('enabled', trim($productAttribute[1]));
-        $this->assertEquals('idle', trim($productAttribute[2]));
-        $this->assertEquals('2017-01-01 11:11:11', trim($productAttribute[3]));
-        $this->assertEquals('100', trim($productAttribute[4]));
-        $this->assertEquals('0', trim($productAttribute[5]));
-        unset($productAttribute);
-
-        $productCategory = array_values(array_filter(explode('|', $linesOutput[5])));
-        $this->assertEquals('catalog_product_category', trim($productCategory[0]));
-        $this->assertEquals('disabled', trim($productCategory[1]));
-        $this->assertEquals('idle', trim($productCategory[2]));
-        $this->assertEquals('2017-01-01 11:11:11', trim($productCategory[3]));
-        $this->assertEquals('100', trim($productCategory[4]));
-        $this->assertEquals('100', trim($productCategory[5]));
-        unset($productCategory);
-    }
-
-    /**
-     * @param array $viewData
-     * @param array $changelogData
-     * @param array $stateData
-     * @return Mview\View|Mview\View\Changelog|\PHPUnit_Framework_MockObject_MockObject
-     */
-    protected function generateMviewStub(array $viewData, array $changelogData, array $stateData)
-    {
-        /** @var Mview\View\Changelog|\PHPUnit_Framework_MockObject_MockObject $stub */
-        $changelog = $this->getMockBuilder(\Magento\Framework\Mview\View\Changelog::class)
-            ->disableOriginalConstructor()
-            ->getMock();
-
-        $listSize = $changelogData['version_id'] - $stateData['version_id'];
-
-        $changelog->expects($this->any())
-            ->method('getListSize')
-            ->willReturn($listSize);
-
-        $changelog->expects($this->any())
-            ->method('getVersion')
-            ->willReturn($changelogData['version_id']);
-
-        /** @var \Magento\Indexer\Model\Mview\View\State|\PHPUnit_Framework_MockObject_MockObject $stub */
-        $state = $this->getMockBuilder(\Magento\Indexer\Model\Mview\View\State::class)
-            ->disableOriginalConstructor()
-            ->setMethods(['loadByView'])
-            ->getMock();
-
-        $state->setData($stateData);
-
-        /** @var Mview\View|\PHPUnit_Framework_MockObject_MockObject $stub */
-        $stub = $this->getMockBuilder(\Magento\Framework\Mview\View::class)
-            ->disableOriginalConstructor()
-            ->setMethods(['getChangelog', 'getState'])
-            ->getMock();
-
-        $stub->expects($this->any())
-            ->method('getChangelog')
-            ->willReturn($changelog);
-
-        $stub->expects($this->any())
-            ->method('getState')
-            ->willReturn($state);
-
-        $stub->setData($viewData);
-
-        return $stub;
-    }
-
-    /**
-     * @return Mview\View|\PHPUnit_Framework_MockObject_MockObject
-     */
-    protected function getNeverEnabledMviewIndexerWithNoTable()
-    {
-        /** @var Mview\View\Changelog|\PHPUnit_Framework_MockObject_MockObject $stub */
-        $changelog = $this->getMockBuilder(\Magento\Framework\Mview\View\Changelog::class)
-            ->disableOriginalConstructor()
-            ->getMock();
-
-        $changelog->expects($this->any())
-            ->method('getVersion')
-            ->willThrowException(
-                new Mview\View\ChangelogTableNotExistsException(new \Magento\Framework\Phrase("Do not render"))
-            );
-
-        /** @var Mview\View|\PHPUnit_Framework_MockObject_MockObject $notInitiatedMview */
-        $notInitiatedMview = $this->getMockBuilder(\Magento\Framework\Mview\View::class)
-            ->disableOriginalConstructor()
-            ->getMock();
-
-        $notInitiatedMview->expects($this->any())
-            ->method('getChangelog')
-            ->willReturn($changelog);
-
-        return $notInitiatedMview;
-    }
-
-    public function testExecuteExceptionNoVerbosity()
-    {
-        /** @var \Magento\Framework\Mview\View|\PHPUnit_Framework_MockObject_MockObject $stub */
-        $stub = $this->getMockBuilder(Mview\View::class)
-            ->disableOriginalConstructor()
-            ->getMock();
-
-        $stub->expects($this->any())
-            ->method('getChangelog')
-            ->willThrowException(new \Exception("Dummy test exception"));
-
-        $this->collection->addItem($stub);
-
-        $tester = new CommandTester($this->command);
-        $this->assertEquals(Cli::RETURN_FAILURE, $tester->execute([]));
-        $linesOutput = array_filter(explode(PHP_EOL, $tester->getDisplay()));
-        $this->assertEquals('Dummy test exception', $linesOutput[0]);
-    }
-}
-- 
GitLab


From d3d300b33430353946f3373a4d64cac578715010 Mon Sep 17 00:00:00 2001
From: Luke Rodgers <lukerodgers90@gmail.com>
Date: Sun, 3 Dec 2017 12:21:58 +0000
Subject: [PATCH 245/380] Update indexer:status to display schedule backlog

---
 .../Console/Command/IndexerStatusCommand.php  |  89 +++++++--
 .../Command/IndexerStatusCommandTest.php      | 177 ++++++++++++++++--
 2 files changed, 234 insertions(+), 32 deletions(-)

diff --git a/app/code/Magento/Indexer/Console/Command/IndexerStatusCommand.php b/app/code/Magento/Indexer/Console/Command/IndexerStatusCommand.php
index 6590f6e0af9..2d9c4bd3ccb 100644
--- a/app/code/Magento/Indexer/Console/Command/IndexerStatusCommand.php
+++ b/app/code/Magento/Indexer/Console/Command/IndexerStatusCommand.php
@@ -7,6 +7,8 @@ namespace Magento\Indexer\Console\Command;
 
 use Symfony\Component\Console\Input\InputInterface;
 use Symfony\Component\Console\Output\OutputInterface;
+use Magento\Framework\Indexer;
+use Magento\Framework\Mview;
 
 /**
  * Command for displaying status of indexers.
@@ -30,21 +32,84 @@ class IndexerStatusCommand extends AbstractIndexerManageCommand
      */
     protected function execute(InputInterface $input, OutputInterface $output)
     {
+        $table = $this->getHelperSet()->get('table');
+        $table->setHeaders(['Title', 'Status', 'Update On', 'Schedule Status', 'Schedule Updated']);
+
+        $rows = [];
+
         $indexers = $this->getIndexers($input);
         foreach ($indexers as $indexer) {
-            $status = 'unknown';
-            switch ($indexer->getStatus()) {
-                case \Magento\Framework\Indexer\StateInterface::STATUS_VALID:
-                    $status = 'Ready';
-                    break;
-                case \Magento\Framework\Indexer\StateInterface::STATUS_INVALID:
-                    $status = 'Reindex required';
-                    break;
-                case \Magento\Framework\Indexer\StateInterface::STATUS_WORKING:
-                    $status = 'Processing';
-                    break;
+            $view = $indexer->getView();
+
+            $rowData = [
+                'Title'             => $indexer->getTitle(),
+                'Status'            => $this->getStatus($indexer),
+                'Update On'         => $indexer->isScheduled() ? 'Schedule' : 'Save',
+                'Schedule Status'   => '',
+                'Updated'           => '',
+            ];
+
+            if ($indexer->isScheduled()) {
+                $state = $view->getState();
+                $rowData['Schedule Status'] = "{$state->getStatus()} ({$this->getPendingCount($view)} in backlog)";
+                $rowData['Updated'] = $state->getUpdated();
             }
-            $output->writeln(sprintf('%-50s ', $indexer->getTitle() . ':') . $status);
+
+            $rows[] = $rowData;
+        }
+
+        usort($rows, function ($comp1, $comp2) {
+            return strcmp($comp1['Title'], $comp2['Title']);
+        });
+
+        $table->addRows($rows);
+        $table->render($output);
+    }
+
+    /**
+     * @param Indexer\IndexerInterface $indexer
+     * @return string
+     */
+    protected function getStatus(Indexer\IndexerInterface $indexer)
+    {
+        $status = 'unknown';
+        switch ($indexer->getStatus()) {
+            case \Magento\Framework\Indexer\StateInterface::STATUS_VALID:
+                $status = 'Ready';
+                break;
+            case \Magento\Framework\Indexer\StateInterface::STATUS_INVALID:
+                $status = 'Reindex required';
+                break;
+            case \Magento\Framework\Indexer\StateInterface::STATUS_WORKING:
+                $status = 'Processing';
+                break;
         }
+        return $status;
+    }
+
+    /**
+     * @param Mview\ViewInterface $view
+     * @return string
+     */
+    protected function getPendingCount(Mview\ViewInterface $view)
+    {
+        $changelog = $view->getChangelog();
+
+        try {
+            $currentVersionId = $changelog->getVersion();
+        } catch (Mview\View\ChangelogTableNotExistsException $e) {
+            return '';
+        }
+
+        $state = $view->getState();
+
+        $pendingCount = $changelog->getListSize($state->getVersionId(), $currentVersionId);
+
+        $pendingString = "<error>$pendingCount</error>";
+        if ($pendingCount <= 0) {
+            $pendingString = "<info>$pendingCount</info>";
+        }
+
+        return $pendingString;
     }
 }
diff --git a/app/code/Magento/Indexer/Test/Unit/Console/Command/IndexerStatusCommandTest.php b/app/code/Magento/Indexer/Test/Unit/Console/Command/IndexerStatusCommandTest.php
index 6eb7f7562b9..58a0a5b7507 100644
--- a/app/code/Magento/Indexer/Test/Unit/Console/Command/IndexerStatusCommandTest.php
+++ b/app/code/Magento/Indexer/Test/Unit/Console/Command/IndexerStatusCommandTest.php
@@ -8,6 +8,8 @@ namespace Magento\Indexer\Test\Unit\Console\Command;
 use Magento\Framework\Indexer\StateInterface;
 use Magento\Indexer\Console\Command\IndexerStatusCommand;
 use Symfony\Component\Console\Tester\CommandTester;
+use Symfony\Component\Console\Helper\HelperSet;
+use Symfony\Component\Console\Helper\TableHelper;
 
 class IndexerStatusCommandTest extends AbstractIndexerCommandCommonSetup
 {
@@ -18,35 +20,132 @@ class IndexerStatusCommandTest extends AbstractIndexerCommandCommonSetup
      */
     private $command;
 
+    /**
+     * @param \PHPUnit_Framework_MockObject_MockObject $indexerMock
+     * @param array $data
+     * @return mixed
+     */
+    protected function attachViewToIndexerMock($indexerMock, array $data)
+    {
+         /** @var \Magento\Framework\Mview\View\Changelog|\PHPUnit_Framework_MockObject_MockObject $stub */
+        $changelog = $this->getMockBuilder(\Magento\Framework\Mview\View\Changelog::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $changelog->expects($this->any())
+            ->method('getListSize')
+            ->willReturn($data['view']['changelog']['list_size']);
+
+        /** @var \Magento\Indexer\Model\Mview\View\State|\PHPUnit_Framework_MockObject_MockObject $stateMock */
+        $stateMock = $this->getMockBuilder(\Magento\Indexer\Model\Mview\View\State::class)
+            ->disableOriginalConstructor()
+            ->setMethods(null)
+            ->getMock();
+
+        $stateMock->addData($data['view']['state']);
+
+        /** @var \Magento\Framework\Mview\View|\PHPUnit_Framework_MockObject_MockObject $viewMock */
+        $viewMock = $this->getMockBuilder(\Magento\Framework\Mview\View::class)
+            ->disableOriginalConstructor()
+            ->setMethods(['getChangelog', 'getState'])
+            ->getMock();
+
+        $viewMock->expects($this->any())
+            ->method('getState')
+            ->willReturn($stateMock);
+        $viewMock->expects($this->any())
+            ->method('getChangelog')
+            ->willReturn($changelog);
+
+        $indexerMock->method('getView')
+            ->willReturn($viewMock);
+
+        return $indexerMock;
+    }
+
     /**
      * @param array $indexers
-     * @param array $statuses
+     *
      * @dataProvider executeAllDataProvider
      */
-    public function testExecuteAll(array $indexers, array $statuses)
+    public function testExecuteAll(array $indexers)
     {
         $this->configureAdminArea();
         $indexerMocks = [];
         foreach ($indexers as $indexerData) {
             $indexerMock = $this->getIndexerMock(
-                ['getStatus'],
+                ['getStatus', 'isScheduled', 'getState', 'getView'],
                 $indexerData
             );
+
             $indexerMock->method('getStatus')
-                ->willReturn($statuses[$indexerData['indexer_id']]);
+                ->willReturn($indexerData['status']);
+            $indexerMock->method('isScheduled')
+                ->willReturn($indexerData['is_scheduled']);
+
+            if ($indexerData['is_scheduled']) {
+                $this->attachViewToIndexerMock($indexerMock, $indexerData);
+            }
+
             $indexerMocks[] = $indexerMock;
+
         }
         $this->initIndexerCollectionByItems($indexerMocks);
         $this->command = new IndexerStatusCommand($this->objectManagerFactory);
+
+        $objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
+
+        $this->command->setHelperSet(
+            $objectManager->getObject(
+                HelperSet::class,
+                ['helpers' => [$objectManager->getObject(TableHelper::class)]]
+            )
+        );
+
+
         $commandTester = new CommandTester($this->command);
         $commandTester->execute([]);
-        $actualValue = $commandTester->getDisplay();
-        $expectedValue = sprintf('%-50s ', 'Title_indexerOne' . ':') . 'Ready' . PHP_EOL
-            . sprintf('%-50s ', 'Title_indexerTwo' . ':') . 'Reindex required' . PHP_EOL
-            . sprintf('%-50s ', 'Title_indexerThree' . ':') . 'Processing' . PHP_EOL
-            . sprintf('%-50s ', 'Title_indexerFour' . ':') . 'unknown' . PHP_EOL;
 
-        $this->assertStringStartsWith($expectedValue, $actualValue);
+        $linesOutput = array_filter(explode(PHP_EOL, $commandTester->getDisplay()));
+
+        $this->assertCount(8, $linesOutput, 'There should be 8 lines output. 3 Spacers, 1 header, 4 content.');
+        $this->assertEquals($linesOutput[0], $linesOutput[2], "Lines 0, 2, 7 should be spacer lines");
+        $this->assertEquals($linesOutput[2], $linesOutput[7], "Lines 0, 2, 6 should be spacer lines");
+
+        $headerValues = array_values(array_filter(explode('|', $linesOutput[1])));
+        $this->assertEquals('Title', trim($headerValues[0]));
+        $this->assertEquals('Status', trim($headerValues[1]));
+        $this->assertEquals('Update On', trim($headerValues[2]));
+        $this->assertEquals('Schedule Status', trim($headerValues[3]));
+        $this->assertEquals('Schedule Updated', trim($headerValues[4]));
+
+        $indexer1 = array_values(array_filter(explode('|', $linesOutput[3])));
+        $this->assertEquals('Title_indexer1', trim($indexer1[0]));
+        $this->assertEquals('Ready', trim($indexer1[1]));
+        $this->assertEquals('Schedule', trim($indexer1[2]));
+        $this->assertEquals('idle (10 in backlog)', trim($indexer1[3]));
+        $this->assertEquals('2017-01-01 11:11:11', trim($indexer1[4]));
+
+        $indexer2 = array_values(array_filter(explode('|', $linesOutput[4])));
+        $this->assertEquals('Title_indexer2', trim($indexer2[0]));
+        $this->assertEquals('Reindex required', trim($indexer2[1]));
+        $this->assertEquals('Save', trim($indexer2[2]));
+        $this->assertEquals('', trim($indexer2[3]));
+        $this->assertEquals('', trim($indexer2[4]));
+
+        $indexer3 = array_values(array_filter(explode('|', $linesOutput[5])));
+        $this->assertEquals('Title_indexer3', trim($indexer3[0]));
+        $this->assertEquals('Processing', trim($indexer3[1]));
+        $this->assertEquals('Schedule', trim($indexer3[2]));
+        $this->assertEquals('idle (100 in backlog)', trim($indexer3[3]));
+        $this->assertEquals('2017-01-01 11:11:11', trim($indexer3[4]));
+
+        $indexer4 = array_values(array_filter(explode('|', $linesOutput[6])));
+        $this->assertEquals('Title_indexer4', trim($indexer4[0]));
+        $this->assertEquals('unknown', trim($indexer4[1]));
+        $this->assertEquals('Schedule', trim($indexer4[2]));
+        $this->assertEquals('running (20 in backlog)', trim($indexer4[3]));
+        $this->assertEquals('2017-01-01 11:11:11', trim($indexer4[4]));
     }
 
     /**
@@ -59,27 +158,65 @@ class IndexerStatusCommandTest extends AbstractIndexerCommandCommonSetup
                 'indexers' => [
                     'indexer_1' => [
                         'indexer_id' => 'indexer_1',
-                        'title' => 'Title_indexerOne'
+                        'title' => 'Title_indexer1',
+                        'status' => StateInterface::STATUS_VALID,
+                        'is_scheduled' => true,
+                        'view' => [
+                            'state' => [
+                                'status' => 'idle',
+                                'updated' => '2017-01-01 11:11:11',
+                            ],
+                            'changelog' => [
+                                'list_size' => 10
+                            ]
+                        ]
                     ],
                     'indexer_2' => [
                         'indexer_id' => 'indexer_2',
-                        'title' => 'Title_indexerTwo'
+                        'title' => 'Title_indexer2',
+                        'status' => StateInterface::STATUS_INVALID,
+                        'is_scheduled' => false,
+                        'view' => [
+                            'state' => [
+                                'status' => 'idle',
+                                'updated' => '2017-01-01 11:11:11',
+                            ],
+                            'changelog' => [
+                                'list_size' => 99999999
+                            ]
+                        ]
                     ],
                     'indexer_3' => [
                         'indexer_id' => 'indexer_3',
-                        'title' => 'Title_indexerThree'
+                        'title' => 'Title_indexer3',
+                        'status' => StateInterface::STATUS_WORKING,
+                        'is_scheduled' => true,
+                        'view' => [
+                            'state' => [
+                                'status' => 'idle',
+                                'updated' => '2017-01-01 11:11:11',
+                            ],
+                            'changelog' => [
+                                'list_size' => 100
+                            ]
+                        ]
                     ],
                     'indexer_4' => [
                         'indexer_id' => 'indexer_4',
-                        'title' => 'Title_indexerFour'
+                        'title' => 'Title_indexer4',
+                        'status' => null,
+                        'is_scheduled' => true,
+                        'view' => [
+                            'state' => [
+                                'status' => 'running',
+                                'updated' => '2017-01-01 11:11:11',
+                            ],
+                            'changelog' => [
+                                'list_size' => 20
+                            ]
+                        ]
                     ],
                 ],
-                'Statuses' => [
-                    'indexer_1' => StateInterface::STATUS_VALID,
-                    'indexer_2' => StateInterface::STATUS_INVALID,
-                    'indexer_3' => StateInterface::STATUS_WORKING,
-                    'indexer_4' => null,
-                ]
             ],
         ];
     }
-- 
GitLab


From c63330fad61b636b213db99cb7aaf619ec46bfd2 Mon Sep 17 00:00:00 2001
From: Luke Rodgers <lukerodgers90@gmail.com>
Date: Sun, 3 Dec 2017 12:23:43 +0000
Subject: [PATCH 246/380] Remove status-mview from di.xml

---
 app/code/Magento/Indexer/etc/di.xml | 1 -
 1 file changed, 1 deletion(-)

diff --git a/app/code/Magento/Indexer/etc/di.xml b/app/code/Magento/Indexer/etc/di.xml
index 266cf72c50d..610f08fac3a 100644
--- a/app/code/Magento/Indexer/etc/di.xml
+++ b/app/code/Magento/Indexer/etc/di.xml
@@ -51,7 +51,6 @@
                 <item name="set-mode" xsi:type="object">Magento\Indexer\Console\Command\IndexerSetModeCommand</item>
                 <item name="show-mode" xsi:type="object">Magento\Indexer\Console\Command\IndexerShowModeCommand</item>
                 <item name="status" xsi:type="object">Magento\Indexer\Console\Command\IndexerStatusCommand</item>
-                <item name="status-mview" xsi:type="object">Magento\Indexer\Console\Command\IndexerStatusMviewCommand</item>
                 <item name="reset" xsi:type="object">Magento\Indexer\Console\Command\IndexerResetStateCommand</item>
             </argument>
         </arguments>
-- 
GitLab


From 709f88a712652a8f0a70893cde610d5fe6abb3e8 Mon Sep 17 00:00:00 2001
From: Luke Rodgers <lukerodgers90@gmail.com>
Date: Sun, 3 Dec 2017 17:54:07 +0000
Subject: [PATCH 247/380] Update method visibility

---
 .../Magento/Indexer/Console/Command/IndexerStatusCommand.php  | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/app/code/Magento/Indexer/Console/Command/IndexerStatusCommand.php b/app/code/Magento/Indexer/Console/Command/IndexerStatusCommand.php
index 2d9c4bd3ccb..f5237ea5d02 100644
--- a/app/code/Magento/Indexer/Console/Command/IndexerStatusCommand.php
+++ b/app/code/Magento/Indexer/Console/Command/IndexerStatusCommand.php
@@ -70,7 +70,7 @@ class IndexerStatusCommand extends AbstractIndexerManageCommand
      * @param Indexer\IndexerInterface $indexer
      * @return string
      */
-    protected function getStatus(Indexer\IndexerInterface $indexer)
+    private function getStatus(Indexer\IndexerInterface $indexer)
     {
         $status = 'unknown';
         switch ($indexer->getStatus()) {
@@ -91,7 +91,7 @@ class IndexerStatusCommand extends AbstractIndexerManageCommand
      * @param Mview\ViewInterface $view
      * @return string
      */
-    protected function getPendingCount(Mview\ViewInterface $view)
+    private function getPendingCount(Mview\ViewInterface $view)
     {
         $changelog = $view->getChangelog();
 
-- 
GitLab


From 831000b9263c1e11829fe0acf1769077f5205aab Mon Sep 17 00:00:00 2001
From: Luke Rodgers <lukerodgers90@gmail.com>
Date: Sun, 3 Dec 2017 17:54:36 +0000
Subject: [PATCH 248/380] Correctly assert table output

---
 .../Test/Unit/Console/Command/IndexerStatusCommandTest.php | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/app/code/Magento/Indexer/Test/Unit/Console/Command/IndexerStatusCommandTest.php b/app/code/Magento/Indexer/Test/Unit/Console/Command/IndexerStatusCommandTest.php
index 58a0a5b7507..27c18b1f935 100644
--- a/app/code/Magento/Indexer/Test/Unit/Console/Command/IndexerStatusCommandTest.php
+++ b/app/code/Magento/Indexer/Test/Unit/Console/Command/IndexerStatusCommandTest.php
@@ -108,9 +108,12 @@ class IndexerStatusCommandTest extends AbstractIndexerCommandCommonSetup
 
         $linesOutput = array_filter(explode(PHP_EOL, $commandTester->getDisplay()));
 
+        $spacer = '+----------------+------------------+-----------+-------------------------+---------------------+';
+
         $this->assertCount(8, $linesOutput, 'There should be 8 lines output. 3 Spacers, 1 header, 4 content.');
-        $this->assertEquals($linesOutput[0], $linesOutput[2], "Lines 0, 2, 7 should be spacer lines");
-        $this->assertEquals($linesOutput[2], $linesOutput[7], "Lines 0, 2, 6 should be spacer lines");
+        $this->assertEquals($linesOutput[0], $spacer, "Lines 0, 2, 7 should be spacer lines");
+        $this->assertEquals($linesOutput[2], $spacer, "Lines 0, 2, 7 should be spacer lines");
+        $this->assertEquals($linesOutput[7], $spacer, "Lines 0, 2, 7 should be spacer lines");
 
         $headerValues = array_values(array_filter(explode('|', $linesOutput[1])));
         $this->assertEquals('Title', trim($headerValues[0]));
-- 
GitLab


From 62e67e1a654708bdb553b6489fb4199636575e9d Mon Sep 17 00:00:00 2001
From: Luke Rodgers <lukerodgers90@gmail.com>
Date: Sun, 3 Dec 2017 17:55:58 +0000
Subject: [PATCH 249/380] Code style fixes

---
 .../Test/Unit/Console/Command/IndexerStatusCommandTest.php   | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)

diff --git a/app/code/Magento/Indexer/Test/Unit/Console/Command/IndexerStatusCommandTest.php b/app/code/Magento/Indexer/Test/Unit/Console/Command/IndexerStatusCommandTest.php
index 27c18b1f935..1a4894faf4a 100644
--- a/app/code/Magento/Indexer/Test/Unit/Console/Command/IndexerStatusCommandTest.php
+++ b/app/code/Magento/Indexer/Test/Unit/Console/Command/IndexerStatusCommandTest.php
@@ -88,8 +88,8 @@ class IndexerStatusCommandTest extends AbstractIndexerCommandCommonSetup
             }
 
             $indexerMocks[] = $indexerMock;
-
         }
+
         $this->initIndexerCollectionByItems($indexerMocks);
         $this->command = new IndexerStatusCommand($this->objectManagerFactory);
 
@@ -101,8 +101,7 @@ class IndexerStatusCommandTest extends AbstractIndexerCommandCommonSetup
                 ['helpers' => [$objectManager->getObject(TableHelper::class)]]
             )
         );
-
-
+        
         $commandTester = new CommandTester($this->command);
         $commandTester->execute([]);
 
-- 
GitLab


From 4af04b1c43ea8b1198ba5027500552c88a09737c Mon Sep 17 00:00:00 2001
From: Luke Rodgers <lukerodgers90@gmail.com>
Date: Sun, 3 Dec 2017 17:57:34 +0000
Subject: [PATCH 250/380] Add ChangelogCounterInterface

---
 .../Framework/Mview/View/Changelog.php        |  4 ++--
 .../Mview/View/ChangelogCounterInterface.php  | 22 +++++++++++++++++++
 .../Mview/View/ChangelogInterface.php         |  9 --------
 3 files changed, 24 insertions(+), 11 deletions(-)
 create mode 100644 lib/internal/Magento/Framework/Mview/View/ChangelogCounterInterface.php

diff --git a/lib/internal/Magento/Framework/Mview/View/Changelog.php b/lib/internal/Magento/Framework/Mview/View/Changelog.php
index 4f648d6b7d6..6d75ee27be1 100644
--- a/lib/internal/Magento/Framework/Mview/View/Changelog.php
+++ b/lib/internal/Magento/Framework/Mview/View/Changelog.php
@@ -8,7 +8,7 @@ namespace Magento\Framework\Mview\View;
 use Magento\Framework\App\ResourceConnection;
 use Magento\Framework\Phrase;
 
-class Changelog implements ChangelogInterface
+class Changelog implements ChangelogInterface, ChangelogCounterInterface
 {
     /**
      * Suffix for changelog table
@@ -132,7 +132,7 @@ class Changelog implements ChangelogInterface
      * @return \Magento\Framework\DB\Select
      * @throws ChangelogTableNotExistsException
      */
-    protected function getListSelect($fromVersionId, $toVersionId)
+    private function getListSelect($fromVersionId, $toVersionId)
     {
         $changelogTableName = $this->resource->getTableName($this->getName());
         if (!$this->connection->isTableExists($changelogTableName)) {
diff --git a/lib/internal/Magento/Framework/Mview/View/ChangelogCounterInterface.php b/lib/internal/Magento/Framework/Mview/View/ChangelogCounterInterface.php
new file mode 100644
index 00000000000..5d92ad1c3de
--- /dev/null
+++ b/lib/internal/Magento/Framework/Mview/View/ChangelogCounterInterface.php
@@ -0,0 +1,22 @@
+<?php
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Framework\Mview\View;
+
+/**
+ * Interface \Magento\Framework\Mview\View\ChangelogCounterInterface
+ *
+ */
+interface ChangelogCounterInterface
+{
+    /**
+     * Retrieve the count of entity ids in the range [$fromVersionId..$toVersionId]
+     *
+     * @param $fromVersionId
+     * @param $toVersionId
+     * @return mixed
+     */
+    public function getListSize($fromVersionId, $toVersionId);
+}
diff --git a/lib/internal/Magento/Framework/Mview/View/ChangelogInterface.php b/lib/internal/Magento/Framework/Mview/View/ChangelogInterface.php
index da115ecdb83..b00c1ca3a2e 100644
--- a/lib/internal/Magento/Framework/Mview/View/ChangelogInterface.php
+++ b/lib/internal/Magento/Framework/Mview/View/ChangelogInterface.php
@@ -42,15 +42,6 @@ interface ChangelogInterface
      */
     public function getList($fromVersionId, $toVersionId);
 
-    /**
-     * Retrieve the count of entity ids in the range [$fromVersionId..$toVersionId]
-     *
-     * @param $fromVersionId
-     * @param $toVersionId
-     * @return mixed
-     */
-    public function getListSize($fromVersionId, $toVersionId);
-
     /**
      * Get maximum version_id from changelog
      *
-- 
GitLab


From 448bfec53114ae82db4eae41238e09a36885d6fd Mon Sep 17 00:00:00 2001
From: Atish Goswami <atishgoswami@gmail.com>
Date: Mon, 4 Dec 2017 05:11:38 +0530
Subject: [PATCH 251/380] Added correction for og:type content value

---
 .../frontend/templates/product/view/opengraph/general.phtml     | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/app/code/Magento/Catalog/view/frontend/templates/product/view/opengraph/general.phtml b/app/code/Magento/Catalog/view/frontend/templates/product/view/opengraph/general.phtml
index b1e46776af4..a2b91a5eeb9 100644
--- a/app/code/Magento/Catalog/view/frontend/templates/product/view/opengraph/general.phtml
+++ b/app/code/Magento/Catalog/view/frontend/templates/product/view/opengraph/general.phtml
@@ -9,7 +9,7 @@
 /** @var $block \Magento\Catalog\Block\Product\View */
 ?>
 
-<meta property="og:type" content="og:product" />
+<meta property="og:type" content="product" />
 <meta property="og:title" content="<?= $block->escapeHtmlAttr($block->stripTags($block->getProduct()->getName())) ?>" />
 <meta property="og:image" content="<?= $block->escapeUrl($block->getImage($block->getProduct(), 'product_base_image')->getImageUrl()) ?>" />
 <meta property="og:description" content="<?= $block->escapeHtmlAttr($block->stripTags($block->getProduct()->getShortDescription())) ?>" />
-- 
GitLab


From 700fe22627057e8a982dbb68fabe1c289b99c666 Mon Sep 17 00:00:00 2001
From: Ihor Sviziev <ihor-sviziev@users.noreply.github.com>
Date: Mon, 4 Dec 2017 09:19:14 +0200
Subject: [PATCH 252/380] Add command to view mview state and queue

Use private method visibility instead of protected in test
---
 .../Test/Unit/Console/Command/IndexerStatusCommandTest.php      | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/app/code/Magento/Indexer/Test/Unit/Console/Command/IndexerStatusCommandTest.php b/app/code/Magento/Indexer/Test/Unit/Console/Command/IndexerStatusCommandTest.php
index 1a4894faf4a..45b3ec3471b 100644
--- a/app/code/Magento/Indexer/Test/Unit/Console/Command/IndexerStatusCommandTest.php
+++ b/app/code/Magento/Indexer/Test/Unit/Console/Command/IndexerStatusCommandTest.php
@@ -25,7 +25,7 @@ class IndexerStatusCommandTest extends AbstractIndexerCommandCommonSetup
      * @param array $data
      * @return mixed
      */
-    protected function attachViewToIndexerMock($indexerMock, array $data)
+    private function attachViewToIndexerMock($indexerMock, array $data)
     {
          /** @var \Magento\Framework\Mview\View\Changelog|\PHPUnit_Framework_MockObject_MockObject $stub */
         $changelog = $this->getMockBuilder(\Magento\Framework\Mview\View\Changelog::class)
-- 
GitLab


From ff0e2018e11dc221b3d81b38296d320d715e930c Mon Sep 17 00:00:00 2001
From: Oscar Recio <osrecio@gmail.com>
Date: Sun, 3 Dec 2017 22:54:23 +0100
Subject: [PATCH 253/380] Set Current Store from Store Code

---
 app/code/Magento/Store/App/Request/PathInfoProcessor.php        | 2 +-
 .../Store/Test/Unit/App/Request/PathInfoProcessorTest.php       | 1 +
 2 files changed, 2 insertions(+), 1 deletion(-)

diff --git a/app/code/Magento/Store/App/Request/PathInfoProcessor.php b/app/code/Magento/Store/App/Request/PathInfoProcessor.php
index a38ea6d1272..3fa78dc94aa 100644
--- a/app/code/Magento/Store/App/Request/PathInfoProcessor.php
+++ b/app/code/Magento/Store/App/Request/PathInfoProcessor.php
@@ -44,7 +44,7 @@ class PathInfoProcessor implements \Magento\Framework\App\Request\PathInfoProces
 
         if ($store->isUseStoreInUrl()) {
             if (!$request->isDirectAccessFrontendName($storeCode) && $storeCode != Store::ADMIN_CODE) {
-                $this->storeManager->setCurrentStore($storeCode);
+                $this->storeManager->setCurrentStore($store->getCode());
                 $pathInfo = '/' . (isset($pathParts[1]) ? $pathParts[1] : '');
                 return $pathInfo;
             } elseif (!empty($storeCode)) {
diff --git a/app/code/Magento/Store/Test/Unit/App/Request/PathInfoProcessorTest.php b/app/code/Magento/Store/Test/Unit/App/Request/PathInfoProcessorTest.php
index f2bd401cea3..7d2fb540149 100644
--- a/app/code/Magento/Store/Test/Unit/App/Request/PathInfoProcessorTest.php
+++ b/app/code/Magento/Store/Test/Unit/App/Request/PathInfoProcessorTest.php
@@ -47,6 +47,7 @@ class PathInfoProcessorTest extends \PHPUnit\Framework\TestCase
         )->with(
             'storeCode'
         )->willReturn($store);
+        $store->expects($this->once())->method('getCode')->will($this->returnValue('storeCode'));
         $store->expects($this->once())->method('isUseStoreInUrl')->will($this->returnValue(true));
         $this->_requestMock->expects(
             $this->once()
-- 
GitLab


From dd4dec8618cd4b514df76145681a3aff71f4a1dd Mon Sep 17 00:00:00 2001
From: magento-engcom-team <mikola.malevanec@transoftgroup.com>
Date: Mon, 4 Dec 2017 11:38:02 +0200
Subject: [PATCH 254/380] 12110: Missing cascade into attribute set deletion.

---
 app/code/Magento/Catalog/Setup/UpgradeSchema.php            | 6 ++----
 .../Model/AttributeSetRepository/RemoveProductsTest.php     | 4 +---
 2 files changed, 3 insertions(+), 7 deletions(-)

diff --git a/app/code/Magento/Catalog/Setup/UpgradeSchema.php b/app/code/Magento/Catalog/Setup/UpgradeSchema.php
index ae09ff11136..78106e3ff3a 100755
--- a/app/code/Magento/Catalog/Setup/UpgradeSchema.php
+++ b/app/code/Magento/Catalog/Setup/UpgradeSchema.php
@@ -714,11 +714,9 @@ class UpgradeSchema implements UpgradeSchemaInterface
      */
     private function removeAttributeSetRelation(SchemaSetupInterface $setup)
     {
-        $productTable = $setup->getTable('catalog_product_entity');
-        $attributeSetTable = $setup->getTable('eav_attribute_set');
         $setup->getConnection()->dropForeignKey(
-            $productTable,
-            $setup->getFkName($productTable, 'attribute_set_id', $attributeSetTable, 'attribute_set_id')
+            $setup->getTable('catalog_product_entity'),
+            $setup->getFkName('catalog_product_entity', 'attribute_set_id', 'eav_attribute_set', 'attribute_set_id')
         );
     }
 }
diff --git a/dev/tests/integration/testsuite/Magento/Catalog/Plugin/Model/AttributeSetRepository/RemoveProductsTest.php b/dev/tests/integration/testsuite/Magento/Catalog/Plugin/Model/AttributeSetRepository/RemoveProductsTest.php
index 724e2e62f23..2896716a01a 100644
--- a/dev/tests/integration/testsuite/Magento/Catalog/Plugin/Model/AttributeSetRepository/RemoveProductsTest.php
+++ b/dev/tests/integration/testsuite/Magento/Catalog/Plugin/Model/AttributeSetRepository/RemoveProductsTest.php
@@ -4,11 +4,10 @@
  * See COPYING.txt for license details.
  */
 
-namespace Magento\CatalogUrlRewrite\Plugin\Eav\AttributeSetRepository;
+namespace Magento\Catalog\Plugin\Model\AttributeSetRepository;
 
 use Magento\Catalog\Api\ProductRepositoryInterface;
 use Magento\Catalog\Model\ResourceModel\Product\CollectionFactory;
-use Magento\Catalog\Plugin\Model\AttributeSetRepository\RemoveProducts;
 use Magento\Eav\Api\AttributeSetRepositoryInterface;
 use Magento\Eav\Model\Entity\Attribute\Set;
 use Magento\TestFramework\Helper\Bootstrap;
@@ -36,7 +35,6 @@ class RemoveProductsTest extends TestCase
      * Test related to given attribute set products will be removed, if attribute set will be deleted.
      *
      * @magentoDataFixture Magento/Catalog/_files/attribute_set_with_product.php
-     * @magentoDbIsolation enabled
      */
     public function testAroundDelete()
     {
-- 
GitLab


From c7a6c5669660a1dfb909d21a4a7ef70d0d09b8ff Mon Sep 17 00:00:00 2001
From: Volodymyr Kublytskyi <vkublytskyi@magento.com>
Date: Mon, 4 Dec 2017 13:02:03 +0200
Subject: [PATCH 255/380] MAGETWO-83373: Fix for issue 9633 500 error on setup
 wizard with memcache #11608

 - fixed test failures
---
 .../Magento/Framework/Session/ConfigTest.php  | 53 ++++++++++---------
 .../Magento/Framework/Session/Config.php      | 14 ++---
 .../Session/Test/Unit/ConfigTest.php          | 27 ++++++----
 3 files changed, 53 insertions(+), 41 deletions(-)

diff --git a/dev/tests/integration/testsuite/Magento/Framework/Session/ConfigTest.php b/dev/tests/integration/testsuite/Magento/Framework/Session/ConfigTest.php
index 629089ae4d9..573531cff96 100644
--- a/dev/tests/integration/testsuite/Magento/Framework/Session/ConfigTest.php
+++ b/dev/tests/integration/testsuite/Magento/Framework/Session/ConfigTest.php
@@ -36,15 +36,18 @@ class ConfigTest extends \PHPUnit\Framework\TestCase
             $sessionManager->writeClose();
         }
         $this->deploymentConfigMock = $this->createMock(\Magento\Framework\App\DeploymentConfig::class);
-
-        $this->deploymentConfigMock->expects($this->at(0))
-            ->method('get')
-            ->with(Config::PARAM_SESSION_SAVE_PATH)
-            ->will($this->returnValue(null));
-        $this->deploymentConfigMock->expects($this->at(1))
+        $this->deploymentConfigMock
             ->method('get')
-            ->with(Config::PARAM_SESSION_CACHE_LIMITER)
-            ->will($this->returnValue($this->_cacheLimiter));
+            ->willReturnCallback(function ($configPath) {
+                switch ($configPath) {
+                    case Config::PARAM_SESSION_SAVE_METHOD:
+                        return 'files';
+                    case Config::PARAM_SESSION_CACHE_LIMITER:
+                        return $this->_cacheLimiter;
+                    default:
+                        return null;
+                }
+            });
 
         $this->_model = $this->_objectManager->create(
             \Magento\Framework\Session\Config::class,
@@ -83,15 +86,6 @@ class ConfigTest extends \PHPUnit\Framework\TestCase
         $this->assertEquals($this->_model->getSavePath(), $this->_model->getOption('save_path'));
     }
 
-    /**
-     * Unable to add integration tests for testGetLifetimePathNonDefault
-     *
-     * Error: Cannot modify header information - headers already sent
-     */
-    public function testGetLifetimePathNonDefault()
-    {
-    }
-
     public function testSetOptionsInvalidValue()
     {
         $preValue = $this->_model->getOptions();
@@ -280,16 +274,27 @@ class ConfigTest extends \PHPUnit\Framework\TestCase
             $this->markTestSkipped('Cannot set session.save_path with ini_set');
         }
 
-        $this->deploymentConfigMock->expects($this->at(0))
+        $deploymentConfigMock = $this->createMock(\Magento\Framework\App\DeploymentConfig::class);
+        $deploymentConfigMock
             ->method('get')
-            ->with(Config::PARAM_SESSION_SAVE_PATH)
-            ->will($this->returnValue($given));
-
-        $this->_model = $this->_objectManager->create(
+            ->willReturnCallback(function ($configPath) use ($given) {
+                switch ($configPath) {
+                    case Config::PARAM_SESSION_SAVE_METHOD:
+                        return 'files';
+                    case Config::PARAM_SESSION_CACHE_LIMITER:
+                        return $this->_cacheLimiter;
+                    case Config::PARAM_SESSION_SAVE_PATH:
+                        return $given;
+                    default:
+                        return null;
+                }
+            });
+
+        $model = $this->_objectManager->create(
             \Magento\Framework\Session\Config::class,
-            ['deploymentConfig' => $this->deploymentConfigMock]
+            ['deploymentConfig' => $deploymentConfigMock]
         );
-        $this->assertEquals($expected, $this->_model->getOption('save_path'));
+        $this->assertEquals($expected, $model->getOption('save_path'));
 
         if ($sessionSavePath != ini_get('session.save_path')) {
             ini_set('session.save_path', $sessionSavePath);
diff --git a/lib/internal/Magento/Framework/Session/Config.php b/lib/internal/Magento/Framework/Session/Config.php
index 73a5eb26df4..053bd3e7fd6 100644
--- a/lib/internal/Magento/Framework/Session/Config.php
+++ b/lib/internal/Magento/Framework/Session/Config.php
@@ -133,14 +133,14 @@ class Config implements ConfigInterface
         if ($savePath) {
             $this->setSavePath($savePath);
         }
-	/**
-	* Session save handler - memcache,files,etc
-	*/
-	$saveHandler=$deploymentConfig->get(self::PARAM_SESSION_SAVE_METHOD);
-	if ($saveHandler) {
-		$this->setOption('session.save_handler', $saveHandler);
-	}
 
+        /**
+        * Session save handler - memcache, files, etc
+        */
+        $saveHandler = $deploymentConfig->get(self::PARAM_SESSION_SAVE_METHOD);
+        if ($saveHandler) {
+            $this->setOption('session.save_handler', $saveHandler);
+        }
 
         /**
          * Session cache limiter
diff --git a/lib/internal/Magento/Framework/Session/Test/Unit/ConfigTest.php b/lib/internal/Magento/Framework/Session/Test/Unit/ConfigTest.php
index 66fc12b4930..12e28cdb397 100644
--- a/lib/internal/Magento/Framework/Session/Test/Unit/ConfigTest.php
+++ b/lib/internal/Magento/Framework/Session/Test/Unit/ConfigTest.php
@@ -350,33 +350,36 @@ class ConfigTest extends \PHPUnit\Framework\TestCase
                 true,
                 true,
                 [
-                    'session.cache_limiter' => 'files',
+                    'session.cache_limiter' => 'private_no_expire',
                     'session.cookie_lifetime' => 7200,
                     'session.cookie_path' => '/',
                     'session.cookie_domain' => 'init.host',
                     'session.cookie_httponly' => false,
                     'session.cookie_secure' => false,
+                    'session.save_handler' => 'files'
                 ],
             ],
             'all invalid' => [
                 true,
                 false,
                 [
-                    'session.cache_limiter' => 'files',
+                    'session.cache_limiter' => 'private_no_expire',
                     'session.cookie_httponly' => false,
                     'session.cookie_secure' => false,
+                    'session.save_handler' => 'files'
                 ],
             ],
             'invalid_valid' => [
                 false,
                 true,
                 [
-                    'session.cache_limiter' => 'files',
+                    'session.cache_limiter' => 'private_no_expire',
                     'session.cookie_lifetime' => 3600,
                     'session.cookie_path' => '/',
                     'session.cookie_domain' => 'init.host',
                     'session.cookie_httponly' => false,
                     'session.cookie_secure' => false,
+                    'session.save_handler' => 'files'
                 ],
             ],
         ];
@@ -429,14 +432,18 @@ class ConfigTest extends \PHPUnit\Framework\TestCase
             ->will($this->returnValue($dirMock));
 
         $deploymentConfigMock = $this->createMock(\Magento\Framework\App\DeploymentConfig::class);
-        $deploymentConfigMock->expects($this->at(0))
+        $deploymentConfigMock
             ->method('get')
-            ->with(Config::PARAM_SESSION_SAVE_PATH)
-            ->will($this->returnValue(null));
-        $deploymentConfigMock->expects($this->at(1))
-            ->method('get')
-            ->with(Config::PARAM_SESSION_CACHE_LIMITER)
-            ->will($this->returnValue('files'));
+            ->willReturnCallback(function ($configPath) {
+                switch ($configPath) {
+                    case Config::PARAM_SESSION_SAVE_METHOD:
+                        return 'files';
+                    case Config::PARAM_SESSION_CACHE_LIMITER:
+                        return 'private_no_expire';
+                    default:
+                        return null;
+                }
+            });
 
         $this->config = $this->helper->getObject(
             \Magento\Framework\Session\Config::class,
-- 
GitLab


From 3143bbb0289d82b0da5a6bccdb779802323d670f Mon Sep 17 00:00:00 2001
From: magento-engcom-team <mikola.malevanec@transoftgroup.com>
Date: Mon, 4 Dec 2017 13:16:08 +0200
Subject: [PATCH 256/380] 12110: Missing cascade into attribute set deletion.

---
 .../Model/AttributeSetRepository/RemoveProducts.php       | 7 +++----
 .../Model/AttributeSetRepository/RemoveProductsTest.php   | 8 ++------
 .../Model/AttributeSetRepository/RemoveProductsTest.php   | 2 +-
 3 files changed, 6 insertions(+), 11 deletions(-)

diff --git a/app/code/Magento/Catalog/Plugin/Model/AttributeSetRepository/RemoveProducts.php b/app/code/Magento/Catalog/Plugin/Model/AttributeSetRepository/RemoveProducts.php
index bc6de17f90c..342b703ded0 100644
--- a/app/code/Magento/Catalog/Plugin/Model/AttributeSetRepository/RemoveProducts.php
+++ b/app/code/Magento/Catalog/Plugin/Model/AttributeSetRepository/RemoveProducts.php
@@ -37,21 +37,20 @@ class RemoveProducts
      * Delete related to specific attribute set products, if attribute set was removed successfully.
      *
      * @param AttributeSetRepositoryInterface $subject
-     * @param \Closure $proceed
+     * @param bool $result
      * @param AttributeSetInterface $attributeSet
      * @return bool
      *
      * @SuppressWarnings(PHPMD.UnusedFormalParameter)
      */
-    public function aroundDelete(
+    public function afterDelete(
         AttributeSetRepositoryInterface $subject,
-        \Closure $proceed,
+        bool $result,
         AttributeSetInterface $attributeSet
     ) {
         /** @var Collection $productCollection */
         $productCollection = $this->collectionFactory->create();
         $productCollection->addFieldToFilter('attribute_set_id', ['eq' => $attributeSet->getId()]);
-        $result = $proceed($attributeSet);
         $productCollection->delete();
 
         return $result;
diff --git a/app/code/Magento/Catalog/Test/Unit/Plugin/Model/AttributeSetRepository/RemoveProductsTest.php b/app/code/Magento/Catalog/Test/Unit/Plugin/Model/AttributeSetRepository/RemoveProductsTest.php
index a8eb757646e..712aeba59df 100644
--- a/app/code/Magento/Catalog/Test/Unit/Plugin/Model/AttributeSetRepository/RemoveProductsTest.php
+++ b/app/code/Magento/Catalog/Test/Unit/Plugin/Model/AttributeSetRepository/RemoveProductsTest.php
@@ -50,7 +50,7 @@ class RemoveProductsTest extends TestCase
     /**
      * Test plugin will delete all related products for given attribute set.
      */
-    public function testAroundDelete()
+    public function testAfterDelete()
     {
         $attributeSetId = '1';
 
@@ -73,10 +73,6 @@ class RemoveProductsTest extends TestCase
             ->disableOriginalConstructor()
             ->getMockForAbstractClass();
 
-        $proceed = function () {
-            return true;
-        };
-
         /** @var AttributeSetInterface|\PHPUnit_Framework_MockObject_MockObject $attributeSet */
         $attributeSet = $this->getMockBuilder(AttributeSetInterface::class)
             ->setMethods(['getId'])
@@ -86,6 +82,6 @@ class RemoveProductsTest extends TestCase
             ->method('getId')
             ->willReturn($attributeSetId);
 
-        $this->testSubject->aroundDelete($attributeSetRepository, $proceed, $attributeSet);
+        self::assertTrue($this->testSubject->afterDelete($attributeSetRepository, true, $attributeSet));
     }
 }
diff --git a/dev/tests/integration/testsuite/Magento/Catalog/Plugin/Model/AttributeSetRepository/RemoveProductsTest.php b/dev/tests/integration/testsuite/Magento/Catalog/Plugin/Model/AttributeSetRepository/RemoveProductsTest.php
index 2896716a01a..4e8eaf70824 100644
--- a/dev/tests/integration/testsuite/Magento/Catalog/Plugin/Model/AttributeSetRepository/RemoveProductsTest.php
+++ b/dev/tests/integration/testsuite/Magento/Catalog/Plugin/Model/AttributeSetRepository/RemoveProductsTest.php
@@ -36,7 +36,7 @@ class RemoveProductsTest extends TestCase
      *
      * @magentoDataFixture Magento/Catalog/_files/attribute_set_with_product.php
      */
-    public function testAroundDelete()
+    public function testAfterDelete()
     {
         $attributeSet = Bootstrap::getObjectManager()->get(Set::class);
         $attributeSet->load('empty_attribute_set', 'attribute_set_name');
-- 
GitLab


From 9df89df5572afd0c4ee98d04321e57213b063951 Mon Sep 17 00:00:00 2001
From: Stanislav Idolov <sidolov@magento.com>
Date: Mon, 4 Dec 2017 15:05:46 +0200
Subject: [PATCH 257/380] magento/magento2#12167

---
 app/code/Magento/Catalog/Setup/UpgradeSchema.php | 1 +
 1 file changed, 1 insertion(+)

diff --git a/app/code/Magento/Catalog/Setup/UpgradeSchema.php b/app/code/Magento/Catalog/Setup/UpgradeSchema.php
index 78106e3ff3a..dfaa6a110e8 100755
--- a/app/code/Magento/Catalog/Setup/UpgradeSchema.php
+++ b/app/code/Magento/Catalog/Setup/UpgradeSchema.php
@@ -21,6 +21,7 @@ class UpgradeSchema implements UpgradeSchemaInterface
     /**
      * {@inheritdoc}
      * @SuppressWarnings(PHPMD.ExcessiveMethodLength)
+     * @SuppressWarnings(PHPMD.CyclomaticComplexity)
      */
     public function upgrade(SchemaSetupInterface $setup, ModuleContextInterface $context)
     {
-- 
GitLab


From c14e9e36612a40f3daff270a4e321234f8d3377a Mon Sep 17 00:00:00 2001
From: magento-engcom-team <mikola.malevanec@transoftgroup.com>
Date: Mon, 4 Dec 2017 15:13:49 +0200
Subject: [PATCH 258/380] 12110: Missing cascade into attribute set deletion.

---
 app/code/Magento/Catalog/Setup/UpgradeSchema.php | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/app/code/Magento/Catalog/Setup/UpgradeSchema.php b/app/code/Magento/Catalog/Setup/UpgradeSchema.php
index 78106e3ff3a..d08108d1fc2 100755
--- a/app/code/Magento/Catalog/Setup/UpgradeSchema.php
+++ b/app/code/Magento/Catalog/Setup/UpgradeSchema.php
@@ -21,6 +21,8 @@ class UpgradeSchema implements UpgradeSchemaInterface
     /**
      * {@inheritdoc}
      * @SuppressWarnings(PHPMD.ExcessiveMethodLength)
+     * @SuppressWarnings(PHPMD.CyclomaticComplexity)
+     * @SuppressWarnings(PHPMD.NPathComplexity)
      */
     public function upgrade(SchemaSetupInterface $setup, ModuleContextInterface $context)
     {
-- 
GitLab


From 8c86e807a0e47aaae7a7034973fe9ec8c66a796a Mon Sep 17 00:00:00 2001
From: Michail Slabko <mslabko@magento.com>
Date: Mon, 4 Dec 2017 17:23:00 +0200
Subject: [PATCH 259/380] MAGETWO-75786: Incorrect count for category filter at
 layered navigation for configurable with no available options

---
 app/code/Magento/Catalog/Model/Category.php   |   7 +-
 .../Category/Product/AbstractAction.php       | 160 ++++++++++++------
 .../Indexer/Product/Category/Action/Rows.php  | 129 +++++++++++---
 .../frontend/templates/navigation/left.phtml  |   1 +
 .../Magento/CatalogInventory/Helper/Stock.php |   2 +-
 .../CatalogSearch/Model/Indexer/Fulltext.php  |   3 +-
 .../Indexer/Fulltext/Action/DataProvider.php  |   6 +-
 .../Model/Indexer/Fulltext/Action/Full.php    |  23 ++-
 .../Model/ResourceModel/Fulltext.php          |  25 +--
 .../Constraint/AssertFilterProductList.php    |   1 -
 .../Test/Constraint/AssertProductsCount.php   |  99 +++++++++++
 .../Test/Repository/Category.xml              |  54 ++++++
 .../ProductsCountInLayeredNavigationTest.php  | 121 +++++++++++++
 .../ProductsCountInLayeredNavigationTest.xml  |  29 ++++
 .../Model/Indexer/FulltextTest.php            |  23 +++
 ...product_configurable_with_single_child.php | 101 +++++++++++
 ...onfigurable_with_single_child_rollback.php |  34 ++++
 .../Framework/Indexer/CacheContext.php        |   5 +-
 18 files changed, 722 insertions(+), 101 deletions(-)
 create mode 100644 dev/tests/functional/tests/app/Magento/LayeredNavigation/Test/Constraint/AssertProductsCount.php
 create mode 100644 dev/tests/functional/tests/app/Magento/LayeredNavigation/Test/Repository/Category.xml
 create mode 100644 dev/tests/functional/tests/app/Magento/LayeredNavigation/Test/TestCase/ProductsCountInLayeredNavigationTest.php
 create mode 100644 dev/tests/functional/tests/app/Magento/LayeredNavigation/Test/TestCase/ProductsCountInLayeredNavigationTest.xml
 create mode 100644 dev/tests/integration/testsuite/Magento/CatalogSearch/_files/product_configurable_with_single_child.php
 create mode 100644 dev/tests/integration/testsuite/Magento/CatalogSearch/_files/product_configurable_with_single_child_rollback.php

diff --git a/app/code/Magento/Catalog/Model/Category.php b/app/code/Magento/Catalog/Model/Category.php
index 571e4646f46..20027226844 100644
--- a/app/code/Magento/Catalog/Model/Category.php
+++ b/app/code/Magento/Catalog/Model/Category.php
@@ -943,8 +943,11 @@ class Category extends \Magento\Catalog\Model\AbstractModel implements
      */
     public function getProductCount()
     {
-        $count = $this->_getResource()->getProductCount($this);
-        $this->setData(self::KEY_PRODUCT_COUNT, $count);
+        if (!$this->hasData(self::KEY_PRODUCT_COUNT)) {
+            $count = $this->_getResource()->getProductCount($this);
+            $this->setData(self::KEY_PRODUCT_COUNT, $count);
+        }
+
         return $this->getData(self::KEY_PRODUCT_COUNT);
     }
 
diff --git a/app/code/Magento/Catalog/Model/Indexer/Category/Product/AbstractAction.php b/app/code/Magento/Catalog/Model/Indexer/Category/Product/AbstractAction.php
index c7ddb14a764..f7f2c7eb5de 100644
--- a/app/code/Magento/Catalog/Model/Indexer/Category/Product/AbstractAction.php
+++ b/app/code/Magento/Catalog/Model/Indexer/Category/Product/AbstractAction.php
@@ -8,9 +8,14 @@
 
 namespace Magento\Catalog\Model\Indexer\Category\Product;
 
-use Magento\Framework\DB\Query\Generator as QueryGenerator;
+use Magento\Catalog\Api\Data\ProductInterface;
+use Magento\Catalog\Model\Product;
+use Magento\Framework\App\ObjectManager;
 use Magento\Framework\App\ResourceConnection;
+use Magento\Framework\DB\Query\Generator as QueryGenerator;
+use Magento\Framework\DB\Select;
 use Magento\Framework\EntityManager\MetadataPool;
+use Magento\Store\Model\Store;
 
 /**
  * Class AbstractAction
@@ -45,21 +50,21 @@ abstract class AbstractAction
     /**
      * Cached non anchor categories select by store id
      *
-     * @var \Magento\Framework\DB\Select[]
+     * @var Select[]
      */
     protected $nonAnchorSelects = [];
 
     /**
      * Cached anchor categories select by store id
      *
-     * @var \Magento\Framework\DB\Select[]
+     * @var Select[]
      */
     protected $anchorSelects = [];
 
     /**
      * Cached all product select by store id
      *
-     * @var \Magento\Framework\DB\Select[]
+     * @var Select[]
      */
     protected $productsSelects = [];
 
@@ -119,19 +124,21 @@ abstract class AbstractAction
      * @param \Magento\Store\Model\StoreManagerInterface $storeManager
      * @param \Magento\Catalog\Model\Config $config
      * @param QueryGenerator $queryGenerator
+     * @param MetadataPool|null $metadataPool
      */
     public function __construct(
         \Magento\Framework\App\ResourceConnection $resource,
         \Magento\Store\Model\StoreManagerInterface $storeManager,
         \Magento\Catalog\Model\Config $config,
-        QueryGenerator $queryGenerator = null
+        QueryGenerator $queryGenerator = null,
+        MetadataPool $metadataPool = null
     ) {
         $this->resource = $resource;
         $this->connection = $resource->getConnection();
         $this->storeManager = $storeManager;
         $this->config = $config;
-        $this->queryGenerator = $queryGenerator ?: \Magento\Framework\App\ObjectManager::getInstance()
-            ->get(QueryGenerator::class);
+        $this->queryGenerator = $queryGenerator ?: ObjectManager::getInstance()->get(QueryGenerator::class);
+        $this->metadataPool = $metadataPool ?: ObjectManager::getInstance()->get(MetadataPool::class);
     }
 
     /**
@@ -188,9 +195,9 @@ abstract class AbstractAction
      */
     protected function getMainTmpTable()
     {
-        return $this->useTempTable ? $this->getTable(
-            self::MAIN_INDEX_TABLE . self::TEMPORARY_TABLE_SUFFIX
-        ) : $this->getMainTable();
+        return $this->useTempTable
+            ? $this->getTable(self::MAIN_INDEX_TABLE . self::TEMPORARY_TABLE_SUFFIX)
+            : $this->getMainTable();
     }
 
     /**
@@ -218,24 +225,25 @@ abstract class AbstractAction
     /**
      * Retrieve select for reindex products of non anchor categories
      *
-     * @param \Magento\Store\Model\Store $store
-     * @return \Magento\Framework\DB\Select
+     * @param Store $store
+     * @return Select
+     * @throws \Exception when metadata not found for ProductInterface
      */
-    protected function getNonAnchorCategoriesSelect(\Magento\Store\Model\Store $store)
+    protected function getNonAnchorCategoriesSelect(Store $store)
     {
         if (!isset($this->nonAnchorSelects[$store->getId()])) {
             $statusAttributeId = $this->config->getAttribute(
-                \Magento\Catalog\Model\Product::ENTITY,
+                Product::ENTITY,
                 'status'
             )->getId();
             $visibilityAttributeId = $this->config->getAttribute(
-                \Magento\Catalog\Model\Product::ENTITY,
+                Product::ENTITY,
                 'visibility'
             )->getId();
 
             $rootPath = $this->getPathFromCategoryId($store->getRootCategoryId());
 
-            $metadata = $this->getMetadataPool()->getMetadata(\Magento\Catalog\Api\Data\ProductInterface::class);
+            $metadata = $this->metadataPool->getMetadata(ProductInterface::class);
             $linkField = $metadata->getLinkField();
             $select = $this->connection->select()->from(
                 ['cc' => $this->getTable('catalog_category_entity')],
@@ -304,12 +312,65 @@ abstract class AbstractAction
                 ]
             );
 
+            $this->addFilteringByChildProductsToSelect($select, $store);
+
             $this->nonAnchorSelects[$store->getId()] = $select;
         }
 
         return $this->nonAnchorSelects[$store->getId()];
     }
 
+    /**
+     * Add filtering by child products to select
+     *
+     * It's used for correct handling of composite products.
+     * This method makes assumption that select already joins `catalog_product_entity` as `cpe`.
+     *
+     * @param Select $select
+     * @param Store $store
+     * @return void
+     * @throws \Exception when metadata not found for ProductInterface
+     */
+    private function addFilteringByChildProductsToSelect(Select $select, Store $store)
+    {
+        $metadata = $this->metadataPool->getMetadata(ProductInterface::class);
+        $linkField = $metadata->getLinkField();
+
+        $statusAttributeId = $this->config->getAttribute(Product::ENTITY, 'status')->getId();
+
+        $select->joinLeft(
+            ['relation' => $this->getTable('catalog_product_relation')],
+            'cpe.' . $linkField . ' = relation.parent_id',
+            []
+        )->joinLeft(
+            ['relation_product_entity' => $this->getTable('catalog_product_entity')],
+            'relation.child_id = relation_product_entity.entity_id',
+            []
+        )->joinLeft(
+            ['child_cpsd' => $this->getTable('catalog_product_entity_int')],
+            'child_cpsd.' . $linkField . ' = '. 'relation_product_entity.' . $linkField
+            . ' AND child_cpsd.store_id = 0'
+            . ' AND child_cpsd.attribute_id = ' . $statusAttributeId,
+            []
+        )->joinLeft(
+            ['child_cpss' => $this->getTable('catalog_product_entity_int')],
+            'child_cpss.' . $linkField . ' = '. 'relation_product_entity.' . $linkField . ''
+            . ' AND child_cpss.attribute_id = child_cpsd.attribute_id'
+            . ' AND child_cpss.store_id = ' . $store->getId(),
+            []
+        )->where(
+            'relation.child_id IS NULL OR '
+            . $this->connection->getIfNullSql('child_cpss.value', 'child_cpsd.value') . ' = ?',
+            \Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED
+        )->group(
+            [
+                'cc.entity_id',
+                'ccp.product_id',
+                'visibility'
+            ]
+        );
+    }
+
     /**
      * Check whether select ranging is needed
      *
@@ -323,16 +384,13 @@ abstract class AbstractAction
     /**
      * Return selects cut by min and max
      *
-     * @param \Magento\Framework\DB\Select $select
+     * @param Select $select
      * @param string $field
      * @param int $range
-     * @return \Magento\Framework\DB\Select[]
+     * @return Select[]
      */
-    protected function prepareSelectsByRange(
-        \Magento\Framework\DB\Select $select,
-        $field,
-        $range = self::RANGE_CATEGORY_STEP
-    ) {
+    protected function prepareSelectsByRange(Select $select, $field, $range = self::RANGE_CATEGORY_STEP)
+    {
         if ($this->isRangingNeeded()) {
             $iterator = $this->queryGenerator->generate(
                 $field,
@@ -353,10 +411,10 @@ abstract class AbstractAction
     /**
      * Reindex products of non anchor categories
      *
-     * @param \Magento\Store\Model\Store $store
+     * @param Store $store
      * @return void
      */
-    protected function reindexNonAnchorCategories(\Magento\Store\Model\Store $store)
+    protected function reindexNonAnchorCategories(Store $store)
     {
         $selects = $this->prepareSelectsByRange($this->getNonAnchorCategoriesSelect($store), 'entity_id');
         foreach ($selects as $select) {
@@ -374,10 +432,10 @@ abstract class AbstractAction
     /**
      * Check if anchor select isset
      *
-     * @param \Magento\Store\Model\Store $store
+     * @param Store $store
      * @return bool
      */
-    protected function hasAnchorSelect(\Magento\Store\Model\Store $store)
+    protected function hasAnchorSelect(Store $store)
     {
         return isset($this->anchorSelects[$store->getId()]);
     }
@@ -385,19 +443,20 @@ abstract class AbstractAction
     /**
      * Create anchor select
      *
-     * @param \Magento\Store\Model\Store $store
-     * @return \Magento\Framework\DB\Select
+     * @param Store $store
+     * @return Select
+     * @throws \Exception when metadata not found for ProductInterface or CategoryInterface
      * @SuppressWarnings(PHPMD.ExcessiveMethodLength)
      */
-    protected function createAnchorSelect(\Magento\Store\Model\Store $store)
+    protected function createAnchorSelect(Store $store)
     {
         $isAnchorAttributeId = $this->config->getAttribute(
             \Magento\Catalog\Model\Category::ENTITY,
             'is_anchor'
         )->getId();
-        $statusAttributeId = $this->config->getAttribute(\Magento\Catalog\Model\Product::ENTITY, 'status')->getId();
+        $statusAttributeId = $this->config->getAttribute(Product::ENTITY, 'status')->getId();
         $visibilityAttributeId = $this->config->getAttribute(
-            \Magento\Catalog\Model\Product::ENTITY,
+            Product::ENTITY,
             'visibility'
         )->getId();
         $rootCatIds = explode('/', $this->getPathFromCategoryId($store->getRootCategoryId()));
@@ -405,12 +464,12 @@ abstract class AbstractAction
 
         $temporaryTreeTable = $this->makeTempCategoryTreeIndex();
 
-        $productMetadata = $this->getMetadataPool()->getMetadata(\Magento\Catalog\Api\Data\ProductInterface::class);
-        $categoryMetadata = $this->getMetadataPool()->getMetadata(\Magento\Catalog\Api\Data\CategoryInterface::class);
+        $productMetadata = $this->metadataPool->getMetadata(ProductInterface::class);
+        $categoryMetadata = $this->metadataPool->getMetadata(\Magento\Catalog\Api\Data\CategoryInterface::class);
         $productLinkField = $productMetadata->getLinkField();
         $categoryLinkField = $categoryMetadata->getLinkField();
 
-        return $this->connection->select()->from(
+        $select = $this->connection->select()->from(
             ['cc' => $this->getTable('catalog_category_entity')],
             []
         )->joinInner(
@@ -492,6 +551,10 @@ abstract class AbstractAction
                 'visibility' => new \Zend_Db_Expr($this->connection->getIfNullSql('cpvs.value', 'cpvd.value')),
             ]
         );
+
+        $this->addFilteringByChildProductsToSelect($select, $store);
+
+        return $select;
     }
 
     /**
@@ -586,10 +649,10 @@ abstract class AbstractAction
     /**
      * Retrieve select for reindex products of non anchor categories
      *
-     * @param \Magento\Store\Model\Store $store
-     * @return \Magento\Framework\DB\Select
+     * @param Store $store
+     * @return Select
      */
-    protected function getAnchorCategoriesSelect(\Magento\Store\Model\Store $store)
+    protected function getAnchorCategoriesSelect(Store $store)
     {
         if (!$this->hasAnchorSelect($store)) {
             $this->anchorSelects[$store->getId()] = $this->createAnchorSelect($store);
@@ -600,10 +663,10 @@ abstract class AbstractAction
     /**
      * Reindex products of anchor categories
      *
-     * @param \Magento\Store\Model\Store $store
+     * @param Store $store
      * @return void
      */
-    protected function reindexAnchorCategories(\Magento\Store\Model\Store $store)
+    protected function reindexAnchorCategories(Store $store)
     {
         $selects = $this->prepareSelectsByRange($this->getAnchorCategoriesSelect($store), 'entity_id');
 
@@ -622,22 +685,23 @@ abstract class AbstractAction
     /**
      * Get select for all products
      *
-     * @param \Magento\Store\Model\Store $store
-     * @return \Magento\Framework\DB\Select
+     * @param Store $store
+     * @return Select
+     * @throws \Exception when metadata not found for ProductInterface
      */
-    protected function getAllProducts(\Magento\Store\Model\Store $store)
+    protected function getAllProducts(Store $store)
     {
         if (!isset($this->productsSelects[$store->getId()])) {
             $statusAttributeId = $this->config->getAttribute(
-                \Magento\Catalog\Model\Product::ENTITY,
+                Product::ENTITY,
                 'status'
             )->getId();
             $visibilityAttributeId = $this->config->getAttribute(
-                \Magento\Catalog\Model\Product::ENTITY,
+                Product::ENTITY,
                 'visibility'
             )->getId();
 
-            $metadata = $this->getMetadataPool()->getMetadata(\Magento\Catalog\Api\Data\ProductInterface::class);
+            $metadata = $this->metadataPool->getMetadata(ProductInterface::class);
             $linkField = $metadata->getLinkField();
 
             $select = $this->connection->select()->from(
@@ -726,10 +790,10 @@ abstract class AbstractAction
     /**
      * Reindex all products to root category
      *
-     * @param \Magento\Store\Model\Store $store
+     * @param Store $store
      * @return void
      */
-    protected function reindexRootCategory(\Magento\Store\Model\Store $store)
+    protected function reindexRootCategory(Store $store)
     {
         if ($this->isIndexRootCategoryNeeded()) {
             $selects = $this->prepareSelectsByRange(
diff --git a/app/code/Magento/Catalog/Model/Indexer/Product/Category/Action/Rows.php b/app/code/Magento/Catalog/Model/Indexer/Product/Category/Action/Rows.php
index 1b988534328..bba8cf66567 100644
--- a/app/code/Magento/Catalog/Model/Indexer/Product/Category/Action/Rows.php
+++ b/app/code/Magento/Catalog/Model/Indexer/Product/Category/Action/Rows.php
@@ -6,9 +6,19 @@
 namespace Magento\Catalog\Model\Indexer\Product\Category\Action;
 
 use Magento\Catalog\Model\Category;
+use Magento\Catalog\Model\Config;
 use Magento\Catalog\Model\Product;
+use Magento\Framework\App\ObjectManager;
+use Magento\Framework\App\ResourceConnection;
+use Magento\Framework\DB\Query\Generator as QueryGenerator;
+use Magento\Framework\EntityManager\MetadataPool;
+use Magento\Framework\Event\ManagerInterface as EventManagerInterface;
 use Magento\Framework\Indexer\CacheContext;
+use Magento\Store\Model\StoreManagerInterface;
 
+/**
+ * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
+ */
 class Rows extends \Magento\Catalog\Model\Indexer\Category\Product\AbstractAction
 {
     /**
@@ -19,32 +29,103 @@ class Rows extends \Magento\Catalog\Model\Indexer\Category\Product\AbstractActio
     protected $limitationByProducts;
 
     /**
-     * @var \Magento\Framework\Indexer\CacheContext
+     * @var CacheContext
      */
     private $cacheContext;
 
+    /**
+     * @var EventManagerInterface|null
+     */
+    private $eventManager;
+
+    /**
+     * @param ResourceConnection $resource
+     * @param StoreManagerInterface $storeManager
+     * @param Config $config
+     * @param QueryGenerator|null $queryGenerator
+     * @param MetadataPool|null $metadataPool
+     * @param CacheContext|null $cacheContext
+     * @param EventManagerInterface|null $eventManager
+     */
+    public function __construct(
+        ResourceConnection $resource,
+        StoreManagerInterface $storeManager,
+        Config $config,
+        QueryGenerator $queryGenerator = null,
+        MetadataPool $metadataPool = null,
+        CacheContext $cacheContext = null,
+        EventManagerInterface $eventManager = null
+    ) {
+        parent::__construct($resource, $storeManager, $config, $queryGenerator, $metadataPool);
+        $this->cacheContext = $cacheContext ?: ObjectManager::getInstance()->get(CacheContext::class);
+        $this->eventManager = $eventManager ?: ObjectManager::getInstance()->get(EventManagerInterface::class);
+    }
+
     /**
      * Refresh entities index
      *
      * @param int[] $entityIds
      * @param bool $useTempTable
      * @return $this
+     * @throws \Exception if metadataPool doesn't contain metadata for ProductInterface
+     * @throws \DomainException
      */
     public function execute(array $entityIds = [], $useTempTable = false)
     {
-        $this->limitationByProducts = $entityIds;
+        $idsToBeReIndexed = $this->getProductIdsWithParents($entityIds);
+
+        $this->limitationByProducts = $idsToBeReIndexed;
         $this->useTempTable = $useTempTable;
 
+        $affectedCategories = $this->getCategoryIdsFromIndex($idsToBeReIndexed);
+
         $this->removeEntries();
 
         $this->reindex();
 
-        $this->registerProducts($entityIds);
-        $this->registerCategories($entityIds);
+        $affectedCategories = array_merge($affectedCategories, $this->getCategoryIdsFromIndex($idsToBeReIndexed));
+
+        $this->registerProducts($idsToBeReIndexed);
+        $this->registerCategories($affectedCategories);
+        $this->eventManager->dispatch('clean_cache_by_tags', ['object' => $this->cacheContext]);
 
         return $this;
     }
 
+    /**
+     * Get IDs of parent products by their child IDs.
+     *
+     * Returns identifiers of parent product from the catalog_product_relation.
+     * Please note that returned ids don't contain ids of passed child products.
+     *
+     * @param int[] $childProductIds
+     * @return int[]
+     * @throws \Exception if metadataPool doesn't contain metadata for ProductInterface
+     * @throws \DomainException
+     */
+    private function getProductIdsWithParents(array $childProductIds)
+    {
+        /** @var \Magento\Framework\EntityManager\EntityMetadataInterface $metadata */
+        $metadata = $this->metadataPool->getMetadata(\Magento\Catalog\Api\Data\ProductInterface::class);
+        $fieldForParent = $metadata->getLinkField();
+
+        $select = $this->connection
+            ->select()
+            ->from(['relation' => $this->getTable('catalog_product_relation')], [])
+            ->distinct(true)
+            ->where('child_id IN (?)', $childProductIds)
+            ->where('parent_id NOT IN (?)', $childProductIds)
+            ->join(
+                ['cpe' => $this->getTable('catalog_product_entity')],
+                'relation.parent_id = cpe.' . $fieldForParent,
+                ['cpe.entity_id']
+            );
+
+        $parentProductIds = $this->connection->fetchCol($select);
+
+        return array_unique(array_merge($childProductIds, $parentProductIds));
+    }
+
     /**
      * Register affected products
      *
@@ -53,26 +134,19 @@ class Rows extends \Magento\Catalog\Model\Indexer\Category\Product\AbstractActio
      */
     private function registerProducts($entityIds)
     {
-        $this->getCacheContext()->registerEntities(Product::CACHE_TAG, $entityIds);
+        $this->cacheContext->registerEntities(Product::CACHE_TAG, $entityIds);
     }
 
     /**
      * Register categories assigned to products
      *
-     * @param array $entityIds
+     * @param array $categoryIds
      * @return void
      */
-    private function registerCategories($entityIds)
+    private function registerCategories(array $categoryIds)
     {
-        $categories = $this->connection->fetchCol(
-            $this->connection->select()
-                ->from($this->getMainTable(), ['category_id'])
-                ->where('product_id IN (?)', $entityIds)
-                ->distinct()
-        );
-
-        if ($categories) {
-            $this->getCacheContext()->registerEntities(Category::CACHE_TAG, $categories);
+        if ($categoryIds) {
+            $this->cacheContext->registerEntities(Category::CACHE_TAG, $categoryIds);
         }
     }
 
@@ -98,7 +172,7 @@ class Rows extends \Magento\Catalog\Model\Indexer\Category\Product\AbstractActio
     protected function getNonAnchorCategoriesSelect(\Magento\Store\Model\Store $store)
     {
         $select = parent::getNonAnchorCategoriesSelect($store);
-        return $select->where('ccp.product_id IN (?)', $this->limitationByProducts);
+        return $select->where('ccp.product_id IN (?) OR relation.child_id IN (?)', $this->limitationByProducts);
     }
 
     /**
@@ -136,16 +210,25 @@ class Rows extends \Magento\Catalog\Model\Indexer\Category\Product\AbstractActio
     }
 
     /**
-     * Get cache context
+     * Returns a list of category ids which are assigned to product ids in the index
      *
      * @return \Magento\Framework\Indexer\CacheContext
-     * @deprecated 101.0.0
      */
-    private function getCacheContext()
+    private function getCategoryIdsFromIndex(array $productIds)
     {
-        if ($this->cacheContext === null) {
-            $this->cacheContext = \Magento\Framework\App\ObjectManager::getInstance()->get(CacheContext::class);
+        $categoryIds = $this->connection->fetchCol(
+            $this->connection->select()
+                ->from($this->getMainTable(), ['category_id'])
+                ->where('product_id IN (?)', $productIds)
+                ->distinct()
+        );
+        $parentCategories = $categoryIds;
+        foreach ($categoryIds as $categoryId) {
+            $parentIds = explode('/', $this->getPathFromCategoryId($categoryId));
+            $parentCategories = array_merge($parentCategories, $parentIds);
         }
-        return $this->cacheContext;
+        $categoryIds = array_unique($parentCategories);
+
+        return $categoryIds;
     }
 }
diff --git a/app/code/Magento/Catalog/view/frontend/templates/navigation/left.phtml b/app/code/Magento/Catalog/view/frontend/templates/navigation/left.phtml
index fa70e151355..01820361744 100644
--- a/app/code/Magento/Catalog/view/frontend/templates/navigation/left.phtml
+++ b/app/code/Magento/Catalog/view/frontend/templates/navigation/left.phtml
@@ -28,6 +28,7 @@
                 <dt><?= /* @escapeNotVerified */ __('Category') ?></dt>
                 <dd>
                     <ol class="items">
+                        <?php /** @var \Magento\Catalog\Model\Category $_category */ ?>
                         <?php foreach ($_categories as $_category): ?>
                             <?php if ($_category->getIsActive()): ?>
                                 <li class="item">
diff --git a/app/code/Magento/CatalogInventory/Helper/Stock.php b/app/code/Magento/CatalogInventory/Helper/Stock.php
index 410e35096ee..99a83753e43 100644
--- a/app/code/Magento/CatalogInventory/Helper/Stock.php
+++ b/app/code/Magento/CatalogInventory/Helper/Stock.php
@@ -156,7 +156,7 @@ class Stock
             $resource = $this->getStockStatusResource();
             $resource->addStockDataToCollection(
                 $collection,
-                !$isShowOutOfStock || $collection->getFlag('require_stock_items')
+                !$isShowOutOfStock
             );
             $collection->setFlag($stockFlag, true);
         }
diff --git a/app/code/Magento/CatalogSearch/Model/Indexer/Fulltext.php b/app/code/Magento/CatalogSearch/Model/Indexer/Fulltext.php
index 9009a40c19d..1aa3dba07fc 100644
--- a/app/code/Magento/CatalogSearch/Model/Indexer/Fulltext.php
+++ b/app/code/Magento/CatalogSearch/Model/Indexer/Fulltext.php
@@ -123,11 +123,12 @@ class Fulltext implements \Magento\Framework\Indexer\ActionInterface, \Magento\F
         $saveHandler = $this->indexerHandlerFactory->create([
             'data' => $this->data
         ]);
+
         foreach ($storeIds as $storeId) {
             $dimension = $this->dimensionFactory->create(['name' => 'scope', 'value' => $storeId]);
             $productIds = array_unique(array_merge($ids, $this->fulltextResource->getRelationsByChild($ids)));
             $saveHandler->deleteIndex([$dimension], new \ArrayObject($productIds));
-            $saveHandler->saveIndex([$dimension], $this->fullAction->rebuildStoreIndex($storeId, $ids));
+            $saveHandler->saveIndex([$dimension], $this->fullAction->rebuildStoreIndex($storeId, $productIds));
         }
     }
 
diff --git a/app/code/Magento/CatalogSearch/Model/Indexer/Fulltext/Action/DataProvider.php b/app/code/Magento/CatalogSearch/Model/Indexer/Fulltext/Action/DataProvider.php
index 07ff47610f3..98fb2528593 100644
--- a/app/code/Magento/CatalogSearch/Model/Indexer/Fulltext/Action/DataProvider.php
+++ b/app/code/Magento/CatalogSearch/Model/Indexer/Fulltext/Action/DataProvider.php
@@ -377,9 +377,9 @@ class DataProvider
     public function getProductChildIds($productId, $typeId)
     {
         $typeInstance = $this->getProductTypeInstance($typeId);
-        $relation = $typeInstance->isComposite(
-            $this->getProductEmulator($typeId)
-        ) ? $typeInstance->getRelationInfo() : false;
+        $relation = $typeInstance->isComposite($this->getProductEmulator($typeId))
+            ? $typeInstance->getRelationInfo()
+            : false;
 
         if ($relation && $relation->getTable() && $relation->getParentFieldName() && $relation->getChildFieldName()) {
             $select = $this->connection->select()->from(
diff --git a/app/code/Magento/CatalogSearch/Model/Indexer/Fulltext/Action/Full.php b/app/code/Magento/CatalogSearch/Model/Indexer/Fulltext/Action/Full.php
index 639c0e8ca66..a517594322d 100644
--- a/app/code/Magento/CatalogSearch/Model/Indexer/Fulltext/Action/Full.php
+++ b/app/code/Magento/CatalogSearch/Model/Indexer/Fulltext/Action/Full.php
@@ -5,6 +5,7 @@
  */
 namespace Magento\CatalogSearch\Model\Indexer\Fulltext\Action;
 
+use Magento\Catalog\Api\Data\ProductInterface;
 use Magento\CatalogSearch\Model\Indexer\Fulltext;
 use Magento\Framework\App\ObjectManager;
 use Magento\Framework\App\ResourceConnection;
@@ -297,27 +298,33 @@ class Full
     /**
      * Get parents IDs of product IDs to be re-indexed
      *
+     * @deprecated as it not used in the class anymore and duplicates another API method
+     * @see \Magento\CatalogSearch\Model\ResourceModel\Fulltext::getRelationsByChild()
+     *
      * @param int[] $entityIds
      * @return int[]
+     * @throws \Exception
      */
     protected function getProductIdsFromParents(array $entityIds)
     {
-        /** @var \Magento\Framework\EntityManager\EntityMetadataInterface $metadata */
-        $metadata = $this->metadataPool->getMetadata(\Magento\Catalog\Api\Data\ProductInterface::class);
-        $fieldForParent = $metadata->getLinkField();
+        $connection = $this->connection;
+        $linkField = $this->metadataPool->getMetadata(ProductInterface::class)->getLinkField();
 
-        $select = $this->connection
+        $select = $connection
             ->select()
-            ->from(['relation' => $this->getTable('catalog_product_relation')], [])
+            ->from(
+                ['relation' => $this->getTable('catalog_product_relation')],
+                []
+            )
             ->distinct(true)
             ->where('child_id IN (?)', $entityIds)
             ->where('parent_id NOT IN (?)', $entityIds)
             ->join(
                 ['cpe' => $this->getTable('catalog_product_entity')],
-                'relation.parent_id = cpe.' . $fieldForParent,
+                'relation.parent_id = cpe.' . $linkField,
                 ['cpe.entity_id']
             );
-        return $this->connection->fetchCol($select);
+        return $connection->fetchCol($select);
     }
 
     /**
@@ -335,7 +342,7 @@ class Full
     public function rebuildStoreIndex($storeId, $productIds = null)
     {
         if ($productIds !== null) {
-            $productIds = array_unique(array_merge($productIds, $this->getProductIdsFromParents($productIds)));
+            $productIds = array_unique($productIds);
         }
 
         // prepare searchable attributes
diff --git a/app/code/Magento/CatalogSearch/Model/ResourceModel/Fulltext.php b/app/code/Magento/CatalogSearch/Model/ResourceModel/Fulltext.php
index 15349e91c3f..e9737d0aa05 100644
--- a/app/code/Magento/CatalogSearch/Model/ResourceModel/Fulltext.php
+++ b/app/code/Magento/CatalogSearch/Model/ResourceModel/Fulltext.php
@@ -82,17 +82,20 @@ class Fulltext extends \Magento\Framework\Model\ResourceModel\Db\AbstractDb
     {
         $connection = $this->getConnection();
         $linkField = $this->metadataPool->getMetadata(ProductInterface::class)->getLinkField();
-        $select = $connection->select()->from(
-            ['relation' => $this->getTable('catalog_product_relation')],
-            []
-        )->join(
-            ['cpe' => $this->getTable('catalog_product_entity')],
-            'cpe.' . $linkField . ' = relation.parent_id',
-            ['cpe.entity_id']
-        )->where(
-            'relation.child_id IN (?)',
-            $childIds
-        )->distinct(true);
+        $select = $connection
+            ->select()
+            ->from(
+                ['relation' => $this->getTable('catalog_product_relation')],
+                []
+            )->distinct(true)
+            ->join(
+                ['cpe' => $this->getTable('catalog_product_entity')],
+                'cpe.' . $linkField . ' = relation.parent_id',
+                ['cpe.entity_id']
+            )->where(
+                'relation.child_id IN (?)',
+                $childIds
+            );
 
         return $connection->fetchCol($select);
     }
diff --git a/dev/tests/functional/tests/app/Magento/LayeredNavigation/Test/Constraint/AssertFilterProductList.php b/dev/tests/functional/tests/app/Magento/LayeredNavigation/Test/Constraint/AssertFilterProductList.php
index ea80e5ac224..19de61c6987 100644
--- a/dev/tests/functional/tests/app/Magento/LayeredNavigation/Test/Constraint/AssertFilterProductList.php
+++ b/dev/tests/functional/tests/app/Magento/LayeredNavigation/Test/Constraint/AssertFilterProductList.php
@@ -3,7 +3,6 @@
  * Copyright © Magento, Inc. All rights reserved.
  * See COPYING.txt for license details.
  */
-
 namespace Magento\LayeredNavigation\Test\Constraint;
 
 use Magento\Catalog\Test\Fixture\Category;
diff --git a/dev/tests/functional/tests/app/Magento/LayeredNavigation/Test/Constraint/AssertProductsCount.php b/dev/tests/functional/tests/app/Magento/LayeredNavigation/Test/Constraint/AssertProductsCount.php
new file mode 100644
index 00000000000..43b3e8d1fab
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/LayeredNavigation/Test/Constraint/AssertProductsCount.php
@@ -0,0 +1,99 @@
+<?php
+/**
+ * Copyright © 2013-2017 Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\LayeredNavigation\Test\Constraint;
+
+use Magento\Catalog\Test\Fixture\Category;
+use Magento\Catalog\Test\Page\Category\CatalogCategoryView;
+use Magento\Mtf\Client\BrowserInterface;
+use Magento\Mtf\Constraint\AbstractConstraint;
+
+/**
+ * Assertion that category name and products qty are correct in category layered navigation
+ */
+class AssertProductsCount extends AbstractConstraint
+{
+    /**
+     * Browser instance.
+     *
+     * @var BrowserInterface
+     */
+    private $browser;
+
+    /**
+     * Catalog category view page.
+     *
+     * @var CatalogCategoryView $catalogCategoryView
+     */
+    private $catalogCategoryView;
+
+    /**
+     * Assert that category name and products cont in layered navigation are correct
+     *
+     * @param CatalogCategoryView $catalogCategoryView
+     * @param Category $category
+     * @param BrowserInterface $browser
+     * @param string $productsCount
+     * @return void
+     */
+    public function processAssert(
+        CatalogCategoryView $catalogCategoryView,
+        Category $category,
+        BrowserInterface $browser,
+        $productsCount
+    ) {
+        $this->browser = $browser;
+        $this->catalogCategoryView = $catalogCategoryView;
+        while ($category) {
+            $parentCategory = $category->getDataFieldConfig('parent_id')['source']->getParentCategory();
+            if ($parentCategory && $parentCategory->getData('is_anchor') == 'No') {
+                $this->openCategory($parentCategory);
+                \PHPUnit_Framework_Assert::assertTrue(
+                    $this->catalogCategoryView->getLayeredNavigationBlock()->isCategoryVisible(
+                        $category,
+                        $productsCount
+                    ),
+                    'Category ' . $category->getName() . ' is absent in Layered Navigation or products count is wrong'
+                );
+            }
+            $category = $parentCategory;
+        }
+    }
+
+    /**
+     * Open category.
+     *
+     * @param Category $category
+     * @return void
+     */
+    private function openCategory(Category $category)
+    {
+        $categoryUrlKey = [];
+
+        while ($category) {
+            $categoryUrlKey[] = $category->hasData('url_key')
+                ? strtolower($category->getUrlKey())
+                : trim(strtolower(preg_replace('#[^0-9a-z%]+#i', '-', $category->getName())), '-');
+
+            $category = $category->getDataFieldConfig('parent_id')['source']->getParentCategory();
+            if ($category !== null && 1 == $category->getParentId()) {
+                $category = null;
+            }
+        }
+        $categoryUrlKey = $_ENV['app_frontend_url'] . implode('/', array_reverse($categoryUrlKey)) . '.html';
+
+        $this->browser->open($categoryUrlKey);
+    }
+
+    /**
+     * Assert success message that category is present in layered navigation and product is visible in product grid.
+     *
+     * @return string
+     */
+    public function toString()
+    {
+        return 'Category is present in layered navigation and product is visible in product grid.';
+    }
+}
diff --git a/dev/tests/functional/tests/app/Magento/LayeredNavigation/Test/Repository/Category.xml b/dev/tests/functional/tests/app/Magento/LayeredNavigation/Test/Repository/Category.xml
new file mode 100644
index 00000000000..4d463f0b936
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/LayeredNavigation/Test/Repository/Category.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" ?>
+<!--
+/**
+ * Copyright © 2013-2017 Magento, Inc. 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/Repository/etc/repository.xsd">
+    <repository class="Magento\Catalog\Test\Repository\Category">
+        <dataset name="default_non_anchored_subcategory">
+            <field name="name" xsi:type="string">DefaultSubcategory%isolation%</field>
+            <field name="url_key" xsi:type="string">default-subcategory-%isolation%</field>
+            <field name="parent_id" xsi:type="array">
+                <item name="dataset" xsi:type="string">default_category</item>
+            </field>
+            <field name="is_active" xsi:type="string">Yes</field>
+            <field name="is_anchor" xsi:type="string">No</field>
+            <field name="include_in_menu" xsi:type="string">Yes</field>
+        </dataset>
+
+        <dataset name="default_second_level_anchored_subcategory">
+            <field name="name" xsi:type="string">DefaultSubcategory%isolation%</field>
+            <field name="url_key" xsi:type="string">default-subcategory-%isolation%</field>
+            <field name="parent_id" xsi:type="array">
+                <item name="dataset" xsi:type="string">default_non_anchored_subcategory</item>
+            </field>
+            <field name="is_active" xsi:type="string">Yes</field>
+            <field name="is_anchor" xsi:type="string">Yes</field>
+            <field name="include_in_menu" xsi:type="string">Yes</field>
+        </dataset>
+
+        <dataset name="default_third_level_non_anchored_subcategory">
+            <field name="name" xsi:type="string">DefaultSubcategory%isolation%</field>
+            <field name="url_key" xsi:type="string">default-subcategory-%isolation%</field>
+            <field name="parent_id" xsi:type="array">
+                <item name="dataset" xsi:type="string">default_second_level_anchored_subcategory</item>
+            </field>
+            <field name="is_active" xsi:type="string">Yes</field>
+            <field name="is_anchor" xsi:type="string">No</field>
+            <field name="include_in_menu" xsi:type="string">Yes</field>
+        </dataset>
+
+        <dataset name="default_fourth_level_anchored_subcategory">
+            <field name="name" xsi:type="string">DefaultSubcategory%isolation%</field>
+            <field name="url_key" xsi:type="string">default-subcategory-%isolation%</field>
+            <field name="parent_id" xsi:type="array">
+                <item name="dataset" xsi:type="string">default_third_level_non_anchored_subcategory</item>
+            </field>
+            <field name="is_active" xsi:type="string">Yes</field>
+            <field name="is_anchor" xsi:type="string">Yes</field>
+            <field name="include_in_menu" xsi:type="string">Yes</field>
+        </dataset>
+    </repository>
+</config>
diff --git a/dev/tests/functional/tests/app/Magento/LayeredNavigation/Test/TestCase/ProductsCountInLayeredNavigationTest.php b/dev/tests/functional/tests/app/Magento/LayeredNavigation/Test/TestCase/ProductsCountInLayeredNavigationTest.php
new file mode 100644
index 00000000000..32ad64d6dec
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/LayeredNavigation/Test/TestCase/ProductsCountInLayeredNavigationTest.php
@@ -0,0 +1,121 @@
+<?php
+/**
+ * Copyright © 2013-2017 Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\LayeredNavigation\Test\TestCase;
+
+use Magento\Catalog\Test\Fixture\Category;
+use Magento\Mtf\TestCase\Injectable;
+use Magento\Catalog\Test\Page\Adminhtml\CatalogProductEdit;
+use Magento\Catalog\Test\Page\Adminhtml\CatalogProductIndex;
+use Magento\Mtf\Fixture\FixtureFactory;
+
+/**
+ * Preconditions:
+ * 1. Create four categories assigned in ascending order (Default Category->first->second->third->fourth)
+ * first and third categories should not be anchored, second and fourth categories should be anchored
+ * 2. Create configurable product with two configurable options and assign it to category "fourth"
+ *
+ * Steps:
+ * 1. Disable configurable options via massaction or from edit product page
+ * 2. Open created non anchored categories on frontend
+ * 3. Perform assertions
+ *
+ * @group Layered_Navigation
+ * @ZephyrId MAGETWO-82891
+ */
+class ProductsCountInLayeredNavigationTest extends Injectable
+{
+    /**
+     * Product page with a grid
+     *
+     * @var CatalogProductIndex
+     */
+    protected $catalogProductIndex;
+
+    /**
+     * Page to update a product
+     *
+     * @var CatalogProductEdit
+     */
+    protected $editProductPage;
+
+    /**
+     * Fixture factory
+     *
+     * @var FixtureFactory
+     */
+    protected $fixtureFactory;
+
+    /**
+     * Injection data
+     *
+     * @param CatalogProductIndex $catalogProductIndex
+     * @param CatalogProductEdit $editProductPage
+     * @param FixtureFactory $fixtureFactory
+     * @return void
+     */
+    public function __inject(
+        CatalogProductIndex $catalogProductIndex,
+        CatalogProductEdit $editProductPage,
+        FixtureFactory $fixtureFactory
+    ) {
+        $this->catalogProductIndex = $catalogProductIndex;
+        $this->editProductPage = $editProductPage;
+        $this->fixtureFactory = $fixtureFactory;
+    }
+
+    /**
+     * Test category name and products count displaying in layered navigation after configurable options disabling
+     *
+     * @param Category $category
+     * @param boolean $disableFromProductsGreed
+     * @return array
+     */
+    public function test(
+        Category $category,
+        $disableFromProductsGreed = true
+    ) {
+        // Preconditions
+        $category->persist();
+        // Steps
+        $products = $category->getDataFieldConfig('category_products')['source']->getProducts();
+        $configurableOptions = [];
+        /** @var \Magento\ConfigurableProduct\Test\Fixture\ConfigurableProduct\ $product */
+        foreach ($products as $product) {
+            $configurableOptions = array_merge(
+                $configurableOptions,
+                $product->getConfigurableAttributesData()['matrix']
+            );
+        }
+        // Disable configurable options
+        if ($disableFromProductsGreed) {
+            $this->catalogProductIndex->open();
+            $this->catalogProductIndex->getProductGrid()->massaction(
+                array_map(
+                    function ($assignedProduct) {
+                        return ['sku' => $assignedProduct['sku']];
+                    },
+                    $configurableOptions
+                ),
+                ['Change status' => 'Disable']
+            );
+        } else {
+            $productToDisable = $this->fixtureFactory->createByCode(
+                'catalogProductSimple',
+                ['data' => ['status' => 'No']]
+            );
+            foreach ($configurableOptions as $configurableOption) {
+                $filter = ['sku' => $configurableOption['sku']];
+                $this->catalogProductIndex->open();
+                $this->catalogProductIndex->getProductGrid()->searchAndOpen($filter);
+                $this->editProductPage->getProductForm()->fill($productToDisable);
+                $this->editProductPage->getFormPageActions()->save();
+            }
+        }
+        return [
+            'products' => $configurableOptions
+        ];
+    }
+}
diff --git a/dev/tests/functional/tests/app/Magento/LayeredNavigation/Test/TestCase/ProductsCountInLayeredNavigationTest.xml b/dev/tests/functional/tests/app/Magento/LayeredNavigation/Test/TestCase/ProductsCountInLayeredNavigationTest.xml
new file mode 100644
index 00000000000..a832163ceea
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/LayeredNavigation/Test/TestCase/ProductsCountInLayeredNavigationTest.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/**
+ * Copyright © 2013-2017 Magento, Inc. 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\LayeredNavigation\Test\TestCase\ProductsCountInLayeredNavigationTest" summary="Check configurable products count in child categories of non-anchor category" ticketId="MAGETWO-82891">
+        <variation name="ProductsCountInLayeredNavigationTestVariation1" summary="Check configurable products count with disabled by massaction products">
+            <data name="runReindex" xsi:type="boolean">true</data>
+            <data name="flushCache" xsi:type="boolean">true</data>
+            <data name="category/dataset" xsi:type="string">default_fourth_level_anchored_subcategory</data>
+            <data name="category/data/category_products/dataset" xsi:type="string">configurableProduct::product_with_size</data>
+            <data name="productsCount" xsi:type="string">0</data>
+            <data name="disableFromProductsGreed" xsi:type="boolean">true</data>
+            <constraint name="Magento\LayeredNavigation\Test\Constraint\AssertProductsCount" />
+        </variation>
+        <variation name="ProductsCountInLayeredNavigationTestVariation2" summary="Check configurable products count with disabled from edit page products">
+            <data name="runReindex" xsi:type="boolean">true</data>
+            <data name="flushCache" xsi:type="boolean">true</data>
+            <data name="category/dataset" xsi:type="string">default_fourth_level_anchored_subcategory</data>
+            <data name="category/data/category_products/dataset" xsi:type="string">configurableProduct::product_with_size</data>
+            <data name="productsCount" xsi:type="string">0</data>
+            <data name="disableFromProductsGreed" xsi:type="boolean">false</data>
+            <constraint name="Magento\LayeredNavigation\Test\Constraint\AssertProductsCount" />
+        </variation>
+    </testCase>
+</config>
diff --git a/dev/tests/integration/testsuite/Magento/CatalogSearch/Model/Indexer/FulltextTest.php b/dev/tests/integration/testsuite/Magento/CatalogSearch/Model/Indexer/FulltextTest.php
index 29d1547f2d8..56269bca470 100644
--- a/dev/tests/integration/testsuite/Magento/CatalogSearch/Model/Indexer/FulltextTest.php
+++ b/dev/tests/integration/testsuite/Magento/CatalogSearch/Model/Indexer/FulltextTest.php
@@ -186,6 +186,29 @@ class FulltextTest extends \PHPUnit\Framework\TestCase
         $this->assertCount(4, $products);
     }
 
+    /**
+     * Test the case when the last child product of the configurable becomes disabled/out of stock.
+     *
+     * Such behavior should enforce parent product to be deleted from the index as its latest child become unavailable
+     * and the configurable cannot be sold anymore.
+     *
+     * @magentoAppArea adminhtml
+     * @magentoDataFixture Magento/CatalogSearch/_files/product_configurable_with_single_child.php
+     */
+    public function testReindexParentProductWhenChildBeingDisabled()
+    {
+        $this->indexer->reindexAll();
+
+        $products = $this->search('Configurable');
+        $this->assertCount(1, $products);
+
+        $childProduct = $this->getProductBySku('configurable_option_single_child');
+        $childProduct->setStatus(Product\Attribute\Source\Status::STATUS_DISABLED)->save();
+
+        $products = $this->search('Configurable');
+        $this->assertCount(0, $products);
+    }
+
     /**
      * Search the text and return result collection
      *
diff --git a/dev/tests/integration/testsuite/Magento/CatalogSearch/_files/product_configurable_with_single_child.php b/dev/tests/integration/testsuite/Magento/CatalogSearch/_files/product_configurable_with_single_child.php
new file mode 100644
index 00000000000..a1e1c30323c
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/CatalogSearch/_files/product_configurable_with_single_child.php
@@ -0,0 +1,101 @@
+<?php
+/**
+ * Copyright © 2013-2017 Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+use Magento\Catalog\Api\ProductRepositoryInterface;
+use Magento\Catalog\Model\Product;
+use Magento\Catalog\Model\Product\Attribute\Source\Status;
+use Magento\Catalog\Model\Product\Type;
+use Magento\Catalog\Model\Product\Visibility;
+use Magento\Catalog\Setup\CategorySetup;
+use Magento\CatalogInventory\Api\Data\StockItemInterface;
+use Magento\ConfigurableProduct\Helper\Product\Options\Factory;
+use Magento\ConfigurableProduct\Model\Product\Type\Configurable;
+use Magento\Eav\Api\Data\AttributeOptionInterface;
+use Magento\TestFramework\Helper\Bootstrap;
+
+Bootstrap::getInstance()->reinitialize();
+
+require __DIR__ . '/../../../Magento/ConfigurableProduct/_files/configurable_attribute.php';
+
+/** @var ProductRepositoryInterface $productRepository */
+$productRepository = Bootstrap::getObjectManager()
+    ->create(ProductRepositoryInterface::class);
+
+/** @var $installer CategorySetup */
+$installer = Bootstrap::getObjectManager()->create(CategorySetup::class);
+
+/* Create simple products per each option value*/
+/** @var AttributeOptionInterface[] $options */
+$options = $attribute->getOptions();
+
+$attributeValues = [];
+$attributeSetId = $installer->getAttributeSetId('catalog_product', 'Default');
+$productsSku = [1410];
+array_shift($options); //remove the first option which is empty
+
+$option = reset($options);
+
+/** @var $childProduct Product */
+$childProduct = Bootstrap::getObjectManager()->create(Product::class);
+$productSku = array_shift($productsSku);
+$childProduct->setTypeId(Type::TYPE_SIMPLE)
+    ->setAttributeSetId($attributeSetId)
+    ->setName('Configurable Product Option' . $option->getLabel())
+    ->setSku('configurable_option_single_child')
+    ->setPrice(11)
+    ->setTestConfigurable($option->getValue())
+    ->setVisibility(Visibility::VISIBILITY_NOT_VISIBLE)
+    ->setStatus(Status::STATUS_ENABLED);
+$childProduct = $productRepository->save($childProduct);
+
+/** @var StockItemInterface $stockItem */
+$stockItem = $childProduct->getExtensionAttributes()->getStockItem();
+$stockItem->setUseConfigManageStock(1)->setIsInStock(true)->setQty(100)->setIsQtyDecimal(0);
+
+$childProduct = $productRepository->save($childProduct);
+
+$attributeValues[] = [
+    'label' => 'test',
+    'attribute_id' => $attribute->getId(),
+    'value_index' => $option->getValue(),
+];
+
+/** @var $product Product */
+$configurableProduct = Bootstrap::getObjectManager()->create(Product::class);
+
+/** @var Factory $optionsFactory */
+$optionsFactory = Bootstrap::getObjectManager()->create(Factory::class);
+
+$configurableAttributesData = [
+    [
+        'attribute_id' => $attribute->getId(),
+        'code' => $attribute->getAttributeCode(),
+        'label' => $attribute->getStoreLabel(),
+        'position' => '0',
+        'values' => $attributeValues,
+    ],
+];
+
+$configurableOptions = $optionsFactory->create($configurableAttributesData);
+
+$extensionConfigurableAttributes = $configurableProduct->getExtensionAttributes();
+$extensionConfigurableAttributes->setConfigurableProductOptions($configurableOptions);
+$extensionConfigurableAttributes->setConfigurableProductLinks([$childProduct->getId()]);
+
+$configurableProduct->setExtensionAttributes($extensionConfigurableAttributes);
+
+$configurableProduct->setTypeId(Configurable::TYPE_CODE)
+    ->setAttributeSetId($attributeSetId)
+    ->setName('Configurable Product with single child')
+    ->setSku('configurable_with_single_child')
+    ->setVisibility(Visibility::VISIBILITY_BOTH)
+    ->setStatus(Status::STATUS_ENABLED);
+$configurableProduct = $productRepository->save($configurableProduct);
+
+/** @var StockItemInterface $stockItem */
+$stockItem = $configurableProduct->getExtensionAttributes()->getStockItem();
+$stockItem->setUseConfigManageStock(1)->setIsInStock(1);
+
+$productRepository->save($configurableProduct);
diff --git a/dev/tests/integration/testsuite/Magento/CatalogSearch/_files/product_configurable_with_single_child_rollback.php b/dev/tests/integration/testsuite/Magento/CatalogSearch/_files/product_configurable_with_single_child_rollback.php
new file mode 100644
index 00000000000..bc27505ac51
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/CatalogSearch/_files/product_configurable_with_single_child_rollback.php
@@ -0,0 +1,34 @@
+<?php
+/**
+ * Copyright © 2013-2017 Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+use Magento\Catalog\Api\Data\ProductInterface;
+use Magento\Framework\Api\SearchCriteriaBuilder;
+use Magento\TestFramework\Helper\Bootstrap;
+
+$objectManager = Bootstrap::getObjectManager();
+
+/** @var \Magento\Framework\Registry $registry */
+$registry = $objectManager->get(\Magento\Framework\Registry::class);
+
+$registry->unregister('isSecureArea');
+$registry->register('isSecureArea', true);
+
+/** @var \Magento\Catalog\Api\ProductRepositoryInterface $productRepository */
+$productRepository = Bootstrap::getObjectManager()
+    ->get(\Magento\Catalog\Api\ProductRepositoryInterface::class);
+
+$productSkus = ['configurable_option_single_child', 'configurable_with_single_child'];
+/** @var SearchCriteriaBuilder $searchCriteriaBuilder */
+$searchCriteriaBuilder = Bootstrap::getObjectManager()->get(SearchCriteriaBuilder::class);
+$searchCriteriaBuilder->addFilter(ProductInterface::SKU, $productSkus, 'in');
+$result = $productRepository->getList($searchCriteriaBuilder->create());
+foreach ($result->getItems() as $product) {
+    $productRepository->delete($product);
+}
+
+require __DIR__ . '/../../../Magento/Framework/Search/_files/configurable_attribute_rollback.php';
+
+$registry->unregister('isSecureArea');
+$registry->register('isSecureArea', false);
diff --git a/lib/internal/Magento/Framework/Indexer/CacheContext.php b/lib/internal/Magento/Framework/Indexer/CacheContext.php
index df0bed1dc1d..4a6964477eb 100644
--- a/lib/internal/Magento/Framework/Indexer/CacheContext.php
+++ b/lib/internal/Magento/Framework/Indexer/CacheContext.php
@@ -29,15 +29,14 @@ class CacheContext implements \Magento\Framework\DataObject\IdentityInterface
      */
     public function registerEntities($cacheTag, $ids)
     {
-        $this->entities[$cacheTag] =
-            array_merge($this->getRegisteredEntity($cacheTag), $ids);
+        $this->entities[$cacheTag] = array_merge($this->getRegisteredEntity($cacheTag), $ids);
         return $this;
     }
 
     /**
      * Register entity tags
      *
-     * @param string $cacheTag
+     * @param array $cacheTags
      * @return $this
      */
     public function registerTags($cacheTags)
-- 
GitLab


From ee37eb301dfeee54fe0fc302fcaa5f00d56a211b Mon Sep 17 00:00:00 2001
From: angelo983 <angelo983@gmail.com>
Date: Mon, 4 Dec 2017 16:31:53 +0100
Subject: [PATCH 260/380] Update Collection.php

---
 .../Reports/Model/ResourceModel/Quote/Item/Collection.php   | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/app/code/Magento/Reports/Model/ResourceModel/Quote/Item/Collection.php b/app/code/Magento/Reports/Model/ResourceModel/Quote/Item/Collection.php
index 6e891c481ae..e9dbfdae7a9 100644
--- a/app/code/Magento/Reports/Model/ResourceModel/Quote/Item/Collection.php
+++ b/app/code/Magento/Reports/Model/ResourceModel/Quote/Item/Collection.php
@@ -220,8 +220,10 @@ class Collection extends \Magento\Framework\Model\ResourceModel\Db\Collection\Ab
         $orderData = $this->getOrdersData($productIds);
         foreach ($items as $item) {
             $item->setId($item->getProductId());
-            $item->setPrice($productData[$item->getProductId()]['price'] * $item->getBaseToGlobalRate());
-            $item->setName($productData[$item->getProductId()]['name']);
+            if (isset($productData[$item->getProductId()])) {
+                $item->setPrice($productData[$item->getProductId()]['price'] * $item->getBaseToGlobalRate());
+                $item->setName($productData[$item->getProductId()]['name']);
+            }
             $item->setOrders(0);
             if (isset($orderData[$item->getProductId()])) {
                 $item->setOrders($orderData[$item->getProductId()]['orders']);
-- 
GitLab


From 0d11498ae76c6e54c5ad23360e8dc8c049b6bdff Mon Sep 17 00:00:00 2001
From: Aria Stewart <aredridel@dinhe.net>
Date: Fri, 11 Aug 2017 13:35:35 -0400
Subject: [PATCH 261/380] Fix swagger-ui on instances of Magento running on a
 non-standard port

---
 app/code/Magento/Webapi/Controller/Rest.php | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/app/code/Magento/Webapi/Controller/Rest.php b/app/code/Magento/Webapi/Controller/Rest.php
index 1f8260c93c5..dc061aeea99 100644
--- a/app/code/Magento/Webapi/Controller/Rest.php
+++ b/app/code/Magento/Webapi/Controller/Rest.php
@@ -303,7 +303,7 @@ class Rest implements \Magento\Framework\App\FrontControllerInterface
         $responseBody = $this->swaggerGenerator->generate(
             $requestedServices,
             $this->_request->getScheme(),
-            $this->_request->getHttpHost(),
+            $this->_request->getHttpHost(false),
             $this->_request->getRequestUri()
         );
         $this->_response->setBody($responseBody)->setHeader('Content-Type', 'application/json');
-- 
GitLab


From ca50c9d411090af4e4f554d16325e8469a83930a Mon Sep 17 00:00:00 2001
From: Luke Rodgers <lukerodgers90@gmail.com>
Date: Mon, 4 Dec 2017 19:06:22 +0000
Subject: [PATCH 262/380] Remove backwards breaking ChangelogCounterInterface

---
 .../Framework/Mview/View/Changelog.php        | 18 +--------------
 .../Mview/View/ChangelogCounterInterface.php  | 22 -------------------
 2 files changed, 1 insertion(+), 39 deletions(-)
 delete mode 100644 lib/internal/Magento/Framework/Mview/View/ChangelogCounterInterface.php

diff --git a/lib/internal/Magento/Framework/Mview/View/Changelog.php b/lib/internal/Magento/Framework/Mview/View/Changelog.php
index 6d75ee27be1..3b0b1bedeec 100644
--- a/lib/internal/Magento/Framework/Mview/View/Changelog.php
+++ b/lib/internal/Magento/Framework/Mview/View/Changelog.php
@@ -8,7 +8,7 @@ namespace Magento\Framework\Mview\View;
 use Magento\Framework\App\ResourceConnection;
 use Magento\Framework\Phrase;
 
-class Changelog implements ChangelogInterface, ChangelogCounterInterface
+class Changelog implements ChangelogInterface
 {
     /**
      * Suffix for changelog table
@@ -169,22 +169,6 @@ class Changelog implements ChangelogInterface, ChangelogCounterInterface
         return $this->connection->fetchCol($select);
     }
 
-    /**
-     * Retrieve the count of entity ids in the range [$fromVersionId..$toVersionId]
-     *
-     * @param int $fromVersionId
-     * @param int $toVersionId
-     * @return int[]
-     * @throws ChangelogTableNotExistsException
-     */
-    public function getListSize($fromVersionId, $toVersionId)
-    {
-        $countSelect = $this->getListSelect($fromVersionId, $toVersionId);
-        $countSelect->reset(\Magento\Framework\DB\Select::COLUMNS);
-        $countSelect->columns(new \Zend_Db_Expr(("COUNT(DISTINCT " . $this->getColumnName() . ")")));
-        return $this->connection->fetchOne($countSelect);
-    }
-
     /**
      * Get maximum version_id from changelog
      * @return int
diff --git a/lib/internal/Magento/Framework/Mview/View/ChangelogCounterInterface.php b/lib/internal/Magento/Framework/Mview/View/ChangelogCounterInterface.php
deleted file mode 100644
index 5d92ad1c3de..00000000000
--- a/lib/internal/Magento/Framework/Mview/View/ChangelogCounterInterface.php
+++ /dev/null
@@ -1,22 +0,0 @@
-<?php
-/**
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
- */
-namespace Magento\Framework\Mview\View;
-
-/**
- * Interface \Magento\Framework\Mview\View\ChangelogCounterInterface
- *
- */
-interface ChangelogCounterInterface
-{
-    /**
-     * Retrieve the count of entity ids in the range [$fromVersionId..$toVersionId]
-     *
-     * @param $fromVersionId
-     * @param $toVersionId
-     * @return mixed
-     */
-    public function getListSize($fromVersionId, $toVersionId);
-}
-- 
GitLab


From 10df2ced56f7010cf274c7950d9d30a7c8db2ba3 Mon Sep 17 00:00:00 2001
From: Luke Rodgers <lukerodgers90@gmail.com>
Date: Mon, 4 Dec 2017 19:08:45 +0000
Subject: [PATCH 263/380] Replace getListSize with getList

This is not so performant, but as discussed in github it'll do for now.
---
 .../Indexer/Console/Command/IndexerStatusCommand.php        | 2 +-
 .../Test/Unit/Console/Command/IndexerStatusCommandTest.php  | 6 +++---
 2 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/app/code/Magento/Indexer/Console/Command/IndexerStatusCommand.php b/app/code/Magento/Indexer/Console/Command/IndexerStatusCommand.php
index f5237ea5d02..22acdc6f82b 100644
--- a/app/code/Magento/Indexer/Console/Command/IndexerStatusCommand.php
+++ b/app/code/Magento/Indexer/Console/Command/IndexerStatusCommand.php
@@ -103,7 +103,7 @@ class IndexerStatusCommand extends AbstractIndexerManageCommand
 
         $state = $view->getState();
 
-        $pendingCount = $changelog->getListSize($state->getVersionId(), $currentVersionId);
+        $pendingCount = count($changelog->getList($state->getVersionId(), $currentVersionId));
 
         $pendingString = "<error>$pendingCount</error>";
         if ($pendingCount <= 0) {
diff --git a/app/code/Magento/Indexer/Test/Unit/Console/Command/IndexerStatusCommandTest.php b/app/code/Magento/Indexer/Test/Unit/Console/Command/IndexerStatusCommandTest.php
index 45b3ec3471b..31513da018c 100644
--- a/app/code/Magento/Indexer/Test/Unit/Console/Command/IndexerStatusCommandTest.php
+++ b/app/code/Magento/Indexer/Test/Unit/Console/Command/IndexerStatusCommandTest.php
@@ -27,14 +27,14 @@ class IndexerStatusCommandTest extends AbstractIndexerCommandCommonSetup
      */
     private function attachViewToIndexerMock($indexerMock, array $data)
     {
-         /** @var \Magento\Framework\Mview\View\Changelog|\PHPUnit_Framework_MockObject_MockObject $stub */
+         /** @var \Magento\Framework\Mview\View\Changelog|\PHPUnit_Framework_MockObject_MockObject $changelog */
         $changelog = $this->getMockBuilder(\Magento\Framework\Mview\View\Changelog::class)
             ->disableOriginalConstructor()
             ->getMock();
 
         $changelog->expects($this->any())
-            ->method('getListSize')
-            ->willReturn($data['view']['changelog']['list_size']);
+            ->method('getList')
+            ->willReturn(range(0, $data['view']['changelog']['list_size']-1));
 
         /** @var \Magento\Indexer\Model\Mview\View\State|\PHPUnit_Framework_MockObject_MockObject $stateMock */
         $stateMock = $this->getMockBuilder(\Magento\Indexer\Model\Mview\View\State::class)
-- 
GitLab


From 3d34bc85aacd57275c5dccc67d9f4a99bfac0374 Mon Sep 17 00:00:00 2001
From: Luke Rodgers <lukerodgers90@gmail.com>
Date: Mon, 4 Dec 2017 19:11:34 +0000
Subject: [PATCH 264/380] Remove changes to Changelog

---
 .../Framework/Mview/View/Changelog.php        | 20 ++++---------------
 1 file changed, 4 insertions(+), 16 deletions(-)

diff --git a/lib/internal/Magento/Framework/Mview/View/Changelog.php b/lib/internal/Magento/Framework/Mview/View/Changelog.php
index 3b0b1bedeec..91caf662283 100644
--- a/lib/internal/Magento/Framework/Mview/View/Changelog.php
+++ b/lib/internal/Magento/Framework/Mview/View/Changelog.php
@@ -127,12 +127,14 @@ class Changelog implements ChangelogInterface
     }
 
     /**
+     * Retrieve entity ids by range [$fromVersionId..$toVersionId]
+     *
      * @param int $fromVersionId
      * @param int $toVersionId
-     * @return \Magento\Framework\DB\Select
+     * @return int[]
      * @throws ChangelogTableNotExistsException
      */
-    private function getListSelect($fromVersionId, $toVersionId)
+    public function getList($fromVersionId, $toVersionId)
     {
         $changelogTableName = $this->resource->getTableName($this->getName());
         if (!$this->connection->isTableExists($changelogTableName)) {
@@ -152,20 +154,6 @@ class Changelog implements ChangelogInterface
             (int)$toVersionId
         );
 
-        return $select;
-    }
-
-    /**
-     * Retrieve entity ids by range [$fromVersionId..$toVersionId]
-     *
-     * @param int $fromVersionId
-     * @param int $toVersionId
-     * @return int[]
-     * @throws ChangelogTableNotExistsException
-     */
-    public function getList($fromVersionId, $toVersionId)
-    {
-        $select = $this->getListSelect($fromVersionId, $toVersionId);
         return $this->connection->fetchCol($select);
     }
 
-- 
GitLab


From b42712efbf971e621687617c9e5eefc2241cade4 Mon Sep 17 00:00:00 2001
From: magento-engcom-team <mikola.malevanec@transoftgroup.com>
Date: Tue, 5 Dec 2017 15:56:02 +0200
Subject: [PATCH 265/380] 7467: File Put Contents file with empty content.

---
 .../Framework/Filesystem/Driver/FileTest.php  | 45 ++++++++++++++++++-
 .../Framework/Filesystem/Driver/File.php      |  2 +-
 2 files changed, 45 insertions(+), 2 deletions(-)

diff --git a/dev/tests/integration/testsuite/Magento/Framework/Filesystem/Driver/FileTest.php b/dev/tests/integration/testsuite/Magento/Framework/Filesystem/Driver/FileTest.php
index 26401c782ef..b74d87fab3a 100644
--- a/dev/tests/integration/testsuite/Magento/Framework/Filesystem/Driver/FileTest.php
+++ b/dev/tests/integration/testsuite/Magento/Framework/Filesystem/Driver/FileTest.php
@@ -7,7 +7,10 @@
  */
 namespace Magento\Framework\Filesystem\Driver;
 
-use Magento\Framework\Filesystem\DriverInterface;
+use Magento\Framework\App\Filesystem\DirectoryList;
+use Magento\Framework\Filesystem;
+use Magento\Framework\Filesystem\Directory\WriteInterface;
+use Magento\TestFramework\Helper\Bootstrap;
 
 class FileTest extends \PHPUnit\Framework\TestCase
 {
@@ -80,4 +83,44 @@ class FileTest extends \PHPUnit\Framework\TestCase
         $this->assertTrue($this->driver->createDirectory($generatedPath));
         $this->assertTrue(is_dir($generatedPath));
     }
+
+    /**
+     * Check, driver can create file with content or without one.
+     *
+     * @dataProvider createFileDataProvider
+     * @param int $result
+     * @param string $fileName
+     * @param string $fileContent
+     * @return void
+     * @throws \Magento\Framework\Exception\FileSystemException
+     */
+    public function testCreateFile(int $result, string $fileName, string $fileContent)
+    {
+        /** @var WriteInterface $directory */
+        $directory = Bootstrap::getObjectManager()->get(Filesystem::class)->getDirectoryWrite(DirectoryList::VAR_DIR);
+        $filePath = $directory->getAbsolutePath() . '/' . $fileName;
+        $this->assertSame($result, $this->driver->filePutContents($filePath, $fileContent));
+        $this->assertTrue($this->driver->deleteFile($filePath));
+    }
+
+    /**
+     * Provides test data for testCreateFile().
+     *
+     * @return array
+     */
+    public function createFileDataProvider()
+    {
+        return [
+            'file_with_content' => [
+                'result' => 11,
+                'fileName' => 'test.txt',
+                'fileContent' => 'testContent',
+            ],
+            'empty_file' => [
+                'result' => 0,
+                'filePath' => 'test.txt',
+                'fileContent' => '',
+            ]
+        ];
+    }
 }
diff --git a/lib/internal/Magento/Framework/Filesystem/Driver/File.php b/lib/internal/Magento/Framework/Filesystem/Driver/File.php
index 519ca21dead..6f9c24344f6 100644
--- a/lib/internal/Magento/Framework/Filesystem/Driver/File.php
+++ b/lib/internal/Magento/Framework/Filesystem/Driver/File.php
@@ -528,7 +528,7 @@ class File implements DriverInterface
     public function filePutContents($path, $content, $mode = null)
     {
         $result = @file_put_contents($this->getScheme() . $path, $content, $mode);
-        if (!$result) {
+        if ($result === false) {
             throw new FileSystemException(
                 new \Magento\Framework\Phrase(
                     'The specified "%1" file could not be written %2',
-- 
GitLab


From 02a09d68a1f25d50d438b48611654c4c458e1521 Mon Sep 17 00:00:00 2001
From: Stanislav Idolov <sidolov@magento.com>
Date: Tue, 5 Dec 2017 16:36:01 +0200
Subject: [PATCH 266/380] magento/magento2#11099

---
 .../Model/ResourceModel/BookmarkRepositoryTest.php   |  6 ++++--
 .../Magento/Wishlist/Test/Unit/Model/ItemTest.php    |  3 ++-
 .../App/Test/Unit/Cache/Tag/ResolverTest.php         |  3 ++-
 .../App/Test/Unit/Cache/Tag/Strategy/DummyTest.php   |  3 ++-
 .../App/Test/Unit/Cache/Tag/Strategy/FactoryTest.php |  3 ++-
 .../Test/Unit/Cache/Tag/Strategy/IdentifierTest.php  |  3 ++-
 .../Framework/App/Test/Unit/ErrorHandlerTest.php     |  3 ++-
 .../Framework/App/Test/Unit/SetupInfoTest.php        |  3 ++-
 .../Magento/Framework/App/Test/Unit/ShellTest.php    |  3 ++-
 .../Asset/MaterializationStrategy/FactoryTest.php    |  3 ++-
 .../Cache/Test/Unit/Frontend/Adapter/ZendTest.php    |  3 ++-
 .../Test/Unit/Generator/InterfaceGeneratorTest.php   |  3 ++-
 .../Framework/Code/Test/Unit/Generator/IoTest.php    |  3 ++-
 .../Test/Unit/Validator/ArgumentSequenceTest.php     |  3 ++-
 .../Code/Test/Unit/Validator/TypeDuplicationTest.php |  3 ++-
 .../Config/Test/Unit/Data/ConfigDataTest.php         |  3 ++-
 .../Magento/Framework/DB/Test/Unit/Tree/NodeTest.php |  3 ++-
 .../Test/Unit/Argument/Interpreter/CompositeTest.php |  3 ++-
 .../Filesystem/Test/Unit/DirectoryListTest.php       |  3 ++-
 .../Image/Test/Unit/Adapter/ImageMagickTest.php      |  3 ++-
 .../Framework/Mview/Test/Unit/View/ChangelogTest.php | 12 ++++++++----
 .../Phrase/Test/Unit/Renderer/CompositeTest.php      |  3 ++-
 .../Phrase/Test/Unit/Renderer/InlineTest.php         |  3 ++-
 .../Phrase/Test/Unit/Renderer/TranslateTest.php      |  3 ++-
 .../Unit/Module/Plugin/DbStatusValidatorTest.php     |  2 +-
 .../Framework/Validator/Test/Unit/BuilderTest.php    |  6 ++++--
 .../Test/Unit/Constraint/Option/CallbackTest.php     |  3 ++-
 .../View/Test/Unit/Element/TemplateTest.php          |  3 ++-
 .../File/Collector/Override/ThemeModularTest.php     |  3 ++-
 .../Layout/Argument/Interpreter/HelperMethodTest.php |  3 ++-
 .../Layout/Argument/Interpreter/NamedParamsTest.php  |  3 ++-
 .../Unit/Layout/Argument/Interpreter/ObjectTest.php  |  3 ++-
 .../Unit/Layout/Argument/Interpreter/OptionsTest.php |  3 ++-
 .../Test/Unit/Rest/Request/Deserializer/JsonTest.php |  3 ++-
 .../Test/Unit/Rest/Request/Deserializer/XmlTest.php  |  3 ++-
 .../Unit/Rest/Request/DeserializerFactoryTest.php    |  3 ++-
 .../Di/Compiler/Config/ModificationChainTest.php     |  3 ++-
 .../Module/I18n/Dictionary/Options/ResolverTest.php  |  3 ++-
 .../Test/Unit/Module/I18n/Dictionary/PhraseTest.php  |  3 ++-
 .../Test/Unit/Module/I18n/Pack/GeneratorTest.php     |  3 ++-
 .../Unit/Module/I18n/Parser/AbstractParserTest.php   |  3 ++-
 41 files changed, 91 insertions(+), 46 deletions(-)

diff --git a/app/code/Magento/Ui/Test/Unit/Model/ResourceModel/BookmarkRepositoryTest.php b/app/code/Magento/Ui/Test/Unit/Model/ResourceModel/BookmarkRepositoryTest.php
index 00a88437c8c..a0cec2258d6 100644
--- a/app/code/Magento/Ui/Test/Unit/Model/ResourceModel/BookmarkRepositoryTest.php
+++ b/app/code/Magento/Ui/Test/Unit/Model/ResourceModel/BookmarkRepositoryTest.php
@@ -94,7 +94,8 @@ class BookmarkRepositoryTest extends \PHPUnit\Framework\TestCase
             ->method('save')
             ->with($this->bookmarkMock)
             ->willThrowException(new \Exception($exceptionMessage));
-        $this->expectException(\Magento\Framework\Exception\CouldNotSaveException::class, __($exceptionMessage));
+        $this->expectException(\Magento\Framework\Exception\CouldNotSaveException::class);
+        $this->expectExceptionMessage($exceptionMessage);
         $this->bookmarkRepository->save($this->bookmarkMock);
     }
 
@@ -143,7 +144,8 @@ class BookmarkRepositoryTest extends \PHPUnit\Framework\TestCase
             ->method('delete')
             ->with($this->bookmarkMock)
             ->willThrowException(new \Exception($exceptionMessage));
-        $this->expectException(\Magento\Framework\Exception\CouldNotDeleteException::class, __($exceptionMessage));
+        $this->expectException(\Magento\Framework\Exception\CouldNotDeleteException::class);
+        $this->expectExceptionMessage($exceptionMessage);
         $this->assertTrue($this->bookmarkRepository->delete($this->bookmarkMock));
     }
 
diff --git a/app/code/Magento/Wishlist/Test/Unit/Model/ItemTest.php b/app/code/Magento/Wishlist/Test/Unit/Model/ItemTest.php
index 95e65a1740b..0b1057683de 100644
--- a/app/code/Magento/Wishlist/Test/Unit/Model/ItemTest.php
+++ b/app/code/Magento/Wishlist/Test/Unit/Model/ItemTest.php
@@ -299,7 +299,8 @@ class ItemTest extends \PHPUnit\Framework\TestCase
 
     public function testGetProductWithException()
     {
-        $this->expectException(\Magento\Framework\Exception\LocalizedException::class, __('Cannot specify product.'));
+        $this->expectException(\Magento\Framework\Exception\LocalizedException::class);
+        $this->expectExceptionMessage('Cannot specify product.');
         $this->model->getProduct();
     }
 
diff --git a/lib/internal/Magento/Framework/App/Test/Unit/Cache/Tag/ResolverTest.php b/lib/internal/Magento/Framework/App/Test/Unit/Cache/Tag/ResolverTest.php
index f4560ed31ae..33b6ab7e99a 100644
--- a/lib/internal/Magento/Framework/App/Test/Unit/Cache/Tag/ResolverTest.php
+++ b/lib/internal/Magento/Framework/App/Test/Unit/Cache/Tag/ResolverTest.php
@@ -40,7 +40,8 @@ class ResolverTest extends \PHPUnit\Framework\TestCase
 
     public function testGetTagsForNotObject()
     {
-        $this->expectException(\InvalidArgumentException::class, 'Provided argument is not an object');
+        $this->expectException(\InvalidArgumentException::class);
+        $this->expectExceptionMessage('Provided argument is not an object');
         $this->model->getTags('some scalar');
     }
 
diff --git a/lib/internal/Magento/Framework/App/Test/Unit/Cache/Tag/Strategy/DummyTest.php b/lib/internal/Magento/Framework/App/Test/Unit/Cache/Tag/Strategy/DummyTest.php
index ad043260645..4f072e037f7 100644
--- a/lib/internal/Magento/Framework/App/Test/Unit/Cache/Tag/Strategy/DummyTest.php
+++ b/lib/internal/Magento/Framework/App/Test/Unit/Cache/Tag/Strategy/DummyTest.php
@@ -20,7 +20,8 @@ class DummyTest extends \PHPUnit\Framework\TestCase
 
     public function testGetTagsWithScalar()
     {
-        $this->expectException(\InvalidArgumentException::class, 'Provided argument is not an object');
+        $this->expectException(\InvalidArgumentException::class);
+        $this->expectExceptionMessage('Provided argument is not an object');
         $this->model->getTags('scalar');
     }
 
diff --git a/lib/internal/Magento/Framework/App/Test/Unit/Cache/Tag/Strategy/FactoryTest.php b/lib/internal/Magento/Framework/App/Test/Unit/Cache/Tag/Strategy/FactoryTest.php
index 8964bd70f0b..3e96c7ab9ca 100644
--- a/lib/internal/Magento/Framework/App/Test/Unit/Cache/Tag/Strategy/FactoryTest.php
+++ b/lib/internal/Magento/Framework/App/Test/Unit/Cache/Tag/Strategy/FactoryTest.php
@@ -49,7 +49,8 @@ class FactoryTest extends \PHPUnit\Framework\TestCase
 
     public function testGetStrategyWithScalar()
     {
-        $this->expectException(\InvalidArgumentException::class, 'Provided argument is not an object');
+        $this->expectException(\InvalidArgumentException::class);
+        $this->expectExceptionMessage('Provided argument is not an object');
         $this->model->getStrategy('some scalar');
     }
 
diff --git a/lib/internal/Magento/Framework/App/Test/Unit/Cache/Tag/Strategy/IdentifierTest.php b/lib/internal/Magento/Framework/App/Test/Unit/Cache/Tag/Strategy/IdentifierTest.php
index d0fcf9d8a73..4dc46d46e67 100644
--- a/lib/internal/Magento/Framework/App/Test/Unit/Cache/Tag/Strategy/IdentifierTest.php
+++ b/lib/internal/Magento/Framework/App/Test/Unit/Cache/Tag/Strategy/IdentifierTest.php
@@ -22,7 +22,8 @@ class IdentifierTest extends \PHPUnit\Framework\TestCase
 
     public function testGetWithScalar()
     {
-        $this->expectException(\InvalidArgumentException::class, 'Provided argument is not an object');
+        $this->expectException(\InvalidArgumentException::class);
+        $this->expectExceptionMessage('Provided argument is not an object');
         $this->model->getTags('scalar');
     }
 
diff --git a/lib/internal/Magento/Framework/App/Test/Unit/ErrorHandlerTest.php b/lib/internal/Magento/Framework/App/Test/Unit/ErrorHandlerTest.php
index 53012558188..daf3a4bdfab 100644
--- a/lib/internal/Magento/Framework/App/Test/Unit/ErrorHandlerTest.php
+++ b/lib/internal/Magento/Framework/App/Test/Unit/ErrorHandlerTest.php
@@ -54,7 +54,8 @@ class ErrorHandlerTest extends \PHPUnit\Framework\TestCase
         $errorLine = 'test_error_line';
 
         $exceptedExceptionMessage = sprintf('%s: %s in %s on line %s', $errorPhrase, $errorStr, $errorFile, $errorLine);
-        $this->expectException('Exception', $exceptedExceptionMessage);
+        $this->expectException('Exception');
+        $this->expectExceptionMessage($exceptedExceptionMessage);
 
         $this->object->handler($errorNo, $errorStr, $errorFile, $errorLine);
     }
diff --git a/lib/internal/Magento/Framework/App/Test/Unit/SetupInfoTest.php b/lib/internal/Magento/Framework/App/Test/Unit/SetupInfoTest.php
index a209c313a0a..3db75f7ec7f 100644
--- a/lib/internal/Magento/Framework/App/Test/Unit/SetupInfoTest.php
+++ b/lib/internal/Magento/Framework/App/Test/Unit/SetupInfoTest.php
@@ -24,7 +24,8 @@ class SetupInfoTest extends \PHPUnit\Framework\TestCase
      */
     public function testConstructorExceptions($server, $expectedError)
     {
-        $this->expectException('\InvalidArgumentException', $expectedError);
+        $this->expectException('\InvalidArgumentException');
+        $this->expectExceptionMessage($expectedError);
         new SetupInfo($server);
     }
 
diff --git a/lib/internal/Magento/Framework/App/Test/Unit/ShellTest.php b/lib/internal/Magento/Framework/App/Test/Unit/ShellTest.php
index 9eed1fbedd9..65ac19cbc29 100644
--- a/lib/internal/Magento/Framework/App/Test/Unit/ShellTest.php
+++ b/lib/internal/Magento/Framework/App/Test/Unit/ShellTest.php
@@ -69,7 +69,8 @@ class ShellTest extends \PHPUnit\Framework\TestCase
         );
         $this->driverMock->expects($this->once())->method('execute')->willReturn($response);
         $this->loggerMock->expects($this->once())->method('error')->with($logEntry);
-        $this->expectException(LocalizedException::class, "Command returned non-zero exit code:\n`$command`");
+        $this->expectException(LocalizedException::class);
+        $this->expectExceptionMessage("Command returned non-zero exit code:\n`$command`");
         $this->model->execute($command, []);
     }
 }
diff --git a/lib/internal/Magento/Framework/App/Test/Unit/View/Asset/MaterializationStrategy/FactoryTest.php b/lib/internal/Magento/Framework/App/Test/Unit/View/Asset/MaterializationStrategy/FactoryTest.php
index c7a27645453..1873cc593a6 100644
--- a/lib/internal/Magento/Framework/App/Test/Unit/View/Asset/MaterializationStrategy/FactoryTest.php
+++ b/lib/internal/Magento/Framework/App/Test/Unit/View/Asset/MaterializationStrategy/FactoryTest.php
@@ -87,7 +87,8 @@ class FactoryTest extends \PHPUnit\Framework\TestCase
 
         $factory = new Factory($this->objectManager, []);
 
-        $this->expectException('LogicException', 'No materialization strategy is supported');
+        $this->expectException('LogicException');
+        $this->expectExceptionMessage('No materialization strategy is supported');
         $factory->create($asset);
     }
 
diff --git a/lib/internal/Magento/Framework/Cache/Test/Unit/Frontend/Adapter/ZendTest.php b/lib/internal/Magento/Framework/Cache/Test/Unit/Frontend/Adapter/ZendTest.php
index ee00a2154f4..129fade7b4a 100644
--- a/lib/internal/Magento/Framework/Cache/Test/Unit/Frontend/Adapter/ZendTest.php
+++ b/lib/internal/Magento/Framework/Cache/Test/Unit/Frontend/Adapter/ZendTest.php
@@ -80,7 +80,8 @@ class ZendTest extends \PHPUnit\Framework\TestCase
      */
     public function testCleanException($cleaningMode, $expectedErrorMessage)
     {
-        $this->expectException('InvalidArgumentException', $expectedErrorMessage);
+        $this->expectException('InvalidArgumentException');
+        $this->expectExceptionMessage($expectedErrorMessage);
         $object = new \Magento\Framework\Cache\Frontend\Adapter\Zend($this->createMock(\Zend_Cache_Core::class));
         $object->clean($cleaningMode);
     }
diff --git a/lib/internal/Magento/Framework/Code/Test/Unit/Generator/InterfaceGeneratorTest.php b/lib/internal/Magento/Framework/Code/Test/Unit/Generator/InterfaceGeneratorTest.php
index 347bc6b46ac..0f3daa46e1e 100644
--- a/lib/internal/Magento/Framework/Code/Test/Unit/Generator/InterfaceGeneratorTest.php
+++ b/lib/internal/Magento/Framework/Code/Test/Unit/Generator/InterfaceGeneratorTest.php
@@ -75,7 +75,8 @@ class InterfaceGeneratorTest extends \PHPUnit\Framework\TestCase
     public function testGenerate($additionalMethodsData, $expectedException, $expectedExceptionMessage)
     {
         if ($expectedException) {
-            $this->expectException($expectedException, $expectedExceptionMessage);
+            $this->expectException($expectedException);
+            $this->expectExceptionMessage($expectedExceptionMessage);
         }
         $methodsData = array_merge_recursive($this->methodsData, $additionalMethodsData);
         $this->interfaceGenerator->setClassDocBlock($this->interfaceDocBlock)
diff --git a/lib/internal/Magento/Framework/Code/Test/Unit/Generator/IoTest.php b/lib/internal/Magento/Framework/Code/Test/Unit/Generator/IoTest.php
index bc23ef954f2..9c63de1258d 100644
--- a/lib/internal/Magento/Framework/Code/Test/Unit/Generator/IoTest.php
+++ b/lib/internal/Magento/Framework/Code/Test/Unit/Generator/IoTest.php
@@ -97,7 +97,8 @@ class IoTest extends \PHPUnit\Framework\TestCase
         } else {
             $exceptionMessage = 'Some error renaming file';
             $renameMockEvent = $this->throwException(new FileSystemException(new Phrase($exceptionMessage)));
-            $this->expectException(\Magento\Framework\Exception\FileSystemException::class, $exceptionMessage);
+            $this->expectException(\Magento\Framework\Exception\FileSystemException::class);
+            $this->expectExceptionMessage($exceptionMessage);
         }
 
         $this->_filesystemDriverMock->expects($this->once())
diff --git a/lib/internal/Magento/Framework/Code/Test/Unit/Validator/ArgumentSequenceTest.php b/lib/internal/Magento/Framework/Code/Test/Unit/Validator/ArgumentSequenceTest.php
index d1692fd4ec0..96be42658f7 100644
--- a/lib/internal/Magento/Framework/Code/Test/Unit/Validator/ArgumentSequenceTest.php
+++ b/lib/internal/Magento/Framework/Code/Test/Unit/Validator/ArgumentSequenceTest.php
@@ -51,7 +51,8 @@ class ArgumentSequenceTest extends \PHPUnit\Framework\TestCase
             'Actual  : %s' .
             PHP_EOL;
         $message = sprintf($message, '\ArgumentSequence\InvalidChildClass', $expectedSequence, $actualSequence);
-        $this->expectException(\Magento\Framework\Exception\ValidatorException::class, $message);
+        $this->expectException(\Magento\Framework\Exception\ValidatorException::class);
+        $this->expectExceptionMessage($message);
         $this->_validator->validate('\ArgumentSequence\InvalidChildClass');
     }
 }
diff --git a/lib/internal/Magento/Framework/Code/Test/Unit/Validator/TypeDuplicationTest.php b/lib/internal/Magento/Framework/Code/Test/Unit/Validator/TypeDuplicationTest.php
index 3822d148adc..a82c88e3e18 100644
--- a/lib/internal/Magento/Framework/Code/Test/Unit/Validator/TypeDuplicationTest.php
+++ b/lib/internal/Magento/Framework/Code/Test/Unit/Validator/TypeDuplicationTest.php
@@ -49,7 +49,8 @@ class TypeDuplicationTest extends \PHPUnit\Framework\TestCase
             $this->_fixturePath .
             PHP_EOL .
             'Multiple type injection [\TypeDuplication\ArgumentBaseClass]';
-        $this->expectException(\Magento\Framework\Exception\ValidatorException::class, $message);
+        $this->expectException(\Magento\Framework\Exception\ValidatorException::class);
+        $this->expectExceptionMessage($message);
         $this->_validator->validate('\TypeDuplication\InvalidClassWithDuplicatedTypes');
     }
 }
diff --git a/lib/internal/Magento/Framework/Config/Test/Unit/Data/ConfigDataTest.php b/lib/internal/Magento/Framework/Config/Test/Unit/Data/ConfigDataTest.php
index b222f52dc73..619135f9c70 100644
--- a/lib/internal/Magento/Framework/Config/Test/Unit/Data/ConfigDataTest.php
+++ b/lib/internal/Magento/Framework/Config/Test/Unit/Data/ConfigDataTest.php
@@ -42,7 +42,8 @@ class ConfigDataTest extends \PHPUnit\Framework\TestCase
 
         $configData = new ConfigData('testKey');
 
-        $this->expectException('InvalidArgumentException', $expectedException);
+        $this->expectException('InvalidArgumentException');
+        $this->expectExceptionMessage($expectedException);
         $configData->set($key, 'value');
     }
 
diff --git a/lib/internal/Magento/Framework/DB/Test/Unit/Tree/NodeTest.php b/lib/internal/Magento/Framework/DB/Test/Unit/Tree/NodeTest.php
index 8d3623d485b..92c901f3872 100644
--- a/lib/internal/Magento/Framework/DB/Test/Unit/Tree/NodeTest.php
+++ b/lib/internal/Magento/Framework/DB/Test/Unit/Tree/NodeTest.php
@@ -20,7 +20,8 @@ class NodeTest extends \PHPUnit\Framework\TestCase
         $expectedException,
         $expectedExceptionMessage
     ) {
-        $this->expectException($expectedException, $expectedExceptionMessage);
+        $this->expectException($expectedException);
+        $this->expectExceptionMessage($expectedExceptionMessage);
         new \Magento\Framework\DB\Tree\Node($data['node_data'], $data['keys']);
     }
 
diff --git a/lib/internal/Magento/Framework/Data/Test/Unit/Argument/Interpreter/CompositeTest.php b/lib/internal/Magento/Framework/Data/Test/Unit/Argument/Interpreter/CompositeTest.php
index 768b8d3b9ef..bca8bb0d934 100644
--- a/lib/internal/Magento/Framework/Data/Test/Unit/Argument/Interpreter/CompositeTest.php
+++ b/lib/internal/Magento/Framework/Data/Test/Unit/Argument/Interpreter/CompositeTest.php
@@ -55,7 +55,8 @@ class CompositeTest extends \PHPUnit\Framework\TestCase
      */
     public function testEvaluateWrongDiscriminator($input, $expectedExceptionMessage)
     {
-        $this->expectException('\InvalidArgumentException', $expectedExceptionMessage);
+        $this->expectException('\InvalidArgumentException');
+        $this->expectExceptionMessage($expectedExceptionMessage);
         $this->_model->evaluate($input);
     }
 
diff --git a/lib/internal/Magento/Framework/Filesystem/Test/Unit/DirectoryListTest.php b/lib/internal/Magento/Framework/Filesystem/Test/Unit/DirectoryListTest.php
index 8a96f79179b..96b56de8451 100644
--- a/lib/internal/Magento/Framework/Filesystem/Test/Unit/DirectoryListTest.php
+++ b/lib/internal/Magento/Framework/Filesystem/Test/Unit/DirectoryListTest.php
@@ -21,7 +21,8 @@ class DirectoryListTest extends \PHPUnit\Framework\TestCase
      */
     public function testValidate($config, $expectedError)
     {
-        $this->expectException('\InvalidArgumentException', $expectedError);
+        $this->expectException('\InvalidArgumentException');
+        $this->expectExceptionMessage($expectedError);
         DirectoryList::validate($config);
     }
 
diff --git a/lib/internal/Magento/Framework/Image/Test/Unit/Adapter/ImageMagickTest.php b/lib/internal/Magento/Framework/Image/Test/Unit/Adapter/ImageMagickTest.php
index af44ae45c2c..ae0348f489f 100644
--- a/lib/internal/Magento/Framework/Image/Test/Unit/Adapter/ImageMagickTest.php
+++ b/lib/internal/Magento/Framework/Image/Test/Unit/Adapter/ImageMagickTest.php
@@ -58,7 +58,8 @@ class ImageMagickTest extends \PHPUnit\Framework\TestCase
      */
     public function testWatermark($imagePath, $expectedMessage)
     {
-        $this->expectException('LogicException', $expectedMessage);
+        $this->expectException('LogicException');
+        $this->expectExceptionMessage($expectedMessage);
         $this->imageMagic->watermark($imagePath);
     }
 
diff --git a/lib/internal/Magento/Framework/Mview/Test/Unit/View/ChangelogTest.php b/lib/internal/Magento/Framework/Mview/Test/Unit/View/ChangelogTest.php
index e278de0fff9..c91b56560eb 100644
--- a/lib/internal/Magento/Framework/Mview/Test/Unit/View/ChangelogTest.php
+++ b/lib/internal/Magento/Framework/Mview/Test/Unit/View/ChangelogTest.php
@@ -124,7 +124,8 @@ class ChangelogTest extends \PHPUnit\Framework\TestCase
         $this->mockIsTableExists($changelogTableName, false);
         $this->mockGetTableName();
 
-        $this->expectException('Exception', "Table {$changelogTableName} does not exist");
+        $this->expectException('Exception');
+        $this->expectExceptionMessage("Table {$changelogTableName} does not exist");
         $this->model->setViewId('viewIdtest');
         $this->model->getVersion();
     }
@@ -135,7 +136,8 @@ class ChangelogTest extends \PHPUnit\Framework\TestCase
         $this->mockIsTableExists($changelogTableName, false);
         $this->mockGetTableName();
 
-        $this->expectException('Exception', "Table {$changelogTableName} does not exist");
+        $this->expectException('Exception');
+        $this->expectExceptionMessage("Table {$changelogTableName} does not exist");
         $this->model->setViewId('viewIdtest');
         $this->model->drop();
     }
@@ -226,7 +228,8 @@ class ChangelogTest extends \PHPUnit\Framework\TestCase
         $this->mockIsTableExists($changelogTableName, false);
         $this->mockGetTableName();
 
-        $this->expectException('Exception', "Table {$changelogTableName} does not exist");
+        $this->expectException('Exception');
+        $this->expectExceptionMessage("Table {$changelogTableName} does not exist");
         $this->model->setViewId('viewIdtest');
         $this->model->getList(mt_rand(1, 200), mt_rand(201, 400));
     }
@@ -237,7 +240,8 @@ class ChangelogTest extends \PHPUnit\Framework\TestCase
         $this->mockIsTableExists($changelogTableName, false);
         $this->mockGetTableName();
 
-        $this->expectException('Exception', "Table {$changelogTableName} does not exist");
+        $this->expectException('Exception');
+        $this->expectExceptionMessage("Table {$changelogTableName} does not exist");
         $this->model->setViewId('viewIdtest');
         $this->model->clear(mt_rand(1, 200));
     }
diff --git a/lib/internal/Magento/Framework/Phrase/Test/Unit/Renderer/CompositeTest.php b/lib/internal/Magento/Framework/Phrase/Test/Unit/Renderer/CompositeTest.php
index 57d8841455f..e302dc8f5ad 100644
--- a/lib/internal/Magento/Framework/Phrase/Test/Unit/Renderer/CompositeTest.php
+++ b/lib/internal/Magento/Framework/Phrase/Test/Unit/Renderer/CompositeTest.php
@@ -85,7 +85,8 @@ class CompositeTest extends \PHPUnit\Framework\TestCase
             ->method('render')
             ->willThrowException($exception);
 
-        $this->expectException('Exception', $message);
+        $this->expectException('Exception');
+        $this->expectExceptionMessage($message);
         $this->object->render(['text'], []);
     }
 }
diff --git a/lib/internal/Magento/Framework/Phrase/Test/Unit/Renderer/InlineTest.php b/lib/internal/Magento/Framework/Phrase/Test/Unit/Renderer/InlineTest.php
index 793557000fb..f9b6e47c19a 100644
--- a/lib/internal/Magento/Framework/Phrase/Test/Unit/Renderer/InlineTest.php
+++ b/lib/internal/Magento/Framework/Phrase/Test/Unit/Renderer/InlineTest.php
@@ -88,7 +88,8 @@ class InlineTest extends \PHPUnit\Framework\TestCase
             ->method('get')
             ->willThrowException($exception);
 
-        $this->expectException('Exception', $message);
+        $this->expectException('Exception');
+        $this->expectExceptionMessage($message);
         $this->renderer->render(['text'], []);
     }
 }
diff --git a/lib/internal/Magento/Framework/Phrase/Test/Unit/Renderer/TranslateTest.php b/lib/internal/Magento/Framework/Phrase/Test/Unit/Renderer/TranslateTest.php
index fb4b3232cab..d8a0b3673ad 100644
--- a/lib/internal/Magento/Framework/Phrase/Test/Unit/Renderer/TranslateTest.php
+++ b/lib/internal/Magento/Framework/Phrase/Test/Unit/Renderer/TranslateTest.php
@@ -91,7 +91,8 @@ class TranslateTest extends \PHPUnit\Framework\TestCase
             ->method('getData')
             ->willThrowException($exception);
 
-        $this->expectException('Exception', $message);
+        $this->expectException('Exception');
+        $this->expectExceptionMessage($message);
         $this->_renderer->render(['text'], []);
     }
 }
diff --git a/lib/internal/Magento/Framework/Test/Unit/Module/Plugin/DbStatusValidatorTest.php b/lib/internal/Magento/Framework/Test/Unit/Module/Plugin/DbStatusValidatorTest.php
index 201856124d7..1516f654797 100644
--- a/lib/internal/Magento/Framework/Test/Unit/Module/Plugin/DbStatusValidatorTest.php
+++ b/lib/internal/Magento/Framework/Test/Unit/Module/Plugin/DbStatusValidatorTest.php
@@ -114,7 +114,7 @@ class DbStatusValidatorTest extends \PHPUnit\Framework\TestCase
         $this->cacheMock->expects(static::never())
             ->method('save');
 
-        $this->expectException(LocalizedException::class, $expectedMessage);
+        $this->expectException(LocalizedException::class);
         $this->expectExceptionMessage($expectedMessage);
         $this->plugin->beforeDispatch($this->frontControllerMock, $this->requestMock);
     }
diff --git a/lib/internal/Magento/Framework/Validator/Test/Unit/BuilderTest.php b/lib/internal/Magento/Framework/Validator/Test/Unit/BuilderTest.php
index 2df8d535ee7..860d449c471 100644
--- a/lib/internal/Magento/Framework/Validator/Test/Unit/BuilderTest.php
+++ b/lib/internal/Magento/Framework/Validator/Test/Unit/BuilderTest.php
@@ -341,7 +341,8 @@ class BuilderTest extends \PHPUnit\Framework\TestCase
      */
     public function testConstructorConfigValidation(array $options, $exception, $exceptionMessage)
     {
-        $this->expectException($exception, $exceptionMessage);
+        $this->expectException($exception);
+        $this->expectExceptionMessage($exceptionMessage);
         if (array_key_exists('method', $options)) {
             $options = ['methods' => [$options]];
         }
@@ -362,7 +363,8 @@ class BuilderTest extends \PHPUnit\Framework\TestCase
      */
     public function testAddConfigurationConfigValidation(array $options, $exception, $exceptionMessage)
     {
-        $this->expectException($exception, $exceptionMessage);
+        $this->expectException($exception);
+        $this->expectExceptionMessage($exceptionMessage);
 
         $constraints = [
             ['alias' => 'alias', 'class' => 'Some\Validator\Class', 'options' => null, 'type' => 'entity'],
diff --git a/lib/internal/Magento/Framework/Validator/Test/Unit/Constraint/Option/CallbackTest.php b/lib/internal/Magento/Framework/Validator/Test/Unit/Constraint/Option/CallbackTest.php
index 91bd3a7608d..9617b283830 100644
--- a/lib/internal/Magento/Framework/Validator/Test/Unit/Constraint/Option/CallbackTest.php
+++ b/lib/internal/Magento/Framework/Validator/Test/Unit/Constraint/Option/CallbackTest.php
@@ -123,7 +123,8 @@ class CallbackTest extends \PHPUnit\Framework\TestCase
     public function testGetValueException($callback, $expectedMessage, $createInstance = false)
     {
         $option = new \Magento\Framework\Validator\Constraint\Option\Callback($callback, null, $createInstance);
-        $this->expectException('InvalidArgumentException', $expectedMessage);
+        $this->expectException('InvalidArgumentException');
+        $this->expectExceptionMessage($expectedMessage);
         $option->getValue();
     }
 
diff --git a/lib/internal/Magento/Framework/View/Test/Unit/Element/TemplateTest.php b/lib/internal/Magento/Framework/View/Test/Unit/Element/TemplateTest.php
index 83813785886..b457a98b5e2 100644
--- a/lib/internal/Magento/Framework/View/Test/Unit/Element/TemplateTest.php
+++ b/lib/internal/Magento/Framework/View/Test/Unit/Element/TemplateTest.php
@@ -175,7 +175,8 @@ class TemplateTest extends \PHPUnit\Framework\TestCase
             ->method('getMode')
             ->willReturn(\Magento\Framework\App\State::MODE_DEVELOPER);
 
-        $this->expectException(\Magento\Framework\Exception\ValidatorException::class, $exception);
+        $this->expectException(\Magento\Framework\Exception\ValidatorException::class);
+        $this->expectExceptionMessage($exception);
         $this->block->fetchView($template);
     }
 
diff --git a/lib/internal/Magento/Framework/View/Test/Unit/File/Collector/Override/ThemeModularTest.php b/lib/internal/Magento/Framework/View/Test/Unit/File/Collector/Override/ThemeModularTest.php
index d1a1851c06c..cae621a0912 100644
--- a/lib/internal/Magento/Framework/View/Test/Unit/File/Collector/Override/ThemeModularTest.php
+++ b/lib/internal/Magento/Framework/View/Test/Unit/File/Collector/Override/ThemeModularTest.php
@@ -169,7 +169,8 @@ class ThemeModularTest extends \PHPUnit\Framework\TestCase
         $filePath = 'design/area/theme_path/Module_One/override/theme/vendor/parent_theme/1.xml';
         $expectedMessage = "Trying to override modular view file '$filePath' for theme 'vendor/parent_theme'"
             . ", which is not ancestor of theme 'vendor/theme_path'";
-        $this->expectException(\Magento\Framework\Exception\LocalizedException::class, $expectedMessage);
+        $this->expectException(\Magento\Framework\Exception\LocalizedException::class);
+        $this->expectExceptionMessage($expectedMessage);
 
         $theme = $this->getMockForAbstractClass(\Magento\Framework\View\Design\ThemeInterface::class);
         $theme->expects($this->once())->method('getFullPath')->willReturn($themePath);
diff --git a/lib/internal/Magento/Framework/View/Test/Unit/Layout/Argument/Interpreter/HelperMethodTest.php b/lib/internal/Magento/Framework/View/Test/Unit/Layout/Argument/Interpreter/HelperMethodTest.php
index 19b450e2d42..458b23a4b15 100644
--- a/lib/internal/Magento/Framework/View/Test/Unit/Layout/Argument/Interpreter/HelperMethodTest.php
+++ b/lib/internal/Magento/Framework/View/Test/Unit/Layout/Argument/Interpreter/HelperMethodTest.php
@@ -67,7 +67,8 @@ class HelperMethodTest extends \PHPUnit\Framework\TestCase
      */
     public function testEvaluateException($helperMethod, $expectedExceptionMessage)
     {
-        $this->expectException('\InvalidArgumentException', $expectedExceptionMessage);
+        $this->expectException('\InvalidArgumentException');
+        $this->expectExceptionMessage($expectedExceptionMessage);
         $input = ['value' => 'some text', 'helper' => $helperMethod];
         $this->_model->evaluate($input);
     }
diff --git a/lib/internal/Magento/Framework/View/Test/Unit/Layout/Argument/Interpreter/NamedParamsTest.php b/lib/internal/Magento/Framework/View/Test/Unit/Layout/Argument/Interpreter/NamedParamsTest.php
index 65f72ef96f8..5ae0b0332f2 100644
--- a/lib/internal/Magento/Framework/View/Test/Unit/Layout/Argument/Interpreter/NamedParamsTest.php
+++ b/lib/internal/Magento/Framework/View/Test/Unit/Layout/Argument/Interpreter/NamedParamsTest.php
@@ -62,7 +62,8 @@ class NamedParamsTest extends \PHPUnit\Framework\TestCase
      */
     public function testEvaluateWrongParam($input, $expectedExceptionMessage)
     {
-        $this->expectException('\InvalidArgumentException', $expectedExceptionMessage);
+        $this->expectException('\InvalidArgumentException');
+        $this->expectExceptionMessage($expectedExceptionMessage);
         $this->_model->evaluate($input);
     }
 
diff --git a/lib/internal/Magento/Framework/View/Test/Unit/Layout/Argument/Interpreter/ObjectTest.php b/lib/internal/Magento/Framework/View/Test/Unit/Layout/Argument/Interpreter/ObjectTest.php
index 682106e01ad..7cc280a930d 100644
--- a/lib/internal/Magento/Framework/View/Test/Unit/Layout/Argument/Interpreter/ObjectTest.php
+++ b/lib/internal/Magento/Framework/View/Test/Unit/Layout/Argument/Interpreter/ObjectTest.php
@@ -49,7 +49,8 @@ class ObjectTest extends \PHPUnit\Framework\TestCase
      */
     public function testEvaluateWrongClass($input, $expectedException, $expectedExceptionMessage)
     {
-        $this->expectException($expectedException, $expectedExceptionMessage);
+        $this->expectException($expectedException);
+        $this->expectExceptionMessage($expectedExceptionMessage);
         $self = $this;
         $this->_objectManager->expects($this->any())->method('create')->willReturnCallback(
             function ($className) use ($self) {
diff --git a/lib/internal/Magento/Framework/View/Test/Unit/Layout/Argument/Interpreter/OptionsTest.php b/lib/internal/Magento/Framework/View/Test/Unit/Layout/Argument/Interpreter/OptionsTest.php
index ffb79790d33..d3e91cb7c2b 100644
--- a/lib/internal/Magento/Framework/View/Test/Unit/Layout/Argument/Interpreter/OptionsTest.php
+++ b/lib/internal/Magento/Framework/View/Test/Unit/Layout/Argument/Interpreter/OptionsTest.php
@@ -67,7 +67,8 @@ class OptionsTest extends \PHPUnit\Framework\TestCase
      */
     public function testEvaluateWrongModel($input, $expectedException, $expectedExceptionMessage)
     {
-        $this->expectException($expectedException, $expectedExceptionMessage);
+        $this->expectException($expectedException);
+        $this->expectExceptionMessage($expectedExceptionMessage);
         $this->_model->evaluate($input);
     }
 
diff --git a/lib/internal/Magento/Framework/Webapi/Test/Unit/Rest/Request/Deserializer/JsonTest.php b/lib/internal/Magento/Framework/Webapi/Test/Unit/Rest/Request/Deserializer/JsonTest.php
index 71ede3fd4fc..d4177ceee8d 100644
--- a/lib/internal/Magento/Framework/Webapi/Test/Unit/Rest/Request/Deserializer/JsonTest.php
+++ b/lib/internal/Magento/Framework/Webapi/Test/Unit/Rest/Request/Deserializer/JsonTest.php
@@ -55,7 +55,8 @@ class JsonTest extends \PHPUnit\Framework\TestCase
 
     public function testDeserializerInvalidArgumentException()
     {
-        $this->expectException('InvalidArgumentException', '"boolean" data type is invalid. String is expected.');
+        $this->expectException('InvalidArgumentException');
+        $this->expectExceptionMessage('"boolean" data type is invalid. String is expected.');
         $this->_jsonDeserializer->deserialize(false);
     }
 
diff --git a/lib/internal/Magento/Framework/Webapi/Test/Unit/Rest/Request/Deserializer/XmlTest.php b/lib/internal/Magento/Framework/Webapi/Test/Unit/Rest/Request/Deserializer/XmlTest.php
index 2c754f23b0b..4b9c90de735 100644
--- a/lib/internal/Magento/Framework/Webapi/Test/Unit/Rest/Request/Deserializer/XmlTest.php
+++ b/lib/internal/Magento/Framework/Webapi/Test/Unit/Rest/Request/Deserializer/XmlTest.php
@@ -42,7 +42,8 @@ class XmlTest extends \PHPUnit\Framework\TestCase
 
     public function testDeserializeInvalidArgumentException()
     {
-        $this->expectException('InvalidArgumentException', '"boolean" data type is invalid. String is expected.');
+        $this->expectException('InvalidArgumentException');
+        $this->expectExceptionMessage('"boolean" data type is invalid. String is expected.');
         $this->_xmlDeserializer->deserialize(false);
     }
 
diff --git a/lib/internal/Magento/Framework/Webapi/Test/Unit/Rest/Request/DeserializerFactoryTest.php b/lib/internal/Magento/Framework/Webapi/Test/Unit/Rest/Request/DeserializerFactoryTest.php
index 74d87095823..588a67430a6 100644
--- a/lib/internal/Magento/Framework/Webapi/Test/Unit/Rest/Request/DeserializerFactoryTest.php
+++ b/lib/internal/Magento/Framework/Webapi/Test/Unit/Rest/Request/DeserializerFactoryTest.php
@@ -11,7 +11,8 @@ class DeserializerFactoryTest extends \PHPUnit\Framework\TestCase
 {
     public function testGetLogicExceptionEmptyRequestAdapter()
     {
-        $this->expectException('LogicException', 'Request deserializer adapter is not set.');
+        $this->expectException('LogicException');
+        $this->expectExceptionMessage('Request deserializer adapter is not set.');
         $interpreterFactory = new \Magento\Framework\Webapi\Rest\Request\DeserializerFactory(
             $this->createMock(\Magento\Framework\ObjectManagerInterface::class),
             []
diff --git a/setup/src/Magento/Setup/Test/Unit/Module/Di/Compiler/Config/ModificationChainTest.php b/setup/src/Magento/Setup/Test/Unit/Module/Di/Compiler/Config/ModificationChainTest.php
index dbe566f9a1c..7f0553034b4 100644
--- a/setup/src/Magento/Setup/Test/Unit/Module/Di/Compiler/Config/ModificationChainTest.php
+++ b/setup/src/Magento/Setup/Test/Unit/Module/Di/Compiler/Config/ModificationChainTest.php
@@ -25,7 +25,8 @@ class ModificationChainTest extends \PHPUnit\Framework\TestCase
 
     public function testConstructorException()
     {
-        $this->expectException('InvalidArgumentException', 'Wrong modifier provided');
+        $this->expectException('InvalidArgumentException');
+        $this->expectExceptionMessage('Wrong modifier provided');
         $modificationsList = [];
         $modificationsList[] = $this->getMockBuilder(
             \Magento\Setup\Module\Di\Compiler\Config\ModificationInterface::class
diff --git a/setup/src/Magento/Setup/Test/Unit/Module/I18n/Dictionary/Options/ResolverTest.php b/setup/src/Magento/Setup/Test/Unit/Module/I18n/Dictionary/Options/ResolverTest.php
index cb49c3a33a5..331b2b8705c 100644
--- a/setup/src/Magento/Setup/Test/Unit/Module/I18n/Dictionary/Options/ResolverTest.php
+++ b/setup/src/Magento/Setup/Test/Unit/Module/I18n/Dictionary/Options/ResolverTest.php
@@ -136,7 +136,8 @@ class ResolverTest extends \PHPUnit\Framework\TestCase
                 'directoryList' => $directoryList
             ]
         );
-        $this->expectException('\InvalidArgumentException', $message);
+        $this->expectException('\InvalidArgumentException');
+        $this->expectExceptionMessage($message);
         $resolver->getOptions();
     }
 
diff --git a/setup/src/Magento/Setup/Test/Unit/Module/I18n/Dictionary/PhraseTest.php b/setup/src/Magento/Setup/Test/Unit/Module/I18n/Dictionary/PhraseTest.php
index e87a716ffdb..b76cc4a0b1f 100644
--- a/setup/src/Magento/Setup/Test/Unit/Module/I18n/Dictionary/PhraseTest.php
+++ b/setup/src/Magento/Setup/Test/Unit/Module/I18n/Dictionary/PhraseTest.php
@@ -55,7 +55,8 @@ class PhraseTest extends \PHPUnit\Framework\TestCase
      */
     public function testWrongParametersWhilePhraseCreation($constructArguments, $message)
     {
-        $this->expectException('DomainException', $message);
+        $this->expectException('DomainException');
+        $this->expectExceptionMessage($message);
 
         new Phrase(...array_values($constructArguments));
     }
diff --git a/setup/src/Magento/Setup/Test/Unit/Module/I18n/Pack/GeneratorTest.php b/setup/src/Magento/Setup/Test/Unit/Module/I18n/Pack/GeneratorTest.php
index 3395596f399..1c035e8ceed 100644
--- a/setup/src/Magento/Setup/Test/Unit/Module/I18n/Pack/GeneratorTest.php
+++ b/setup/src/Magento/Setup/Test/Unit/Module/I18n/Pack/GeneratorTest.php
@@ -111,7 +111,8 @@ class GeneratorTest extends \PHPUnit\Framework\TestCase
         $error = "Duplicated translation is found, but it is not allowed.\n"
             . "The phrase \"phrase1\" is translated in 1 places.\n"
             . "The phrase \"phrase2\" is translated in 1 places.\n";
-        $this->expectException('\RuntimeException', $error);
+        $this->expectException('\RuntimeException');
+        $this->expectExceptionMessage($error);
 
         $allowDuplicates = false;
 
diff --git a/setup/src/Magento/Setup/Test/Unit/Module/I18n/Parser/AbstractParserTest.php b/setup/src/Magento/Setup/Test/Unit/Module/I18n/Parser/AbstractParserTest.php
index e68a1c62437..3c744bb44d3 100644
--- a/setup/src/Magento/Setup/Test/Unit/Module/I18n/Parser/AbstractParserTest.php
+++ b/setup/src/Magento/Setup/Test/Unit/Module/I18n/Parser/AbstractParserTest.php
@@ -29,7 +29,8 @@ class AbstractParserTest extends \PHPUnit\Framework\TestCase
      */
     public function testValidateOptions($options, $message)
     {
-        $this->expectException('InvalidArgumentException', $message);
+        $this->expectException('InvalidArgumentException');
+        $this->expectExceptionMessage($message);
 
         $this->_parserMock->addAdapter(
             'php',
-- 
GitLab


From afafc3c0a64adb2802704d71d8e44136bd72f7c5 Mon Sep 17 00:00:00 2001
From: RomanKis <romaikiss@gmail.com>
Date: Tue, 5 Dec 2017 18:01:25 +0200
Subject: [PATCH 267/380] 8601: Can bypass Minimum Order Amount Logic

---
 .../Model/Checkout/Type/Multishipping.php     | 53 +++++++++++++++++--
 .../Model/Checkout/Type/MultishippingTest.php | 42 ++++++++++++++-
 2 files changed, 89 insertions(+), 6 deletions(-)

diff --git a/app/code/Magento/Multishipping/Model/Checkout/Type/Multishipping.php b/app/code/Magento/Multishipping/Model/Checkout/Type/Multishipping.php
index f9d6d0adaae..7c72c09c0d9 100644
--- a/app/code/Magento/Multishipping/Model/Checkout/Type/Multishipping.php
+++ b/app/code/Magento/Multishipping/Model/Checkout/Type/Multishipping.php
@@ -817,13 +817,21 @@ class Multishipping extends \Magento\Framework\DataObject
      */
     public function validateMinimumAmount()
     {
-        return !($this->_scopeConfig->isSetFlag(
+        $minimumOrderActive = $this->_scopeConfig->isSetFlag(
             'sales/minimum_order/active',
             \Magento\Store\Model\ScopeInterface::SCOPE_STORE
-        ) && $this->_scopeConfig->isSetFlag(
+        );
+
+        if ($this->_scopeConfig->isSetFlag(
             'sales/minimum_order/multi_address',
-            \Magento\Store\Model\ScopeInterface::SCOPE_STORE
-        ) && !$this->getQuote()->validateMinimumAmount());
+            \Magento\Store\Model\ScopeInterface::SCOPE_STORE)
+        ) {
+            $result = !($minimumOrderActive && !$this->getQuote()->validateMinimumAmount());
+        } else {
+            $result = !($minimumOrderActive && !$this->validateMinimumAmountForAddressItems());
+        }
+
+        return $result;
     }
 
     /**
@@ -1031,4 +1039,41 @@ class Multishipping extends \Magento\Framework\DataObject
         }
         return $this->shippingAssignmentProcessor;
     }
+
+    /**
+     * Validate minimum amount for "Checkout with Multiple Addresses" when
+     * "Validate Each Address Separately in Multi-address Checkout" is No.
+     *
+     * @return bool
+     */
+    private function validateMinimumAmountForAddressItems()
+    {
+        $result = true;
+        $storeId = $this->getQuote()->getStoreId();
+
+        $minAmount = $this->_scopeConfig->getValue(
+            'sales/minimum_order/amount',
+            \Magento\Store\Model\ScopeInterface::SCOPE_STORE,
+            $storeId
+        );
+        $taxInclude = $this->_scopeConfig->getValue(
+            'sales/minimum_order/tax_including',
+            \Magento\Store\Model\ScopeInterface::SCOPE_STORE,
+            $storeId
+        );
+
+        $addresses = $this->getQuote()->getAllAddresses();
+
+        $baseTotal = 0;
+        foreach ($addresses as $address) {
+            $taxes = ($taxInclude) ? $address->getBaseTaxAmount() : 0;
+            $baseTotal += $address->getBaseSubtotalWithDiscount() + $taxes;
+        }
+
+        if ($baseTotal < $minAmount) {
+            $result = false;
+        }
+
+        return $result;
+    }
 }
diff --git a/app/code/Magento/Multishipping/Test/Unit/Model/Checkout/Type/MultishippingTest.php b/app/code/Magento/Multishipping/Test/Unit/Model/Checkout/Type/MultishippingTest.php
index 1d779c11d59..f90e85a9043 100644
--- a/app/code/Magento/Multishipping/Test/Unit/Model/Checkout/Type/MultishippingTest.php
+++ b/app/code/Magento/Multishipping/Test/Unit/Model/Checkout/Type/MultishippingTest.php
@@ -118,13 +118,18 @@ class MultishippingTest extends \PHPUnit\Framework\TestCase
      */
     private $quoteRepositoryMock;
 
+    /**
+     * @var PHPUnit_Framework_MockObject_MockObject
+     */
+    private $scopeConfigMock;
+
     protected function setUp()
     {
         $this->checkoutSessionMock = $this->createSimpleMock(Session::class);
         $this->customerSessionMock = $this->createSimpleMock(CustomerSession::class);
         $orderFactoryMock = $this->createSimpleMock(OrderFactory::class);
         $eventManagerMock = $this->createSimpleMock(ManagerInterface::class);
-        $scopeConfigMock = $this->createSimpleMock(ScopeConfigInterface::class);
+        $this->scopeConfigMock = $this->createSimpleMock(ScopeConfigInterface::class);
         $sessionMock = $this->createSimpleMock(Generic::class);
         $addressFactoryMock = $this->createSimpleMock(AddressFactory::class);
         $toOrderMock = $this->createSimpleMock(ToOrder::class);
@@ -166,7 +171,7 @@ class MultishippingTest extends \PHPUnit\Framework\TestCase
             $orderFactoryMock,
             $this->addressRepositoryMock,
             $eventManagerMock,
-            $scopeConfigMock,
+            $this->scopeConfigMock,
             $sessionMock,
             $addressFactoryMock,
             $toOrderMock,
@@ -497,4 +502,37 @@ class MultishippingTest extends \PHPUnit\Framework\TestCase
             ->disableOriginalConstructor()
             ->getMock();
     }
+
+    public function testValidateMinimumAmountMultiAddressTrue()
+    {
+        $this->scopeConfigMock->expects($this->exactly(2))->method('isSetFlag')->withConsecutive(
+            ['sales/minimum_order/active', \Magento\Store\Model\ScopeInterface::SCOPE_STORE],
+            ['sales/minimum_order/multi_address', \Magento\Store\Model\ScopeInterface::SCOPE_STORE]
+        )->willReturnOnConsecutiveCalls(true, true);
+
+        $this->checkoutSessionMock->expects($this->atLeastOnce())->method('getQuote')->willReturn($this->quoteMock);
+        $this->quoteMock->expects($this->once())->method('validateMinimumAmount')->willReturn(false);
+        $this->assertFalse($this->model->validateMinimumAmount());
+    }
+
+    public function testValidateMinimumAmountMultiAddressFalse()
+    {
+        $addressMock = $this->createMock(\Magento\Quote\Model\Quote\Address::class);
+        $this->scopeConfigMock->expects($this->exactly(2))->method('isSetFlag')->withConsecutive(
+            ['sales/minimum_order/active', \Magento\Store\Model\ScopeInterface::SCOPE_STORE],
+            ['sales/minimum_order/multi_address', \Magento\Store\Model\ScopeInterface::SCOPE_STORE]
+        )->willReturnOnConsecutiveCalls(true, false);
+
+        $this->scopeConfigMock->expects($this->exactly(2))->method('getValue')->withConsecutive(
+            ['sales/minimum_order/amount', \Magento\Store\Model\ScopeInterface::SCOPE_STORE],
+            ['sales/minimum_order/tax_including', \Magento\Store\Model\ScopeInterface::SCOPE_STORE]
+        )->willReturnOnConsecutiveCalls(100, false);
+
+        $this->checkoutSessionMock->expects($this->atLeastOnce())->method('getQuote')->willReturn($this->quoteMock);
+        $this->quoteMock->expects($this->once())->method('getStoreId')->willReturn(1);
+        $this->quoteMock->expects($this->once())->method('getAllAddresses')->willReturn([$addressMock]);
+        $addressMock->expects($this->once())->method('getBaseSubtotalWithDiscount')->willReturn(101);
+
+        $this->assertTrue($this->model->validateMinimumAmount());
+    }
 }
-- 
GitLab


From aaf1c2b35387e0224306fdeeb323d2f13b523af5 Mon Sep 17 00:00:00 2001
From: Michail Slabko <mslabko@magento.com>
Date: Tue, 5 Dec 2017 19:21:54 +0200
Subject: [PATCH 268/380] MAGETWO-75786: Incorrect count for category filter at
 layered navigation for configurable with no available options

---
 .../Indexer/Category/Product/AbstractAction.php | 12 ------------
 .../Test/Constraint/AssertProductsCount.php     |  2 +-
 .../Model/Indexer/FulltextTest.php              | 17 ++++++++++++++---
 3 files changed, 15 insertions(+), 16 deletions(-)

diff --git a/app/code/Magento/Catalog/Model/Indexer/Category/Product/AbstractAction.php b/app/code/Magento/Catalog/Model/Indexer/Category/Product/AbstractAction.php
index f7f2c7eb5de..78fe3042b5f 100644
--- a/app/code/Magento/Catalog/Model/Indexer/Category/Product/AbstractAction.php
+++ b/app/code/Magento/Catalog/Model/Indexer/Category/Product/AbstractAction.php
@@ -814,16 +814,4 @@ abstract class AbstractAction
             }
         }
     }
-
-    /**
-     * @return \Magento\Framework\EntityManager\MetadataPool
-     */
-    private function getMetadataPool()
-    {
-        if (null === $this->metadataPool) {
-            $this->metadataPool = \Magento\Framework\App\ObjectManager::getInstance()
-                ->get(\Magento\Framework\EntityManager\MetadataPool::class);
-        }
-        return $this->metadataPool;
-    }
 }
diff --git a/dev/tests/functional/tests/app/Magento/LayeredNavigation/Test/Constraint/AssertProductsCount.php b/dev/tests/functional/tests/app/Magento/LayeredNavigation/Test/Constraint/AssertProductsCount.php
index 43b3e8d1fab..7c9a1f4faef 100644
--- a/dev/tests/functional/tests/app/Magento/LayeredNavigation/Test/Constraint/AssertProductsCount.php
+++ b/dev/tests/functional/tests/app/Magento/LayeredNavigation/Test/Constraint/AssertProductsCount.php
@@ -1,6 +1,6 @@
 <?php
 /**
- * Copyright © 2013-2017 Magento, Inc. All rights reserved.
+ * Copyright © Magento, Inc. All rights reserved.
  * See COPYING.txt for license details.
  */
 namespace Magento\LayeredNavigation\Test\Constraint;
diff --git a/dev/tests/integration/testsuite/Magento/CatalogSearch/Model/Indexer/FulltextTest.php b/dev/tests/integration/testsuite/Magento/CatalogSearch/Model/Indexer/FulltextTest.php
index 56269bca470..ffd837aaca6 100644
--- a/dev/tests/integration/testsuite/Magento/CatalogSearch/Model/Indexer/FulltextTest.php
+++ b/dev/tests/integration/testsuite/Magento/CatalogSearch/Model/Indexer/FulltextTest.php
@@ -6,6 +6,7 @@
 namespace Magento\CatalogSearch\Model\Indexer;
 
 use Magento\Catalog\Model\Product;
+use Magento\Catalog\Model\Product\Visibility;
 use Magento\CatalogSearch\Model\ResourceModel\Fulltext\Collection;
 use Magento\TestFramework\Helper\Bootstrap;
 
@@ -199,13 +200,18 @@ class FulltextTest extends \PHPUnit\Framework\TestCase
     {
         $this->indexer->reindexAll();
 
-        $products = $this->search('Configurable');
+        $visibilityFilter = [
+            Visibility::VISIBILITY_IN_SEARCH,
+            Visibility::VISIBILITY_IN_CATALOG,
+            Visibility::VISIBILITY_BOTH
+        ];
+        $products = $this->search('Configurable', $visibilityFilter);
         $this->assertCount(1, $products);
 
         $childProduct = $this->getProductBySku('configurable_option_single_child');
         $childProduct->setStatus(Product\Attribute\Source\Status::STATUS_DISABLED)->save();
 
-        $products = $this->search('Configurable');
+        $products = $this->search('Configurable', $visibilityFilter);
         $this->assertCount(0, $products);
     }
 
@@ -213,9 +219,10 @@ class FulltextTest extends \PHPUnit\Framework\TestCase
      * Search the text and return result collection
      *
      * @param string $text
+     * @param null|array $visibilityFilter
      * @return Product[]
      */
-    protected function search($text)
+    protected function search($text, $visibilityFilter = null)
     {
         $this->resourceFulltext->resetSearchResults();
         $query = $this->queryFactory->get();
@@ -230,6 +237,10 @@ class FulltextTest extends \PHPUnit\Framework\TestCase
             ]
         );
         $collection->addSearchFilter($text);
+        if (null !== $visibilityFilter) {
+            $collection->setVisibility($visibilityFilter);
+        }
+
         foreach ($collection as $product) {
             $products[] = $product;
         }
-- 
GitLab


From 59cedcd02f8ca52d14e1cb88cd464cc6c13952bd Mon Sep 17 00:00:00 2001
From: magento-engcom-team <mikola.malevanec@transoftgroup.com>
Date: Wed, 6 Dec 2017 11:47:45 +0200
Subject: [PATCH 269/380] 8011: Strip Tags from attribute.

---
 .../Condition/Product/AbstractProduct.php     | 21 +++-
 .../Condition/Product/AbstractProductTest.php | 95 +++++++++++++++++++
 .../_files/dropdown_attribute_with_html.php   | 59 ++++++++++++
 .../dropdown_attribute_with_html_rollback.php | 22 +++++
 4 files changed, 196 insertions(+), 1 deletion(-)
 create mode 100644 dev/tests/integration/testsuite/Magento/Rule/Model/Condition/Product/AbstractProductTest.php
 create mode 100644 dev/tests/integration/testsuite/Magento/Rule/_files/dropdown_attribute_with_html.php
 create mode 100644 dev/tests/integration/testsuite/Magento/Rule/_files/dropdown_attribute_with_html_rollback.php

diff --git a/app/code/Magento/Rule/Model/Condition/Product/AbstractProduct.php b/app/code/Magento/Rule/Model/Condition/Product/AbstractProduct.php
index 5ab1379b96c..370d00d6c30 100644
--- a/app/code/Magento/Rule/Model/Condition/Product/AbstractProduct.php
+++ b/app/code/Magento/Rule/Model/Condition/Product/AbstractProduct.php
@@ -241,7 +241,9 @@ abstract class AbstractProduct extends \Magento\Rule\Model\Condition\AbstractCon
                 } else {
                     $addEmptyOption = true;
                 }
-                $selectOptions = $attributeObject->getSource()->getAllOptions($addEmptyOption);
+                $selectOptions = $this->removeTagsFromLabel(
+                    $attributeObject->getSource()->getAllOptions($addEmptyOption)
+                );
             }
         }
 
@@ -734,4 +736,21 @@ abstract class AbstractProduct extends \Magento\Rule\Model\Condition\AbstractCon
 
         return 'at_' . $attribute->getAttributeCode();
     }
+
+    /**
+     * Remove html tags from attribute labels.
+     *
+     * @param array $selectOptions
+     * @return array
+     */
+    private function removeTagsFromLabel($selectOptions)
+    {
+        foreach ($selectOptions as &$option) {
+            if (isset($option['label'])) {
+                $option['label'] = strip_tags($option['label']);
+            }
+        }
+
+        return $selectOptions;
+    }
 }
diff --git a/dev/tests/integration/testsuite/Magento/Rule/Model/Condition/Product/AbstractProductTest.php b/dev/tests/integration/testsuite/Magento/Rule/Model/Condition/Product/AbstractProductTest.php
new file mode 100644
index 00000000000..5052525f557
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Rule/Model/Condition/Product/AbstractProductTest.php
@@ -0,0 +1,95 @@
+<?php
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Rule\Model\Condition\Product;
+
+use Magento\Backend\Helper\Data;
+use Magento\Catalog\Api\ProductRepositoryInterface;
+use Magento\Catalog\Model\ProductCategoryList;
+use Magento\Catalog\Model\ProductFactory;
+use Magento\Catalog\Model\ResourceModel\Product;
+use Magento\Eav\Model\Config;
+use Magento\Eav\Model\ResourceModel\Entity\Attribute\Set\Collection;
+use Magento\Framework\Locale\FormatInterface;
+use Magento\Rule\Model\Condition\Context;
+use Magento\TestFramework\Helper\Bootstrap;
+
+/**
+ * Provide tests for Abstract Rule product condition data model.
+ * @magentoAppArea adminhtml
+ */
+class AbstractProductTest extends \PHPUnit\Framework\TestCase
+{
+    /**
+     * Test subject.
+     *
+     * @var AbstractProduct|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $model;
+
+    /**
+     * @inheritdoc
+     */
+    protected function setUp()
+    {
+        $objectManager = Bootstrap::getObjectManager();
+        $context = $objectManager->get(Context::class);
+        $helperData = $objectManager->get(Data::class);
+        $config = $objectManager->get(Config::class);
+        $productFactory = $objectManager->get(ProductFactory::class);
+        $productRepository = $objectManager->get(ProductRepositoryInterface::class);
+        $productResource = $objectManager->get(Product::class);
+        $attributeSetCollection = $objectManager->get(Collection::class);
+        $localeFormat = $objectManager->get(FormatInterface::class);
+        $data = [];
+        $productCategoryList = $objectManager->get(ProductCategoryList::class);
+        $this->model = $this->getMockBuilder(AbstractProduct::class)
+            ->setMethods(['getOperator', 'getFormName', 'setFormName'])
+            ->setConstructorArgs([
+                $context,
+                $helperData,
+                $config,
+                $productFactory,
+                $productRepository,
+                $productResource,
+                $attributeSetCollection,
+                $localeFormat,
+                $data,
+                $productCategoryList
+            ])
+            ->getMockForAbstractClass();
+    }
+
+    /**
+     * Test Abstract Rule product condition data model shows attribute labels in more readable view
+     * (without html tags, if one presented).
+     *
+     * @magentoDataFixture Magento/Rule/_files/dropdown_attribute_with_html.php
+     */
+    public function test()
+    {
+        $expectedOptions = [
+            [
+                'label' => ' ',
+                'value' => '',
+            ],
+            [
+                'value' => '4',
+                'label' => 'Option 1',
+            ],
+            [
+                'value' => '5',
+                'label' => 'Option 2',
+            ],
+            [
+                'value' => '6',
+                'label' => 'Option 3',
+            ],
+        ];
+        $this->model->setAttribute('dropdown_attribute_with_html');
+        self::assertSame($expectedOptions, $this->model->getValueSelectOptions());
+    }
+}
diff --git a/dev/tests/integration/testsuite/Magento/Rule/_files/dropdown_attribute_with_html.php b/dev/tests/integration/testsuite/Magento/Rule/_files/dropdown_attribute_with_html.php
new file mode 100644
index 00000000000..d4c6036a340
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Rule/_files/dropdown_attribute_with_html.php
@@ -0,0 +1,59 @@
+<?php
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+/* Create attribute */
+/** @var $attribute \Magento\Catalog\Model\ResourceModel\Eav\Attribute */
+$attribute = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create(
+    \Magento\Catalog\Model\ResourceModel\Eav\Attribute::class
+);
+
+if (!$attribute->loadByCode(4, 'dropdown_attribute_with_html')->getId()) {
+    /** @var $installer \Magento\Catalog\Setup\CategorySetup */
+    $installer = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create(
+        \Magento\Catalog\Setup\CategorySetup::class
+    );
+
+    $attribute->setData(
+        [
+            'attribute_code'                => 'dropdown_attribute_with_html',
+            'entity_type_id'                => $installer->getEntityTypeId('catalog_product'),
+            'is_global'                     => 0,
+            'is_user_defined'               => 1,
+            'frontend_input'                => 'select',
+            'is_unique'                     => 0,
+            'is_required'                   => 0,
+            'is_searchable'                 => 0,
+            'is_visible_in_advanced_search' => 0,
+            'is_comparable'                 => 0,
+            'is_filterable'                 => 0,
+            'is_filterable_in_search'       => 0,
+            'is_used_for_promo_rules'       => 0,
+            'is_html_allowed_on_front'      => 1,
+            'is_visible_on_front'           => 0,
+            'used_in_product_listing'       => 0,
+            'used_for_sort_by'              => 0,
+            'frontend_label'                => ['Drop-Down Attribute'],
+            'backend_type'                  => 'varchar',
+            'backend_model'                 => \Magento\Eav\Model\Entity\Attribute\Backend\ArrayBackend::class,
+            'option'                        => [
+                'value' => [
+                    'option_1' => ['<a href="#">Option 1</a>'],
+                    'option_2' => ['<a href="#">Option 2</a>'],
+                    'option_3' => ['<a href="#">Option 3</a>'],
+                ],
+                'order' => [
+                    'option_1' => 1,
+                    'option_2' => 2,
+                    'option_3' => 3,
+                ],
+            ],
+        ]
+    );
+    $attribute->save();
+
+    /* Assign attribute to attribute set */
+    $installer->addAttributeToGroup('catalog_product', 'Default', 'Attributes', $attribute->getId());
+}
diff --git a/dev/tests/integration/testsuite/Magento/Rule/_files/dropdown_attribute_with_html_rollback.php b/dev/tests/integration/testsuite/Magento/Rule/_files/dropdown_attribute_with_html_rollback.php
new file mode 100644
index 00000000000..130cfea7442
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Rule/_files/dropdown_attribute_with_html_rollback.php
@@ -0,0 +1,22 @@
+<?php
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+/* Delete attribute  with dropdown_attribute_with_html code */
+
+use Magento\Catalog\Model\ResourceModel\Eav\Attribute;
+use Magento\TestFramework\Helper\Bootstrap;
+
+$registry = Bootstrap::getObjectManager()->get(\Magento\Framework\Registry::class);
+$registry->unregister('isSecureArea');
+$registry->register('isSecureArea', true);
+/** @var $attribute Attribute */
+$attribute = Bootstrap::getObjectManager()->create(
+    Attribute::class
+);
+$attribute->load('dropdown_attribute_with_html', 'attribute_code');
+$attribute->delete();
+
+$registry->unregister('isSecureArea');
+$registry->register('isSecureArea', false);
-- 
GitLab


From 45cc40d9ce3fab8412380fb91e4b526a1d4b8604 Mon Sep 17 00:00:00 2001
From: Michail Slabko <mslabko@magento.com>
Date: Wed, 6 Dec 2017 12:16:54 +0200
Subject: [PATCH 270/380] MAGETWO-75786: Incorrect count for category filter at
 layered navigation for configurable with no available options

---
 .../app/Magento/LayeredNavigation/Test/Repository/Category.xml  | 2 +-
 .../Test/TestCase/ProductsCountInLayeredNavigationTest.php      | 2 +-
 .../Test/TestCase/ProductsCountInLayeredNavigationTest.xml      | 2 +-
 .../Magento/CatalogSearch/Model/Indexer/FulltextTest.php        | 1 +
 .../_files/product_configurable_with_single_child.php           | 2 +-
 .../_files/product_configurable_with_single_child_rollback.php  | 2 +-
 6 files changed, 6 insertions(+), 5 deletions(-)

diff --git a/dev/tests/functional/tests/app/Magento/LayeredNavigation/Test/Repository/Category.xml b/dev/tests/functional/tests/app/Magento/LayeredNavigation/Test/Repository/Category.xml
index 4d463f0b936..7799faf309c 100644
--- a/dev/tests/functional/tests/app/Magento/LayeredNavigation/Test/Repository/Category.xml
+++ b/dev/tests/functional/tests/app/Magento/LayeredNavigation/Test/Repository/Category.xml
@@ -1,7 +1,7 @@
 <?xml version="1.0" ?>
 <!--
 /**
- * Copyright © 2013-2017 Magento, Inc. All rights reserved.
+ * Copyright © Magento, Inc. All rights reserved.
  * See COPYING.txt for license details.
  */
 -->
diff --git a/dev/tests/functional/tests/app/Magento/LayeredNavigation/Test/TestCase/ProductsCountInLayeredNavigationTest.php b/dev/tests/functional/tests/app/Magento/LayeredNavigation/Test/TestCase/ProductsCountInLayeredNavigationTest.php
index 32ad64d6dec..179f9ef2579 100644
--- a/dev/tests/functional/tests/app/Magento/LayeredNavigation/Test/TestCase/ProductsCountInLayeredNavigationTest.php
+++ b/dev/tests/functional/tests/app/Magento/LayeredNavigation/Test/TestCase/ProductsCountInLayeredNavigationTest.php
@@ -1,6 +1,6 @@
 <?php
 /**
- * Copyright © 2013-2017 Magento, Inc. All rights reserved.
+ * Copyright © Magento, Inc. All rights reserved.
  * See COPYING.txt for license details.
  */
 namespace Magento\LayeredNavigation\Test\TestCase;
diff --git a/dev/tests/functional/tests/app/Magento/LayeredNavigation/Test/TestCase/ProductsCountInLayeredNavigationTest.xml b/dev/tests/functional/tests/app/Magento/LayeredNavigation/Test/TestCase/ProductsCountInLayeredNavigationTest.xml
index a832163ceea..41e18e64540 100644
--- a/dev/tests/functional/tests/app/Magento/LayeredNavigation/Test/TestCase/ProductsCountInLayeredNavigationTest.xml
+++ b/dev/tests/functional/tests/app/Magento/LayeredNavigation/Test/TestCase/ProductsCountInLayeredNavigationTest.xml
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
 /**
- * Copyright © 2013-2017 Magento, Inc. All rights reserved.
+ * Copyright © Magento, Inc. All rights reserved.
  * See COPYING.txt for license details.
  */
 -->
diff --git a/dev/tests/integration/testsuite/Magento/CatalogSearch/Model/Indexer/FulltextTest.php b/dev/tests/integration/testsuite/Magento/CatalogSearch/Model/Indexer/FulltextTest.php
index ffd837aaca6..da2fc449871 100644
--- a/dev/tests/integration/testsuite/Magento/CatalogSearch/Model/Indexer/FulltextTest.php
+++ b/dev/tests/integration/testsuite/Magento/CatalogSearch/Model/Indexer/FulltextTest.php
@@ -13,6 +13,7 @@ use Magento\TestFramework\Helper\Bootstrap;
 /**
  * @magentoDbIsolation disabled
  * @magentoDataFixture Magento/CatalogSearch/_files/indexer_fulltext.php
+ * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
  */
 class FulltextTest extends \PHPUnit\Framework\TestCase
 {
diff --git a/dev/tests/integration/testsuite/Magento/CatalogSearch/_files/product_configurable_with_single_child.php b/dev/tests/integration/testsuite/Magento/CatalogSearch/_files/product_configurable_with_single_child.php
index a1e1c30323c..5172ea94e53 100644
--- a/dev/tests/integration/testsuite/Magento/CatalogSearch/_files/product_configurable_with_single_child.php
+++ b/dev/tests/integration/testsuite/Magento/CatalogSearch/_files/product_configurable_with_single_child.php
@@ -1,6 +1,6 @@
 <?php
 /**
- * Copyright © 2013-2017 Magento, Inc. All rights reserved.
+ * Copyright © Magento, Inc. All rights reserved.
  * See COPYING.txt for license details.
  */
 use Magento\Catalog\Api\ProductRepositoryInterface;
diff --git a/dev/tests/integration/testsuite/Magento/CatalogSearch/_files/product_configurable_with_single_child_rollback.php b/dev/tests/integration/testsuite/Magento/CatalogSearch/_files/product_configurable_with_single_child_rollback.php
index bc27505ac51..85a72789e7f 100644
--- a/dev/tests/integration/testsuite/Magento/CatalogSearch/_files/product_configurable_with_single_child_rollback.php
+++ b/dev/tests/integration/testsuite/Magento/CatalogSearch/_files/product_configurable_with_single_child_rollback.php
@@ -1,6 +1,6 @@
 <?php
 /**
- * Copyright © 2013-2017 Magento, Inc. All rights reserved.
+ * Copyright © Magento, Inc. All rights reserved.
  * See COPYING.txt for license details.
  */
 use Magento\Catalog\Api\Data\ProductInterface;
-- 
GitLab


From d81d25edbc1cfb8b8f5e0c39bbaf48ee28abe7e4 Mon Sep 17 00:00:00 2001
From: Stanislav Idolov <sidolov@magento.com>
Date: Wed, 6 Dec 2017 12:37:56 +0200
Subject: [PATCH 271/380] magento/magento2#11099

---
 .../Catalog/Api/ProductCustomOptionRepositoryTest.php        | 5 +++--
 .../Catalog/Api/_files/product_options_update_negative.php   | 4 +++-
 2 files changed, 6 insertions(+), 3 deletions(-)

diff --git a/dev/tests/api-functional/testsuite/Magento/Catalog/Api/ProductCustomOptionRepositoryTest.php b/dev/tests/api-functional/testsuite/Magento/Catalog/Api/ProductCustomOptionRepositoryTest.php
index b0dd2702f89..34588c9573f 100644
--- a/dev/tests/api-functional/testsuite/Magento/Catalog/Api/ProductCustomOptionRepositoryTest.php
+++ b/dev/tests/api-functional/testsuite/Magento/Catalog/Api/ProductCustomOptionRepositoryTest.php
@@ -391,8 +391,9 @@ class ProductCustomOptionRepositoryTest extends WebapiAbstract
      * @dataProvider optionNegativeUpdateDataProvider
      * @param array $optionData
      * @param string $message
+     * @param int $exceptionCode
      */
-    public function testUpdateNegative($optionData, $message)
+    public function testUpdateNegative($optionData, $message, $exceptionCode)
     {
         $this->_markTestAsRestOnly();
         $productSku = 'simple';
@@ -411,7 +412,7 @@ class ProductCustomOptionRepositoryTest extends WebapiAbstract
 
         $this->expectException('Exception');
         $this->expectExceptionMessage($message);
-        $this->expectExceptionCode(400);
+        $this->expectExceptionCode($exceptionCode);
         $this->_webApiCall($serviceInfo, ['option' => $optionData]);
     }
 
diff --git a/dev/tests/api-functional/testsuite/Magento/Catalog/Api/_files/product_options_update_negative.php b/dev/tests/api-functional/testsuite/Magento/Catalog/Api/_files/product_options_update_negative.php
index 08a14c2e7b2..d819fb5f604 100644
--- a/dev/tests/api-functional/testsuite/Magento/Catalog/Api/_files/product_options_update_negative.php
+++ b/dev/tests/api-functional/testsuite/Magento/Catalog/Api/_files/product_options_update_negative.php
@@ -16,6 +16,7 @@ return [
             'max_characters' => 10,
         ],
         'ProductSku should be specified',
+        400
     ],
     'invalid_product_sku' => [
         [
@@ -25,9 +26,10 @@ return [
             'is_require'     => 1,
             'price'          => 10.0,
             'price_type'     => 'fixed',
-            'sku'            => 'sku1',
+            'product_sku'            => 'sku1',
             'max_characters' => 10,
         ],
         'Requested product doesn\'t exist',
+        404
     ],
 ];
-- 
GitLab


From bd6d35c41739d4060d87169f2a7f160a2b916eab Mon Sep 17 00:00:00 2001
From: RomanKis <romaikiss@gmail.com>
Date: Wed, 6 Dec 2017 12:43:40 +0200
Subject: [PATCH 272/380] 8507: There is invalid type in PHPDoc block of
 \Magento\Framework\Data\Tree::getNodeById()

---
 lib/internal/Magento/Framework/Data/Tree.php | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/lib/internal/Magento/Framework/Data/Tree.php b/lib/internal/Magento/Framework/Data/Tree.php
index b4583381848..b348bc8fdc9 100644
--- a/lib/internal/Magento/Framework/Data/Tree.php
+++ b/lib/internal/Magento/Framework/Data/Tree.php
@@ -189,7 +189,7 @@ class Tree
     /**
      * Enter description here...
      *
-     * @param Node $nodeId
+     * @param string|int $nodeId
      * @return Node
      */
     public function getNodeById($nodeId)
-- 
GitLab


From 0c069a257624c477cf44ba4f53b47400f06b3bfa Mon Sep 17 00:00:00 2001
From: magento-engcom-team <mikola.malevanec@transoftgroup.com>
Date: Wed, 6 Dec 2017 13:03:05 +0200
Subject: [PATCH 273/380] 8011: Strip Tags from attribute.

---
 .../Condition/Product/AbstractProductTest.php | 28 ++++++-------------
 1 file changed, 8 insertions(+), 20 deletions(-)

diff --git a/dev/tests/integration/testsuite/Magento/Rule/Model/Condition/Product/AbstractProductTest.php b/dev/tests/integration/testsuite/Magento/Rule/Model/Condition/Product/AbstractProductTest.php
index 5052525f557..3c706b453b4 100644
--- a/dev/tests/integration/testsuite/Magento/Rule/Model/Condition/Product/AbstractProductTest.php
+++ b/dev/tests/integration/testsuite/Magento/Rule/Model/Condition/Product/AbstractProductTest.php
@@ -69,27 +69,15 @@ class AbstractProductTest extends \PHPUnit\Framework\TestCase
      *
      * @magentoDataFixture Magento/Rule/_files/dropdown_attribute_with_html.php
      */
-    public function test()
+    public function testGetValueSelectOptions()
     {
-        $expectedOptions = [
-            [
-                'label' => ' ',
-                'value' => '',
-            ],
-            [
-                'value' => '4',
-                'label' => 'Option 1',
-            ],
-            [
-                'value' => '5',
-                'label' => 'Option 2',
-            ],
-            [
-                'value' => '6',
-                'label' => 'Option 3',
-            ],
-        ];
+        $expectedLabels = [' ', 'Option 1', 'Option 2', 'Option 3'];
         $this->model->setAttribute('dropdown_attribute_with_html');
-        self::assertSame($expectedOptions, $this->model->getValueSelectOptions());
+        $options = $this->model->getValueSelectOptions();
+        $labels = [];
+        foreach ($options as $option) {
+            $labels[] = $option['label'];
+        }
+        self::assertSame($expectedLabels, $labels);
     }
 }
-- 
GitLab


From 5e93220a56bd741d3ec27b8a0fffd2f539e4e473 Mon Sep 17 00:00:00 2001
From: RomanKis <romaikiss@gmail.com>
Date: Wed, 6 Dec 2017 15:53:14 +0200
Subject: [PATCH 274/380] 8437:Silent error when an email template is not found

---
 .../Customer/Model/AccountManagement.php      |  2 +
 .../Test/Unit/Model/AccountManagementTest.php | 98 +++++++++++++++++++
 .../Magento/Email/Model/Template/Config.php   | 23 ++++-
 .../Test/Unit/Model/Template/ConfigTest.php   | 13 +++
 4 files changed, 135 insertions(+), 1 deletion(-)

diff --git a/app/code/Magento/Customer/Model/AccountManagement.php b/app/code/Magento/Customer/Model/AccountManagement.php
index ba646549f69..894dd5931a6 100644
--- a/app/code/Magento/Customer/Model/AccountManagement.php
+++ b/app/code/Magento/Customer/Model/AccountManagement.php
@@ -817,6 +817,8 @@ class AccountManagement implements AccountManagementInterface
         } catch (MailException $e) {
             // If we are not able to send a new account email, this should be ignored
             $this->logger->critical($e);
+        } catch (\UnexpectedValueException $e) {
+            $this->logger->error($e);
         }
     }
 
diff --git a/app/code/Magento/Customer/Test/Unit/Model/AccountManagementTest.php b/app/code/Magento/Customer/Test/Unit/Model/AccountManagementTest.php
index 2a6b9fe6fd4..676e9c98a20 100644
--- a/app/code/Magento/Customer/Test/Unit/Model/AccountManagementTest.php
+++ b/app/code/Magento/Customer/Test/Unit/Model/AccountManagementTest.php
@@ -1721,4 +1721,102 @@ class AccountManagementTest extends \PHPUnit\Framework\TestCase
 
         return $dateTime;
     }
+
+    public function testCreateAccountUnexpectedValueException()
+    {
+        $websiteId = 1;
+        $storeId = null;
+        $defaultStoreId = 1;
+        $customerId = 1;
+        $customerEmail = 'email@email.com';
+        $newLinkToken = '2jh43j5h2345jh23lh452h345hfuzasd96ofu';
+        $exception = new \UnexpectedValueException('Template file was not found');
+
+        $datetime = $this->prepareDateTimeFactory();
+
+        $address = $this->createMock(\Magento\Customer\Api\Data\AddressInterface::class);
+        $address->expects($this->once())
+            ->method('setCustomerId')
+            ->with($customerId);
+        $store = $this->createMock(\Magento\Store\Model\Store::class);
+        $store->expects($this->once())
+            ->method('getId')
+            ->willReturn($defaultStoreId);
+        $website = $this->createMock(\Magento\Store\Model\Website::class);
+        $website->expects($this->atLeastOnce())
+            ->method('getStoreIds')
+            ->willReturn([1, 2, 3]);
+        $website->expects($this->once())
+            ->method('getDefaultStore')
+            ->willReturn($store);
+        $customer = $this->createMock(\Magento\Customer\Api\Data\CustomerInterface::class);
+        $customer->expects($this->atLeastOnce())
+            ->method('getId')
+            ->willReturn($customerId);
+        $customer->expects($this->atLeastOnce())
+            ->method('getEmail')
+            ->willReturn($customerEmail);
+        $customer->expects($this->atLeastOnce())
+            ->method('getWebsiteId')
+            ->willReturn($websiteId);
+        $customer->expects($this->atLeastOnce())
+            ->method('getStoreId')
+            ->willReturn($storeId);
+        $customer->expects($this->once())
+            ->method('setStoreId')
+            ->with($defaultStoreId);
+        $customer->expects($this->once())
+            ->method('getAddresses')
+            ->willReturn([$address]);
+        $customer->expects($this->once())
+            ->method('setAddresses')
+            ->with(null);
+        $this->customerRepository->expects($this->once())
+            ->method('get')
+            ->with($customerEmail)
+            ->willReturn($customer);
+        $this->share->expects($this->once())
+            ->method('isWebsiteScope')
+            ->willReturn(true);
+        $this->storeManager->expects($this->atLeastOnce())
+            ->method('getWebsite')
+            ->with($websiteId)
+            ->willReturn($website);
+        $this->customerRepository->expects($this->atLeastOnce())
+            ->method('save')
+            ->willReturn($customer);
+        $this->addressRepository->expects($this->atLeastOnce())
+            ->method('save')
+            ->with($address);
+        $this->customerRepository->expects($this->once())
+            ->method('getById')
+            ->with($customerId)
+            ->willReturn($customer);
+        $this->random->expects($this->once())
+            ->method('getUniqueHash')
+            ->willReturn($newLinkToken);
+        $customerSecure = $this->createPartialMock(
+            \Magento\Customer\Model\Data\CustomerSecure::class,
+            ['setRpToken', 'setRpTokenCreatedAt', 'getPasswordHash']
+        );
+        $customerSecure->expects($this->any())
+            ->method('setRpToken')
+            ->with($newLinkToken);
+        $customerSecure->expects($this->any())
+            ->method('setRpTokenCreatedAt')
+            ->with($datetime)
+            ->willReturnSelf();
+        $customerSecure->expects($this->any())
+            ->method('getPasswordHash')
+            ->willReturn(null);
+        $this->customerRegistry->expects($this->atLeastOnce())
+            ->method('retrieveSecureData')
+            ->willReturn($customerSecure);
+        $this->emailNotificationMock->expects($this->once())
+            ->method('newAccount')
+            ->willThrowException($exception);
+        $this->logger->expects($this->once())->method('error')->with($exception);
+
+        $this->accountManagement->createAccount($customer);
+    }
 }
diff --git a/app/code/Magento/Email/Model/Template/Config.php b/app/code/Magento/Email/Model/Template/Config.php
index bdd9054e796..8a7e7172a8e 100644
--- a/app/code/Magento/Email/Model/Template/Config.php
+++ b/app/code/Magento/Email/Model/Template/Config.php
@@ -205,8 +205,9 @@ class Config implements \Magento\Framework\Mail\Template\ConfigInterface
         $designParams['module'] = $module;
 
         $file = $this->_getInfo($templateId, 'file');
+        $filename = $this->getFilename($file, $designParams, $module);
 
-        return $this->viewFileSystem->getEmailTemplateFileName($file, $designParams, $module);
+        return $filename;
     }
 
     /**
@@ -230,4 +231,24 @@ class Config implements \Magento\Framework\Mail\Template\ConfigInterface
         }
         return $data[$templateId][$fieldName];
     }
+
+    /**
+     * @param string $file
+     * @param array $designParams
+     * @param string $module
+     *
+     * @return string
+     *
+     * @throws \UnexpectedValueException
+     */
+    private function getFilename($file, array $designParams, $module)
+    {
+        $filename = $this->viewFileSystem->getEmailTemplateFileName($file, $designParams, $module);
+
+        if ($filename === false) {
+            throw new \UnexpectedValueException("Template file '{$file}' is not found.");
+        }
+
+        return $filename;
+    }
 }
diff --git a/app/code/Magento/Email/Test/Unit/Model/Template/ConfigTest.php b/app/code/Magento/Email/Test/Unit/Model/Template/ConfigTest.php
index 6ec3905fe46..6cb51ee8328 100644
--- a/app/code/Magento/Email/Test/Unit/Model/Template/ConfigTest.php
+++ b/app/code/Magento/Email/Test/Unit/Model/Template/ConfigTest.php
@@ -272,6 +272,19 @@ class ConfigTest extends \PHPUnit\Framework\TestCase
         $this->assertEquals('_files/Fixture/ModuleOne/view/frontend/email/one.html', $actualResult);
     }
 
+    /**
+     * @expectedException \UnexpectedValueException
+     * @expectedExceptionMessage Template file 'one.html' is not found
+     */
+    public function testGetTemplateFilenameWrongFileName()
+    {
+        $this->viewFileSystem->expects($this->once())->method('getEmailTemplateFileName')
+            ->with('one.html', $this->designParams, 'Fixture_ModuleOne')
+            ->willReturn(false);
+
+        $this->model->getTemplateFilename('template_one', $this->designParams);
+    }
+
     /**
      * @param string $getterMethod
      * @param $argument
-- 
GitLab


From be347775dcc199c221b2916108e47049996a6e9a Mon Sep 17 00:00:00 2001
From: Michail Slabko <mslabko@magento.com>
Date: Wed, 6 Dec 2017 20:22:10 +0200
Subject: [PATCH 275/380] MAGETWO-75786: Incorrect count for category filter at
 layered navigation for configurable with no available options

---
 .../Catalog/Model/Indexer/Product/Category/Action/Rows.php       | 1 -
 .../Magento/CatalogSearch/Model/Indexer/Fulltext/Action/Full.php | 1 -
 2 files changed, 2 deletions(-)

diff --git a/app/code/Magento/Catalog/Model/Indexer/Product/Category/Action/Rows.php b/app/code/Magento/Catalog/Model/Indexer/Product/Category/Action/Rows.php
index bba8cf66567..99b087691ab 100644
--- a/app/code/Magento/Catalog/Model/Indexer/Product/Category/Action/Rows.php
+++ b/app/code/Magento/Catalog/Model/Indexer/Product/Category/Action/Rows.php
@@ -114,7 +114,6 @@ class Rows extends \Magento\Catalog\Model\Indexer\Category\Product\AbstractActio
             ->from(['relation' => $this->getTable('catalog_product_relation')], [])
             ->distinct(true)
             ->where('child_id IN (?)', $childProductIds)
-            ->where('parent_id NOT IN (?)', $childProductIds)
             ->join(
                 ['cpe' => $this->getTable('catalog_product_entity')],
                 'relation.parent_id = cpe.' . $fieldForParent,
diff --git a/app/code/Magento/CatalogSearch/Model/Indexer/Fulltext/Action/Full.php b/app/code/Magento/CatalogSearch/Model/Indexer/Fulltext/Action/Full.php
index a517594322d..5abcd5e7592 100644
--- a/app/code/Magento/CatalogSearch/Model/Indexer/Fulltext/Action/Full.php
+++ b/app/code/Magento/CatalogSearch/Model/Indexer/Fulltext/Action/Full.php
@@ -318,7 +318,6 @@ class Full
             )
             ->distinct(true)
             ->where('child_id IN (?)', $entityIds)
-            ->where('parent_id NOT IN (?)', $entityIds)
             ->join(
                 ['cpe' => $this->getTable('catalog_product_entity')],
                 'relation.parent_id = cpe.' . $linkField,
-- 
GitLab


From c45ec2a7f2211020617ec9e0ab9e2b7673cde6b8 Mon Sep 17 00:00:00 2001
From: magento-engcom-team <mikola.malevanec@transoftgroup.com>
Date: Thu, 7 Dec 2017 11:52:23 +0200
Subject: [PATCH 276/380] 10797: catalogProductTierPriceManagementV1 DELETE and
 POST operation wipes out media gallery selections when used on store code
 "all".

---
 .../Catalog/Model/ProductRepository.php        | 18 ++++++++++--------
 .../Api/ProductTierPriceManagementTest.php     | 10 ++++++++--
 2 files changed, 18 insertions(+), 10 deletions(-)

diff --git a/app/code/Magento/Catalog/Model/ProductRepository.php b/app/code/Magento/Catalog/Model/ProductRepository.php
index e814dc03cf3..3f4d275fb95 100644
--- a/app/code/Magento/Catalog/Model/ProductRepository.php
+++ b/app/code/Magento/Catalog/Model/ProductRepository.php
@@ -489,16 +489,17 @@ class ProductRepository implements \Magento\Catalog\Api\ProductRepositoryInterfa
      * @throws InputException
      * @throws StateException
      * @SuppressWarnings(PHPMD.CyclomaticComplexity)
+     * @throws LocalizedException
      */
-    protected function processMediaGallery(ProductInterface $product, $mediaGalleryEntries)
+    protected function processMediaGallery(ProductInterface $product, array $mediaGalleryEntries)
     {
         $existingMediaGallery = $product->getMediaGallery('images');
         $newEntries = [];
         $entriesById = [];
         if (!empty($existingMediaGallery)) {
             foreach ($mediaGalleryEntries as $entry) {
-                if (isset($entry['value_id'])) {
-                    $entriesById[$entry['value_id']] = $entry;
+                if (isset($entry['id'])) {
+                    $entriesById[$entry['id']] = $entry;
                 } else {
                     $newEntries[] = $entry;
                 }
@@ -515,6 +516,7 @@ class ProductRepository implements \Magento\Catalog\Api\ProductRepositoryInterfa
                     $existingEntry['removed'] = true;
                 }
             }
+            unset($existingEntry);
             $product->setData('media_gallery', ["images" => $existingMediaGallery]);
         } else {
             $newEntries = $mediaGalleryEntries;
@@ -536,9 +538,9 @@ class ProductRepository implements \Magento\Catalog\Api\ProductRepositoryInterfa
             }
             /** @var ImageContentInterface $contentDataObject */
             $contentDataObject = $this->contentFactory->create()
-                ->setName($newEntry['content']['data'][ImageContentInterface::NAME])
-                ->setBase64EncodedData($newEntry['content']['data'][ImageContentInterface::BASE64_ENCODED_DATA])
-                ->setType($newEntry['content']['data'][ImageContentInterface::TYPE]);
+                ->setName($newEntry['content'][ImageContentInterface::NAME])
+                ->setBase64EncodedData($newEntry['content'][ImageContentInterface::BASE64_ENCODED_DATA])
+                ->setType($newEntry['content'][ImageContentInterface::TYPE]);
             $newEntry['content'] = $contentDataObject;
             $this->processNewMediaGalleryEntry($product, $newEntry);
 
@@ -587,8 +589,8 @@ class ProductRepository implements \Magento\Catalog\Api\ProductRepositoryInterfa
         $product = $this->initializeProductData($productDataArray, empty($existingProduct));
 
         $this->processLinks($product, $productLinks);
-        if (isset($productDataArray['media_gallery'])) {
-            $this->processMediaGallery($product, $productDataArray['media_gallery']['images']);
+        if (isset($productDataArray['media_gallery_entries'])) {
+            $this->processMediaGallery($product, $productDataArray['media_gallery_entries']);
         }
 
         if (!$product->getOptionsReadonly()) {
diff --git a/dev/tests/api-functional/testsuite/Magento/Catalog/Api/ProductTierPriceManagementTest.php b/dev/tests/api-functional/testsuite/Magento/Catalog/Api/ProductTierPriceManagementTest.php
index 315458a0e38..7df0aede46b 100644
--- a/dev/tests/api-functional/testsuite/Magento/Catalog/Api/ProductTierPriceManagementTest.php
+++ b/dev/tests/api-functional/testsuite/Magento/Catalog/Api/ProductTierPriceManagementTest.php
@@ -60,15 +60,17 @@ class ProductTierPriceManagementTest extends WebapiAbstract
     /**
      * @param string|int $customerGroupId
      * @param int $qty
-     * @magentoApiDataFixture Magento/Catalog/_files/product_simple.php
+     * @magentoApiDataFixture Magento/Catalog/_files/product_with_image.php
      * @dataProvider deleteDataProvider
      */
     public function testDelete($customerGroupId, $qty)
     {
         $productSku = 'simple';
+        $objectManager = \Magento\TestFramework\ObjectManager::getInstance();
+        $productBefore = $objectManager->get(ProductRepositoryInterface::class)->get($productSku, false, null, true);
         $serviceInfo = [
             'rest' => [
-                'resourcePath' =>   self::RESOURCE_PATH
+                'resourcePath' => self::RESOURCE_PATH
                     . $productSku . "/group-prices/" . $customerGroupId . "/tiers/" . $qty,
                 'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_DELETE,
             ],
@@ -80,6 +82,10 @@ class ProductTierPriceManagementTest extends WebapiAbstract
         ];
         $requestData = ['sku' => $productSku, 'customerGroupId' => $customerGroupId, 'qty' => $qty];
         $this->assertTrue($this->_webApiCall($serviceInfo, $requestData));
+        $productAfter = $objectManager->get(ProductRepositoryInterface::class)->get($productSku, false, null, true);
+        $this->assertSame($productBefore->getImage(), $productAfter->getImage());
+        $this->assertSame($productBefore->getSmallImage(), $productAfter->getSmallImage());
+        $this->assertSame($productBefore->getThumbnail(), $productAfter->getThumbnail());
     }
 
     public function deleteDataProvider()
-- 
GitLab


From fd5f40a94dc66806aa98822c87ade74d4a8025d7 Mon Sep 17 00:00:00 2001
From: RomanKis <romaikiss@gmail.com>
Date: Thu, 7 Dec 2017 12:20:52 +0200
Subject: [PATCH 277/380] 8410: Custom Checkout Step and Shipping Step are
 Highlighted

---
 .../Checkout/view/frontend/web/js/view/payment.js      | 10 ++++++++++
 .../Checkout/view/frontend/web/js/view/shipping.js     |  8 ++++++++
 2 files changed, 18 insertions(+)

diff --git a/app/code/Magento/Checkout/view/frontend/web/js/view/payment.js b/app/code/Magento/Checkout/view/frontend/web/js/view/payment.js
index c17e5e40d5c..94ccf7a24f3 100644
--- a/app/code/Magento/Checkout/view/frontend/web/js/view/payment.js
+++ b/app/code/Magento/Checkout/view/frontend/web/js/view/payment.js
@@ -46,8 +46,18 @@ define([
 
         /** @inheritdoc */
         initialize: function () {
+            var self = this;
             this._super();
             checkoutDataResolver.resolvePaymentMethod();
+
+            //If some step is active this step will become inactive.
+            stepNavigator.steps().some(function (element) {
+                if (element.isVisible()) {
+                    self.isVisible(false);
+                    return true;
+                }
+            });
+
             stepNavigator.registerStep(
                 'payment',
                 null,
diff --git a/app/code/Magento/Checkout/view/frontend/web/js/view/shipping.js b/app/code/Magento/Checkout/view/frontend/web/js/view/shipping.js
index 619de95e467..a6e7e3efd3d 100644
--- a/app/code/Magento/Checkout/view/frontend/web/js/view/shipping.js
+++ b/app/code/Magento/Checkout/view/frontend/web/js/view/shipping.js
@@ -82,6 +82,14 @@ define([
             this._super();
 
             if (!quote.isVirtual()) {
+                //If some step is active this step will become inactive.
+                stepNavigator.steps().some(function (element) {
+                    if (element.isVisible()) {
+                        self.visible(false);
+                        return true;
+                    }
+                });
+
                 stepNavigator.registerStep(
                     'shipping',
                     '',
-- 
GitLab


From c12dc31bc40536e5f13577475f0dc28d451b2c17 Mon Sep 17 00:00:00 2001
From: RomanKis <romaikiss@gmail.com>
Date: Thu, 7 Dec 2017 14:21:16 +0200
Subject: [PATCH 278/380] 8410: Custom Checkout Step and Shipping Step are
 Highlighted

---
 .../app/code/Magento/Checkout/frontend/js/view/shipping.test.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/dev/tests/js/jasmine/tests/app/code/Magento/Checkout/frontend/js/view/shipping.test.js b/dev/tests/js/jasmine/tests/app/code/Magento/Checkout/frontend/js/view/shipping.test.js
index be27e16a137..b25c36de28a 100644
--- a/dev/tests/js/jasmine/tests/app/code/Magento/Checkout/frontend/js/view/shipping.test.js
+++ b/dev/tests/js/jasmine/tests/app/code/Magento/Checkout/frontend/js/view/shipping.test.js
@@ -42,7 +42,7 @@ define(['squire', 'ko', 'jquery', 'jquery/validate'], function (Squire, ko, $) {
             'Magento_Checkout/js/action/select-shipping-method': jasmine.createSpy(),
             'Magento_Checkout/js/model/shipping-rate-registry': jasmine.createSpy(),
             'Magento_Checkout/js/action/set-shipping-information': jasmine.createSpy(),
-            'Magento_Checkout/js/model/step-navigator': jasmine.createSpyObj('navigator', ['registerStep']),
+            'Magento_Checkout/js/model/step-navigator': jasmine.createSpyObj('navigator', ['registerStep', 'steps']),
             'Magento_Ui/js/modal/modal': jasmine.createSpy('modal').and.returnValue(modalStub),
             'Magento_Checkout/js/model/checkout-data-resolver': jasmine.createSpyObj(
                 'dataResolver',
-- 
GitLab


From 7959af7912ee5262ad0db46b3b57f2ef93dbc7c0 Mon Sep 17 00:00:00 2001
From: magento-engcom-team <mikola.malevanec@transoftgroup.com>
Date: Thu, 7 Dec 2017 15:49:41 +0200
Subject: [PATCH 279/380] 10797: catalogProductTierPriceManagementV1 DELETE and
 POST operation wipes out media gallery selections when used on store code
 "all".

---
 .../Catalog/Model/ProductRepository.php       | 24 ++++++++++++++++++-
 .../Test/Unit/Model/ProductRepositoryTest.php | 23 ++++++++++++++----
 2 files changed, 41 insertions(+), 6 deletions(-)

diff --git a/app/code/Magento/Catalog/Model/ProductRepository.php b/app/code/Magento/Catalog/Model/ProductRepository.php
index 3f4d275fb95..e6d2de03653 100644
--- a/app/code/Magento/Catalog/Model/ProductRepository.php
+++ b/app/code/Magento/Catalog/Model/ProductRepository.php
@@ -507,7 +507,7 @@ class ProductRepository implements \Magento\Catalog\Api\ProductRepositoryInterfa
             foreach ($existingMediaGallery as $key => &$existingEntry) {
                 if (isset($entriesById[$existingEntry['value_id']])) {
                     $updatedEntry = $entriesById[$existingEntry['value_id']];
-                    if ($updatedEntry['file'] === null) {
+                    if (isset($updatedEntry['file']) && $updatedEntry['file'] === null) {
                         unset($updatedEntry['file']);
                     }
                     $existingMediaGallery[$key] = array_merge($existingEntry, $updatedEntry);
@@ -546,6 +546,9 @@ class ProductRepository implements \Magento\Catalog\Api\ProductRepositoryInterfa
 
             $finalGallery = $product->getData('media_gallery');
             $newEntryId = key(array_diff_key($product->getData('media_gallery')['images'], $entriesById));
+            if (isset($newEntry['extension_attributes'])) {
+                $this->processExtensionAttributes($newEntry, $newEntry['extension_attributes']);
+            }
             $newEntry = array_replace_recursive($newEntry, $finalGallery['images'][$newEntryId]);
             $entriesById[$newEntryId] = $newEntry;
             $finalGallery['images'][$newEntryId] = $newEntry;
@@ -788,4 +791,23 @@ class ProductRepository implements \Magento\Catalog\Api\ProductRepositoryInterfa
         }
         return $this->collectionProcessor;
     }
+
+    /**
+     * Convert extension attribute for product media gallery.
+     *
+     * @param array $newEntry
+     * @param array $extensionAttributes
+     * @return void
+     */
+    private function processExtensionAttributes(array &$newEntry, array $extensionAttributes)
+    {
+        foreach ($extensionAttributes as $code => $value) {
+            if (is_array($value)) {
+                $this->processExtensionAttributes($newEntry, $value);
+            } else {
+                $newEntry[$code] = $value;
+            }
+        }
+        unset($newEntry['extension_attributes']);
+    }
 }
diff --git a/app/code/Magento/Catalog/Test/Unit/Model/ProductRepositoryTest.php b/app/code/Magento/Catalog/Test/Unit/Model/ProductRepositoryTest.php
index c98705b4eda..8cd3fcd1149 100644
--- a/app/code/Magento/Catalog/Test/Unit/Model/ProductRepositoryTest.php
+++ b/app/code/Magento/Catalog/Test/Unit/Model/ProductRepositoryTest.php
@@ -9,7 +9,6 @@
 
 namespace Magento\Catalog\Test\Unit\Model;
 
-use Magento\Catalog\Api\Data\ProductAttributeInterface;
 use Magento\Framework\Api\Data\ImageContentInterface;
 use Magento\Framework\Api\SearchCriteria\CollectionProcessorInterface;
 use Magento\Framework\DB\Adapter\ConnectionException;
@@ -1178,7 +1177,21 @@ class ProductRepositoryTest extends \PHPUnit\Framework\TestCase
 
         $this->setupProductMocksForSave();
         //media gallery data
-        $this->productData['media_gallery'] = $newEntriesData;
+        $this->productData['media_gallery_entries'] = [
+            [
+                'id' => null,
+                'label' => "label_text",
+                'position' => 10,
+                'disabled' => false,
+                'types' => ['image', 'small_image'],
+                'content' => [
+                        ImageContentInterface::NAME => 'filename',
+                        ImageContentInterface::TYPE => 'image/jpeg',
+                        ImageContentInterface::BASE64_ENCODED_DATA => 'encoded_content',
+                ],
+                'media_type' => 'media_type',
+            ]
+        ];
         $this->extensibleDataObjectConverterMock
             ->expects($this->once())
             ->method('toNestedArray')
@@ -1288,7 +1301,7 @@ class ProductRepositoryTest extends \PHPUnit\Framework\TestCase
         //update one entry, delete one entry
         $newEntries = [
             [
-                'value_id' => 5,
+                'id' => 5,
                 "label" => "new_label_text",
                 'file' => 'filename1',
                 'position' => 10,
@@ -1316,7 +1329,7 @@ class ProductRepositoryTest extends \PHPUnit\Framework\TestCase
         $expectedResult = [
             [
                 'value_id' => 5,
-                'value_id' => 5,
+                'id' => 5,
                 "label" => "new_label_text",
                 'file' => 'filename1',
                 'position' => 10,
@@ -1332,7 +1345,7 @@ class ProductRepositoryTest extends \PHPUnit\Framework\TestCase
 
         $this->setupProductMocksForSave();
         //media gallery data
-        $this->productData['media_gallery']['images'] = $newEntries;
+        $this->productData['media_gallery_entries'] = $newEntries;
         $this->extensibleDataObjectConverterMock
             ->expects($this->once())
             ->method('toNestedArray')
-- 
GitLab


From 5aef35b950f77917f39406bfcfc9c481275cefe9 Mon Sep 17 00:00:00 2001
From: magento-engcom-team <mikola.malevanec@transoftgroup.com>
Date: Thu, 7 Dec 2017 18:24:59 +0200
Subject: [PATCH 280/380] 10797: catalogProductTierPriceManagementV1 DELETE and
 POST operation wipes out media gallery selections when used on store code
 "all".

---
 .../Catalog/Model/ProductRepository.php       | 62 ++++++++++++-------
 1 file changed, 39 insertions(+), 23 deletions(-)

diff --git a/app/code/Magento/Catalog/Model/ProductRepository.php b/app/code/Magento/Catalog/Model/ProductRepository.php
index e6d2de03653..cdab94b57b4 100644
--- a/app/code/Magento/Catalog/Model/ProductRepository.php
+++ b/app/code/Magento/Catalog/Model/ProductRepository.php
@@ -488,8 +488,8 @@ class ProductRepository implements \Magento\Catalog\Api\ProductRepositoryInterfa
      * @return $this
      * @throws InputException
      * @throws StateException
-     * @SuppressWarnings(PHPMD.CyclomaticComplexity)
      * @throws LocalizedException
+     * @SuppressWarnings(PHPMD.CyclomaticComplexity)
      */
     protected function processMediaGallery(ProductInterface $product, array $mediaGalleryEntries)
     {
@@ -531,29 +531,8 @@ class ProductRepository implements \Magento\Catalog\Api\ProductRepositoryInterfa
                 }
             }
         }
+        $this->processEntries($product, $newEntries, $entriesById);
 
-        foreach ($newEntries as $newEntry) {
-            if (!isset($newEntry['content'])) {
-                throw new InputException(__('The image content is not valid.'));
-            }
-            /** @var ImageContentInterface $contentDataObject */
-            $contentDataObject = $this->contentFactory->create()
-                ->setName($newEntry['content'][ImageContentInterface::NAME])
-                ->setBase64EncodedData($newEntry['content'][ImageContentInterface::BASE64_ENCODED_DATA])
-                ->setType($newEntry['content'][ImageContentInterface::TYPE]);
-            $newEntry['content'] = $contentDataObject;
-            $this->processNewMediaGalleryEntry($product, $newEntry);
-
-            $finalGallery = $product->getData('media_gallery');
-            $newEntryId = key(array_diff_key($product->getData('media_gallery')['images'], $entriesById));
-            if (isset($newEntry['extension_attributes'])) {
-                $this->processExtensionAttributes($newEntry, $newEntry['extension_attributes']);
-            }
-            $newEntry = array_replace_recursive($newEntry, $finalGallery['images'][$newEntryId]);
-            $entriesById[$newEntryId] = $newEntry;
-            $finalGallery['images'][$newEntryId] = $newEntry;
-            $product->setData('media_gallery', $finalGallery);
-        }
         return $this;
     }
 
@@ -810,4 +789,41 @@ class ProductRepository implements \Magento\Catalog\Api\ProductRepositoryInterfa
         }
         unset($newEntry['extension_attributes']);
     }
+
+    /**
+     * Convert entries into product media gallery data and set to product.
+     *
+     * @param ProductInterface $product
+     * @param array $newEntries
+     * @param array $entriesById
+     * @throws InputException
+     * @throws LocalizedException
+     * @throws StateException
+     * @return void
+     */
+    private function processEntries(ProductInterface $product, array $newEntries, array $entriesById)
+    {
+        foreach ($newEntries as $newEntry) {
+            if (!isset($newEntry['content'])) {
+                throw new InputException(__('The image content is not valid.'));
+            }
+            /** @var ImageContentInterface $contentDataObject */
+            $contentDataObject = $this->contentFactory->create()
+                ->setName($newEntry['content'][ImageContentInterface::NAME])
+                ->setBase64EncodedData($newEntry['content'][ImageContentInterface::BASE64_ENCODED_DATA])
+                ->setType($newEntry['content'][ImageContentInterface::TYPE]);
+            $newEntry['content'] = $contentDataObject;
+            $this->processNewMediaGalleryEntry($product, $newEntry);
+
+            $finalGallery = $product->getData('media_gallery');
+            $newEntryId = key(array_diff_key($product->getData('media_gallery')['images'], $entriesById));
+            if (isset($newEntry['extension_attributes'])) {
+                $this->processExtensionAttributes($newEntry, $newEntry['extension_attributes']);
+            }
+            $newEntry = array_replace_recursive($newEntry, $finalGallery['images'][$newEntryId]);
+            $entriesById[$newEntryId] = $newEntry;
+            $finalGallery['images'][$newEntryId] = $newEntry;
+            $product->setData('media_gallery', $finalGallery);
+        }
+    }
 }
-- 
GitLab


From 4ac80e00d30d7bbffe843c92e775c583feaa82b4 Mon Sep 17 00:00:00 2001
From: nmalevanec <mikola.malevanec@transoftgroup.com>
Date: Fri, 8 Dec 2017 11:17:48 +0200
Subject: [PATCH 281/380] 10123: Wrong invoice entity_model in table
 eav_entity_type.

---
 app/code/Magento/Sales/Setup/UpgradeData.php | 8 ++++++++
 app/code/Magento/Sales/etc/module.xml        | 2 +-
 2 files changed, 9 insertions(+), 1 deletion(-)

diff --git a/app/code/Magento/Sales/Setup/UpgradeData.php b/app/code/Magento/Sales/Setup/UpgradeData.php
index 1c36a9a5383..16455d616d8 100644
--- a/app/code/Magento/Sales/Setup/UpgradeData.php
+++ b/app/code/Magento/Sales/Setup/UpgradeData.php
@@ -108,6 +108,14 @@ class UpgradeData implements UpgradeDataInterface
                 [$setup]
             );
         }
+        if (version_compare($context->getVersion(), '2.0.9', '<')) {
+            //Correct wrong source model for "invoice" entity type, introduced by mistake in 2.0.1 upgrade.
+            $salesSetup->updateEntityType(
+                'invoice',
+                'entity_model',
+                \Magento\Sales\Model\ResourceModel\Order\Invoice::class
+            );
+        }
         $this->eavConfig->clear();
     }
 
diff --git a/app/code/Magento/Sales/etc/module.xml b/app/code/Magento/Sales/etc/module.xml
index 58c7a4f2120..b234cdad876 100644
--- a/app/code/Magento/Sales/etc/module.xml
+++ b/app/code/Magento/Sales/etc/module.xml
@@ -6,7 +6,7 @@
  */
 -->
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
-    <module name="Magento_Sales" setup_version="2.0.8">
+    <module name="Magento_Sales" setup_version="2.0.9">
         <sequence>
             <module name="Magento_Rule"/>
             <module name="Magento_Catalog"/>
-- 
GitLab


From 0db60528b24e5fea1614b8cd20b67933758b95aa Mon Sep 17 00:00:00 2001
From: Pavel Bystritsky <p.bystritsky@yandex.ru>
Date: Fri, 8 Dec 2017 13:53:46 +0200
Subject: [PATCH 282/380] magento/magento2#12582: Can't remove item description
 from wishlist

---
 .../Wishlist/Controller/Index/Update.php      |   2 -
 .../Wishlist/Controller/UpdateTest.php        | 141 ++++++++++++++++++
 2 files changed, 141 insertions(+), 2 deletions(-)
 create mode 100644 dev/tests/integration/testsuite/Magento/Wishlist/Controller/UpdateTest.php

diff --git a/app/code/Magento/Wishlist/Controller/Index/Update.php b/app/code/Magento/Wishlist/Controller/Index/Update.php
index a79e4aa95ff..cc3f222c830 100644
--- a/app/code/Magento/Wishlist/Controller/Index/Update.php
+++ b/app/code/Magento/Wishlist/Controller/Index/Update.php
@@ -83,8 +83,6 @@ class Update extends \Magento\Wishlist\Controller\AbstractIndex
                 )->defaultCommentString()
                 ) {
                     $description = '';
-                } elseif (!strlen($description)) {
-                    $description = $item->getDescription();
                 }
 
                 $qty = null;
diff --git a/dev/tests/integration/testsuite/Magento/Wishlist/Controller/UpdateTest.php b/dev/tests/integration/testsuite/Magento/Wishlist/Controller/UpdateTest.php
new file mode 100644
index 00000000000..4af27d705f5
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Wishlist/Controller/UpdateTest.php
@@ -0,0 +1,141 @@
+<?php
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Wishlist\Controller;
+
+use Magento\Customer\Helper\View;
+use Magento\Customer\Model\Session;
+use Magento\Framework\Data\Form\FormKey;
+use Magento\Framework\Message\ManagerInterface;
+use Magento\Wishlist\Model\Item;
+use Psr\Log\LoggerInterface;
+use Zend\Http\Request;
+
+/**
+ * Tests updating wishlist item comment.
+ *
+ * @magentoAppIsolation enabled
+ * @magentoDbIsolation disabled
+ * @magentoAppArea frontend
+ */
+class UpdateTest extends \Magento\TestFramework\TestCase\AbstractController
+{
+    /**
+     * @var Session
+     */
+    private $customerSession;
+
+    /**
+     * @var ManagerInterface
+     */
+    private $messages;
+
+    /**
+     * @var View
+     */
+    private $customerViewHelper;
+
+    /**
+     * Description field value for wishlist item.
+     *
+     * @var string
+     */
+    private $description = 'some description';
+
+    /**
+     * Tests updating wishlist item comment.
+     *
+     * @magentoDataFixture Magento/Wishlist/_files/wishlist.php
+     * @dataProvider commentDataProvider
+     */
+    public function testUpdateComment($postDescription, $postQty, $expectedResult, $presetComment)
+    {
+        $itemId = 1;
+        $wishlistId = 1;
+
+        if ($presetComment) {
+            $item = $this->_objectManager->create(Item::class)->load($itemId);
+            $item->setDescription($this->description);
+            $item->save();
+        }
+
+        $formKey = $this->_objectManager->get(FormKey::class);
+        $this->getRequest()->setPostValue(
+            [
+                'description' => $postDescription,
+                'qty' => $postQty,
+                'do' => '',
+                'form_key' => $formKey->getFormKey()
+            ]
+        )->setMethod(Request::METHOD_POST);
+        $this->dispatch('wishlist/index/update/wishlist_id/' . $wishlistId);
+
+        $item = $this->_objectManager->create(Item::class)->load($itemId);
+
+        self::assertEquals(
+            $expectedResult,
+            $item->getDescription()
+        );
+    }
+
+    /**
+     * Data provider for testUpdateComment.
+     *
+     * @return array
+     */
+    public function commentDataProvider()
+    {
+        return [
+            'test adding comment' => [
+                'postDescription' => [1 => $this->description],
+                'postQty' => [1 => '1'],
+                'expectedResult' => $this->description,
+                'presetComment' => false
+            ],
+            'test removing comment' => [
+                'postDescription' => [1 => ''],
+                'postQty' => [1 => '1'],
+                'expectedResult' => '',
+                'presetComment' => true
+            ],
+            'test not changing comment' => [
+                'postDescription' => [],
+                'postQty' => [1 => '1'],
+                'expectedResult' => $this->description,
+                'presetComment' => true
+            ],
+        ];
+    }
+
+    protected function setUp()
+    {
+        parent::setUp();
+        $logger = $this->createMock(LoggerInterface::class);
+        $this->customerSession = $this->_objectManager->get(
+            Session::class,
+            [$logger]
+        );
+        /** @var \Magento\Customer\Api\AccountManagementInterface $service */
+        $service = $this->_objectManager->create(
+            \Magento\Customer\Api\AccountManagementInterface::class
+        );
+        $customer = $service->authenticate('customer@example.com', 'password');
+        $this->customerSession->setCustomerDataAsLoggedIn($customer);
+
+        $this->customerViewHelper = $this->_objectManager->create(View::class);
+
+        $this->messages = $this->_objectManager->get(
+            ManagerInterface::class
+        );
+    }
+
+    protected function tearDown()
+    {
+        $this->customerSession->logout();
+        $this->customerSession = null;
+        parent::tearDown();
+    }
+}
-- 
GitLab


From 89b8f3a2e4c01b130754e024d00ed34618163b8b Mon Sep 17 00:00:00 2001
From: Oleksandr Miroshnichenko <omiroshnichenko@magento.com>
Date: Fri, 8 Dec 2017 14:05:59 +0200
Subject: [PATCH 283/380] MAGETWO-84903: Added namespace to product videos
 fotorama events #12469

---
 .../view/frontend/web/js/fotorama-add-video-events.js           | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/app/code/Magento/ProductVideo/view/frontend/web/js/fotorama-add-video-events.js b/app/code/Magento/ProductVideo/view/frontend/web/js/fotorama-add-video-events.js
index c0036b71ac8..3104fdc6190 100644
--- a/app/code/Magento/ProductVideo/view/frontend/web/js/fotorama-add-video-events.js
+++ b/app/code/Magento/ProductVideo/view/frontend/web/js/fotorama-add-video-events.js
@@ -207,7 +207,7 @@ define([
                 if (options.dataMergeStrategy === 'prepend') {
                     this.options.videoData = [].concat(
                         this.options.optionsVideoData[options.selectedOption],
-                        this.options.videoData
+                        this.defaultVideoData
                     );
                 } else {
                     this.options.videoData = this.options.optionsVideoData[options.selectedOption];
-- 
GitLab


From ac4dd33ea39e3d25226291282560ca3083635e7b Mon Sep 17 00:00:00 2001
From: Pavel Bystritsky <p.bystritsky@yandex.ru>
Date: Fri, 8 Dec 2017 16:46:57 +0200
Subject: [PATCH 284/380] magento/magento2#12259: Save and Duplicated product
 not working

---
 .../Magento/Catalog/Model/Product/Copier.php  |  1 +
 .../Catalog/Model/Product/CopierTest.php      | 68 +++++++++++++++++++
 .../_files/product_simple_rollback.php        | 22 +++---
 3 files changed, 79 insertions(+), 12 deletions(-)
 create mode 100644 dev/tests/integration/testsuite/Magento/Catalog/Model/Product/CopierTest.php

diff --git a/app/code/Magento/Catalog/Model/Product/Copier.php b/app/code/Magento/Catalog/Model/Product/Copier.php
index e94104ae473..906280257d4 100644
--- a/app/code/Magento/Catalog/Model/Product/Copier.php
+++ b/app/code/Magento/Catalog/Model/Product/Copier.php
@@ -83,6 +83,7 @@ class Copier
                 $duplicate->save();
                 $isDuplicateSaved = true;
             } catch (\Magento\Framework\Exception\AlreadyExistsException $e) {
+            } catch (\Magento\UrlRewrite\Model\Exception\UrlAlreadyExistsException $e) {
             }
         } while (!$isDuplicateSaved);
         $this->getOptionRepository()->duplicate($product, $duplicate);
diff --git a/dev/tests/integration/testsuite/Magento/Catalog/Model/Product/CopierTest.php b/dev/tests/integration/testsuite/Magento/Catalog/Model/Product/CopierTest.php
new file mode 100644
index 00000000000..8c91f5689f6
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Catalog/Model/Product/CopierTest.php
@@ -0,0 +1,68 @@
+<?php
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Catalog\Model\Product;
+
+
+use Magento\Catalog\Model\ProductRepository;
+
+class CopierTest extends \PHPUnit\Framework\TestCase
+{
+    /**
+     * @var \Magento\Framework\ObjectManagerInterface
+     */
+    private $objectManager;
+
+    /**
+     * @var \Magento\Catalog\Model\Product\Copier
+     */
+    private $copier;
+
+    /**
+     * @var \Magento\Catalog\Model\ProductRepository
+     */
+    private $productRepository;
+
+    /**
+     * Tests multiple duplication of the same product.
+     *
+     * @magentoDataFixture Magento/Catalog/_files/product_simple.php
+     * @magentoAppArea adminhtml
+     * @magentoDbIsolation disabled
+     * @magentoAppIsolation enabled
+     */
+    public function testDoubleCopy()
+    {
+        $product = $this->productRepository->get('simple');
+
+        $product1 = $this->copier->copy($product);
+        $this->assertEquals(
+            'simple-1',
+            $product1->getSku()
+        );
+        $this->assertEquals(
+            'simple-product-1',
+            $product1->getUrlKey()
+        );
+
+        $product2 = $this->copier->copy($product);
+        $this->assertEquals(
+            'simple-2',
+            $product2->getSku()
+        );
+        $this->assertEquals(
+            'simple-product-2',
+            $product2->getUrlKey()
+        );
+    }
+
+    protected function setUp()
+    {
+        $this->objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
+        $this->copier = $this->objectManager->get(Copier::class);
+        $this->productRepository = $this->objectManager->get(ProductRepository::class);
+    }
+}
diff --git a/dev/tests/integration/testsuite/Magento/Catalog/_files/product_simple_rollback.php b/dev/tests/integration/testsuite/Magento/Catalog/_files/product_simple_rollback.php
index 28d229d06b2..bdefb1470ec 100644
--- a/dev/tests/integration/testsuite/Magento/Catalog/_files/product_simple_rollback.php
+++ b/dev/tests/integration/testsuite/Magento/Catalog/_files/product_simple_rollback.php
@@ -3,23 +3,21 @@
  * Copyright © Magento, Inc. All rights reserved.
  * See COPYING.txt for license details.
  */
-use Magento\Framework\Exception\NoSuchEntityException;
 
-\Magento\TestFramework\Helper\Bootstrap::getInstance()->getInstance()->reinitialize();
+use Magento\Catalog\Model\Product;
+use Magento\Catalog\Model\ResourceModel\Product\Collection;
+use Magento\Framework\Registry;
+use Magento\TestFramework\Helper\Bootstrap;
 
-/** @var \Magento\Framework\Registry $registry */
-$registry = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->get(\Magento\Framework\Registry::class);
+/** @var Registry $registry */
+$registry = Bootstrap::getObjectManager()->get(Registry::class);
 
 $registry->unregister('isSecureArea');
 $registry->register('isSecureArea', true);
 
-/** @var \Magento\Catalog\Api\ProductRepositoryInterface $productRepository */
-$productRepository = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()
-    ->get(\Magento\Catalog\Api\ProductRepositoryInterface::class);
-try {
-    $product = $productRepository->get('simple', false, null, true);
-    $productRepository->delete($product);
-} catch (NoSuchEntityException $e) {
-}
+/** @var Collection $productCollection */
+$productCollection = Bootstrap::getObjectManager()->get(Product::class)->getCollection();
+$productCollection->delete();
+
 $registry->unregister('isSecureArea');
 $registry->register('isSecureArea', false);
-- 
GitLab


From 04ff6611e313efaed87d88f36e25e7c82cb95f26 Mon Sep 17 00:00:00 2001
From: RomanKis <romaikiss@gmail.com>
Date: Fri, 8 Dec 2017 16:49:01 +0200
Subject: [PATCH 285/380] 8410: Custom Checkout Step and Shipping Step are
 Highlighted

---
 .../Checkout/view/frontend/web/js/view/payment.js  | 14 ++++++++------
 .../Checkout/view/frontend/web/js/view/shipping.js | 14 ++++++++------
 2 files changed, 16 insertions(+), 12 deletions(-)

diff --git a/app/code/Magento/Checkout/view/frontend/web/js/view/payment.js b/app/code/Magento/Checkout/view/frontend/web/js/view/payment.js
index 94ccf7a24f3..5a4e1ad5a91 100644
--- a/app/code/Magento/Checkout/view/frontend/web/js/view/payment.js
+++ b/app/code/Magento/Checkout/view/frontend/web/js/view/payment.js
@@ -51,12 +51,14 @@ define([
             checkoutDataResolver.resolvePaymentMethod();
 
             //If some step is active this step will become inactive.
-            stepNavigator.steps().some(function (element) {
-                if (element.isVisible()) {
-                    self.isVisible(false);
-                    return true;
-                }
-            });
+            if (stepNavigator.steps()) {
+                stepNavigator.steps().some(function (element) {
+                    if (element.isVisible()) {
+                        self.isVisible(false);
+                        return true;
+                    }
+                });
+            }
 
             stepNavigator.registerStep(
                 'payment',
diff --git a/app/code/Magento/Checkout/view/frontend/web/js/view/shipping.js b/app/code/Magento/Checkout/view/frontend/web/js/view/shipping.js
index a6e7e3efd3d..d99fc56458d 100644
--- a/app/code/Magento/Checkout/view/frontend/web/js/view/shipping.js
+++ b/app/code/Magento/Checkout/view/frontend/web/js/view/shipping.js
@@ -83,12 +83,14 @@ define([
 
             if (!quote.isVirtual()) {
                 //If some step is active this step will become inactive.
-                stepNavigator.steps().some(function (element) {
-                    if (element.isVisible()) {
-                        self.visible(false);
-                        return true;
-                    }
-                });
+                if (stepNavigator.steps()) {
+                    stepNavigator.steps().some(function (element) {
+                        if (element.isVisible()) {
+                            self.visible(false);
+                            return true;
+                        }
+                    });
+                }
 
                 stepNavigator.registerStep(
                     'shipping',
-- 
GitLab


From 4996ea2e82ea1fc98e352b1450b9824b9cefb59f Mon Sep 17 00:00:00 2001
From: nmalevanec <mikola.malevanec@transoftgroup.com>
Date: Fri, 8 Dec 2017 17:14:59 +0200
Subject: [PATCH 286/380] 12535: Product change sku via repository.

---
 .../Catalog/Model/ProductRepository.php       | 11 +++-
 .../Test/Unit/Model/ProductRepositoryTest.php |  4 +-
 .../Catalog/Model/ProductRepositoryTest.php   | 56 +++++++++++++++++++
 3 files changed, 66 insertions(+), 5 deletions(-)
 create mode 100644 dev/tests/integration/testsuite/Magento/Catalog/Model/ProductRepositoryTest.php

diff --git a/app/code/Magento/Catalog/Model/ProductRepository.php b/app/code/Magento/Catalog/Model/ProductRepository.php
index e814dc03cf3..2b9ee8f8629 100644
--- a/app/code/Magento/Catalog/Model/ProductRepository.php
+++ b/app/code/Magento/Catalog/Model/ProductRepository.php
@@ -333,8 +333,13 @@ class ProductRepository implements \Magento\Catalog\Api\ProductRepositoryInterfa
                 $product->setWebsiteIds([$this->storeManager->getStore(true)->getWebsiteId()]);
             }
         } else {
-            unset($this->instances[$productData['sku']]);
-            $product = $this->get($productData['sku']);
+            if (!empty($productData['id'])) {
+                unset($this->instancesById[$productData['id']]);
+                $product = $this->getById($productData['id']);
+            } else {
+                unset($this->instances[$productData['sku']]);
+                $product = $this->get($productData['sku']);
+            }
         }
 
         foreach ($productData as $key => $value) {
@@ -562,7 +567,7 @@ class ProductRepository implements \Magento\Catalog\Api\ProductRepositoryInterfa
         $tierPrices = $product->getData('tier_price');
 
         try {
-            $existingProduct = $this->get($product->getSku());
+            $existingProduct = $product->getId() ? $this->getById($product->getId()) : $this->get($product->getSku());
 
             $product->setData(
                 $this->resourceModel->getLinkField(),
diff --git a/app/code/Magento/Catalog/Test/Unit/Model/ProductRepositoryTest.php b/app/code/Magento/Catalog/Test/Unit/Model/ProductRepositoryTest.php
index c98705b4eda..2a9a867fa20 100644
--- a/app/code/Magento/Catalog/Test/Unit/Model/ProductRepositoryTest.php
+++ b/app/code/Magento/Catalog/Test/Unit/Model/ProductRepositoryTest.php
@@ -610,7 +610,7 @@ class ProductRepositoryTest extends \PHPUnit\Framework\TestCase
             ->willReturn(true);
         $this->resourceModelMock->expects($this->once())->method('save')->with($this->productMock)
             ->willThrowException(new \Magento\Eav\Model\Entity\Attribute\Exception(__('123')));
-        $this->productMock->expects($this->once())->method('getId')->willReturn(null);
+        $this->productMock->expects($this->exactly(2))->method('getId')->willReturn(null);
         $this->extensibleDataObjectConverterMock
             ->expects($this->once())
             ->method('toNestedArray')
@@ -634,7 +634,7 @@ class ProductRepositoryTest extends \PHPUnit\Framework\TestCase
         $this->initializationHelperMock->expects($this->never())->method('initialize');
         $this->resourceModelMock->expects($this->once())->method('validate')->with($this->productMock)
             ->willReturn(['error1', 'error2']);
-        $this->productMock->expects($this->never())->method('getId');
+        $this->productMock->expects($this->once())->method('getId')->willReturn(null);
         $this->extensibleDataObjectConverterMock
             ->expects($this->once())
             ->method('toNestedArray')
diff --git a/dev/tests/integration/testsuite/Magento/Catalog/Model/ProductRepositoryTest.php b/dev/tests/integration/testsuite/Magento/Catalog/Model/ProductRepositoryTest.php
new file mode 100644
index 00000000000..cbd2a90b4d7
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Catalog/Model/ProductRepositoryTest.php
@@ -0,0 +1,56 @@
+<?php
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Catalog\Model;
+
+use Magento\Catalog\Api\ProductRepositoryInterface;
+use Magento\Catalog\Model\ResourceModel\Product as ProductResource;
+use Magento\TestFramework\Helper\Bootstrap;
+
+/**
+ * Provide tests for ProductRepository model.
+ */
+class ProductRepositoryTest extends \PHPUnit\Framework\TestCase
+{
+    /**
+     * Test subject.
+     *
+     * @var ProductRepositoryInterface
+     */
+    private $productRepository;
+
+    /**
+     * @inheritdoc
+     */
+    protected function setUp()
+    {
+        $this->productRepository = Bootstrap::getObjectManager()->get(ProductRepositoryInterface::class);
+    }
+
+    /**
+     * Test Product Repository can change(update) "sku" for given product.
+     *
+     * @magentoDataFixture Magento/Catalog/_files/product_simple.php
+     * @magentoDbIsolation enabled
+     * @magentoAppArea adminhtml
+     */
+    public function testUpdateProductSku()
+    {
+        $newSku = 'simple-edited';
+        $productId = Bootstrap::getObjectManager()->get(ProductResource::class)->getIdBySku('simple');
+        $initialProduct = Bootstrap::getObjectManager()->create(Product::class)->load($productId);
+
+        $initialProduct->setSku($newSku);
+        $this->productRepository->save($initialProduct);
+
+        $updatedProduct = Bootstrap::getObjectManager()->create(Product::class);
+        $updatedProduct->load($productId);
+        self::assertSame($newSku, $updatedProduct->getSku());
+
+        //clean up.
+        $this->productRepository->delete($updatedProduct);
+    }
+}
-- 
GitLab


From fccecf386b710d779fcf497e0a282d8ddb0703a4 Mon Sep 17 00:00:00 2001
From: RomanKis <romaikiss@gmail.com>
Date: Fri, 8 Dec 2017 17:50:05 +0200
Subject: [PATCH 287/380] 8410: Custom Checkout Step and Shipping Step are
 Highlighted

---
 app/code/Magento/Checkout/view/frontend/web/js/view/payment.js  | 1 +
 app/code/Magento/Checkout/view/frontend/web/js/view/shipping.js | 1 +
 2 files changed, 2 insertions(+)

diff --git a/app/code/Magento/Checkout/view/frontend/web/js/view/payment.js b/app/code/Magento/Checkout/view/frontend/web/js/view/payment.js
index 5a4e1ad5a91..3753091f0db 100644
--- a/app/code/Magento/Checkout/view/frontend/web/js/view/payment.js
+++ b/app/code/Magento/Checkout/view/frontend/web/js/view/payment.js
@@ -55,6 +55,7 @@ define([
                 stepNavigator.steps().some(function (element) {
                     if (element.isVisible()) {
                         self.isVisible(false);
+
                         return true;
                     }
                 });
diff --git a/app/code/Magento/Checkout/view/frontend/web/js/view/shipping.js b/app/code/Magento/Checkout/view/frontend/web/js/view/shipping.js
index d99fc56458d..52078488af4 100644
--- a/app/code/Magento/Checkout/view/frontend/web/js/view/shipping.js
+++ b/app/code/Magento/Checkout/view/frontend/web/js/view/shipping.js
@@ -87,6 +87,7 @@ define([
                     stepNavigator.steps().some(function (element) {
                         if (element.isVisible()) {
                             self.visible(false);
+
                             return true;
                         }
                     });
-- 
GitLab


From 41db211ad868cae7b594b909f875007f7aef1285 Mon Sep 17 00:00:00 2001
From: RomanKis <romaikiss@gmail.com>
Date: Fri, 8 Dec 2017 14:37:06 +0200
Subject: [PATCH 288/380] 12560: Back-End issue for multi-store website: when
 editing Order shipping/billing address - allowed countries are selected from
 wrong Store View

---
 .../Block/Adminhtml/Order/Address/Form.php    | 16 ++++
 .../Adminhtml/Order/Create/Form/Address.php   | 12 ++-
 .../Adminhtml/Order/Address/FormTest.php      | 92 +++++++++++++++++++
 3 files changed, 117 insertions(+), 3 deletions(-)
 create mode 100644 app/code/Magento/Sales/Test/Unit/Block/Adminhtml/Order/Address/FormTest.php

diff --git a/app/code/Magento/Sales/Block/Adminhtml/Order/Address/Form.php b/app/code/Magento/Sales/Block/Adminhtml/Order/Address/Form.php
index f2b454260dc..2d23bca110a 100644
--- a/app/code/Magento/Sales/Block/Adminhtml/Order/Address/Form.php
+++ b/app/code/Magento/Sales/Block/Adminhtml/Order/Address/Form.php
@@ -135,4 +135,20 @@ class Form extends \Magento\Sales\Block\Adminhtml\Order\Create\Form\Address
     {
         return $this->_getAddress()->getData();
     }
+
+    /**
+     * @inheritdoc
+     */
+    protected function processCountryOptions(
+        \Magento\Framework\Data\Form\Element\AbstractElement $countryElement,
+        $storeId = null
+    ) {
+        /** @var \Magento\Sales\Model\Order\Address $address */
+        $address = $this->_coreRegistry->registry('order_address');
+        if ($address !== null) {
+            $storeId = $address->getOrder()->getStoreId();
+        }
+
+        parent::processCountryOptions($countryElement, $storeId);
+    }
 }
diff --git a/app/code/Magento/Sales/Block/Adminhtml/Order/Create/Form/Address.php b/app/code/Magento/Sales/Block/Adminhtml/Order/Create/Form/Address.php
index 5738e8ee333..6625f438f95 100644
--- a/app/code/Magento/Sales/Block/Adminhtml/Order/Create/Form/Address.php
+++ b/app/code/Magento/Sales/Block/Adminhtml/Order/Create/Form/Address.php
@@ -293,11 +293,17 @@ class Address extends \Magento\Sales\Block\Adminhtml\Order\Create\Form\AbstractF
 
     /**
      * @param \Magento\Framework\Data\Form\Element\AbstractElement $countryElement
+     * @param string|int $storeId
+     *
      * @return void
      */
-    private function processCountryOptions(\Magento\Framework\Data\Form\Element\AbstractElement $countryElement)
-    {
-        $storeId = $this->getBackendQuoteSession()->getStoreId();
+    protected function processCountryOptions(
+        \Magento\Framework\Data\Form\Element\AbstractElement $countryElement,
+        $storeId = null
+    ) {
+        if ($storeId === null) {
+            $storeId = $this->getBackendQuoteSession()->getStoreId();
+        }
         $options = $this->getCountriesCollection()
             ->loadByStore($storeId)
             ->toOptionArray();
diff --git a/app/code/Magento/Sales/Test/Unit/Block/Adminhtml/Order/Address/FormTest.php b/app/code/Magento/Sales/Test/Unit/Block/Adminhtml/Order/Address/FormTest.php
new file mode 100644
index 00000000000..8a11717c954
--- /dev/null
+++ b/app/code/Magento/Sales/Test/Unit/Block/Adminhtml/Order/Address/FormTest.php
@@ -0,0 +1,92 @@
+<?php
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Sales\Test\Unit\Block\Adminhtml\Order\Address;
+
+/**
+ * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
+ */
+class FormTest extends \PHPUnit\Framework\TestCase
+{
+    /**
+     * @var \Magento\Sales\Block\Adminhtml\Order\Address\Form
+     */
+    private $addressBlock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    private $formFactoryMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    private $customerFormFactoryMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    private $coreRegistryMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    private $countriesCollection;
+
+    protected function setUp()
+    {
+        $objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
+
+        $this->formFactoryMock = $this->createMock(\Magento\Framework\Data\FormFactory::class);
+        $this->customerFormFactoryMock = $this->createMock(\Magento\Customer\Model\Metadata\FormFactory::class);
+        $this->coreRegistryMock = $this->createMock(\Magento\Framework\Registry::class);
+        $this->countriesCollection = $this->createMock(
+            \Magento\Directory\Model\ResourceModel\Country\Collection::class
+        );
+
+        $this->addressBlock = $objectManager->getObject(
+            \Magento\Sales\Block\Adminhtml\Order\Address\Form::class,
+            [
+                '_formFactory' => $this->formFactoryMock,
+                '_customerFormFactory' => $this->customerFormFactoryMock,
+                '_coreRegistry' => $this->coreRegistryMock,
+                'countriesCollection' => $this->countriesCollection,
+            ]
+        );
+    }
+
+    public function testGetForm()
+    {
+        $formMock = $this->createMock(\Magento\Framework\Data\Form::class);
+        $fieldsetMock = $this->createMock(\Magento\Framework\Data\Form\Element\Fieldset::class);
+        $addressFormMock = $this->createMock(\Magento\Customer\Model\Metadata\Form::class);
+        $addressMock = $this->createMock(\Magento\Sales\Model\Order\Address::class);
+        $selectMock = $this->createMock(\Magento\Framework\Data\Form\Element\Select::class);
+        $orderMock = $this->createMock(\Magento\Sales\Model\Order::class);
+
+        $this->formFactoryMock->expects($this->atLeastOnce())->method('create')->willReturn($formMock);
+        $formMock->expects($this->atLeastOnce())->method('addFieldset')->willReturn($fieldsetMock);
+        $this->customerFormFactoryMock->expects($this->atLeastOnce())->method('create')->willReturn($addressFormMock);
+        $addressFormMock->expects($this->atLeastOnce())->method('getAttributes')->willReturn([]);
+        $this->coreRegistryMock->expects($this->atLeastOnce())->method('registry')->willReturn($addressMock);
+        $formMock->expects($this->atLeastOnce())->method('getElement')->willReturnOnConsecutiveCalls(
+            $selectMock,
+            $selectMock,
+            $selectMock,
+            $selectMock,
+            $selectMock,
+            $selectMock,
+            $selectMock,
+            null
+        );
+        $addressMock->expects($this->once())->method('getOrder')->willReturn($orderMock);
+        $orderMock->expects($this->once())->method('getStoreId')->willReturn(5);
+        $this->countriesCollection->expects($this->atLeastOnce())->method('loadByStore')
+            ->willReturn($this->countriesCollection);
+
+        $this->addressBlock->getForm();
+    }
+}
-- 
GitLab


From 84207463800df2900484cff76065076d7bee74d8 Mon Sep 17 00:00:00 2001
From: John Stennett <john00ivy@gmail.com>
Date: Wed, 29 Nov 2017 22:28:53 +0200
Subject: [PATCH 289/380] MQE-528: Robo commands should override certain files.

- Adjusting the commands that Robo executes so it overrides certain files.
---
 dev/tests/acceptance/RoboFile.php             |  4 +--
 .../SalesRule/Data/SalesRuleData.xml          | 25 -------------------
 2 files changed, 2 insertions(+), 27 deletions(-)
 delete mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesRule/Data/SalesRuleData.xml

diff --git a/dev/tests/acceptance/RoboFile.php b/dev/tests/acceptance/RoboFile.php
index c255e9f0653..c7368c79309 100644
--- a/dev/tests/acceptance/RoboFile.php
+++ b/dev/tests/acceptance/RoboFile.php
@@ -21,8 +21,8 @@ class RoboFile extends \Robo\Tasks
     function cloneFiles()
     {
         $this->_exec('cp -vn .env.example .env');
-        $this->_exec('cp -vn codeception.dist.yml codeception.yml');
-        $this->_exec('cp -vn tests/functional.suite.dist.yml tests/functional.suite.yml');
+        $this->_exec('cp -vf codeception.dist.yml codeception.yml');
+        $this->_exec('cp -vf tests/functional.suite.dist.yml tests/functional.suite.yml');
     }
 
     /**
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesRule/Data/SalesRuleData.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesRule/Data/SalesRuleData.xml
deleted file mode 100644
index 3f13fbf02a8..00000000000
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesRule/Data/SalesRuleData.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- /**
-  * Copyright © Magento, Inc. All rights reserved.
-  * See COPYING.txt for license details.
-  */
--->
-
-<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-        xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataProfileSchema.xsd">
-    <entity name="SimpleSalesRule" type="SalesRule">
-        <data key="name" unique="suffix">SalesRule</data>
-        <data key="is_active">true</data>
-        <required-entity type="SalesRuleStoreLabel">SalesRuleStoreLabel1</required-entity>
-        <required-entity type="SalesRuleStoreLabel">SalesRuleStoreLabel2</required-entity>
-    </entity>
-    <entity name="SalesRuleStoreLabel1" type="SalesRuleStoreLabel">
-        <data key="store_id">0</data>
-        <data key="store_label">TestRule_Label</data>
-    </entity>
-    <entity name="SalesRuleStoreLabel2" type="SalesRuleStoreLabel">
-        <data key="store_id">1</data>
-        <data key="store_label">TestRule_Label_default</data>
-    </entity>
-</config>
-- 
GitLab


From 2f634043a8d71329cfa7c1837c1742adb6059c4a Mon Sep 17 00:00:00 2001
From: John Stennett <john00ivy@gmail.com>
Date: Wed, 29 Nov 2017 23:16:31 +0200
Subject: [PATCH 290/380] MQE-382: Adding custom
 "assertElementContainsAttribute" method.

    - Replacing "userInput" with "expectedValue".
    - Adding example for asserting "0" is present in an attribute.
    - Adding another example to the SampleCest file.
    - Adding examples to the SampleCest file under "CustomMethods".
---
 .../FunctionalTest/SampleTests/Cest/SampleCest.xml       | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/SampleCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/SampleCest.xml
index b07e73bbbaa..6b931ce3f30 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/SampleCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/SampleCest.xml
@@ -180,6 +180,15 @@
                 <severity value="CRITICAL"/>
                 <testCaseId value="#"/>
             </annotations>
+            <assertElementContainsAttribute selector="#username" attribute="class" expectedValue="admin__control-text" mergeKey="assertElementContainsAttribute1"/>
+            <assertElementContainsAttribute selector="#username" attribute="type" expectedValue="text" mergeKey="assertElementContainsAttribute2"/>
+            <assertElementContainsAttribute selector="#username" attribute="name" expectedValue="login[username]" mergeKey="assertElementContainsAttribute3"/>
+            <assertElementContainsAttribute selector="#username" attribute="autofocus" expectedValue="" mergeKey="assertElementContainsAttribute4"/>
+            <assertElementContainsAttribute selector="#username" attribute="data-validate" expectedValue="{required:true}" mergeKey="assertElementContainsAttribute5"/>
+            <assertElementContainsAttribute selector="#username" attribute="placeholder" expectedValue="user name" mergeKey="assertElementContainsAttribute6"/>
+            <assertElementContainsAttribute selector="#username" attribute="autocomplete" expectedValue="off" mergeKey="assertElementContainsAttribute7"/>
+            <assertElementContainsAttribute selector=".admin__menu-overlay" attribute="style" expectedValue="display: none;" mergeKey="assertElementContainsAttribute8"/>
+            <assertElementContainsAttribute selector=".admin__menu-overlay" attribute="border" expectedValue="0" mergeKey="assertElementContainsAttribute9"/>
             <loginAsAdmin mergeKey="loginAsAdmin1"/>
             <loginAsAdmin username="admin" password="123123q" mergeKey="loginAsAdmin2"/>
             <closeAdminNotification mergeKey="closeAdminNotification1"/>
-- 
GitLab


From 8173a436373fdd119257edd3f5a0fd983a3eece7 Mon Sep 17 00:00:00 2001
From: Kevin Kozan <kkozan@magento.com>
Date: Thu, 30 Nov 2017 17:41:01 +0200
Subject: [PATCH 291/380] MQE-572: Expose selenium configuration from within
 our .env file

- changed functional.suite.dist to set host,port,protocol, and path based on env.
- added above env parameters to env.example

(cherry picked from commit e08c27e)
---
 dev/tests/acceptance/.env.example                    | 6 ++++++
 dev/tests/acceptance/tests/functional.suite.dist.yml | 5 +++++
 2 files changed, 11 insertions(+)

diff --git a/dev/tests/acceptance/.env.example b/dev/tests/acceptance/.env.example
index 500d54c3881..9cce00f6c06 100644
--- a/dev/tests/acceptance/.env.example
+++ b/dev/tests/acceptance/.env.example
@@ -7,6 +7,12 @@ MAGENTO_BACKEND_NAME=
 MAGENTO_ADMIN_USERNAME=
 MAGENTO_ADMIN_PASSWORD=
 
+#*** Selenium Server Protocol, Host, Port, and Path, with local defaults. Change if not running Selenium locally.
+SELENIUM_HOST=127.0.0.1
+SELENIUM_PORT=4444
+SELENIUM_PROTOCOL=http
+SELENIUM_PATH=/wd/hub
+
 #*** Uncomment and set host & port if your dev environment needs different value other than MAGENTO_BASE_URL for Rest Api Requests ***#
 #MAGENTO_RESTAPI_SERVER_HOST=
 #MAGENTO_RESTAPI_SERVER_PORT=
diff --git a/dev/tests/acceptance/tests/functional.suite.dist.yml b/dev/tests/acceptance/tests/functional.suite.dist.yml
index afba145ca9a..9bae4de6edb 100644
--- a/dev/tests/acceptance/tests/functional.suite.dist.yml
+++ b/dev/tests/acceptance/tests/functional.suite.dist.yml
@@ -31,3 +31,8 @@ modules:
             username: "%MAGENTO_ADMIN_USERNAME%"
             password: "%MAGENTO_ADMIN_PASSWORD%"
             pageload_timeout: 30
+            host: %SELENIUM_HOST%
+            port: %SELENIUM_PORT%
+            protocol: %SELENIUM_PROTOCOL%
+            path: %SELENIUM_PATH%
+
-- 
GitLab


From 73107df7a3c3e079a73a2f983943edc6714cf9f5 Mon Sep 17 00:00:00 2001
From: Ji Lu <jilu1@magento.com>
Date: Tue, 28 Nov 2017 18:23:43 +0200
Subject: [PATCH 292/380] MQE-513: added attachment (screenshots/logs) support
 in Allure reporting.

---
 dev/tests/functional/composer.json            |  9 ++++--
 dev/tests/functional/etc/events.xml           | 17 +++++++++++
 .../System/Observer/AllureWebapiResponse.php  | 30 +++++++++++++++++++
 3 files changed, 53 insertions(+), 3 deletions(-)
 create mode 100644 dev/tests/functional/lib/Magento/Mtf/System/Observer/AllureWebapiResponse.php

diff --git a/dev/tests/functional/composer.json b/dev/tests/functional/composer.json
index f58a38bd01d..08ac79f0ab6 100644
--- a/dev/tests/functional/composer.json
+++ b/dev/tests/functional/composer.json
@@ -1,10 +1,13 @@
 {
+    "config": {
+        "sort-packages": true
+    },
     "require": {
-        "magento/mtf": "1.0.0-rc57",
         "php": "7.0.2|~7.0.6|~7.1.0",
+        "allure-framework/allure-phpunit": "~1.2.0",
+        "magento/mtf": "1.0.0-rc57",
         "phpunit/phpunit": "~4.8.0|~5.5.0",
-        "phpunit/phpunit-selenium": ">=1.2",
-        "allure-framework/allure-phpunit": "~1.2.0"
+        "phpunit/phpunit-selenium": ">=1.2"
     },
     "suggest": {
         "netwing/selenium-server-standalone": "dev-master",
diff --git a/dev/tests/functional/etc/events.xml b/dev/tests/functional/etc/events.xml
index 5be0f8e7d4e..e8f0f63334f 100644
--- a/dev/tests/functional/etc/events.xml
+++ b/dev/tests/functional/etc/events.xml
@@ -10,6 +10,9 @@
         <observer class="Magento\Mtf\System\Observer\WebapiResponse">
             <tag name="webapi_failed" />
         </observer>
+        <observer class="Magento\Mtf\System\Observer\AllureWebapiResponse">
+            <tag name="webapi_failed" />
+        </observer>
     </preset>
     <preset name="coverage" extends="base">
         <observer class="Magento\Mtf\System\Observer\PageUrl">
@@ -32,15 +35,29 @@
             <tag name="exception"/>
             <tag name="failure"/>
         </observer>
+        <observer class="Magento\Mtf\System\Observer\AllureSourceCode">
+            <tag name="exception"/>
+            <tag name="failure"/>
+        </observer>
         <observer class="Magento\Mtf\System\Observer\Screenshot">
             <tag name="exception"/>
             <tag name="failure"/>
         </observer>
+        <observer class="Magento\Mtf\System\Observer\AllureScreenshot">
+            <tag name="exception"/>
+            <tag name="failure"/>
+        </observer>
         <observer class="Magento\Mtf\System\Observer\CurlResponse">
             <tag name="curl_failed"/>
         </observer>
+        <observer class="Magento\Mtf\System\Observer\AllureCurlResponse">
+            <tag name="curl_failed"/>
+        </observer>
         <observer class="Magento\Mtf\System\Observer\WebapiResponse">
             <tag name="webapi_failed" />
         </observer>
+        <observer class="Magento\Mtf\System\Observer\AllureWebapiResponse">
+            <tag name="webapi_failed" />
+        </observer>
     </preset>
 </config>
diff --git a/dev/tests/functional/lib/Magento/Mtf/System/Observer/AllureWebapiResponse.php b/dev/tests/functional/lib/Magento/Mtf/System/Observer/AllureWebapiResponse.php
new file mode 100644
index 00000000000..bda514ad9fa
--- /dev/null
+++ b/dev/tests/functional/lib/Magento/Mtf/System/Observer/AllureWebapiResponse.php
@@ -0,0 +1,30 @@
+<?php
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Mtf\System\Observer;
+
+use Magento\Mtf\System\Event\Event;
+
+/**
+ * AllureWebapiResponse observer.
+ */
+class AllureWebapiResponse extends AbstractAllureObserver
+{
+    /**
+     * Collect response source artifact to storage.
+     *
+     * @param Event $event
+     * @return void
+     */
+    public function process(Event $event)
+    {
+        $this->addAttachment(
+            json_encode($event->getSubjects()[0]),
+            'webapi-response-' . $event->getFileIdentifier(),
+            'text/json'
+        );
+    }
+}
-- 
GitLab


From f17a854bfa650cb47129948a3c11abb8b8299113 Mon Sep 17 00:00:00 2001
From: Ji Lu <jilu1@magento.com>
Date: Thu, 30 Nov 2017 17:40:53 +0200
Subject: [PATCH 293/380] MQE-513: added allure observers as a separate event
 preset.

---
 dev/tests/functional/etc/events.xml | 16 ++--------------
 1 file changed, 2 insertions(+), 14 deletions(-)

diff --git a/dev/tests/functional/etc/events.xml b/dev/tests/functional/etc/events.xml
index e8f0f63334f..5f6a771237a 100644
--- a/dev/tests/functional/etc/events.xml
+++ b/dev/tests/functional/etc/events.xml
@@ -10,6 +10,8 @@
         <observer class="Magento\Mtf\System\Observer\WebapiResponse">
             <tag name="webapi_failed" />
         </observer>
+    </preset>
+    <preset name="allure">
         <observer class="Magento\Mtf\System\Observer\AllureWebapiResponse">
             <tag name="webapi_failed" />
         </observer>
@@ -35,29 +37,15 @@
             <tag name="exception"/>
             <tag name="failure"/>
         </observer>
-        <observer class="Magento\Mtf\System\Observer\AllureSourceCode">
-            <tag name="exception"/>
-            <tag name="failure"/>
-        </observer>
         <observer class="Magento\Mtf\System\Observer\Screenshot">
             <tag name="exception"/>
             <tag name="failure"/>
         </observer>
-        <observer class="Magento\Mtf\System\Observer\AllureScreenshot">
-            <tag name="exception"/>
-            <tag name="failure"/>
-        </observer>
         <observer class="Magento\Mtf\System\Observer\CurlResponse">
             <tag name="curl_failed"/>
         </observer>
-        <observer class="Magento\Mtf\System\Observer\AllureCurlResponse">
-            <tag name="curl_failed"/>
-        </observer>
         <observer class="Magento\Mtf\System\Observer\WebapiResponse">
             <tag name="webapi_failed" />
         </observer>
-        <observer class="Magento\Mtf\System\Observer\AllureWebapiResponse">
-            <tag name="webapi_failed" />
-        </observer>
     </preset>
 </config>
-- 
GitLab


From 3b8ecb717602eeb0c86236f4b1347ff0466ad199 Mon Sep 17 00:00:00 2001
From: John Stennett <john00ivy@gmail.com>
Date: Thu, 30 Nov 2017 20:53:10 +0200
Subject: [PATCH 294/380] MQE-439: .env.example parameter example comment block

- Added a comment block at the top of the file that contains example values for each of the supported parameters.
- Removing DB parameters, part of MQE-404: Remove DB variables from .env.example.
---
 dev/tests/acceptance/.env.example | 40 +++++++++++++++++++++++++------
 1 file changed, 33 insertions(+), 7 deletions(-)

diff --git a/dev/tests/acceptance/.env.example b/dev/tests/acceptance/.env.example
index 9cce00f6c06..01c375010db 100644
--- a/dev/tests/acceptance/.env.example
+++ b/dev/tests/acceptance/.env.example
@@ -1,8 +1,36 @@
 #Copyright © Magento, Inc. All rights reserved.
 #See COPYING.txt for license details.
 
+#*** Start of example .env ***#
+#
+# MAGENTO_BASE_URL=http://127.0.0.1:32772/
+#
+# MAGENTO_BACKEND_NAME=admin
+# MAGENTO_ADMIN_USERNAME=admin
+# MAGENTO_ADMIN_PASSWORD=123123q
+#
+# SELENIUM_HOST=127.0.0.1
+# SELENIUM_PORT=4444
+# SELENIUM_PROTOCOL=http
+# SELENIUM_PATH=/wd/hub
+#
+# MAGENTO_RESTAPI_SERVER_HOST=127.0.0.1
+# MAGENTO_RESTAPI_SERVER_PORT=32769
+#
+# TESTS_BP=/Users/First_Last/GitHub/magento2ce/dev/tests/acceptance/tests/functional
+# FW_BP=/Users/First_Last/GitHub/magento2-functional-testing-framework
+# TESTS_MODULE_PATH=/Users/First_Last/GitHub/magento2ce/dev/tests/acceptance/tests/functional/Magento/FunctionalTest
+# MODULE_WHITELIST=Magento_SampleTests,Magento_NewModule
+#
+#*** End of example .env ***#
+
+
+#*** Start of .env ***#
+
+#*** Set the base URL for your Magento instance ***#
 MAGENTO_BASE_URL=
 
+#*** Set the Admin Username and Password for your Magento instance ***#
 MAGENTO_BACKEND_NAME=
 MAGENTO_ADMIN_USERNAME=
 MAGENTO_ADMIN_PASSWORD=
@@ -13,16 +41,14 @@ SELENIUM_PORT=4444
 SELENIUM_PROTOCOL=http
 SELENIUM_PATH=/wd/hub
 
-#*** Uncomment and set host & port if your dev environment needs different value other than MAGENTO_BASE_URL for Rest Api Requests ***#
+#*** Uncomment and set host & port if your dev environment needs different value other than MAGENTO_BASE_URL for Rest API Requests ***#
 #MAGENTO_RESTAPI_SERVER_HOST=
 #MAGENTO_RESTAPI_SERVER_PORT=
 
-DB_DSN=
-DB_USERNAME=
-DB_PASSWORD=
-
-#*** uncomment these properties to set up a dev environment with symlinked projects***#
+#*** Uncomment these properties to set up a dev environment with symlinked projects ***#
 #TESTS_BP=
 #FW_BP=
 #TESTS_MODULE_PATH=
-#MODULE_WHITELIST=
\ No newline at end of file
+#MODULE_WHITELIST=
+
+#*** End of .env ***#
\ No newline at end of file
-- 
GitLab


From 718ccaae8e3c4147d83f2b1d6bf20f671ed58498 Mon Sep 17 00:00:00 2001
From: Ji Lu <jilu1@magento.com>
Date: Fri, 1 Dec 2017 18:37:11 +0200
Subject: [PATCH 295/380] MQE-541: changed to use stepKey for test step
 sequencing.

---
 .../acceptance/tests/_suite/sampleSuite.xml   |   8 +-
 .../Backend/Cest/AdminLoginCest.xml           |  10 +-
 .../Catalog/Cest/AdminCreateCategoryCest.xml  |  34 +-
 .../Cest/AdminCreateSimpleProductCest.xml     |  68 +--
 .../Cest/StorefrontCustomerCheckoutCest.xml   |  96 ++--
 .../Cest/StorefrontGuestCheckoutCest.xml      |  98 ++--
 .../Cms/Cest/AdminCreateCmsPageCest.xml       |  40 +-
 .../AdminCreateConfigurableProductCest.xml    | 202 ++++----
 .../Customer/Cest/AdminCreateCustomerCest.xml |  38 +-
 .../Cest/StorefrontCreateCustomerCest.xml     |  24 +-
 .../StorefrontPersistedCustomerLoginCest.xml  |  18 +-
 .../Sales/Cest/AdminCreateInvoiceCest.xml     | 102 ++--
 .../ActionGroup/SampleActionGroup.xml         |   6 +-
 .../SampleTests/Cest/AdvancedSampleCest.xml   |  16 +-
 .../SampleTests/Cest/AssertsCest.xml          | 126 ++---
 .../CreateConfigurableProductByApiCest.xml    |  36 +-
 .../Cest/CreateSalesRuleByApiCest.xml         |   4 +-
 .../SampleTests/Cest/MinimumTestCest.xml      |  10 +-
 .../Cest/PersistMultipleEntitiesCest.xml      |  18 +-
 .../SampleTests/Cest/SampleCest.xml           | 462 +++++++++---------
 .../Cest/SetPaymentConfigurationCest.xml      |   8 +-
 .../Cest/UpdateSimpleProductByApiCest.xml     |   8 +-
 .../Store/Cest/AdminCreateStoreGroupCest.xml  |  38 +-
 .../StorefrontDeletePersistedWishlistCest.xml |  44 +-
 24 files changed, 757 insertions(+), 757 deletions(-)

diff --git a/dev/tests/acceptance/tests/_suite/sampleSuite.xml b/dev/tests/acceptance/tests/_suite/sampleSuite.xml
index f9b142d89c8..4172b526683 100644
--- a/dev/tests/acceptance/tests/_suite/sampleSuite.xml
+++ b/dev/tests/acceptance/tests/_suite/sampleSuite.xml
@@ -9,14 +9,14 @@
 <suites xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Suite/etc/suiteSchema.xsd">
     <suite name="mySuite">
         <before>
-            <createData entity="_defaultCategory" mergeKey="createCategory"/>
-            <createData entity="_defaultProduct" mergeKey="createProduct">
+            <createData entity="_defaultCategory" stepKey="createCategory"/>
+            <createData entity="_defaultProduct" stepKey="createProduct">
                 <required-entity createDataKey="createCategory"/>
             </createData>
         </before>
         <after>
-            <deleteData mergeKey="deleteMyProduct" createDataKey="createProduct"/>
-            <deleteData mergeKey="deleteMyCategory" createDataKey="createCategory"/>
+            <deleteData stepKey="deleteMyProduct" createDataKey="createProduct"/>
+            <deleteData stepKey="deleteMyCategory" createDataKey="createCategory"/>
         </after>
         <include>
             <group name="example"/>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/Cest/AdminLoginCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/Cest/AdminLoginCest.xml
index a50d75c167c..67605e2dbe5 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/Cest/AdminLoginCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/Cest/AdminLoginCest.xml
@@ -26,11 +26,11 @@
                 <env value="phantomjs"/>
                 <env value="headless"/>
             </annotations>
-            <amOnPage url="{{AdminLoginPage.url}}" mergeKey="amOnAdminLoginPage"/>
-            <fillField selector="{{AdminLoginFormSection.username}}" userInput="{{_ENV.MAGENTO_ADMIN_USERNAME}}" mergeKey="fillUsername"/>
-            <fillField selector="{{AdminLoginFormSection.password}}" userInput="{{_ENV.MAGENTO_ADMIN_PASSWORD}}" mergeKey="fillPassword"/>
-            <click selector="{{AdminLoginFormSection.signIn}}" mergeKey="clickOnSignIn"/>
-            <seeInCurrentUrl url="{{AdminLoginPage.url}}" mergeKey="seeAdminLoginUrl"/>
+            <amOnPage url="{{AdminLoginPage.url}}" stepKey="amOnAdminLoginPage"/>
+            <fillField selector="{{AdminLoginFormSection.username}}" userInput="{{_ENV.MAGENTO_ADMIN_USERNAME}}" stepKey="fillUsername"/>
+            <fillField selector="{{AdminLoginFormSection.password}}" userInput="{{_ENV.MAGENTO_ADMIN_PASSWORD}}" stepKey="fillPassword"/>
+            <click selector="{{AdminLoginFormSection.signIn}}" stepKey="clickOnSignIn"/>
+            <seeInCurrentUrl url="{{AdminLoginPage.url}}" stepKey="seeAdminLoginUrl"/>
         </test>
     </cest>
 </config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Cest/AdminCreateCategoryCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Cest/AdminCreateCategoryCest.xml
index 550e668b080..980eae28b6d 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Cest/AdminCreateCategoryCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Cest/AdminCreateCategoryCest.xml
@@ -14,7 +14,7 @@
             <stories value="Create a Category via the Admin"/>
         </annotations>
         <after>
-            <amOnPage url="admin/admin/auth/logout/" mergeKey="amOnLogoutPage"/>
+            <amOnPage url="admin/admin/auth/logout/" stepKey="amOnLogoutPage"/>
         </after>
         <test name="CreateCategoryViaAdmin">
             <annotations>
@@ -26,24 +26,24 @@
                 <env value="chrome"/>
                 <env value="headless"/>
             </annotations>
-            <amOnPage url="{{AdminLoginPage.url}}" mergeKey="amOnAdminLoginPage"/>
-            <fillField selector="{{AdminLoginFormSection.username}}" userInput="{{_ENV.MAGENTO_ADMIN_USERNAME}}" mergeKey="fillUsername"/>
-            <fillField selector="{{AdminLoginFormSection.password}}" userInput="{{_ENV.MAGENTO_ADMIN_PASSWORD}}" mergeKey="fillPassword"/>
-            <click selector="{{AdminLoginFormSection.signIn}}" mergeKey="clickOnSignIn"/>
-            <amOnPage url="{{AdminCategoryPage.url}}" mergeKey="navigateToCategoryPage"/>
-            <waitForPageLoad mergeKey="waitForPageLoad1"/>
-            <click selector="{{AdminCategorySidebarActionSection.AddSubcategoryButton}}" mergeKey="clickOnAddSubCategory"/>
-            <fillField selector="{{AdminCategoryBasicFieldSection.CategoryNameInput}}" userInput="{{SimpleSubCategory.name}}" mergeKey="enterCategoryName"/>
-            <click selector="{{AdminCategorySEOSection.SectionHeader}}" mergeKey="openSEO"/>
-            <fillField selector="{{AdminCategorySEOSection.UrlKeyInput}}" userInput="{{SimpleSubCategory.name_lwr}}" mergeKey="enterURLKey"/>
-            <click selector="{{AdminCategoryMainActionsSection.SaveButton}}" mergeKey="saveCategory"/>
-            <seeElement selector="{{AdminCategoryMessagesSection.SuccessMessage}}" mergeKey="assertSuccess"/>
+            <amOnPage url="{{AdminLoginPage.url}}" stepKey="amOnAdminLoginPage"/>
+            <fillField selector="{{AdminLoginFormSection.username}}" userInput="{{_ENV.MAGENTO_ADMIN_USERNAME}}" stepKey="fillUsername"/>
+            <fillField selector="{{AdminLoginFormSection.password}}" userInput="{{_ENV.MAGENTO_ADMIN_PASSWORD}}" stepKey="fillPassword"/>
+            <click selector="{{AdminLoginFormSection.signIn}}" stepKey="clickOnSignIn"/>
+            <amOnPage url="{{AdminCategoryPage.url}}" stepKey="navigateToCategoryPage"/>
+            <waitForPageLoad stepKey="waitForPageLoad1"/>
+            <click selector="{{AdminCategorySidebarActionSection.AddSubcategoryButton}}" stepKey="clickOnAddSubCategory"/>
+            <fillField selector="{{AdminCategoryBasicFieldSection.CategoryNameInput}}" userInput="{{SimpleSubCategory.name}}" stepKey="enterCategoryName"/>
+            <click selector="{{AdminCategorySEOSection.SectionHeader}}" stepKey="openSEO"/>
+            <fillField selector="{{AdminCategorySEOSection.UrlKeyInput}}" userInput="{{SimpleSubCategory.name_lwr}}" stepKey="enterURLKey"/>
+            <click selector="{{AdminCategoryMainActionsSection.SaveButton}}" stepKey="saveCategory"/>
+            <seeElement selector="{{AdminCategoryMessagesSection.SuccessMessage}}" stepKey="assertSuccess"/>
 
             <!-- Literal URL below, need to refactor line + StorefrontCategoryPage when support for variable URL is implemented-->
-            <amOnPage url="/{{SimpleSubCategory.name_lwr}}.html" mergeKey="goToCategoryFrontPage"/>
-            <waitForPageLoad mergeKey="waitForPageLoad2"/>
-            <seeInTitle userInput="{{SimpleSubCategory.name}}" mergeKey="assertTitle"/>
-            <see selector="{{StorefrontCategoryMainSection.CategoryTitle}}" userInput="{{SimpleSubCategory.name_lwr}}" mergeKey="assertInfo1"/>
+            <amOnPage url="/{{SimpleSubCategory.name_lwr}}.html" stepKey="goToCategoryFrontPage"/>
+            <waitForPageLoad stepKey="waitForPageLoad2"/>
+            <seeInTitle userInput="{{SimpleSubCategory.name}}" stepKey="assertTitle"/>
+            <see selector="{{StorefrontCategoryMainSection.CategoryTitle}}" userInput="{{SimpleSubCategory.name_lwr}}" stepKey="assertInfo1"/>
         </test>
     </cest>
 </config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Cest/AdminCreateSimpleProductCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Cest/AdminCreateSimpleProductCest.xml
index f649580554e..c2756445f62 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Cest/AdminCreateSimpleProductCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Cest/AdminCreateSimpleProductCest.xml
@@ -14,7 +14,7 @@
             <stories value="Create a Simple Product via Admin"/>
         </annotations>
         <before>
-            <createData entity="_defaultCategory" mergeKey="createPreReqCategory"/>
+            <createData entity="_defaultCategory" stepKey="createPreReqCategory"/>
         </before>
         <test name="CreateSimpleProductViaAdmin">
             <annotations>
@@ -26,45 +26,45 @@
                 <env value="chrome"/>
                 <env value="headless"/>
             </annotations>
-            <amOnPage url="{{AdminLoginPage.url}}" mergeKey="navigateToAdmin"/>
-            <fillField userInput="{{_ENV.MAGENTO_ADMIN_USERNAME}}" selector="{{AdminLoginFormSection.username}}" mergeKey="fillUsername"/>
-            <fillField userInput="{{_ENV.MAGENTO_ADMIN_PASSWORD}}" selector="{{AdminLoginFormSection.password}}" mergeKey="fillPassword"/>
-            <click selector="{{AdminLoginFormSection.signIn}}" mergeKey="clickLogin"/>
-            <amOnPage url="{{AdminProductIndexPage.url}}" mergeKey="navigateToProductIndex"/>
-            <click selector="{{AdminProductGridActionSection.addProductToggle}}" mergeKey="clickAddProductDropdown"/>
-            <click selector="{{AdminProductGridActionSection.addSimpleProduct}}" mergeKey="clickAddSimpleProduct"/>
-            <fillField userInput="{{_defaultProduct.name}}" selector="{{AdminProductFormSection.productName}}" mergeKey="fillName"/>
-            <fillField userInput="{{_defaultProduct.sku}}" selector="{{AdminProductFormSection.productSku}}" mergeKey="fillSKU"/>
-            <fillField userInput="{{_defaultProduct.price}}" selector="{{AdminProductFormSection.productPrice}}" mergeKey="fillPrice"/>
-            <fillField userInput="{{_defaultProduct.quantity}}" selector="{{AdminProductFormSection.productQuantity}}" mergeKey="fillQuantity"/>
-            <searchAndMultiSelectOption selector="{{AdminProductFormSection.categoriesDropdown}}" parameterArray="[$$createPreReqCategory.name$$]" mergeKey="searchAndSelectCategory"/>
-            <click selector="{{AdminProductSEOSection.sectionHeader}}" mergeKey="openSeoSection"/>
-            <fillField userInput="{{_defaultProduct.urlKey}}" selector="{{AdminProductSEOSection.urlKeyInput}}" mergeKey="fillUrlKey"/>
-            <click selector="{{AdminProductFormActionSection.saveButton}}" mergeKey="saveProduct"/>
-            <seeElement selector="{{AdminProductMessagesSection.successMessage}}" mergeKey="assertSaveMessageSuccess"/>
-            <seeInField userInput="{{_defaultProduct.name}}" selector="{{AdminProductFormSection.productName}}" mergeKey="assertFieldName"/>
-            <seeInField userInput="{{_defaultProduct.sku}}" selector="{{AdminProductFormSection.productSku}}" mergeKey="assertFieldSku"/>
-            <seeInField userInput="{{_defaultProduct.price}}" selector="{{AdminProductFormSection.productPrice}}" mergeKey="assertFieldPrice"/>
-            <click selector="{{AdminProductSEOSection.sectionHeader}}" mergeKey="openSeoSectionAssert"/>
-            <seeInField userInput="{{_defaultProduct.urlKey}}" selector="{{AdminProductSEOSection.urlKeyInput}}" mergeKey="assertFieldUrlKey"/>
+            <amOnPage url="{{AdminLoginPage.url}}" stepKey="navigateToAdmin"/>
+            <fillField userInput="{{_ENV.MAGENTO_ADMIN_USERNAME}}" selector="{{AdminLoginFormSection.username}}" stepKey="fillUsername"/>
+            <fillField userInput="{{_ENV.MAGENTO_ADMIN_PASSWORD}}" selector="{{AdminLoginFormSection.password}}" stepKey="fillPassword"/>
+            <click selector="{{AdminLoginFormSection.signIn}}" stepKey="clickLogin"/>
+            <amOnPage url="{{AdminProductIndexPage.url}}" stepKey="navigateToProductIndex"/>
+            <click selector="{{AdminProductGridActionSection.addProductToggle}}" stepKey="clickAddProductDropdown"/>
+            <click selector="{{AdminProductGridActionSection.addSimpleProduct}}" stepKey="clickAddSimpleProduct"/>
+            <fillField userInput="{{_defaultProduct.name}}" selector="{{AdminProductFormSection.productName}}" stepKey="fillName"/>
+            <fillField userInput="{{_defaultProduct.sku}}" selector="{{AdminProductFormSection.productSku}}" stepKey="fillSKU"/>
+            <fillField userInput="{{_defaultProduct.price}}" selector="{{AdminProductFormSection.productPrice}}" stepKey="fillPrice"/>
+            <fillField userInput="{{_defaultProduct.quantity}}" selector="{{AdminProductFormSection.productQuantity}}" stepKey="fillQuantity"/>
+            <searchAndMultiSelectOption selector="{{AdminProductFormSection.categoriesDropdown}}" parameterArray="[$$createPreReqCategory.name$$]" stepKey="searchAndSelectCategory"/>
+            <click selector="{{AdminProductSEOSection.sectionHeader}}" stepKey="openSeoSection"/>
+            <fillField userInput="{{_defaultProduct.urlKey}}" selector="{{AdminProductSEOSection.urlKeyInput}}" stepKey="fillUrlKey"/>
+            <click selector="{{AdminProductFormActionSection.saveButton}}" stepKey="saveProduct"/>
+            <seeElement selector="{{AdminProductMessagesSection.successMessage}}" stepKey="assertSaveMessageSuccess"/>
+            <seeInField userInput="{{_defaultProduct.name}}" selector="{{AdminProductFormSection.productName}}" stepKey="assertFieldName"/>
+            <seeInField userInput="{{_defaultProduct.sku}}" selector="{{AdminProductFormSection.productSku}}" stepKey="assertFieldSku"/>
+            <seeInField userInput="{{_defaultProduct.price}}" selector="{{AdminProductFormSection.productPrice}}" stepKey="assertFieldPrice"/>
+            <click selector="{{AdminProductSEOSection.sectionHeader}}" stepKey="openSeoSectionAssert"/>
+            <seeInField userInput="{{_defaultProduct.urlKey}}" selector="{{AdminProductSEOSection.urlKeyInput}}" stepKey="assertFieldUrlKey"/>
 
             <!-- Go to storefront category page, assert product visibility -->
-            <amOnPage url="{{StorefrontCategoryPage.url($$createPreReqCategory.name$$)}}" mergeKey="navigateToCategoryPage"/>
-            <waitForPageLoad mergeKey="waitForPageLoad1"/>
-            <see userInput="{{_defaultProduct.name}}" mergeKey="assertProductPresent"/>
-            <see userInput="{{_defaultProduct.price}}" mergeKey="assertProductPricePresent"/>
+            <amOnPage url="{{StorefrontCategoryPage.url($$createPreReqCategory.name$$)}}" stepKey="navigateToCategoryPage"/>
+            <waitForPageLoad stepKey="waitForPageLoad1"/>
+            <see userInput="{{_defaultProduct.name}}" stepKey="assertProductPresent"/>
+            <see userInput="{{_defaultProduct.price}}" stepKey="assertProductPricePresent"/>
 
             <!-- Go to storefront product page, assert product visibility -->
-            <amOnPage url="{{_defaultProduct.urlKey}}.html" mergeKey="navigateToProductPage"/>
-            <waitForPageLoad mergeKey="waitForPageLoad2"/>
-            <seeInTitle userInput="{{_defaultProduct.name}}" mergeKey="assertProductNameTitle"/>
-            <see userInput="{{_defaultProduct.name}}" selector="{{StorefrontProductInfoMainSection.productName}}" mergeKey="assertProductName"/>
-            <see userInput="{{_defaultProduct.price}}" selector="{{StorefrontProductInfoMainSection.productPrice}}" mergeKey="assertProductPrice"/>
-            <see userInput="{{_defaultProduct.sku}}" selector="{{StorefrontProductInfoMainSection.productSku}}" mergeKey="assertProductSku"/>
+            <amOnPage url="{{_defaultProduct.urlKey}}.html" stepKey="navigateToProductPage"/>
+            <waitForPageLoad stepKey="waitForPageLoad2"/>
+            <seeInTitle userInput="{{_defaultProduct.name}}" stepKey="assertProductNameTitle"/>
+            <see userInput="{{_defaultProduct.name}}" selector="{{StorefrontProductInfoMainSection.productName}}" stepKey="assertProductName"/>
+            <see userInput="{{_defaultProduct.price}}" selector="{{StorefrontProductInfoMainSection.productPrice}}" stepKey="assertProductPrice"/>
+            <see userInput="{{_defaultProduct.sku}}" selector="{{StorefrontProductInfoMainSection.productSku}}" stepKey="assertProductSku"/>
         </test>
         <after>
-            <deleteData createDataKey="createPreReqCategory" mergeKey="deletePreReqCategory"/>
-            <amOnPage url="admin/admin/auth/logout/" mergeKey="amOnLogoutPage"/>
+            <deleteData createDataKey="createPreReqCategory" stepKey="deletePreReqCategory"/>
+            <amOnPage url="admin/admin/auth/logout/" stepKey="amOnLogoutPage"/>
         </after>
     </cest>
 </config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Cest/StorefrontCustomerCheckoutCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Cest/StorefrontCustomerCheckoutCest.xml
index 5e97a6ab03b..1da632eaae1 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Cest/StorefrontCustomerCheckoutCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Cest/StorefrontCustomerCheckoutCest.xml
@@ -14,16 +14,16 @@
             <stories value="Checkout via the Admin"/>
         </annotations>
         <before>
-            <createData entity="SimpleSubCategory" mergeKey="simplecategory"/>
-            <createData entity="SimpleProduct" mergeKey="simpleproduct1">
+            <createData entity="SimpleSubCategory" stepKey="simplecategory"/>
+            <createData entity="SimpleProduct" stepKey="simpleproduct1">
                 <required-entity createDataKey="simplecategory"/>
             </createData>
-            <createData entity="Simple_US_Customer" mergeKey="simpleuscustomer"/>
+            <createData entity="Simple_US_Customer" stepKey="simpleuscustomer"/>
         </before>
         <after>
-            <deleteData createDataKey="simpleproduct1" mergeKey="deleteProduct1"/>
-            <deleteData createDataKey="simplecategory" mergeKey="deleteCategory"/>
-            <deleteData createDataKey="simpleuscustomer" mergeKey="deleteCustomer"/>
+            <deleteData createDataKey="simpleproduct1" stepKey="deleteProduct1"/>
+            <deleteData createDataKey="simplecategory" stepKey="deleteCategory"/>
+            <deleteData createDataKey="simpleuscustomer" stepKey="deleteCustomer"/>
         </after>
         <test name="CustomerCheckoutTest">
             <annotations>
@@ -36,52 +36,52 @@
                 <env value="headless"/>
             </annotations>
 
-            <amOnPage mergeKey="s1"  url="customer/account/login/"/>
-            <fillField  mergeKey="s3" userInput="$$simpleuscustomer.email$$" selector="{{StorefrontCustomerSignInFormSection.emailField}}"/>
-            <fillField  mergeKey="s5" userInput="$$simpleuscustomer.password$$" selector="{{StorefrontCustomerSignInFormSection.passwordField}}"/>
-            <click mergeKey="s7" selector="{{StorefrontCustomerSignInFormSection.signInAccountButton}}"/>
-            <waitForPageLoad mergeKey="s9"/>
+            <amOnPage stepKey="s1"  url="customer/account/login/"/>
+            <fillField  stepKey="s3" userInput="$$simpleuscustomer.email$$" selector="{{StorefrontCustomerSignInFormSection.emailField}}"/>
+            <fillField  stepKey="s5" userInput="$$simpleuscustomer.password$$" selector="{{StorefrontCustomerSignInFormSection.passwordField}}"/>
+            <click stepKey="s7" selector="{{StorefrontCustomerSignInFormSection.signInAccountButton}}"/>
+            <waitForPageLoad stepKey="s9"/>
 
-            <amOnPage mergeKey="s11" url="/$$simplecategory.name$$.html" />
-            <moveMouseOver mergeKey="s15" selector="{{StorefrontCategoryMainSection.ProductItemInfo}}" />
-            <click mergeKey="s17" selector="{{StorefrontCategoryMainSection.AddToCartBtn}}" />
-            <waitForElementVisible mergeKey="s21" selector="{{StorefrontCategoryMainSection.SuccessMsg}}" time="30" />
-            <see mergeKey="s23" selector="{{StorefrontCategoryMainSection.SuccessMsg}}" userInput="You added $$simpleproduct1.name$$ to your shopping cart."/>
-            <see mergeKey="s25" selector="{{StorefrontMiniCartSection.quantity}}" userInput="1" />
-            <click mergeKey="s27" selector="{{StorefrontMiniCartSection.show}}" />
-            <click mergeKey="s31" selector="{{StorefrontMiniCartSection.goToCheckout}}" />
-            <waitForPageLoad mergeKey="s33"/>
-            <waitForLoadingMaskToDisappear mergeKey="s34"/>
-            <click mergeKey="s35" selector="{{CheckoutShippingMethodsSection.firstShippingMethod}}"/>
-            <waitForElement mergeKey="s36" selector="{{CheckoutShippingMethodsSection.next}}" time="30"/>
-            <click mergeKey="s37" selector="{{CheckoutShippingMethodsSection.next}}" />
-            <waitForPageLoad mergeKey="s39"/>
-            <waitForElement mergeKey="s41" selector="{{CheckoutPaymentSection.placeOrder}}" time="30" />
-            <see mergeKey="s47" selector="{{CheckoutPaymentSection.billingAddress}}" userInput="{{US_Address_TX.street[0]}}" />
-            <click mergeKey="s49" selector="{{CheckoutPaymentSection.placeOrder}}" />
-            <waitForPageLoad mergeKey="s51"/>
-            <grabTextFrom mergeKey="s53" selector="{{CheckoutSuccessMainSection.orderNumber22}}" returnVariable="orderNumber" />
-            <see mergeKey="s55" selector="{{CheckoutSuccessMainSection.success}}" userInput="Your order number is:" />
+            <amOnPage stepKey="s11" url="/$$simplecategory.name$$.html" />
+            <moveMouseOver stepKey="s15" selector="{{StorefrontCategoryMainSection.ProductItemInfo}}" />
+            <click stepKey="s17" selector="{{StorefrontCategoryMainSection.AddToCartBtn}}" />
+            <waitForElementVisible stepKey="s21" selector="{{StorefrontCategoryMainSection.SuccessMsg}}" time="30" />
+            <see stepKey="s23" selector="{{StorefrontCategoryMainSection.SuccessMsg}}" userInput="You added $$simpleproduct1.name$$ to your shopping cart."/>
+            <see stepKey="s25" selector="{{StorefrontMiniCartSection.quantity}}" userInput="1" />
+            <click stepKey="s27" selector="{{StorefrontMiniCartSection.show}}" />
+            <click stepKey="s31" selector="{{StorefrontMiniCartSection.goToCheckout}}" />
+            <waitForPageLoad stepKey="s33"/>
+            <waitForLoadingMaskToDisappear stepKey="s34"/>
+            <click stepKey="s35" selector="{{CheckoutShippingMethodsSection.firstShippingMethod}}"/>
+            <waitForElement stepKey="s36" selector="{{CheckoutShippingMethodsSection.next}}" time="30"/>
+            <click stepKey="s37" selector="{{CheckoutShippingMethodsSection.next}}" />
+            <waitForPageLoad stepKey="s39"/>
+            <waitForElement stepKey="s41" selector="{{CheckoutPaymentSection.placeOrder}}" time="30" />
+            <see stepKey="s47" selector="{{CheckoutPaymentSection.billingAddress}}" userInput="{{US_Address_TX.street[0]}}" />
+            <click stepKey="s49" selector="{{CheckoutPaymentSection.placeOrder}}" />
+            <waitForPageLoad stepKey="s51"/>
+            <grabTextFrom stepKey="s53" selector="{{CheckoutSuccessMainSection.orderNumber22}}" returnVariable="orderNumber" />
+            <see stepKey="s55" selector="{{CheckoutSuccessMainSection.success}}" userInput="Your order number is:" />
 
-            <amOnPage mergeKey="s59" url="{{AdminLoginPage.url}}" />
-            <fillField mergeKey="s61" selector="{{AdminLoginFormSection.username}}" userInput="{{_ENV.MAGENTO_ADMIN_USERNAME}}" />
-            <fillField mergeKey="s63" selector="{{AdminLoginFormSection.password}}" userInput="{{_ENV.MAGENTO_ADMIN_PASSWORD}}" />
-            <click mergeKey="s65" selector="{{AdminLoginFormSection.signIn}}" />
+            <amOnPage stepKey="s59" url="{{AdminLoginPage.url}}" />
+            <fillField stepKey="s61" selector="{{AdminLoginFormSection.username}}" userInput="{{_ENV.MAGENTO_ADMIN_USERNAME}}" />
+            <fillField stepKey="s63" selector="{{AdminLoginFormSection.password}}" userInput="{{_ENV.MAGENTO_ADMIN_PASSWORD}}" />
+            <click stepKey="s65" selector="{{AdminLoginFormSection.signIn}}" />
 
-            <amOnPage mergeKey="s67" url="{{OrdersPage.url}}"/>
-            <waitForPageLoad mergeKey="s75"/>
-            <fillField mergeKey="s77" selector="{{OrdersGridSection.search}}" variable="orderNumber" />
-            <waitForPageLoad mergeKey="s78"/>
+            <amOnPage stepKey="s67" url="{{OrdersPage.url}}"/>
+            <waitForPageLoad stepKey="s75"/>
+            <fillField stepKey="s77" selector="{{OrdersGridSection.search}}" variable="orderNumber" />
+            <waitForPageLoad stepKey="s78"/>
 
-            <click mergeKey="s81" selector="{{OrdersGridSection.submitSearch22}}" />
-            <waitForPageLoad mergeKey="s831"/>
-            <click mergeKey="s84" selector="{{OrdersGridSection.firstRow}}" />
-            <see mergeKey="s85" selector="{{OrderDetailsInformationSection.orderStatus}}" userInput="Pending" />
-            <see mergeKey="s87" selector="{{OrderDetailsInformationSection.accountInformation}}" userInput="Customer" />
-            <see mergeKey="s89" selector="{{OrderDetailsInformationSection.accountInformation}}" userInput="$$simpleuscustomer.email$$" />
-            <see mergeKey="s91" selector="{{OrderDetailsInformationSection.billingAddress}}" userInput="{{US_Address_TX.street[0]}}" />
-            <see mergeKey="s93" selector="{{OrderDetailsInformationSection.shippingAddress}}" userInput="{{US_Address_TX.street[0]}}" />
-            <see mergeKey="s95" selector="{{OrderDetailsInformationSection.itemsOrdered}}" userInput="$$simpleproduct1.name$$" />
+            <click stepKey="s81" selector="{{OrdersGridSection.submitSearch22}}" />
+            <waitForPageLoad stepKey="s831"/>
+            <click stepKey="s84" selector="{{OrdersGridSection.firstRow}}" />
+            <see stepKey="s85" selector="{{OrderDetailsInformationSection.orderStatus}}" userInput="Pending" />
+            <see stepKey="s87" selector="{{OrderDetailsInformationSection.accountInformation}}" userInput="Customer" />
+            <see stepKey="s89" selector="{{OrderDetailsInformationSection.accountInformation}}" userInput="$$simpleuscustomer.email$$" />
+            <see stepKey="s91" selector="{{OrderDetailsInformationSection.billingAddress}}" userInput="{{US_Address_TX.street[0]}}" />
+            <see stepKey="s93" selector="{{OrderDetailsInformationSection.shippingAddress}}" userInput="{{US_Address_TX.street[0]}}" />
+            <see stepKey="s95" selector="{{OrderDetailsInformationSection.itemsOrdered}}" userInput="$$simpleproduct1.name$$" />
         </test>
     </cest>
 </config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Cest/StorefrontGuestCheckoutCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Cest/StorefrontGuestCheckoutCest.xml
index fa441fd6737..2aa0a77b0a0 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Cest/StorefrontGuestCheckoutCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Cest/StorefrontGuestCheckoutCest.xml
@@ -14,14 +14,14 @@
             <stories value="Checkout via Guest Checkout"/>
         </annotations>
         <before>
-            <createData entity="_defaultCategory" mergeKey="createCategory"/>
-            <createData entity="_defaultProduct" mergeKey="createProduct">
+            <createData entity="_defaultCategory" stepKey="createCategory"/>
+            <createData entity="_defaultProduct" stepKey="createProduct">
                 <required-entity createDataKey="createCategory"/>
             </createData>
         </before>
         <after>
-            <deleteData createDataKey="createCategory" mergeKey="deleteCategory"/>
-            <deleteData createDataKey="createProduct" mergeKey="deleteProduct"/>
+            <deleteData createDataKey="createCategory" stepKey="deleteCategory"/>
+            <deleteData createDataKey="createProduct" stepKey="deleteProduct"/>
         </after>
         <test name="GuestCheckoutTest">
             <annotations>
@@ -33,51 +33,51 @@
                 <env value="chrome"/>
                 <env value="headless"/>
             </annotations>
-            <amOnPage url="{{StorefrontCategoryPage.url($$createCategory.name$$)}}" mergeKey="onCategoryPage"/>
-            <waitForPageLoad mergeKey="waitForPageLoad1"/>
-            <moveMouseOver selector="{{StorefrontCategoryMainSection.ProductItemInfo}}" mergeKey="hoverProduct"/>
-            <click selector="{{StorefrontCategoryMainSection.AddToCartBtn}}" mergeKey="addToCart"/>
-            <waitForElementVisible selector="{{StorefrontCategoryMainSection.SuccessMsg}}" time="30" mergeKey="waitForProductAdded"/>
-            <see selector="{{StorefrontCategoryMainSection.SuccessMsg}}" userInput="You added $$createProduct.name$$ to your shopping cart." mergeKey="seeAddedToCartMessage"/>
-            <see selector="{{StorefrontMiniCartSection.quantity}}" userInput="1" mergeKey="seeCartQuantity"/>
-            <click selector="{{StorefrontMiniCartSection.show}}" mergeKey="clickCart"/>
-            <click selector="{{StorefrontMiniCartSection.goToCheckout}}" mergeKey="goToCheckout"/>
-            <waitForPageLoad mergeKey="waitForPageLoad2"/>
-            <fillField selector="{{GuestCheckoutShippingSection.email}}" userInput="{{CustomerEntityOne.email}}" mergeKey="enterEmail"/>
-            <fillField selector="{{GuestCheckoutShippingSection.firstName}}" userInput="{{CustomerEntityOne.firstname}}" mergeKey="enterFirstName"/>
-            <fillField selector="{{GuestCheckoutShippingSection.lastName}}" userInput="{{CustomerEntityOne.lastname}}" mergeKey="enterLastName"/>
-            <fillField selector="{{GuestCheckoutShippingSection.street}}" userInput="{{CustomerAddressSimple.street[0]}}" mergeKey="enterStreet"/>
-            <fillField selector="{{GuestCheckoutShippingSection.city}}" userInput="{{CustomerAddressSimple.city}}" mergeKey="enterCity"/>
-            <selectOption selector="{{GuestCheckoutShippingSection.region}}" userInput="{{CustomerAddressSimple.state}}" mergeKey="selectRegion"/>
-            <fillField selector="{{GuestCheckoutShippingSection.postcode}}" userInput="{{CustomerAddressSimple.postcode}}" mergeKey="enterPostcode"/>
-            <fillField selector="{{GuestCheckoutShippingSection.telephone}}" userInput="{{CustomerAddressSimple.telephone}}" mergeKey="enterTelephone"/>
-            <waitForLoadingMaskToDisappear mergeKey="waitForLoadingMask"/>
-            <click selector="{{GuestCheckoutShippingSection.firstShippingMethod}}" mergeKey="selectFirstShippingMethod"/>
-            <waitForElement selector="{{GuestCheckoutShippingSection.next}}" time="30" mergeKey="waitForNextButton"/>
-            <click selector="{{GuestCheckoutShippingSection.next}}" mergeKey="clickNext"/>
-            <waitForElement selector="{{GuestCheckoutPaymentSection.placeOrder}}" time="30" mergeKey="waitForPlaceOrderButton"/>
-            <see selector="{{GuestCheckoutPaymentSection.cartItems}}" userInput="{{_defaultProduct.name}}" mergeKey="seeProductInCart"/>
-            <see selector="{{GuestCheckoutPaymentSection.billingAddress}}" userInput="{{CustomerAddressSimple.street[0]}}" mergeKey="seeAddress"/>
-            <click selector="{{GuestCheckoutPaymentSection.placeOrder}}" mergeKey="clickPlaceOrder"/>
-            <grabTextFrom selector="{{CheckoutSuccessMainSection.orderNumber}}" returnVariable="orderNumber" mergeKey="grabOrderNumber"/>
-            <see selector="{{CheckoutSuccessMainSection.success}}" userInput="Your order # is:" mergeKey="seeOrderNumber"/>
-            <see selector="{{CheckoutSuccessMainSection.success}}" userInput="We'll email you an order confirmation with details and tracking info." mergeKey="seeEmailYou"/>
-            <amOnPage url="{{AdminLoginPage.url}}" mergeKey="navigateToAdmin"/>
-            <fillField selector="{{AdminLoginFormSection.username}}" userInput="{{_ENV.MAGENTO_ADMIN_USERNAME}}" mergeKey="fillUsername"/>
-            <fillField selector="{{AdminLoginFormSection.password}}" userInput="{{_ENV.MAGENTO_ADMIN_PASSWORD}}" mergeKey="fillPassword"/>
-            <click selector="{{AdminLoginFormSection.signIn}}" mergeKey="clickLogin"/>
-            <amOnPage url="{{OrdersPage.url}}" mergeKey="onOrdersPage"/>
-            <waitForElementNotVisible selector="{{OrdersGridSection.spinner}}" time="30" mergeKey="waitForOrdersPage"/>
-            <fillField selector="{{OrdersGridSection.search}}" variable="orderNumber" mergeKey="fillOrderNum"/>
-            <click selector="{{OrdersGridSection.submitSearch}}" mergeKey="submitSearchOrderNum"/>
-            <waitForElementNotVisible selector="{{OrdersGridSection.spinner}}" time="30" mergeKey="waitForOrdersPage2"/>
-            <click selector="{{OrdersGridSection.firstRow}}" mergeKey="clickOrderRow"/>
-            <see selector="{{OrderDetailsInformationSection.orderStatus}}" userInput="Pending" mergeKey="seeAdminOrderStatus"/>
-            <see selector="{{OrderDetailsInformationSection.accountInformation}}" userInput="Guest" mergeKey="seeAdminOrderGuest"/>
-            <see selector="{{OrderDetailsInformationSection.accountInformation}}" userInput="{{CustomerEntityOne.email}}" mergeKey="seeAdminOrderEmail"/>
-            <see selector="{{OrderDetailsInformationSection.billingAddress}}" userInput="{{CustomerAddressSimple.street[0]}}" mergeKey="seeAdminOrderBillingAddress"/>
-            <see selector="{{OrderDetailsInformationSection.shippingAddress}}" userInput="{{CustomerAddressSimple.street[0]}}" mergeKey="seeAdminOrderShippingAddress"/>
-            <see selector="{{OrderDetailsInformationSection.itemsOrdered}}" userInput="{{_defaultProduct.name}}" mergeKey="seeAdminOrderProduct"/>
+            <amOnPage url="{{StorefrontCategoryPage.url($$createCategory.name$$)}}" stepKey="onCategoryPage"/>
+            <waitForPageLoad stepKey="waitForPageLoad1"/>
+            <moveMouseOver selector="{{StorefrontCategoryMainSection.ProductItemInfo}}" stepKey="hoverProduct"/>
+            <click selector="{{StorefrontCategoryMainSection.AddToCartBtn}}" stepKey="addToCart"/>
+            <waitForElementVisible selector="{{StorefrontCategoryMainSection.SuccessMsg}}" time="30" stepKey="waitForProductAdded"/>
+            <see selector="{{StorefrontCategoryMainSection.SuccessMsg}}" userInput="You added $$createProduct.name$$ to your shopping cart." stepKey="seeAddedToCartMessage"/>
+            <see selector="{{StorefrontMiniCartSection.quantity}}" userInput="1" stepKey="seeCartQuantity"/>
+            <click selector="{{StorefrontMiniCartSection.show}}" stepKey="clickCart"/>
+            <click selector="{{StorefrontMiniCartSection.goToCheckout}}" stepKey="goToCheckout"/>
+            <waitForPageLoad stepKey="waitForPageLoad2"/>
+            <fillField selector="{{GuestCheckoutShippingSection.email}}" userInput="{{CustomerEntityOne.email}}" stepKey="enterEmail"/>
+            <fillField selector="{{GuestCheckoutShippingSection.firstName}}" userInput="{{CustomerEntityOne.firstname}}" stepKey="enterFirstName"/>
+            <fillField selector="{{GuestCheckoutShippingSection.lastName}}" userInput="{{CustomerEntityOne.lastname}}" stepKey="enterLastName"/>
+            <fillField selector="{{GuestCheckoutShippingSection.street}}" userInput="{{CustomerAddressSimple.street[0]}}" stepKey="enterStreet"/>
+            <fillField selector="{{GuestCheckoutShippingSection.city}}" userInput="{{CustomerAddressSimple.city}}" stepKey="enterCity"/>
+            <selectOption selector="{{GuestCheckoutShippingSection.region}}" userInput="{{CustomerAddressSimple.state}}" stepKey="selectRegion"/>
+            <fillField selector="{{GuestCheckoutShippingSection.postcode}}" userInput="{{CustomerAddressSimple.postcode}}" stepKey="enterPostcode"/>
+            <fillField selector="{{GuestCheckoutShippingSection.telephone}}" userInput="{{CustomerAddressSimple.telephone}}" stepKey="enterTelephone"/>
+            <waitForLoadingMaskToDisappear stepKey="waitForLoadingMask"/>
+            <click selector="{{GuestCheckoutShippingSection.firstShippingMethod}}" stepKey="selectFirstShippingMethod"/>
+            <waitForElement selector="{{GuestCheckoutShippingSection.next}}" time="30" stepKey="waitForNextButton"/>
+            <click selector="{{GuestCheckoutShippingSection.next}}" stepKey="clickNext"/>
+            <waitForElement selector="{{GuestCheckoutPaymentSection.placeOrder}}" time="30" stepKey="waitForPlaceOrderButton"/>
+            <see selector="{{GuestCheckoutPaymentSection.cartItems}}" userInput="{{_defaultProduct.name}}" stepKey="seeProductInCart"/>
+            <see selector="{{GuestCheckoutPaymentSection.billingAddress}}" userInput="{{CustomerAddressSimple.street[0]}}" stepKey="seeAddress"/>
+            <click selector="{{GuestCheckoutPaymentSection.placeOrder}}" stepKey="clickPlaceOrder"/>
+            <grabTextFrom selector="{{CheckoutSuccessMainSection.orderNumber}}" returnVariable="orderNumber" stepKey="grabOrderNumber"/>
+            <see selector="{{CheckoutSuccessMainSection.success}}" userInput="Your order # is:" stepKey="seeOrderNumber"/>
+            <see selector="{{CheckoutSuccessMainSection.success}}" userInput="We'll email you an order confirmation with details and tracking info." stepKey="seeEmailYou"/>
+            <amOnPage url="{{AdminLoginPage.url}}" stepKey="navigateToAdmin"/>
+            <fillField selector="{{AdminLoginFormSection.username}}" userInput="{{_ENV.MAGENTO_ADMIN_USERNAME}}" stepKey="fillUsername"/>
+            <fillField selector="{{AdminLoginFormSection.password}}" userInput="{{_ENV.MAGENTO_ADMIN_PASSWORD}}" stepKey="fillPassword"/>
+            <click selector="{{AdminLoginFormSection.signIn}}" stepKey="clickLogin"/>
+            <amOnPage url="{{OrdersPage.url}}" stepKey="onOrdersPage"/>
+            <waitForElementNotVisible selector="{{OrdersGridSection.spinner}}" time="30" stepKey="waitForOrdersPage"/>
+            <fillField selector="{{OrdersGridSection.search}}" variable="orderNumber" stepKey="fillOrderNum"/>
+            <click selector="{{OrdersGridSection.submitSearch}}" stepKey="submitSearchOrderNum"/>
+            <waitForElementNotVisible selector="{{OrdersGridSection.spinner}}" time="30" stepKey="waitForOrdersPage2"/>
+            <click selector="{{OrdersGridSection.firstRow}}" stepKey="clickOrderRow"/>
+            <see selector="{{OrderDetailsInformationSection.orderStatus}}" userInput="Pending" stepKey="seeAdminOrderStatus"/>
+            <see selector="{{OrderDetailsInformationSection.accountInformation}}" userInput="Guest" stepKey="seeAdminOrderGuest"/>
+            <see selector="{{OrderDetailsInformationSection.accountInformation}}" userInput="{{CustomerEntityOne.email}}" stepKey="seeAdminOrderEmail"/>
+            <see selector="{{OrderDetailsInformationSection.billingAddress}}" userInput="{{CustomerAddressSimple.street[0]}}" stepKey="seeAdminOrderBillingAddress"/>
+            <see selector="{{OrderDetailsInformationSection.shippingAddress}}" userInput="{{CustomerAddressSimple.street[0]}}" stepKey="seeAdminOrderShippingAddress"/>
+            <see selector="{{OrderDetailsInformationSection.itemsOrdered}}" userInput="{{_defaultProduct.name}}" stepKey="seeAdminOrderProduct"/>
         </test>
     </cest>
 </config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Cest/AdminCreateCmsPageCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Cest/AdminCreateCmsPageCest.xml
index e6dfb969fe2..fde1baac0c4 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Cest/AdminCreateCmsPageCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Cest/AdminCreateCmsPageCest.xml
@@ -14,7 +14,7 @@
             <stories value="Create a CMS Page via the Admin"/>
         </annotations>
         <after>
-            <amOnPage url="admin/admin/auth/logout/" mergeKey="amOnLogoutPage"/>
+            <amOnPage url="admin/admin/auth/logout/" stepKey="amOnLogoutPage"/>
         </after>
         <test name="CreateNewPage">
             <annotations>
@@ -28,26 +28,26 @@
                 <env value="firefox"/>
                 <env value="headless"/>
             </annotations>
-            <amOnPage url="{{AdminLoginPage.url}}" mergeKey="navigateToAdmin"/>
-            <fillField selector="{{AdminLoginFormSection.username}}" userInput="{{_ENV.MAGENTO_ADMIN_USERNAME}}" mergeKey="fillUsername"/>
-            <fillField selector="{{AdminLoginFormSection.password}}" userInput="{{_ENV.MAGENTO_ADMIN_PASSWORD}}" mergeKey="fillPassword"/>
-            <click selector="{{AdminLoginFormSection.signIn}}" mergeKey="clickLogin"/>
-            <amOnPage url="{{CmsPagesPage.url}}" mergeKey="amOnPagePagesGrid"/>
-            <waitForPageLoad mergeKey="waitForPageLoad1"/>
-            <click selector="{{CmsPagesPageActionsSection.addNewPage}}" mergeKey="clickAddNewPage"/>
-            <fillField selector="{{CmsNewPagePageBasicFieldsSection.pageTitle}}" userInput="{{_defaultCmsPage.title}}" mergeKey="fillFieldTitle"/>
-            <click selector="{{CmsNewPagePageContentSection.header}}" mergeKey="clickExpandContent"/>
-            <fillField selector="{{CmsNewPagePageContentSection.contentHeading}}" userInput="{{_defaultCmsPage.content_heading}}" mergeKey="fillFieldContentHeading"/>
+            <amOnPage url="{{AdminLoginPage.url}}" stepKey="navigateToAdmin"/>
+            <fillField selector="{{AdminLoginFormSection.username}}" userInput="{{_ENV.MAGENTO_ADMIN_USERNAME}}" stepKey="fillUsername"/>
+            <fillField selector="{{AdminLoginFormSection.password}}" userInput="{{_ENV.MAGENTO_ADMIN_PASSWORD}}" stepKey="fillPassword"/>
+            <click selector="{{AdminLoginFormSection.signIn}}" stepKey="clickLogin"/>
+            <amOnPage url="{{CmsPagesPage.url}}" stepKey="amOnPagePagesGrid"/>
+            <waitForPageLoad stepKey="waitForPageLoad1"/>
+            <click selector="{{CmsPagesPageActionsSection.addNewPage}}" stepKey="clickAddNewPage"/>
+            <fillField selector="{{CmsNewPagePageBasicFieldsSection.pageTitle}}" userInput="{{_defaultCmsPage.title}}" stepKey="fillFieldTitle"/>
+            <click selector="{{CmsNewPagePageContentSection.header}}" stepKey="clickExpandContent"/>
+            <fillField selector="{{CmsNewPagePageContentSection.contentHeading}}" userInput="{{_defaultCmsPage.content_heading}}" stepKey="fillFieldContentHeading"/>
             <!-- As of 2017/11/15, this test is failing here (Jenkins only, works locally). See MQE-282. -->
-            <fillField selector="{{CmsNewPagePageContentSection.content}}" userInput="{{_defaultCmsPage.content}}" mergeKey="fillFieldContent"/>
-            <click selector="{{CmsNewPagePageSeoSection.header}}" mergeKey="clickExpandSearchEngineOptimisation"/>
-            <fillField selector="{{CmsNewPagePageSeoSection.urlKey}}" userInput="{{_defaultCmsPage.identifier}}" mergeKey="fillFieldUrlKey"/>
-            <click selector="{{CmsNewPagePageActionsSection.savePage}}" mergeKey="clickSavePage"/>
-            <see userInput="You saved the page." mergeKey="seeSuccessMessage"/>
-            <amOnPage url="{{_defaultCmsPage.identifier}}" mergeKey="amOnPageTestPage"/>
-            <waitForPageLoad mergeKey="waitForPageLoad2"/>
-            <see userInput="{{_defaultCmsPage.content_heading}}" mergeKey="seeContentHeading"/>
-            <see userInput="{{_defaultCmsPage.content}}" mergeKey="seeContent"/>
+            <fillField selector="{{CmsNewPagePageContentSection.content}}" userInput="{{_defaultCmsPage.content}}" stepKey="fillFieldContent"/>
+            <click selector="{{CmsNewPagePageSeoSection.header}}" stepKey="clickExpandSearchEngineOptimisation"/>
+            <fillField selector="{{CmsNewPagePageSeoSection.urlKey}}" userInput="{{_defaultCmsPage.identifier}}" stepKey="fillFieldUrlKey"/>
+            <click selector="{{CmsNewPagePageActionsSection.savePage}}" stepKey="clickSavePage"/>
+            <see userInput="You saved the page." stepKey="seeSuccessMessage"/>
+            <amOnPage url="{{_defaultCmsPage.identifier}}" stepKey="amOnPageTestPage"/>
+            <waitForPageLoad stepKey="waitForPageLoad2"/>
+            <see userInput="{{_defaultCmsPage.content_heading}}" stepKey="seeContentHeading"/>
+            <see userInput="{{_defaultCmsPage.content}}" stepKey="seeContent"/>
         </test>
     </cest>
 </config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/Cest/AdminCreateConfigurableProductCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/Cest/AdminCreateConfigurableProductCest.xml
index fbcc2581b40..1e1475e154c 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/Cest/AdminCreateConfigurableProductCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/Cest/AdminCreateConfigurableProductCest.xml
@@ -14,10 +14,10 @@
             <stories value="Create a Configurable Product via the Admin"/>
         </annotations>
         <before>
-            <loginAsAdmin mergeKey="loginAsAdmin"/>
+            <loginAsAdmin stepKey="loginAsAdmin"/>
         </before>
         <after>
-            <amOnPage url="admin/admin/auth/logout/" mergeKey="amOnLogoutPage"/>
+            <amOnPage url="admin/admin/auth/logout/" stepKey="amOnLogoutPage"/>
         </after>
         <test name="CreateConfigurableProductViaAdmin">
             <annotations>
@@ -30,105 +30,105 @@
                 <env value="chrome"/>
             </annotations>
 
-            <amOnPage url="{{AdminCategoryPage.url}}" mergeKey="amOnCategoryGridPage"/>
-            <waitForPageLoad mergeKey="waitForPageLoad1"/>
-
-            <click selector="{{AdminCategorySidebarActionSection.AddSubcategoryButton}}" mergeKey="clickOnAddSubCategory"/>
-            <fillField selector="{{AdminCategoryBasicFieldSection.CategoryNameInput}}" userInput="{{_defaultCategory.name}}" mergeKey="enterCategoryName"/>
-            <click selector="{{AdminCategorySEOSection.SectionHeader}}" mergeKey="clickOnSeoSection"/>
-            <fillField selector="{{AdminCategorySEOSection.UrlKeyInput}}" userInput="{{_defaultCategory.name_lwr}}" mergeKey="enterUrlKey"/>
-            <click selector="{{AdminCategoryMainActionsSection.SaveButton}}" mergeKey="clickOnSaveCategory"/>
-            <seeElement selector="{{AdminCategoryMessagesSection.SuccessMessage}}" mergeKey="assertSuccessMessage"/>
-
-            <amOnPage url="{{AdminProductIndexPage.url}}" mergeKey="amOnProductGridPage"/>
-            <waitForPageLoad mergeKey="waitForPageLoad2"/>
-            <click selector="{{AdminProductGridActionSection.addProductToggle}}" mergeKey="clickOnAddProductToggle"/>
-            <click selector="{{AdminProductGridActionSection.addConfigurableProduct}}" mergeKey="clickOnAddConfigurableProduct"/>
-            <fillField userInput="{{_defaultProduct.name}}" selector="{{AdminProductFormSection.productName}}" mergeKey="fillName"/>
-            <fillField userInput="{{_defaultProduct.sku}}" selector="{{AdminProductFormSection.productSku}}" mergeKey="fillSKU"/>
-            <fillField userInput="{{_defaultProduct.price}}" selector="{{AdminProductFormSection.productPrice}}" mergeKey="fillPrice"/>
-            <fillField userInput="{{_defaultProduct.quantity}}" selector="{{AdminProductFormSection.productQuantity}}" mergeKey="fillQuantity"/>
-            <searchAndMultiSelectOption selector="{{AdminProductFormSection.categoriesDropdown}}" parameterArray="[{{_defaultCategory.name}}]" mergeKey="searchAndSelectCategory"/>
-            <click selector="{{AdminProductSEOSection.sectionHeader}}" mergeKey="openSeoSection"/>
-            <fillField userInput="{{_defaultProduct.urlKey}}" selector="{{AdminProductSEOSection.urlKeyInput}}" mergeKey="fillUrlKey"/>
-
-            <click selector="{{AdminProductFormConfigurationsSection.createConfigurations}}" mergeKey="clickOnCreateConfigurations"/>
-            <click selector="{{AdminCreateProductConfigurationsPanel.createNewAttribute}}" mergeKey="clickOnNewAttribute"/>
-            <switchToIFrame selector="{{AdminNewAttributePanel.newAttributeIFrame}}" mergeKey="switchToNewAttributeIFrame"/>
-            <fillField selector="{{AdminNewAttributePanel.defaultLabel}}" userInput="{{colorProductAttribute.default_label}}" mergeKey="fillDefaultLabel"/>
-            <click selector="{{AdminNewAttributePanel.saveAttribute}}" mergeKey="clickOnNewAttributePanel"/>
-
-            <switchToIFrame mergeKey="switchOutOfIFrame"/>
-            <click selector="{{AdminCreateProductConfigurationsPanel.filters}}" mergeKey="clickOnFilters"/>
-            <fillField userInput="{{colorProductAttribute.default_label}}" selector="{{AdminCreateProductConfigurationsPanel.attributeCode}}" mergeKey="fillFilterAttributeCodeField"/>
-            <click selector="{{AdminCreateProductConfigurationsPanel.applyFilters}}" mergeKey="clickApplyFiltersButton"/>
-            <click selector="{{AdminCreateProductConfigurationsPanel.firstCheckbox}}" mergeKey="clickOnFirstCheckbox"/>
-            <click selector="{{AdminCreateProductConfigurationsPanel.next}}" mergeKey="clickOnNextButton1"/>
-
-            <click selector="{{AdminCreateProductConfigurationsPanel.createNewValue}}" mergeKey="clickOnCreateNewValue1"/>
-            <fillField userInput="{{colorProductAttribute1.name}}" selector="{{AdminCreateProductConfigurationsPanel.attributeName}}" mergeKey="fillFieldForNewAttribute1"/>
-            <click selector="{{AdminCreateProductConfigurationsPanel.saveAttribute}}" mergeKey="clickOnSaveNewAttribute1"/>
-
-            <click selector="{{AdminCreateProductConfigurationsPanel.createNewValue}}" mergeKey="clickOnCreateNewValue2"/>
-            <fillField userInput="{{colorProductAttribute2.name}}" selector="{{AdminCreateProductConfigurationsPanel.attributeName}}" mergeKey="fillFieldForNewAttribute2"/>
-            <click selector="{{AdminCreateProductConfigurationsPanel.saveAttribute}}" mergeKey="clickOnSaveNewAttribute2"/>
-
-            <click selector="{{AdminCreateProductConfigurationsPanel.createNewValue}}" mergeKey="clickOnCreateNewValue3"/>
-            <fillField userInput="{{colorProductAttribute3.name}}" selector="{{AdminCreateProductConfigurationsPanel.attributeName}}" mergeKey="fillFieldForNewAttribute3"/>
-            <click selector="{{AdminCreateProductConfigurationsPanel.saveAttribute}}" mergeKey="clickOnSaveNewAttribute3"/>
-
-            <click selector="{{AdminCreateProductConfigurationsPanel.selectAll}}" mergeKey="clickOnSelectAll"/>
-            <click selector="{{AdminCreateProductConfigurationsPanel.next}}" mergeKey="clickOnNextButton2"/>
-
-            <click selector="{{AdminCreateProductConfigurationsPanel.applyUniquePricesByAttributeToEachSku}}" mergeKey="clickOnApplyUniquePricesByAttributeToEachSku"/>
-            <selectOption selector="{{AdminCreateProductConfigurationsPanel.selectAttribute}}" userInput="{{colorProductAttribute.default_label}}" mergeKey="selectAttributes"/>
-            <fillField selector="{{AdminCreateProductConfigurationsPanel.attribute1}}" userInput="{{colorProductAttribute1.price}}" mergeKey="fillAttributePrice1"/>
-            <fillField selector="{{AdminCreateProductConfigurationsPanel.attribute2}}" userInput="{{colorProductAttribute2.price}}" mergeKey="fillAttributePrice2"/>
-            <fillField selector="{{AdminCreateProductConfigurationsPanel.attribute3}}" userInput="{{colorProductAttribute3.price}}" mergeKey="fillAttributePrice3"/>
-
-            <click selector="{{AdminCreateProductConfigurationsPanel.applySingleQuantityToEachSkus}}" mergeKey="clickOnApplySingleQuantityToEachSku"/>
-            <fillField selector="{{AdminCreateProductConfigurationsPanel.quantity}}" userInput="1" mergeKey="enterAttributeQuantity"/>
-            <click selector="{{AdminCreateProductConfigurationsPanel.next}}" mergeKey="clickOnNextButton3"/>
-            <click selector="{{AdminCreateProductConfigurationsPanel.next}}" mergeKey="clickOnNextButton4"/>
-
-            <click selector="{{AdminProductFormActionSection.saveButton}}" mergeKey="clickOnSaveButton2"/>
-            <click selector="{{AdminChooseAffectedAttributeSetPopup.confirm}}" mergeKey="clickOnConfirmInPopup"/>
-
-            <seeElement selector="{{AdminProductMessagesSection.successMessage}}" mergeKey="seeSaveProductMessage"/>
-            <seeInTitle userInput="{{_defaultProduct.name}}" mergeKey="seeProductNameInTitle"/>
-
-            <seeNumberOfElements selector="{{AdminProductFormConfigurationsSection.currentVariationsRows}}" userInput="3" mergeKey="seeNumberOfRows"/>
-            <see selector="{{AdminProductFormConfigurationsSection.currentVariationsNameCells}}" userInput="{{colorProductAttribute1.name}}" mergeKey="seeAttributeName1InField"/>
-            <see selector="{{AdminProductFormConfigurationsSection.currentVariationsNameCells}}" userInput="{{colorProductAttribute2.name}}" mergeKey="seeAttributeName2InField"/>
-            <see selector="{{AdminProductFormConfigurationsSection.currentVariationsNameCells}}" userInput="{{colorProductAttribute3.name}}" mergeKey="seeAttributeName3InField"/>
-            <see selector="{{AdminProductFormConfigurationsSection.currentVariationsSkuCells}}" userInput="{{colorProductAttribute1.name}}" mergeKey="seeAttributeSku1InField"/>
-            <see selector="{{AdminProductFormConfigurationsSection.currentVariationsSkuCells}}" userInput="{{colorProductAttribute2.name}}" mergeKey="seeAttributeSku2InField"/>
-            <see selector="{{AdminProductFormConfigurationsSection.currentVariationsSkuCells}}" userInput="{{colorProductAttribute3.name}}" mergeKey="seeAttributeSku3InField"/>
-            <see selector="{{AdminProductFormConfigurationsSection.currentVariationsPriceCells}}" userInput="{{colorProductAttribute1.price}}" mergeKey="seeUniquePrice1InField"/>
-            <see selector="{{AdminProductFormConfigurationsSection.currentVariationsPriceCells}}" userInput="{{colorProductAttribute2.price}}" mergeKey="seeUniquePrice2InField"/>
-            <see selector="{{AdminProductFormConfigurationsSection.currentVariationsPriceCells}}" userInput="{{colorProductAttribute3.price}}" mergeKey="seeUniquePrice3InField"/>
-            <see selector="{{AdminProductFormConfigurationsSection.currentVariationsQuantityCells}}" userInput="{{colorProductAttribute.attribute_quantity}}" mergeKey="seeQuantityInField"/>
-
-            <amOnPage url="/" mergeKey="amOnStorefront"/>
-            <waitForPageLoad mergeKey="waitForPageLoad3"/>
-
-            <click userInput="{{_defaultCategory.name}}" mergeKey="clickOnCategoryName"/>
-            <waitForPageLoad mergeKey="waitForPageLoad4"/>
-
-            <see userInput="{{_defaultProduct.name}}" mergeKey="assertProductPresent"/>
-            <see userInput="{{colorProductAttribute1.price}}" mergeKey="assertProductPricePresent"/>
-            <click userInput="{{_defaultProduct.name}}" mergeKey="clickOnProductName"/>
-            <waitForPageLoad mergeKey="waitForPageLoad5"/>
-
-            <seeInTitle userInput="{{_defaultProduct.name}}" mergeKey="assertProductNameTitle"/>
-            <see userInput="{{_defaultProduct.name}}" selector="{{StorefrontProductInfoMainSection.productName}}" mergeKey="assertProductName"/>
-            <see userInput="{{colorProductAttribute1.price}}" selector="{{StorefrontProductInfoMainSection.productPrice}}" mergeKey="assertProductPrice"/>
-            <see userInput="{{_defaultProduct.sku}}" selector="{{StorefrontProductInfoMainSection.productSku}}" mergeKey="assertProductSku"/>
-
-            <see selector="{{StorefrontProductInfoMainSection.productAttributeTitle1}}" userInput="{{colorProductAttribute.default_label}}" mergeKey="seeColorAttributeName1"/>
-            <see selector="{{StorefrontProductInfoMainSection.productAttributeOptions1}}" userInput="{{colorProductAttribute1.name}}" mergeKey="seeInDropDown1"/>
-            <see selector="{{StorefrontProductInfoMainSection.productAttributeOptions1}}" userInput="{{colorProductAttribute2.name}}" mergeKey="seeInDropDown2"/>
-            <see selector="{{StorefrontProductInfoMainSection.productAttributeOptions1}}" userInput="{{colorProductAttribute3.name}}" mergeKey="seeInDropDown3"/>
+            <amOnPage url="{{AdminCategoryPage.url}}" stepKey="amOnCategoryGridPage"/>
+            <waitForPageLoad stepKey="waitForPageLoad1"/>
+
+            <click selector="{{AdminCategorySidebarActionSection.AddSubcategoryButton}}" stepKey="clickOnAddSubCategory"/>
+            <fillField selector="{{AdminCategoryBasicFieldSection.CategoryNameInput}}" userInput="{{_defaultCategory.name}}" stepKey="enterCategoryName"/>
+            <click selector="{{AdminCategorySEOSection.SectionHeader}}" stepKey="clickOnSeoSection"/>
+            <fillField selector="{{AdminCategorySEOSection.UrlKeyInput}}" userInput="{{_defaultCategory.name_lwr}}" stepKey="enterUrlKey"/>
+            <click selector="{{AdminCategoryMainActionsSection.SaveButton}}" stepKey="clickOnSaveCategory"/>
+            <seeElement selector="{{AdminCategoryMessagesSection.SuccessMessage}}" stepKey="assertSuccessMessage"/>
+
+            <amOnPage url="{{AdminProductIndexPage.url}}" stepKey="amOnProductGridPage"/>
+            <waitForPageLoad stepKey="waitForPageLoad2"/>
+            <click selector="{{AdminProductGridActionSection.addProductToggle}}" stepKey="clickOnAddProductToggle"/>
+            <click selector="{{AdminProductGridActionSection.addConfigurableProduct}}" stepKey="clickOnAddConfigurableProduct"/>
+            <fillField userInput="{{_defaultProduct.name}}" selector="{{AdminProductFormSection.productName}}" stepKey="fillName"/>
+            <fillField userInput="{{_defaultProduct.sku}}" selector="{{AdminProductFormSection.productSku}}" stepKey="fillSKU"/>
+            <fillField userInput="{{_defaultProduct.price}}" selector="{{AdminProductFormSection.productPrice}}" stepKey="fillPrice"/>
+            <fillField userInput="{{_defaultProduct.quantity}}" selector="{{AdminProductFormSection.productQuantity}}" stepKey="fillQuantity"/>
+            <searchAndMultiSelectOption selector="{{AdminProductFormSection.categoriesDropdown}}" parameterArray="[{{_defaultCategory.name}}]" stepKey="searchAndSelectCategory"/>
+            <click selector="{{AdminProductSEOSection.sectionHeader}}" stepKey="openSeoSection"/>
+            <fillField userInput="{{_defaultProduct.urlKey}}" selector="{{AdminProductSEOSection.urlKeyInput}}" stepKey="fillUrlKey"/>
+
+            <click selector="{{AdminProductFormConfigurationsSection.createConfigurations}}" stepKey="clickOnCreateConfigurations"/>
+            <click selector="{{AdminCreateProductConfigurationsPanel.createNewAttribute}}" stepKey="clickOnNewAttribute"/>
+            <switchToIFrame selector="{{AdminNewAttributePanel.newAttributeIFrame}}" stepKey="switchToNewAttributeIFrame"/>
+            <fillField selector="{{AdminNewAttributePanel.defaultLabel}}" userInput="{{colorProductAttribute.default_label}}" stepKey="fillDefaultLabel"/>
+            <click selector="{{AdminNewAttributePanel.saveAttribute}}" stepKey="clickOnNewAttributePanel"/>
+
+            <switchToIFrame stepKey="switchOutOfIFrame"/>
+            <click selector="{{AdminCreateProductConfigurationsPanel.filters}}" stepKey="clickOnFilters"/>
+            <fillField userInput="{{colorProductAttribute.default_label}}" selector="{{AdminCreateProductConfigurationsPanel.attributeCode}}" stepKey="fillFilterAttributeCodeField"/>
+            <click selector="{{AdminCreateProductConfigurationsPanel.applyFilters}}" stepKey="clickApplyFiltersButton"/>
+            <click selector="{{AdminCreateProductConfigurationsPanel.firstCheckbox}}" stepKey="clickOnFirstCheckbox"/>
+            <click selector="{{AdminCreateProductConfigurationsPanel.next}}" stepKey="clickOnNextButton1"/>
+
+            <click selector="{{AdminCreateProductConfigurationsPanel.createNewValue}}" stepKey="clickOnCreateNewValue1"/>
+            <fillField userInput="{{colorProductAttribute1.name}}" selector="{{AdminCreateProductConfigurationsPanel.attributeName}}" stepKey="fillFieldForNewAttribute1"/>
+            <click selector="{{AdminCreateProductConfigurationsPanel.saveAttribute}}" stepKey="clickOnSaveNewAttribute1"/>
+
+            <click selector="{{AdminCreateProductConfigurationsPanel.createNewValue}}" stepKey="clickOnCreateNewValue2"/>
+            <fillField userInput="{{colorProductAttribute2.name}}" selector="{{AdminCreateProductConfigurationsPanel.attributeName}}" stepKey="fillFieldForNewAttribute2"/>
+            <click selector="{{AdminCreateProductConfigurationsPanel.saveAttribute}}" stepKey="clickOnSaveNewAttribute2"/>
+
+            <click selector="{{AdminCreateProductConfigurationsPanel.createNewValue}}" stepKey="clickOnCreateNewValue3"/>
+            <fillField userInput="{{colorProductAttribute3.name}}" selector="{{AdminCreateProductConfigurationsPanel.attributeName}}" stepKey="fillFieldForNewAttribute3"/>
+            <click selector="{{AdminCreateProductConfigurationsPanel.saveAttribute}}" stepKey="clickOnSaveNewAttribute3"/>
+
+            <click selector="{{AdminCreateProductConfigurationsPanel.selectAll}}" stepKey="clickOnSelectAll"/>
+            <click selector="{{AdminCreateProductConfigurationsPanel.next}}" stepKey="clickOnNextButton2"/>
+
+            <click selector="{{AdminCreateProductConfigurationsPanel.applyUniquePricesByAttributeToEachSku}}" stepKey="clickOnApplyUniquePricesByAttributeToEachSku"/>
+            <selectOption selector="{{AdminCreateProductConfigurationsPanel.selectAttribute}}" userInput="{{colorProductAttribute.default_label}}" stepKey="selectAttributes"/>
+            <fillField selector="{{AdminCreateProductConfigurationsPanel.attribute1}}" userInput="{{colorProductAttribute1.price}}" stepKey="fillAttributePrice1"/>
+            <fillField selector="{{AdminCreateProductConfigurationsPanel.attribute2}}" userInput="{{colorProductAttribute2.price}}" stepKey="fillAttributePrice2"/>
+            <fillField selector="{{AdminCreateProductConfigurationsPanel.attribute3}}" userInput="{{colorProductAttribute3.price}}" stepKey="fillAttributePrice3"/>
+
+            <click selector="{{AdminCreateProductConfigurationsPanel.applySingleQuantityToEachSkus}}" stepKey="clickOnApplySingleQuantityToEachSku"/>
+            <fillField selector="{{AdminCreateProductConfigurationsPanel.quantity}}" userInput="1" stepKey="enterAttributeQuantity"/>
+            <click selector="{{AdminCreateProductConfigurationsPanel.next}}" stepKey="clickOnNextButton3"/>
+            <click selector="{{AdminCreateProductConfigurationsPanel.next}}" stepKey="clickOnNextButton4"/>
+
+            <click selector="{{AdminProductFormActionSection.saveButton}}" stepKey="clickOnSaveButton2"/>
+            <click selector="{{AdminChooseAffectedAttributeSetPopup.confirm}}" stepKey="clickOnConfirmInPopup"/>
+
+            <seeElement selector="{{AdminProductMessagesSection.successMessage}}" stepKey="seeSaveProductMessage"/>
+            <seeInTitle userInput="{{_defaultProduct.name}}" stepKey="seeProductNameInTitle"/>
+
+            <seeNumberOfElements selector="{{AdminProductFormConfigurationsSection.currentVariationsRows}}" userInput="3" stepKey="seeNumberOfRows"/>
+            <see selector="{{AdminProductFormConfigurationsSection.currentVariationsNameCells}}" userInput="{{colorProductAttribute1.name}}" stepKey="seeAttributeName1InField"/>
+            <see selector="{{AdminProductFormConfigurationsSection.currentVariationsNameCells}}" userInput="{{colorProductAttribute2.name}}" stepKey="seeAttributeName2InField"/>
+            <see selector="{{AdminProductFormConfigurationsSection.currentVariationsNameCells}}" userInput="{{colorProductAttribute3.name}}" stepKey="seeAttributeName3InField"/>
+            <see selector="{{AdminProductFormConfigurationsSection.currentVariationsSkuCells}}" userInput="{{colorProductAttribute1.name}}" stepKey="seeAttributeSku1InField"/>
+            <see selector="{{AdminProductFormConfigurationsSection.currentVariationsSkuCells}}" userInput="{{colorProductAttribute2.name}}" stepKey="seeAttributeSku2InField"/>
+            <see selector="{{AdminProductFormConfigurationsSection.currentVariationsSkuCells}}" userInput="{{colorProductAttribute3.name}}" stepKey="seeAttributeSku3InField"/>
+            <see selector="{{AdminProductFormConfigurationsSection.currentVariationsPriceCells}}" userInput="{{colorProductAttribute1.price}}" stepKey="seeUniquePrice1InField"/>
+            <see selector="{{AdminProductFormConfigurationsSection.currentVariationsPriceCells}}" userInput="{{colorProductAttribute2.price}}" stepKey="seeUniquePrice2InField"/>
+            <see selector="{{AdminProductFormConfigurationsSection.currentVariationsPriceCells}}" userInput="{{colorProductAttribute3.price}}" stepKey="seeUniquePrice3InField"/>
+            <see selector="{{AdminProductFormConfigurationsSection.currentVariationsQuantityCells}}" userInput="{{colorProductAttribute.attribute_quantity}}" stepKey="seeQuantityInField"/>
+
+            <amOnPage url="/" stepKey="amOnStorefront"/>
+            <waitForPageLoad stepKey="waitForPageLoad3"/>
+
+            <click userInput="{{_defaultCategory.name}}" stepKey="clickOnCategoryName"/>
+            <waitForPageLoad stepKey="waitForPageLoad4"/>
+
+            <see userInput="{{_defaultProduct.name}}" stepKey="assertProductPresent"/>
+            <see userInput="{{colorProductAttribute1.price}}" stepKey="assertProductPricePresent"/>
+            <click userInput="{{_defaultProduct.name}}" stepKey="clickOnProductName"/>
+            <waitForPageLoad stepKey="waitForPageLoad5"/>
+
+            <seeInTitle userInput="{{_defaultProduct.name}}" stepKey="assertProductNameTitle"/>
+            <see userInput="{{_defaultProduct.name}}" selector="{{StorefrontProductInfoMainSection.productName}}" stepKey="assertProductName"/>
+            <see userInput="{{colorProductAttribute1.price}}" selector="{{StorefrontProductInfoMainSection.productPrice}}" stepKey="assertProductPrice"/>
+            <see userInput="{{_defaultProduct.sku}}" selector="{{StorefrontProductInfoMainSection.productSku}}" stepKey="assertProductSku"/>
+
+            <see selector="{{StorefrontProductInfoMainSection.productAttributeTitle1}}" userInput="{{colorProductAttribute.default_label}}" stepKey="seeColorAttributeName1"/>
+            <see selector="{{StorefrontProductInfoMainSection.productAttributeOptions1}}" userInput="{{colorProductAttribute1.name}}" stepKey="seeInDropDown1"/>
+            <see selector="{{StorefrontProductInfoMainSection.productAttributeOptions1}}" userInput="{{colorProductAttribute2.name}}" stepKey="seeInDropDown2"/>
+            <see selector="{{StorefrontProductInfoMainSection.productAttributeOptions1}}" userInput="{{colorProductAttribute3.name}}" stepKey="seeInDropDown3"/>
         </test>
     </cest>
 </config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Cest/AdminCreateCustomerCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Cest/AdminCreateCustomerCest.xml
index b577bca92e3..da72ffd45ea 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Cest/AdminCreateCustomerCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Cest/AdminCreateCustomerCest.xml
@@ -24,26 +24,26 @@
                 <env value="chrome"/>
                 <env value="headless"/>
             </annotations>
-            <amOnPage url="{{AdminLoginPage.url}}" mergeKey="navigateToAdmin"/>
-            <fillField userInput="{{_ENV.MAGENTO_ADMIN_USERNAME}}" selector="{{AdminLoginFormSection.username}}" mergeKey="fillUsername"/>
-            <fillField userInput="{{_ENV.MAGENTO_ADMIN_PASSWORD}}" selector="{{AdminLoginFormSection.password}}" mergeKey="fillPassword"/>
-            <click selector="{{AdminLoginFormSection.signIn}}" mergeKey="clickLogin"/>
-            <amOnPage url="{{AdminCustomerPage.url}}" mergeKey="navigateToCustomers"/>
-            <click selector="{{AdminCustomerMainActionsSection.addNewCustomer}}" mergeKey="clickCreateCustomer"/>
-            <fillField userInput="{{CustomerEntityOne.firstname}}" selector="{{AdminNewCustomerAccountInformationSection.firstName}}" mergeKey="fillFirstName"/>
-            <fillField userInput="{{CustomerEntityOne.lastname}}" selector="{{AdminNewCustomerAccountInformationSection.lastName}}" mergeKey="fillLastName"/>
-            <fillField userInput="{{CustomerEntityOne.email}}" selector="{{AdminNewCustomerAccountInformationSection.email}}" mergeKey="fillEmail"/>
-            <click selector="{{AdminNewCustomerMainActionsSection.saveButton}}" mergeKey="saveCustomer"/>
-            <waitForElementNotVisible selector="div [data-role='spinner']" time="10" mergeKey="waitForSpinner1"/>
-            <seeElement selector="{{AdminCustomerMessagesSection.successMessage}}" mergeKey="assertSuccessMessage"/>
+            <amOnPage url="{{AdminLoginPage.url}}" stepKey="navigateToAdmin"/>
+            <fillField userInput="{{_ENV.MAGENTO_ADMIN_USERNAME}}" selector="{{AdminLoginFormSection.username}}" stepKey="fillUsername"/>
+            <fillField userInput="{{_ENV.MAGENTO_ADMIN_PASSWORD}}" selector="{{AdminLoginFormSection.password}}" stepKey="fillPassword"/>
+            <click selector="{{AdminLoginFormSection.signIn}}" stepKey="clickLogin"/>
+            <amOnPage url="{{AdminCustomerPage.url}}" stepKey="navigateToCustomers"/>
+            <click selector="{{AdminCustomerMainActionsSection.addNewCustomer}}" stepKey="clickCreateCustomer"/>
+            <fillField userInput="{{CustomerEntityOne.firstname}}" selector="{{AdminNewCustomerAccountInformationSection.firstName}}" stepKey="fillFirstName"/>
+            <fillField userInput="{{CustomerEntityOne.lastname}}" selector="{{AdminNewCustomerAccountInformationSection.lastName}}" stepKey="fillLastName"/>
+            <fillField userInput="{{CustomerEntityOne.email}}" selector="{{AdminNewCustomerAccountInformationSection.email}}" stepKey="fillEmail"/>
+            <click selector="{{AdminNewCustomerMainActionsSection.saveButton}}" stepKey="saveCustomer"/>
+            <waitForElementNotVisible selector="div [data-role='spinner']" time="10" stepKey="waitForSpinner1"/>
+            <seeElement selector="{{AdminCustomerMessagesSection.successMessage}}" stepKey="assertSuccessMessage"/>
 
-            <click selector="{{AdminCustomerFiltersSection.filtersButton}}" mergeKey="openFilter"/>
-            <fillField userInput="{{CustomerEntityOne.firstname}}" selector="{{AdminCustomerFiltersSection.nameInput}}" mergeKey="filterFirstName"/>
-            <click selector="{{AdminCustomerFiltersSection.apply}}" mergeKey="applyFilter"/>
-            <waitForElementNotVisible selector="div [data-role='spinner']" time="10" mergeKey="waitForSpinner2"/>
-            <see userInput="{{CustomerEntityOne.firstname}}" selector="{{AdminCustomerGridSection.customerGrid}}" mergeKey="assertFirstName"/>
-            <see userInput="{{CustomerEntityOne.lastname}}" selector="{{AdminCustomerGridSection.customerGrid}}" mergeKey="assertLastName"/>
-            <see userInput="{{CustomerEntityOne.email}}" selector="{{AdminCustomerGridSection.customerGrid}}" mergeKey="assertEmail"/>
+            <click selector="{{AdminCustomerFiltersSection.filtersButton}}" stepKey="openFilter"/>
+            <fillField userInput="{{CustomerEntityOne.firstname}}" selector="{{AdminCustomerFiltersSection.nameInput}}" stepKey="filterFirstName"/>
+            <click selector="{{AdminCustomerFiltersSection.apply}}" stepKey="applyFilter"/>
+            <waitForElementNotVisible selector="div [data-role='spinner']" time="10" stepKey="waitForSpinner2"/>
+            <see userInput="{{CustomerEntityOne.firstname}}" selector="{{AdminCustomerGridSection.customerGrid}}" stepKey="assertFirstName"/>
+            <see userInput="{{CustomerEntityOne.lastname}}" selector="{{AdminCustomerGridSection.customerGrid}}" stepKey="assertLastName"/>
+            <see userInput="{{CustomerEntityOne.email}}" selector="{{AdminCustomerGridSection.customerGrid}}" stepKey="assertEmail"/>
         </test>
     </cest>
 </config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Cest/StorefrontCreateCustomerCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Cest/StorefrontCreateCustomerCest.xml
index 37fe0017b86..36c97c56d0f 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Cest/StorefrontCreateCustomerCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Cest/StorefrontCreateCustomerCest.xml
@@ -25,18 +25,18 @@
                 <env value="firefox"/>
                 <env value="headless"/>
             </annotations>
-            <amOnPage mergeKey="amOnStorefrontPage"  url="/"/>
-            <click mergeKey="clickOnCreateAccountLink" selector="{{StorefrontPanelHeaderSection.createAnAccountLink}}"/>
-            <fillField  mergeKey="fillFirstName" userInput="{{CustomerEntityOne.firstname}}" selector="{{StorefrontCustomerCreateFormSection.firstnameField}}"/>
-            <fillField  mergeKey="fillLastName" userInput="{{CustomerEntityOne.lastname}}" selector="{{StorefrontCustomerCreateFormSection.lastnameField}}"/>
-            <fillField  mergeKey="fillEmail" userInput="{{CustomerEntityOne.email}}" selector="{{StorefrontCustomerCreateFormSection.emailField}}"/>
-            <fillField  mergeKey="fillPassword" userInput="{{CustomerEntityOne.password}}" selector="{{StorefrontCustomerCreateFormSection.passwordField}}"/>
-            <fillField  mergeKey="fillConfirmPassword" userInput="{{CustomerEntityOne.password}}" selector="{{StorefrontCustomerCreateFormSection.confirmPasswordField}}"/>
-            <click mergeKey="clickCreateAccountButton" selector="{{StorefrontCustomerCreateFormSection.createAccountButton}}"/>
-            <see mergeKey="seeThankYouMessage" userInput="Thank you for registering with Main Website Store."/>
-            <see mergeKey="seeFirstName" userInput="{{CustomerEntityOne.firstname}}" selector="{{StorefrontCustomerDashboardAccountInformationSection.ContactInformation}}" />
-            <see mergeKey="seeLastName" userInput="{{CustomerEntityOne.lastname}}" selector="{{StorefrontCustomerDashboardAccountInformationSection.ContactInformation}}" />
-            <see mergeKey="seeEmail" userInput="{{CustomerEntityOne.email}}" selector="{{StorefrontCustomerDashboardAccountInformationSection.ContactInformation}}" />
+            <amOnPage stepKey="amOnStorefrontPage"  url="/"/>
+            <click stepKey="clickOnCreateAccountLink" selector="{{StorefrontPanelHeaderSection.createAnAccountLink}}"/>
+            <fillField  stepKey="fillFirstName" userInput="{{CustomerEntityOne.firstname}}" selector="{{StorefrontCustomerCreateFormSection.firstnameField}}"/>
+            <fillField  stepKey="fillLastName" userInput="{{CustomerEntityOne.lastname}}" selector="{{StorefrontCustomerCreateFormSection.lastnameField}}"/>
+            <fillField  stepKey="fillEmail" userInput="{{CustomerEntityOne.email}}" selector="{{StorefrontCustomerCreateFormSection.emailField}}"/>
+            <fillField  stepKey="fillPassword" userInput="{{CustomerEntityOne.password}}" selector="{{StorefrontCustomerCreateFormSection.passwordField}}"/>
+            <fillField  stepKey="fillConfirmPassword" userInput="{{CustomerEntityOne.password}}" selector="{{StorefrontCustomerCreateFormSection.confirmPasswordField}}"/>
+            <click stepKey="clickCreateAccountButton" selector="{{StorefrontCustomerCreateFormSection.createAccountButton}}"/>
+            <see stepKey="seeThankYouMessage" userInput="Thank you for registering with Main Website Store."/>
+            <see stepKey="seeFirstName" userInput="{{CustomerEntityOne.firstname}}" selector="{{StorefrontCustomerDashboardAccountInformationSection.ContactInformation}}" />
+            <see stepKey="seeLastName" userInput="{{CustomerEntityOne.lastname}}" selector="{{StorefrontCustomerDashboardAccountInformationSection.ContactInformation}}" />
+            <see stepKey="seeEmail" userInput="{{CustomerEntityOne.email}}" selector="{{StorefrontCustomerDashboardAccountInformationSection.ContactInformation}}" />
         </test>
     </cest>
 </config>
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Cest/StorefrontPersistedCustomerLoginCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Cest/StorefrontPersistedCustomerLoginCest.xml
index 2e039b51bf1..6c79e31478c 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Cest/StorefrontPersistedCustomerLoginCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Cest/StorefrontPersistedCustomerLoginCest.xml
@@ -14,10 +14,10 @@
             <stories value="Persisted customer can login from storefront."/>
         </annotations>
         <before>
-            <createData mergeKey="customer" entity="Simple_US_Customer"/>
+            <createData stepKey="customer" entity="Simple_US_Customer"/>
         </before>
         <after>
-            <deleteData mergeKey="deleteCustomer" createDataKey="customer" />
+            <deleteData stepKey="deleteCustomer" createDataKey="customer" />
         </after>
         <test name="StorefrontPersistedCustomerLoginTest">
             <annotations>
@@ -31,13 +31,13 @@
                 <env value="phantomjs"/>
                 <env value="headless"/>
             </annotations>
-            <amOnPage mergeKey="amOnSignInPage"  url="{{StorefrontCustomerSignInPage.url}}"/>
-            <fillField  mergeKey="fillEmail" userInput="$$customer.email$$" selector="{{StorefrontCustomerSignInFormSection.emailField}}"/>
-            <fillField  mergeKey="fillPassword" userInput="$$customer.password$$" selector="{{StorefrontCustomerSignInFormSection.passwordField}}"/>
-            <click mergeKey="clickSignInAccountButton" selector="{{StorefrontCustomerSignInFormSection.signInAccountButton}}"/>
-            <see mergeKey="seeFirstName" userInput="$$customer.firstname$$" selector="{{StorefrontCustomerDashboardAccountInformationSection.ContactInformation}}" />
-            <see mergeKey="seeLastName" userInput="$$customer.lastname$$" selector="{{StorefrontCustomerDashboardAccountInformationSection.ContactInformation}}" />
-            <see mergeKey="seeEmail" userInput="$$customer.email$$" selector="{{StorefrontCustomerDashboardAccountInformationSection.ContactInformation}}" />
+            <amOnPage stepKey="amOnSignInPage"  url="{{StorefrontCustomerSignInPage.url}}"/>
+            <fillField  stepKey="fillEmail" userInput="$$customer.email$$" selector="{{StorefrontCustomerSignInFormSection.emailField}}"/>
+            <fillField  stepKey="fillPassword" userInput="$$customer.password$$" selector="{{StorefrontCustomerSignInFormSection.passwordField}}"/>
+            <click stepKey="clickSignInAccountButton" selector="{{StorefrontCustomerSignInFormSection.signInAccountButton}}"/>
+            <see stepKey="seeFirstName" userInput="$$customer.firstname$$" selector="{{StorefrontCustomerDashboardAccountInformationSection.ContactInformation}}" />
+            <see stepKey="seeLastName" userInput="$$customer.lastname$$" selector="{{StorefrontCustomerDashboardAccountInformationSection.ContactInformation}}" />
+            <see stepKey="seeEmail" userInput="$$customer.email$$" selector="{{StorefrontCustomerDashboardAccountInformationSection.ContactInformation}}" />
         </test>
     </cest>
 </config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Cest/AdminCreateInvoiceCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Cest/AdminCreateInvoiceCest.xml
index c043fe298f7..f27ac7d37af 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Cest/AdminCreateInvoiceCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Cest/AdminCreateInvoiceCest.xml
@@ -14,8 +14,8 @@
             <stories value="Create an Invoice via the Admin"/>
         </annotations>
         <before>
-            <createData entity="_defaultCategory" mergeKey="createCategory"/>
-            <createData entity="_defaultProduct" mergeKey="createProduct">
+            <createData entity="_defaultCategory" stepKey="createCategory"/>
+            <createData entity="_defaultProduct" stepKey="createProduct">
                 <required-entity createDataKey="createCategory"/>
             </createData>
         </before>
@@ -32,59 +32,59 @@
             </annotations>
 
             <!-- todo: Create an order via the api instead of driving the browser  -->
-            <amOnPage url="{{StorefrontCategoryPage.url($$createCategory.name$$)}}" mergeKey="onCategoryPage"/>
-            <waitForPageLoad mergeKey="waitForPageLoad1"/>
-            <moveMouseOver selector="{{StorefrontCategoryMainSection.ProductItemInfo}}" mergeKey="hoverProduct"/>
-            <click selector="{{StorefrontCategoryMainSection.AddToCartBtn}}" mergeKey="addToCart"/>
-            <waitForElementVisible selector="{{StorefrontCategoryMainSection.SuccessMsg}}" time="30" mergeKey="waitForProductAdded"/>
-            <click selector="{{StorefrontMiniCartSection.show}}" mergeKey="clickCart"/>
-            <click selector="{{StorefrontMiniCartSection.goToCheckout}}" mergeKey="goToCheckout"/>
-            <waitForPageLoad mergeKey="waitForPageLoad2"/>
-            <fillField selector="{{CheckoutShippingGuestInfoSection.email}}" userInput="{{CustomerEntityOne.email}}" mergeKey="enterEmail"/>
-            <fillField selector="{{CheckoutShippingGuestInfoSection.firstName}}" userInput="{{CustomerEntityOne.firstname}}" mergeKey="enterFirstName"/>
-            <fillField selector="{{CheckoutShippingGuestInfoSection.lastName}}" userInput="{{CustomerEntityOne.lastname}}" mergeKey="enterLastName"/>
-            <fillField selector="{{CheckoutShippingGuestInfoSection.street}}" userInput="{{CustomerAddressSimple.street[0]}}" mergeKey="enterStreet"/>
-            <fillField selector="{{CheckoutShippingGuestInfoSection.city}}" userInput="{{CustomerAddressSimple.city}}" mergeKey="enterCity"/>
-            <selectOption selector="{{CheckoutShippingGuestInfoSection.region}}" userInput="{{CustomerAddressSimple.state}}" mergeKey="selectRegion"/>
-            <fillField selector="{{CheckoutShippingGuestInfoSection.postcode}}" userInput="{{CustomerAddressSimple.postcode}}" mergeKey="enterPostcode"/>
-            <fillField selector="{{CheckoutShippingGuestInfoSection.telephone}}" userInput="{{CustomerAddressSimple.telephone}}" mergeKey="enterTelephone"/>
-            <waitForLoadingMaskToDisappear mergeKey="waitForLoadingMask"/>
-            <click selector="{{CheckoutShippingMethodsSection.firstShippingMethod}}" mergeKey="selectFirstShippingMethod"/>
-            <waitForElement selector="{{CheckoutShippingMethodsSection.next}}" time="30" mergeKey="waitForNextButton"/>
-            <click selector="{{CheckoutShippingMethodsSection.next}}" mergeKey="clickNext"/>
-            <waitForElement selector="{{CheckoutPaymentSection.placeOrder}}" time="30" mergeKey="waitForPlaceOrderButton"/>
-            <click selector="{{CheckoutPaymentSection.placeOrder}}" mergeKey="clickPlaceOrder"/>
-            <grabTextFrom selector="{{CheckoutSuccessMainSection.orderNumber}}" returnVariable="orderNumber" mergeKey="grabOrderNumber"/>
+            <amOnPage url="{{StorefrontCategoryPage.url($$createCategory.name$$)}}" stepKey="onCategoryPage"/>
+            <waitForPageLoad stepKey="waitForPageLoad1"/>
+            <moveMouseOver selector="{{StorefrontCategoryMainSection.ProductItemInfo}}" stepKey="hoverProduct"/>
+            <click selector="{{StorefrontCategoryMainSection.AddToCartBtn}}" stepKey="addToCart"/>
+            <waitForElementVisible selector="{{StorefrontCategoryMainSection.SuccessMsg}}" time="30" stepKey="waitForProductAdded"/>
+            <click selector="{{StorefrontMiniCartSection.show}}" stepKey="clickCart"/>
+            <click selector="{{StorefrontMiniCartSection.goToCheckout}}" stepKey="goToCheckout"/>
+            <waitForPageLoad stepKey="waitForPageLoad2"/>
+            <fillField selector="{{CheckoutShippingGuestInfoSection.email}}" userInput="{{CustomerEntityOne.email}}" stepKey="enterEmail"/>
+            <fillField selector="{{CheckoutShippingGuestInfoSection.firstName}}" userInput="{{CustomerEntityOne.firstname}}" stepKey="enterFirstName"/>
+            <fillField selector="{{CheckoutShippingGuestInfoSection.lastName}}" userInput="{{CustomerEntityOne.lastname}}" stepKey="enterLastName"/>
+            <fillField selector="{{CheckoutShippingGuestInfoSection.street}}" userInput="{{CustomerAddressSimple.street[0]}}" stepKey="enterStreet"/>
+            <fillField selector="{{CheckoutShippingGuestInfoSection.city}}" userInput="{{CustomerAddressSimple.city}}" stepKey="enterCity"/>
+            <selectOption selector="{{CheckoutShippingGuestInfoSection.region}}" userInput="{{CustomerAddressSimple.state}}" stepKey="selectRegion"/>
+            <fillField selector="{{CheckoutShippingGuestInfoSection.postcode}}" userInput="{{CustomerAddressSimple.postcode}}" stepKey="enterPostcode"/>
+            <fillField selector="{{CheckoutShippingGuestInfoSection.telephone}}" userInput="{{CustomerAddressSimple.telephone}}" stepKey="enterTelephone"/>
+            <waitForLoadingMaskToDisappear stepKey="waitForLoadingMask"/>
+            <click selector="{{CheckoutShippingMethodsSection.firstShippingMethod}}" stepKey="selectFirstShippingMethod"/>
+            <waitForElement selector="{{CheckoutShippingMethodsSection.next}}" time="30" stepKey="waitForNextButton"/>
+            <click selector="{{CheckoutShippingMethodsSection.next}}" stepKey="clickNext"/>
+            <waitForElement selector="{{CheckoutPaymentSection.placeOrder}}" time="30" stepKey="waitForPlaceOrderButton"/>
+            <click selector="{{CheckoutPaymentSection.placeOrder}}" stepKey="clickPlaceOrder"/>
+            <grabTextFrom selector="{{CheckoutSuccessMainSection.orderNumber}}" returnVariable="orderNumber" stepKey="grabOrderNumber"/>
             <!-- end todo -->
 
-            <amOnPage url="{{AdminLoginPage.url}}" mergeKey="goToAdmin"/>
-            <waitForPageLoad mergeKey="waitForPageLoad1"/>
-            <fillField selector="{{AdminLoginFormSection.username}}" userInput="{{_ENV.MAGENTO_ADMIN_USERNAME}}" mergeKey="fillUsername"/>
-            <fillField selector="{{AdminLoginFormSection.password}}" userInput="{{_ENV.MAGENTO_ADMIN_PASSWORD}}" mergeKey="fillPassword"/>
-            <click selector="{{AdminLoginFormSection.signIn}}" mergeKey="clickLogin"/>
+            <amOnPage url="{{AdminLoginPage.url}}" stepKey="goToAdmin"/>
+            <waitForPageLoad stepKey="waitForPageLoad1"/>
+            <fillField selector="{{AdminLoginFormSection.username}}" userInput="{{_ENV.MAGENTO_ADMIN_USERNAME}}" stepKey="fillUsername"/>
+            <fillField selector="{{AdminLoginFormSection.password}}" userInput="{{_ENV.MAGENTO_ADMIN_PASSWORD}}" stepKey="fillPassword"/>
+            <click selector="{{AdminLoginFormSection.signIn}}" stepKey="clickLogin"/>
 
-            <amOnPage url="{{OrdersPage.url}}" mergeKey="onOrdersPage"/>
-            <waitForElementNotVisible selector="{{OrdersGridSection.spinner}}" time="10" mergeKey="waitSpinner1"/>
-            <fillField selector="{{OrdersGridSection.search}}" variable="orderNumber" mergeKey="searchOrderNum"/>
-            <click selector="{{OrdersGridSection.submitSearch}}" mergeKey="submitSearch"/>
-            <waitForElementNotVisible selector="{{OrdersGridSection.spinner}}" time="10" mergeKey="waitSpinner2"/>
+            <amOnPage url="{{OrdersPage.url}}" stepKey="onOrdersPage"/>
+            <waitForElementNotVisible selector="{{OrdersGridSection.spinner}}" time="10" stepKey="waitSpinner1"/>
+            <fillField selector="{{OrdersGridSection.search}}" variable="orderNumber" stepKey="searchOrderNum"/>
+            <click selector="{{OrdersGridSection.submitSearch}}" stepKey="submitSearch"/>
+            <waitForElementNotVisible selector="{{OrdersGridSection.spinner}}" time="10" stepKey="waitSpinner2"/>
 
-            <click selector="{{OrdersGridSection.firstRow}}" mergeKey="clickOrderRow"/>
-            <click selector="{{OrderDetailsMainActionsSection.invoice}}" mergeKey="clickInvoice"/>
-            <click selector="{{InvoiceNewSection.submitInvoice}}" mergeKey="clickSubmitInvoice"/>
-            <see selector="{{OrderDetailsMessagesSection.successMessage}}" userInput="The invoice has been created." mergeKey="seeSuccessMessage"/>
-            <click selector="{{OrderDetailsOrderViewSection.invoices}}" mergeKey="clickInvoices"/>
-            <waitForElementNotVisible selector="{{OrderDetailsInvoicesSection.spinner}}" time="10" mergeKey="waitSpinner3"/>
-            <see selector="{{OrderDetailsInvoicesSection.content}}" variable="orderNumber" mergeKey="seeInvoice1"/>
-            <see selector="{{OrderDetailsInvoicesSection.content}}" userInput="John Doe" mergeKey="seeInvoice2"/>
-            <click selector="{{OrderDetailsOrderViewSection.information}}" mergeKey="clickInformation"/>
-            <see selector="{{OrderDetailsInformationSection.orderStatus}}" userInput="Processing" mergeKey="seeOrderStatus"/>
-            <amOnPage url="{{InvoicesPage.url}}" mergeKey="goToInvoices"/>
-            <waitForElementNotVisible selector="{{InvoicesGridSection.spinner}}" time="10" mergeKey="waitSpinner4"/>
-            <click selector="{{InvoicesGridSection.filter}}" mergeKey="clickFilters"/>
-            <fillField selector="{{InvoicesFiltersSection.orderNum}}" variable="orderNumber" mergeKey="searchOrderNum2"/>
-            <click selector="{{InvoicesGridSection.firstRow}}" mergeKey="clickInvoice2"/>
-            <see selector="{{InvoiceDetailsInformationSection.orderStatus}}" userInput="Processing" mergeKey="seeOrderStatus2"/>
+            <click selector="{{OrdersGridSection.firstRow}}" stepKey="clickOrderRow"/>
+            <click selector="{{OrderDetailsMainActionsSection.invoice}}" stepKey="clickInvoice"/>
+            <click selector="{{InvoiceNewSection.submitInvoice}}" stepKey="clickSubmitInvoice"/>
+            <see selector="{{OrderDetailsMessagesSection.successMessage}}" userInput="The invoice has been created." stepKey="seeSuccessMessage"/>
+            <click selector="{{OrderDetailsOrderViewSection.invoices}}" stepKey="clickInvoices"/>
+            <waitForElementNotVisible selector="{{OrderDetailsInvoicesSection.spinner}}" time="10" stepKey="waitSpinner3"/>
+            <see selector="{{OrderDetailsInvoicesSection.content}}" variable="orderNumber" stepKey="seeInvoice1"/>
+            <see selector="{{OrderDetailsInvoicesSection.content}}" userInput="John Doe" stepKey="seeInvoice2"/>
+            <click selector="{{OrderDetailsOrderViewSection.information}}" stepKey="clickInformation"/>
+            <see selector="{{OrderDetailsInformationSection.orderStatus}}" userInput="Processing" stepKey="seeOrderStatus"/>
+            <amOnPage url="{{InvoicesPage.url}}" stepKey="goToInvoices"/>
+            <waitForElementNotVisible selector="{{InvoicesGridSection.spinner}}" time="10" stepKey="waitSpinner4"/>
+            <click selector="{{InvoicesGridSection.filter}}" stepKey="clickFilters"/>
+            <fillField selector="{{InvoicesFiltersSection.orderNum}}" variable="orderNumber" stepKey="searchOrderNum2"/>
+            <click selector="{{InvoicesGridSection.firstRow}}" stepKey="clickInvoice2"/>
+            <see selector="{{InvoiceDetailsInformationSection.orderStatus}}" userInput="Processing" stepKey="seeOrderStatus2"/>
         </test>
     </cest>
 </config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/ActionGroup/SampleActionGroup.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/ActionGroup/SampleActionGroup.xml
index 629688f7437..b047b19d4a0 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/ActionGroup/SampleActionGroup.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/ActionGroup/SampleActionGroup.xml
@@ -12,13 +12,13 @@
         <arguments>
             <argument name="person" defaultValue="SamplePerson"/>
         </arguments>
-        <fillField selector="#foo" userInput="{{person.foo}}" mergeKey="fillField1"/>
-        <fillField selector="#bar" userInput="{{person.bar}}" mergeKey="fillField2"/>
+        <fillField selector="#foo" userInput="{{person.foo}}" stepKey="fillField1"/>
+        <fillField selector="#bar" userInput="{{person.bar}}" stepKey="fillField2"/>
     </actionGroup>
     <actionGroup name="ValidateSlideOutPanelField">
         <arguments>
             <argument name="property" defaultValue=""/>
         </arguments>
-        <see userInput="{{property.name}}" selector="{{ColumnSection.panelFieldLabel(property.section, property.fieldName, property.section, property.name)}}" mergeKey="seePropertyLabel"/>
+        <see userInput="{{property.name}}" selector="{{ColumnSection.panelFieldLabel(property.section, property.fieldName, property.section, property.name)}}" stepKey="seePropertyLabel"/>
     </actionGroup>
 </config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/AdvancedSampleCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/AdvancedSampleCest.xml
index 761635f2818..eddae0242f5 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/AdvancedSampleCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/AdvancedSampleCest.xml
@@ -16,7 +16,7 @@
             <group value="skip"/>
         </annotations>
         <before>
-            <createData entity="SamplePerson" mergeKey="beforeData"/>
+            <createData entity="SamplePerson" stepKey="beforeData"/>
         </before>
         <after>
 
@@ -30,26 +30,26 @@
             </annotations>
 
             <!-- Create an entity that depends on another entity -->
-            <createData entity="_defaultCategory" mergeKey="createCategory"/>
-            <createData entity="_defaultProduct" mergeKey="createProduct">
+            <createData entity="_defaultCategory" stepKey="createCategory"/>
+            <createData entity="_defaultProduct" stepKey="createProduct">
                 <required-entity createDataKey="createCategory"/>
             </createData>
 
             <!-- Parameterized url -->
-            <amOnPage url="{{SamplePage.url('foo', SamplePerson.bar)}}" mergeKey="amOnPage"/>
+            <amOnPage url="{{SamplePage.url('foo', SamplePerson.bar)}}" stepKey="amOnPage"/>
 
             <!-- Parameterized selector -->
-            <grabTextFrom selector="{{SampleSection.twoParamElement(SamplePerson.foo, 'bar')}}" returnVariable="myReturnVar" mergeKey="grabTextFrom"/>
+            <grabTextFrom selector="{{SampleSection.twoParamElement(SamplePerson.foo, 'bar')}}" returnVariable="myReturnVar" stepKey="grabTextFrom"/>
 
             <!-- Element with a timeout -->
-            <click selector="{{SampleSection.timeoutElement}}" mergeKey="click"/>
+            <click selector="{{SampleSection.timeoutElement}}" stepKey="click"/>
 
             <!-- ActionGroup -->
-            <actionGroup ref="SampleActionGroup" mergeKey="actionGroup">
+            <actionGroup ref="SampleActionGroup" stepKey="actionGroup">
                 <argument name="person" value="OverrideDefaultPerson"/>
             </actionGroup>
 
-            <actionGroup ref="ValidateSlideOutPanelField" mergeKey="seeAppearanceMinHeightProperty">
+            <actionGroup ref="ValidateSlideOutPanelField" stepKey="seeAppearanceMinHeightProperty">
                 <argument name="property" value="AppearanceMinHeightProperty"/>
             </actionGroup>
         </test>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/AssertsCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/AssertsCest.xml
index e6b3f9b5631..17366a6518c 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/AssertsCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/AssertsCest.xml
@@ -14,83 +14,83 @@
             <group value="skip"/>
         </annotations>
         <before>
-            <createData entity="Simple_US_Customer" mergeKey="createData1"/>
+            <createData entity="Simple_US_Customer" stepKey="createData1"/>
         </before>
         <after>
-            <deleteData createDataKey="createData1" mergeKey="deleteData1"/>
+            <deleteData createDataKey="createData1" stepKey="deleteData1"/>
         </after>
         <test name="AssertTest">
-            <createData entity="Simple_US_Customer" mergeKey="createData2"/>
-            <amOnUrl url="https://www.yahoo.com" mergeKey="amOnPage"/>
-            <waitForElementVisible mergeKey="wait1" selector="#uh-logo" time="10"/>
-            <grabTextFrom returnVariable="text" selector="#uh-logo" mergeKey="grabTextFrom1"/>
+            <createData entity="Simple_US_Customer" stepKey="createData2"/>
+            <amOnUrl url="https://www.yahoo.com" stepKey="amOnPage"/>
+            <waitForElementVisible stepKey="wait1" selector="#uh-logo" time="10"/>
+            <grabTextFrom returnVariable="text" selector="#uh-logo" stepKey="grabTextFrom1"/>
 
             <!-- asserts without variable replacement -->
-            <comment mergeKey="c1" userInput="asserts without variable replacement"/>
-            <assertArrayHasKey mergeKey="assertArrayHasKey" expected="apple" expectedType="string" actual="['orange' => 2, 'apple' => 1]" actualType="const" message="pass"/>
-            <assertArrayNotHasKey mergeKey="assertArrayNotHasKey" expected="kiwi" expectedType="string" actual="['orange' => 2, 'apple' => 1]" message="pass"/>
-            <assertArraySubset mergeKey="assertArraySubset" expected="[1, 2]" actual="[1, 2, 3, 5]" message="pass"/>
-            <assertContains mergeKey="assertContains" expected="ab" expectedType="string" actual="['item1' => 'a', 'item2' => 'ab']" message="pass"/>
-            <assertCount mergeKey="assertCount" expected="2" expectedType="int" actual="['a', 'b']" message="pass"/>
-            <assertEmpty mergeKey="assertEmpty" actual="[]" message="pass"/>
-            <assertEquals mergeKey="assertEquals1" expected="text" expectedType="variable" actual="Yahoo" actualType="string" message="pass"/>
-            <assertEquals mergeKey="assertEquals2" expected="Yahoo" expectedType="string" actual="text" actualType="variable" message="pass"/>
-            <assertFalse mergeKey="assertFalse1" actual="0" actualType="bool" message="pass"/>
-            <assertFileNotExists mergeKey="assertFileNotExists1" actual="/out.txt" actualType="string" message="pass"/>
-            <assertFileNotExists mergeKey="assertFileNotExists2" actual="text" actualType="variable" message="pass"/>
-            <assertGreaterOrEquals mergeKey="assertGreaterOrEquals" expected="2" expectedType="int" actual="5" actualType="int" message="pass"/>
-            <assertGreaterThan mergeKey="assertGreaterThan" expected="2" expectedType="int" actual="5" actualType="int" message="pass"/>
-            <assertGreaterThanOrEqual mergeKey="assertGreaterThanOrEqual" expected="2" expectedType="int" actual="5" actualType="int" message="pass"/>
-            <assertInternalType mergeKey="assertInternalType1" expected="string" expectedType="string" actual="xyz" actualType="string" message="pass"/>
-            <assertInternalType mergeKey="assertInternalType2" expected="int" expectedType="string" actual="21" actualType="int" message="pass"/>
-            <assertInternalType mergeKey="assertInternalType3" expected="string" expectedType="string" actual="text" actualType="variable" message="pass"/>
-            <assertLessOrEquals mergeKey="assertLessOrEquals" expected="5" expectedType="int" actual="2" actualType="int" message="pass"/>
-            <assertLessThan mergeKey="assertLessThan" expected="5" expectedType="int" actual="2" actualType="int" message="pass"/>
-            <assertLessThanOrEqual mergeKey="assertLessThanOrEqual" expected="5" expectedType="int" actual="2" actualType="int" message="pass"/>
-            <assertNotContains mergeKey="assertNotContains1" expected="bc" expectedType="string" actual="['item1' => 'a', 'item2' => 'ab']" message="pass"/>
-            <assertNotContains mergeKey="assertNotContains2" expected="bc" expectedType="string" actual="text" actualType="variable" message="pass"/>
-            <assertNotEmpty mergeKey="assertNotEmpty1" actual="[1, 2]" message="pass"/>
-            <assertNotEmpty mergeKey="assertNotEmpty2" actual="text" actualType="variable" message="pass"/>
-            <assertNotEquals mergeKey="assertNotEquals" expected="2" expectedType="int" actual="5" actualType="int" message="pass" delta=""/>
-            <assertNotNull mergeKey="assertNotNull1" actual="abc" actualType="string" message="pass"/>
-            <assertNotNull mergeKey="assertNotNull2" actual="text" actualType="variable" message="pass"/>
-            <assertNotRegExp mergeKey="assertNotRegExp" expected="/foo/" expectedType="string" actual="bar" actualType="string" message="pass"/>
-            <assertNotSame mergeKey="assertNotSame" expected="log" expectedType="string" actual="tag" actualType="string" message="pass"/>
-            <assertRegExp mergeKey="assertRegExp" expected="/foo/" expectedType="string" actual="foo" actualType="string" message="pass"/>
-            <assertSame mergeKey="assertSame" expected="bar" expectedType="string" actual="bar" actualType="string" message="pass"/>
-            <assertStringStartsNotWith mergeKey="assertStringStartsNotWith" expected="a" expectedType="string" actual="banana" actualType="string" message="pass"/>
-            <assertStringStartsWith mergeKey="assertStringStartsWith" expected="a" expectedType="string" actual="apple" actualType="string" message="pass"/>
-            <assertTrue mergeKey="assertTrue" actual="1" actualType="bool" message="pass"/>
+            <comment stepKey="c1" userInput="asserts without variable replacement"/>
+            <assertArrayHasKey stepKey="assertArrayHasKey" expected="apple" expectedType="string" actual="['orange' => 2, 'apple' => 1]" actualType="const" message="pass"/>
+            <assertArrayNotHasKey stepKey="assertArrayNotHasKey" expected="kiwi" expectedType="string" actual="['orange' => 2, 'apple' => 1]" message="pass"/>
+            <assertArraySubset stepKey="assertArraySubset" expected="[1, 2]" actual="[1, 2, 3, 5]" message="pass"/>
+            <assertContains stepKey="assertContains" expected="ab" expectedType="string" actual="['item1' => 'a', 'item2' => 'ab']" message="pass"/>
+            <assertCount stepKey="assertCount" expected="2" expectedType="int" actual="['a', 'b']" message="pass"/>
+            <assertEmpty stepKey="assertEmpty" actual="[]" message="pass"/>
+            <assertEquals stepKey="assertEquals1" expected="text" expectedType="variable" actual="Yahoo" actualType="string" message="pass"/>
+            <assertEquals stepKey="assertEquals2" expected="Yahoo" expectedType="string" actual="text" actualType="variable" message="pass"/>
+            <assertFalse stepKey="assertFalse1" actual="0" actualType="bool" message="pass"/>
+            <assertFileNotExists stepKey="assertFileNotExists1" actual="/out.txt" actualType="string" message="pass"/>
+            <assertFileNotExists stepKey="assertFileNotExists2" actual="text" actualType="variable" message="pass"/>
+            <assertGreaterOrEquals stepKey="assertGreaterOrEquals" expected="2" expectedType="int" actual="5" actualType="int" message="pass"/>
+            <assertGreaterThan stepKey="assertGreaterThan" expected="2" expectedType="int" actual="5" actualType="int" message="pass"/>
+            <assertGreaterThanOrEqual stepKey="assertGreaterThanOrEqual" expected="2" expectedType="int" actual="5" actualType="int" message="pass"/>
+            <assertInternalType stepKey="assertInternalType1" expected="string" expectedType="string" actual="xyz" actualType="string" message="pass"/>
+            <assertInternalType stepKey="assertInternalType2" expected="int" expectedType="string" actual="21" actualType="int" message="pass"/>
+            <assertInternalType stepKey="assertInternalType3" expected="string" expectedType="string" actual="text" actualType="variable" message="pass"/>
+            <assertLessOrEquals stepKey="assertLessOrEquals" expected="5" expectedType="int" actual="2" actualType="int" message="pass"/>
+            <assertLessThan stepKey="assertLessThan" expected="5" expectedType="int" actual="2" actualType="int" message="pass"/>
+            <assertLessThanOrEqual stepKey="assertLessThanOrEqual" expected="5" expectedType="int" actual="2" actualType="int" message="pass"/>
+            <assertNotContains stepKey="assertNotContains1" expected="bc" expectedType="string" actual="['item1' => 'a', 'item2' => 'ab']" message="pass"/>
+            <assertNotContains stepKey="assertNotContains2" expected="bc" expectedType="string" actual="text" actualType="variable" message="pass"/>
+            <assertNotEmpty stepKey="assertNotEmpty1" actual="[1, 2]" message="pass"/>
+            <assertNotEmpty stepKey="assertNotEmpty2" actual="text" actualType="variable" message="pass"/>
+            <assertNotEquals stepKey="assertNotEquals" expected="2" expectedType="int" actual="5" actualType="int" message="pass" delta=""/>
+            <assertNotNull stepKey="assertNotNull1" actual="abc" actualType="string" message="pass"/>
+            <assertNotNull stepKey="assertNotNull2" actual="text" actualType="variable" message="pass"/>
+            <assertNotRegExp stepKey="assertNotRegExp" expected="/foo/" expectedType="string" actual="bar" actualType="string" message="pass"/>
+            <assertNotSame stepKey="assertNotSame" expected="log" expectedType="string" actual="tag" actualType="string" message="pass"/>
+            <assertRegExp stepKey="assertRegExp" expected="/foo/" expectedType="string" actual="foo" actualType="string" message="pass"/>
+            <assertSame stepKey="assertSame" expected="bar" expectedType="string" actual="bar" actualType="string" message="pass"/>
+            <assertStringStartsNotWith stepKey="assertStringStartsNotWith" expected="a" expectedType="string" actual="banana" actualType="string" message="pass"/>
+            <assertStringStartsWith stepKey="assertStringStartsWith" expected="a" expectedType="string" actual="apple" actualType="string" message="pass"/>
+            <assertTrue stepKey="assertTrue" actual="1" actualType="bool" message="pass"/>
 
             <!-- string type that use created data -->
-            <comment mergeKey="c2" userInput="string type that use created data"/>
-            <assertStringStartsWith mergeKey="assert1" expected="D" expectedType="string" actual="$$createData1.lastname$$, $$createData1.firstname$$" actualType="string" message="fail"/>
-            <assertStringStartsNotWith mergeKey="assert2" expected="W" expectedType="string" actual="$createData2.firstname$ $createData2.lastname$" actualType="string" message="pass"/>
-            <assertEquals mergeKey="assert5" expected="$$createData1.lastname$$" expectedType="string" actual="$$createData1.lastname$$" actualType="string" message="pass"/>
+            <comment stepKey="c2" userInput="string type that use created data"/>
+            <assertStringStartsWith stepKey="assert1" expected="D" expectedType="string" actual="$$createData1.lastname$$, $$createData1.firstname$$" actualType="string" message="fail"/>
+            <assertStringStartsNotWith stepKey="assert2" expected="W" expectedType="string" actual="$createData2.firstname$ $createData2.lastname$" actualType="string" message="pass"/>
+            <assertEquals stepKey="assert5" expected="$$createData1.lastname$$" expectedType="string" actual="$$createData1.lastname$$" actualType="string" message="pass"/>
 
             <!-- array type that use created data -->
-            <comment mergeKey="c3" userInput="array type that use created data"/>
-            <assertArraySubset mergeKey="assert9" expected="[$$createData1.lastname$$, $$createData1.firstname$$]" expectedType="array" actual="[$$createData1.lastname$$, $$createData1.firstname$$, 1]" actualType="array" message="pass"/>
-            <assertArraySubset mergeKey="assert10" expected="[$createData2.firstname$, $createData2.lastname$]" expectedType="array" actual="[$createData2.firstname$, $createData2.lastname$, 1]" actualType="array" message="pass"/>
-            <assertArrayHasKey mergeKey="assert3" expected="lastname" expectedType="string" actual="['lastname' => $$createData1.lastname$$, 'firstname' => $$createData1.firstname$$]" actualType="array" message="pass"/>
-            <assertArrayHasKey mergeKey="assert4" expected="lastname" expectedType="string" actual="['lastname' => $createData2.lastname$, 'firstname' => $createData2.firstname$]" actualType="array" message="pass"/>
+            <comment stepKey="c3" userInput="array type that use created data"/>
+            <assertArraySubset stepKey="assert9" expected="[$$createData1.lastname$$, $$createData1.firstname$$]" expectedType="array" actual="[$$createData1.lastname$$, $$createData1.firstname$$, 1]" actualType="array" message="pass"/>
+            <assertArraySubset stepKey="assert10" expected="[$createData2.firstname$, $createData2.lastname$]" expectedType="array" actual="[$createData2.firstname$, $createData2.lastname$, 1]" actualType="array" message="pass"/>
+            <assertArrayHasKey stepKey="assert3" expected="lastname" expectedType="string" actual="['lastname' => $$createData1.lastname$$, 'firstname' => $$createData1.firstname$$]" actualType="array" message="pass"/>
+            <assertArrayHasKey stepKey="assert4" expected="lastname" expectedType="string" actual="['lastname' => $createData2.lastname$, 'firstname' => $createData2.firstname$]" actualType="array" message="pass"/>
 
             <!-- comment this section before running this test -->
-            <comment mergeKey="c4" userInput="comment this section before running this test"/>
-            <assertInstanceOf mergeKey="assertInstanceOf" expected="User::class" actual="text" actualType="variable" message="pass"/>
-            <assertNotInstanceOf mergeKey="assertNotInstanceOf" expected="User::class" actual="21" actualType="int" message="pass"/>
-            <assertFileExists mergeKey="assertFileExists2" actual="text" actualType="variable" message="pass"/>
-            <assertFileExists mergeKey="assert6" actual="AssertCest.php" actualType="string" message="pass"/>
-            <assertIsEmpty mergeKey="assertIsEmpty" actual="text" actualType="variable" message="pass"/>
-            <assertNull mergeKey="assertNull" actual="text" actualType="variable" message="pass"/>
-            <expectException mergeKey="expectException" expected="new MyException('exception msg')" actual="function() {$this->doSomethingBad();}"/>
-            <fail mergeKey="fail" message="fail"/>
-            <fail mergeKey="assert7" message="$createData2.firstname$ $createData2.lastname$"/>
-            <fail mergeKey="assert8" message="$$createData1.firstname$$ $$createData1.lastname$$"/>
+            <comment stepKey="c4" userInput="comment this section before running this test"/>
+            <assertInstanceOf stepKey="assertInstanceOf" expected="User::class" actual="text" actualType="variable" message="pass"/>
+            <assertNotInstanceOf stepKey="assertNotInstanceOf" expected="User::class" actual="21" actualType="int" message="pass"/>
+            <assertFileExists stepKey="assertFileExists2" actual="text" actualType="variable" message="pass"/>
+            <assertFileExists stepKey="assert6" actual="AssertCest.php" actualType="string" message="pass"/>
+            <assertIsEmpty stepKey="assertIsEmpty" actual="text" actualType="variable" message="pass"/>
+            <assertNull stepKey="assertNull" actual="text" actualType="variable" message="pass"/>
+            <expectException stepKey="expectException" expected="new MyException('exception msg')" actual="function() {$this->doSomethingBad();}"/>
+            <fail stepKey="fail" message="fail"/>
+            <fail stepKey="assert7" message="$createData2.firstname$ $createData2.lastname$"/>
+            <fail stepKey="assert8" message="$$createData1.firstname$$ $$createData1.lastname$$"/>
             <!-- comment end -->
-            <comment mergeKey="c5" userInput="comment end"/>
+            <comment stepKey="c5" userInput="comment end"/>
 
-            <deleteData createDataKey="createData2" mergeKey="deleteData2"/>
+            <deleteData createDataKey="createData2" stepKey="deleteData2"/>
         </test>
     </cest>
 </config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/CreateConfigurableProductByApiCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/CreateConfigurableProductByApiCest.xml
index 690b008fe29..0f13decf740 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/CreateConfigurableProductByApiCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/CreateConfigurableProductByApiCest.xml
@@ -14,61 +14,61 @@
             <stories value="Create a Configurable Product By API"/>
         </annotations>
         <before>
-            <createData mergeKey="categoryHandle" entity="SimpleSubCategory" />
-            <createData mergeKey="baseConfigProductHandle" entity="BaseConfigurableProduct" >
+            <createData stepKey="categoryHandle" entity="SimpleSubCategory" />
+            <createData stepKey="baseConfigProductHandle" entity="BaseConfigurableProduct" >
                 <required-entity createDataKey="categoryHandle"/>
             </createData>
-            <createData mergeKey="productAttributeHandle" entity="productAttributeWithTwoOptions"/>
+            <createData stepKey="productAttributeHandle" entity="productAttributeWithTwoOptions"/>
 
-            <createData mergeKey="productAttributeOption1Handle" entity="productAttributeOption1">
+            <createData stepKey="productAttributeOption1Handle" entity="productAttributeOption1">
                 <required-entity createDataKey="productAttributeHandle"/>
             </createData>
-            <createData mergeKey="productAttributeOption2Handle" entity="productAttributeOption2">
+            <createData stepKey="productAttributeOption2Handle" entity="productAttributeOption2">
                 <required-entity createDataKey="productAttributeHandle"/>
             </createData>
 
-            <createData mergeKey="addToAttributeSetHandle" entity="AddToDefaultSet">
+            <createData stepKey="addToAttributeSetHandle" entity="AddToDefaultSet">
                 <required-entity createDataKey="productAttributeHandle"/>
             </createData>
 
-            <getData mergeKey="getAttributeOption1Handle" entity="ProductAttributeOptionGetter" index="1">
+            <getData stepKey="getAttributeOption1Handle" entity="ProductAttributeOptionGetter" index="1">
                 <required-entity createDataKey="productAttributeHandle"/>
             </getData>
-            <getData mergeKey="getAttributeOption2Handle" entity="ProductAttributeOptionGetter" index="2">
+            <getData stepKey="getAttributeOption2Handle" entity="ProductAttributeOptionGetter" index="2">
                 <required-entity createDataKey="productAttributeHandle"/>
             </getData>
 
-            <createData mergeKey="childProductHandle1" entity="SimpleOne">
+            <createData stepKey="childProductHandle1" entity="SimpleOne">
                 <required-entity createDataKey="productAttributeHandle"/>
                 <required-entity createDataKey="getAttributeOption1Handle"/>
             </createData>
-            <createData mergeKey="childProductHandle2" entity="SimpleOne">
+            <createData stepKey="childProductHandle2" entity="SimpleOne">
                 <required-entity createDataKey="productAttributeHandle"/>
                 <required-entity createDataKey="getAttributeOption2Handle"/>
             </createData>
 
-            <createData mergeKey="configProductOptionHandle" entity="ConfigurableProductTwoOptions">
+            <createData stepKey="configProductOptionHandle" entity="ConfigurableProductTwoOptions">
                 <required-entity createDataKey="baseConfigProductHandle"/>
                 <required-entity createDataKey="productAttributeHandle"/>
                 <required-entity createDataKey="getAttributeOption1Handle"/>
                 <required-entity createDataKey="getAttributeOption2Handle"/>
             </createData>
 
-            <createData mergeKey="configProductHandle1" entity="ConfigurableProductAddChild">
+            <createData stepKey="configProductHandle1" entity="ConfigurableProductAddChild">
                 <required-entity createDataKey="childProductHandle1"/>
                 <required-entity createDataKey="baseConfigProductHandle"/>
             </createData>
-            <createData mergeKey="configProductHandle2" entity="ConfigurableProductAddChild">
+            <createData stepKey="configProductHandle2" entity="ConfigurableProductAddChild">
                 <required-entity createDataKey="childProductHandle2"/>
                 <required-entity createDataKey="baseConfigProductHandle"/>
             </createData>
         </before>
         <after>
-            <deleteData mergeKey="d2" createDataKey="childProductHandle1"/>
-            <deleteData mergeKey="d3" createDataKey="childProductHandle2"/>
-            <deleteData mergeKey="d7" createDataKey="baseConfigProductHandle"/>
-            <deleteData mergeKey="d8" createDataKey="categoryHandle"/>
-            <deleteData mergeKey="d6" createDataKey="productAttributeHandle"/>
+            <deleteData stepKey="d2" createDataKey="childProductHandle1"/>
+            <deleteData stepKey="d3" createDataKey="childProductHandle2"/>
+            <deleteData stepKey="d7" createDataKey="baseConfigProductHandle"/>
+            <deleteData stepKey="d8" createDataKey="categoryHandle"/>
+            <deleteData stepKey="d6" createDataKey="productAttributeHandle"/>
         </after>
         <test name="CreateConfigurableProductByApiTest">
         </test>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/CreateSalesRuleByApiCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/CreateSalesRuleByApiCest.xml
index bdbca5862a2..b202095bea1 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/CreateSalesRuleByApiCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/CreateSalesRuleByApiCest.xml
@@ -14,10 +14,10 @@
             <stories value="Create a Sales Rule By API"/>
         </annotations>
         <before>
-            <createData mergeKey="saleRule" entity="SimpleSalesRule" />
+            <createData stepKey="saleRule" entity="SimpleSalesRule" />
         </before>
         <test name="CreateSalesRuleByApiTest">
-            <!--see mergeKey="test" userInput="$$saleRule.store_labels[0][store_id]$$" selector="test"/-->
+            <!--see stepKey="test" userInput="$$saleRule.store_labels[0][store_id]$$" selector="test"/-->
         </test>
     </cest>
 </config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/MinimumTestCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/MinimumTestCest.xml
index b1cfc787acb..c571e8694be 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/MinimumTestCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/MinimumTestCest.xml
@@ -14,7 +14,7 @@
             <stories value="Minimum Test"/>
         </annotations>
         <after>
-            <seeInCurrentUrl url="/admin/admin/" mergeKey="seeInCurrentUrl"/>
+            <seeInCurrentUrl url="/admin/admin/" stepKey="seeInCurrentUrl"/>
         </after>
         <test name="MinimumFieldsTest">
             <annotations>
@@ -26,10 +26,10 @@
                 <env value="phantomjs"/>
                 <env value="headless"/>
             </annotations>
-            <amOnPage url="{{AdminLoginPage.url}}" mergeKey="navigateToAdmin"/>
-            <fillField selector="{{AdminLoginFormSection.username}}" userInput="{{_ENV.MAGENTO_ADMIN_USERNAME}}" mergeKey="fillUsername"/>
-            <fillField selector="{{AdminLoginFormSection.password}}" userInput="{{_ENV.MAGENTO_ADMIN_PASSWORD}}" mergeKey="fillPassword"/>
-            <click selector="{{AdminLoginFormSection.signIn}}" mergeKey="clickLogin"/>
+            <amOnPage url="{{AdminLoginPage.url}}" stepKey="navigateToAdmin"/>
+            <fillField selector="{{AdminLoginFormSection.username}}" userInput="{{_ENV.MAGENTO_ADMIN_USERNAME}}" stepKey="fillUsername"/>
+            <fillField selector="{{AdminLoginFormSection.password}}" userInput="{{_ENV.MAGENTO_ADMIN_PASSWORD}}" stepKey="fillPassword"/>
+            <click selector="{{AdminLoginFormSection.signIn}}" stepKey="clickLogin"/>
         </test>
     </cest>
 </config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/PersistMultipleEntitiesCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/PersistMultipleEntitiesCest.xml
index 12b2a8774c4..2985d7a5105 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/PersistMultipleEntitiesCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/PersistMultipleEntitiesCest.xml
@@ -10,26 +10,26 @@
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Test/etc/testSchema.xsd">
     <cest name="PersistMultipleEntitiesCest">
         <before>
-            <createData entity="simplesubcategory" mergeKey="simplecategory"/>
-            <createData entity="simpleproduct" mergeKey="simpleproduct1">
+            <createData entity="simplesubcategory" stepKey="simplecategory"/>
+            <createData entity="simpleproduct" stepKey="simpleproduct1">
                 <required-entity createDataKey="simplecategory"/>
             </createData>
-            <createData entity="simpleproduct" mergeKey="simpleproduct2">
+            <createData entity="simpleproduct" stepKey="simpleproduct2">
                 <required-entity createDataKey="categoryLink"/>
             </createData>
         </before>
         <after>
-            <deleteData createDataKey="simpleproduct1" mergeKey="deleteProduct1"/>
-            <deleteData createDataKey="simpleproduct2" mergeKey="deleteProduct2"/>
-            <deleteData createDataKey="simplecategory" mergeKey="deleteCategory"/>
+            <deleteData createDataKey="simpleproduct1" stepKey="deleteProduct1"/>
+            <deleteData createDataKey="simpleproduct2" stepKey="deleteProduct2"/>
+            <deleteData createDataKey="simplecategory" stepKey="deleteCategory"/>
         </after>
         <test name="PersistMultipleEntitiesTest">
             <annotations>
                 <group value="skip"/>
             </annotations>
-            <amOnPage mergeKey="s11" url="/$$simplecategory.name$$.html" />
-            <waitForPageLoad mergeKey="s33"/>
-            <see mergeKey="s35" selector="{{StorefrontCategoryMainSection.productCount}}" userInput="2"/>
+            <amOnPage stepKey="s11" url="/$$simplecategory.name$$.html" />
+            <waitForPageLoad stepKey="s33"/>
+            <see stepKey="s35" selector="{{StorefrontCategoryMainSection.productCount}}" userInput="2"/>
         </test>
     </cest>
 </config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/SampleCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/SampleCest.xml
index 6b931ce3f30..0d2facdb09b 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/SampleCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/SampleCest.xml
@@ -16,14 +16,14 @@
             <group value="skip"/>
         </annotations>
         <before>
-            <amOnUrl url="http://127.0.0.1:32772/admin/" mergeKey="amOnPage"/>
-            <createData entity="CustomerEntity1" mergeKey="createData1"/>
-            <createData entity="AssertThis" mergeKey="createData2"/>
+            <amOnUrl url="http://127.0.0.1:32772/admin/" stepKey="amOnPage"/>
+            <createData entity="CustomerEntity1" stepKey="createData1"/>
+            <createData entity="AssertThis" stepKey="createData2"/>
         </before>
         <after>
-            <amOnUrl url="http://127.0.0.1:32772/admin/admin/auth/logout" mergeKey="amOnPage"/>
-            <deleteData createDataKey="createData1" mergeKey="deleteData1"/>
-            <deleteData createDataKey="createData2" mergeKey="deleteData2"/>
+            <amOnUrl url="http://127.0.0.1:32772/admin/admin/auth/logout" stepKey="amOnPage"/>
+            <deleteData createDataKey="createData1" stepKey="deleteData1"/>
+            <deleteData createDataKey="createData2" stepKey="deleteData2"/>
         </after>
         <test name="AllCodeceptionMethodsTest">
             <annotations>
@@ -32,146 +32,146 @@
                 <severity value="CRITICAL"/>
                 <testCaseId value="#"/>
             </annotations>
-            <acceptPopup mergeKey="acceptPopup"/>
-            <amOnPage url="/admin" mergeKey="amOnPage"/>
-            <amOnSubdomain url="admin" mergeKey="amOnSubdomain"/>
-            <amOnUrl url="http://www.google.com/" mergeKey="amOnUrl"/>
-            <appendField userInput="More Words" selector=".stuff" mergeKey="appendField"/>
-            <attachFile userInput="filename.php" selector="#stuff" mergeKey="attachFile"/>
-            <cancelPopup mergeKey="cancelPopup"/>
-            <checkOption selector="#checkbox" mergeKey="checkOption"/>
-            <clearField selector="#field" mergeKey="clearField"/>
-            <click selector="#button" userInput="Context" mergeKey="click1"/>
-            <click selectorArray="['link' => 'Login']" mergeKey="click2"/>
-            <click selectorArray="['link' => 'Login']" userInput="stuff" mergeKey="click3"/>
-            <click userInput="Click" mergeKey="click4"/>
-            <clickWithLeftButton selector="#clickHere" mergeKey="clickWithLeftButton1" x="23" y="324"/>
-            <clickWithLeftButton selectorArray="['css' => '.checkout']" mergeKey="clickWithLeftButton2" x="23" y="324"/>
-            <clickWithLeftButton mergeKey="clickWithLeftButton3" x="23" y="324"/>
-            <clickWithRightButton selector="#clickHere" mergeKey="clickWithRightButton1" x="23" y="324"/>
-            <clickWithRightButton selectorArray="['css' => '.checkout']" mergeKey="clickWithRightButton2" x="23" y="324"/>
-            <clickWithRightButton mergeKey="clickWithRightButton3" x="23" y="324"/>
-            <closeTab mergeKey="closeTab"/>
-            <comment userInput="This is a Comment." mergeKey="comment"/>
-            <createData entity="CustomerEntity1" mergeKey="createData1"/>
-            <deleteData createDataKey="createData1" mergeKey="deleteData1"/>
-            <dontSee userInput="Text" mergeKey="dontSee1"/>
-            <dontSee userInput="Text" selector=".title" mergeKey="dontSee2"/>
-            <dontSee userInput="Text" selectorArray="['css' => 'body h1']" mergeKey="dontSee3"/>
-            <dontSeeCheckboxIsChecked selector="#checkbox" mergeKey="dontSeeCheckboxIsChecked"/>
-            <dontSeeCookie userInput="cookieName" mergeKey="dontSeeCookie1"/>
-            <dontSeeCookie userInput="cookieName" parameterArray="['domainName' => 'stuff']" mergeKey="dontSeeCookie2"/>
-            <dontSeeCurrentUrlEquals url="/stuff" mergeKey="dontSeeCurrentUrlEquals"/>
-            <dontSeeCurrentUrlMatches url="~$/users/(\d+)~" mergeKey="dontSeeCurrentUrlMatches"/>
-            <dontSeeElement selector=".error" mergeKey="dontSeeElement1"/>
-            <dontSeeElement selector="input" parameterArray="['name' => 'login']" mergeKey="dontSeeElement2"/>
-            <dontSeeElementInDOM selector="#stuff" mergeKey="dontSeeElementInDOM1"/>
-            <dontSeeElementInDOM selector="#stuff" parameterArray="['name' => 'login']" mergeKey="dontSeeElementInDOM2"/>
-            <dontSeeInCurrentUrl url="/users/" mergeKey="dontSeeInCurrentUrl"/>
-            <dontSeeInField selector=".field" userInput="stuff" mergeKey="dontSeeInField1"/>
-            <dontSeeInField selectorArray="['name' => 'search']" userInput="Comment Here" mergeKey="dontSeeInField2"/>
-            <dontSeeInFormFields selector="form[name=myform]" parameterArray="['input1' => 'non-existent value', 'input2' => 'other non-existent value']" mergeKey="dontSeeInFormFields"/>
-            <dontSeeInPageSource userInput="Stuff in Page Source" mergeKey="dontSeeInPageSource"/>
-            <!--<dontSeeInSource html="<h1></h1>" mergeKey="dontSeeInSource"/>-->
-            <dontSeeInTitle userInput="Title" mergeKey="dontSeeInTitle"/>
-            <dontSeeLink userInput="Logout" mergeKey="dontSeeLink1"/>
-            <dontSeeLink userInput="Checkout" url="/store/cart.php" mergeKey="dontSeeLink2"/>
-            <dontSeeOptionIsSelected selector="#form .stuff" userInput="Option Name" mergeKey="dontSeeOptionIsSelected"/>
-            <doubleClick selector="#click .here" mergeKey="doubleClick"/>
-            <dragAndDrop selector1="#number1" selector2="#number2" mergeKey="dragAndDrop"/>
-            <executeInSelenium function="function(\Facebook\WebDriver\Remote\RemoteWebDriver $webdriver) {$webdriver->get('http://google.com');}" mergeKey="executeInSelenium"/>
-            <executeJS function="return $('#myField').val()" mergeKey="executeJS"/>
-            <fillField selector="#field" userInput="stuff" mergeKey="fillField1"/>
-            <fillField selectorArray="['name' => 'email']" userInput="stuff" mergeKey="fillField2"/>
-            <grabAttributeFrom returnVariable="title" selector="#target" userInput="title" mergeKey="grabAttributeFrom"/>
-            <grabCookie returnVariable="cookie" userInput="cookie" parameterArray="['domain' => 'www.google.com']" mergeKey="grabCookie"/>
-            <grabFromCurrentUrl returnVariable="uri" url="~$/user/(\d+)/~" mergeKey="grabFromCurrentUrl"/>
-            <grabMultiple returnVariable="multiple" selector="a" userInput="href" mergeKey="grabMultiple"/>
-            <grabPageSource returnVariable="pageSource" mergeKey="grabPageSource1"/>
-            <grabTextFrom returnVariable="text" selector="h1" mergeKey="grabTextFrom1"/>
-            <grabValueFrom returnVariable="value1" selector=".form" mergeKey="grabValueFrom1"/>
-            <grabValueFrom returnVariable="value2" selectorArray="['name' => 'username']" mergeKey="grabValueFrom2"/>
-            <loadSessionSnapshot userInput="stuff" mergeKey="loadSessionSnapshot1"/>
-            <loadSessionSnapshot returnVariable="snapshot" userInput="stuff" mergeKey="loadSessionSnapshot2"/>
-            <makeScreenshot userInput="ScreenshotName" mergeKey="makeScreenshot"/>
-            <maximizeWindow mergeKey="maximizeWindow"/>
-            <moveBack mergeKey="moveBack"/>
-            <moveForward mergeKey="moveForward"/>
-            <moveMouseOver selector="#stuff" mergeKey="moveMouseOver1"/>
-            <moveMouseOver selectorArray="['css' => '.checkout']" mergeKey="moveMouseOver2"/>
-            <moveMouseOver x="5" y="5" mergeKey="moveMouseOver3"/>
-            <moveMouseOver selector="#stuff" x="5" y="5" mergeKey="moveMouseOver4"/>
-            <moveMouseOver selectorArray="['css' => '.checkout']" x="5" y="5" mergeKey="moveMouseOver5"/>
-            <openNewTab mergeKey="openNewTab"/>
-            <pauseExecution mergeKey="pauseExecution"/>
-            <performOn selector=".rememberMe" function="function (WebDriver $I) { $I->see('Remember me next time'); $I->seeElement('#LoginForm_rememberMe'); $I->dontSee('Login'); }" mergeKey="performOn1"/>
-            <performOn selector=".rememberMe" function="ActionSequence::build()->see('Warning')->see('Are you sure you want to delete this?')->click('Yes')" mergeKey="performOn2"/>
-            <pressKey selector="#page" userInput="a" mergeKey="pressKey1"/>
-            <pressKey selector="#page" parameterArray="[['ctrl','a'],'new']" mergeKey="pressKey2"/>
-            <pressKey selector="#page" parameterArray="[['shift','111'],'1','x']" mergeKey="pressKey3"/>
-            <pressKey selector="#page" parameterArray="[['ctrl', 'a'], \Facebook\WebDriver\WebDriverKeys::DELETE]" mergeKey="pressKey4"/>
-            <!--pressKey selector="descendant-or-self::*[@id='page']" userInput="u" mergeKey="pressKey5"/-->
-            <reloadPage mergeKey="reloadPage"/>
-            <resetCookie userInput="cookie" mergeKey="resetCookie1"/>
-            <resetCookie userInput="cookie" parameterArray="['domainName' => 'www.google.com']" mergeKey="resetCookie2"/>
-            <resizeWindow width="800" height="600" mergeKey="resizeWindow"/>
-            <saveSessionSnapshot userInput="stuff" mergeKey="saveSessionSnapshot"/>
-            <scrollTo selector="#place" x="20" y="50" mergeKey="scrollTo1"/>
-            <scrollTo selectorArray="['css' => '.checkout']" x="20" y="50" mergeKey="scrollTo2"/>
-            <see userInput="Stuff" mergeKey="see1"/>
-            <see userInput="More Stuff" selector=".stuff" mergeKey="see2"/>
-            <see userInput="More More Stuff" selectorArray="['css' => 'body h1']" mergeKey="see3"/>
-            <seeCheckboxIsChecked selector="#checkbox" mergeKey="seeCheckboxIsChecked"/>
-            <seeCookie userInput="PHPSESSID" mergeKey="seeCookie1"/>
-            <seeCookie userInput="PHPSESSID" parameterArray="['domainName' => 'www.google.com']" mergeKey="seeCookie2"/>
-            <seeCurrentUrlEquals url="/" mergeKey="seeCurrentUrlEquals"/>
-            <seeCurrentUrlMatches url="~$/users/(\d+)~" mergeKey="seeCurrentUrlMatches"/>
-            <seeElement selector=".error" mergeKey="seeElement1"/>
-            <seeElement selectorArray="['css' => 'form input']" mergeKey="seeElement2"/>
-            <seeElement selector=".error" parameterArray="['name' => 'login']" mergeKey="seeElement3"/>
-            <seeElement selectorArray="['css' => 'form input']" parameterArray="['name' => 'login']" mergeKey="seeElement4"/>
-            <seeElementInDOM selector="//form/input[type=hidden]" mergeKey="seeElementInDOM1"/>
-            <seeElementInDOM selector="//form/input[type=hidden]" parameterArray="['name' => 'form']" mergeKey="seeElementInDOM2"/>
-            <seeInCurrentUrl url="home" mergeKey="seeInCurrentUrl1"/>
-            <seeInCurrentUrl url="/home/" mergeKey="seeInCurrentUrl2"/>
-            <seeInField userInput="Stuff" selector="#field" mergeKey="seeInField1"/>
-            <seeInField userInput="Stuff" selectorArray="['name' => 'search']" mergeKey="seeInField2"/>
-            <seeInFormFields selector="form[name=myform]" parameterArray="['input1' => 'value','input2' => 'other value']" mergeKey="seeInFormFields1"/>
-            <seeInFormFields selector=".form-class" parameterArray="[['multiselect' => ['value1','value2'],'checkbox[]]' => ['a checked value','another checked value',]]" mergeKey="seeInFormFields2"/>
-            <!--<seeInPageSource html="<h1></h1>" mergeKey="seeInPageSource"/>-->
-            <seeInPopup userInput="Yes in Popup" mergeKey="seeInPopup"/>
-            <!--<seeInSource html="<h1></h1>" mergeKey="seeInSource"/>-->
-            <seeInTitle userInput="In Title" mergeKey="seeInTitle"/>
-            <seeLink userInput="Logout" mergeKey="seeLink1"/>
-            <seeLink userInput="Logout" url="/logout" mergeKey="seeLink2"/>
-            <seeNumberOfElements selector="tr" userInput="10" mergeKey="seeNumberOfElements1"/>
-            <seeNumberOfElements selector="tr" userInput="[0, 10]" mergeKey="seeNumberOfElements2"/>
-            <seeOptionIsSelected selector=".option" userInput="Visa" mergeKey="seeOptionIsSelected"/>
-            <selectOption selector=".dropDown" userInput="Option Name" mergeKey="selectOption1"/>
-            <selectOption selector="//form/select[@name=account]" parameterArray="['Windows','Linux']" mergeKey="selectOption2"/>
-            <selectOption selector="Which OS do you use?" parameterArray="['text' => 'Windows']" mergeKey="selectOption3"/>
-            <setCookie userInput="PHPSESSID" value="stuff" mergeKey="setCookie1"/>
-            <setCookie userInput="PHPSESSID" value="stuff" parameterArray="['domainName' => 'www.google.com']" mergeKey="setCookie2"/>
-            <submitForm selector="#my-form" parameterArray="['field' => ['value','another value',]]" button="#submit" mergeKey="submitForm2"/>
-            <switchToIFrame mergeKey="switchToIFrame1"/>
-            <switchToIFrame userInput="another_frame" mergeKey="switchToIFrame2"/>
-            <switchToNextTab mergeKey="switchToNextTab1"/>
-            <switchToNextTab userInput="2" mergeKey="switchToNextTab2"/>
-            <switchToPreviousTab mergeKey="switchToPreviewTab1"/>
-            <switchToPreviousTab userInput="1" mergeKey="switchToPreviewTab2"/>
-            <switchToWindow mergeKey="switchToWindow1"/>
-            <switchToWindow userInput="another_window" mergeKey="switchToWindow2"/>
-            <typeInPopup userInput="Stuff for popup" mergeKey="typeInPopup"/>
-            <uncheckOption selector="#option" mergeKey="uncheckOption"/>
-            <unselectOption selector="#dropDown" userInput="Option" mergeKey="unselectOption"/>
-            <wait time="15" mergeKey="wait"/>
-            <waitForElement selector="#button" time="10" mergeKey="waitForElement"/>
-            <waitForElementChange selector="#menu" function="function(\WebDriverElement $el) {return $el->isDisplayed();}" time="100" mergeKey="waitForElementChange"/>
-            <waitForElementNotVisible selector="#a_thing .className" time="30" mergeKey="waitForElementNotVisible"/>
-            <waitForElementVisible selector="#a_thing .className" time="15" mergeKey="waitForElementVisible"/>
-            <waitForJS function="return $.active == 0;" time="30" mergeKey="waitForJS"/>
-            <waitForText userInput="foo" time="30" mergeKey="waitForText1"/>
-            <waitForText userInput="foo" selector=".title" time="30" mergeKey="waitForText2"/>
+            <acceptPopup stepKey="acceptPopup"/>
+            <amOnPage url="/admin" stepKey="amOnPage"/>
+            <amOnSubdomain url="admin" stepKey="amOnSubdomain"/>
+            <amOnUrl url="http://www.google.com/" stepKey="amOnUrl"/>
+            <appendField userInput="More Words" selector=".stuff" stepKey="appendField"/>
+            <attachFile userInput="filename.php" selector="#stuff" stepKey="attachFile"/>
+            <cancelPopup stepKey="cancelPopup"/>
+            <checkOption selector="#checkbox" stepKey="checkOption"/>
+            <clearField selector="#field" stepKey="clearField"/>
+            <click selector="#button" userInput="Context" stepKey="click1"/>
+            <click selectorArray="['link' => 'Login']" stepKey="click2"/>
+            <click selectorArray="['link' => 'Login']" userInput="stuff" stepKey="click3"/>
+            <click userInput="Click" stepKey="click4"/>
+            <clickWithLeftButton selector="#clickHere" stepKey="clickWithLeftButton1" x="23" y="324"/>
+            <clickWithLeftButton selectorArray="['css' => '.checkout']" stepKey="clickWithLeftButton2" x="23" y="324"/>
+            <clickWithLeftButton stepKey="clickWithLeftButton3" x="23" y="324"/>
+            <clickWithRightButton selector="#clickHere" stepKey="clickWithRightButton1" x="23" y="324"/>
+            <clickWithRightButton selectorArray="['css' => '.checkout']" stepKey="clickWithRightButton2" x="23" y="324"/>
+            <clickWithRightButton stepKey="clickWithRightButton3" x="23" y="324"/>
+            <closeTab stepKey="closeTab"/>
+            <comment userInput="This is a Comment." stepKey="comment"/>
+            <createData entity="CustomerEntity1" stepKey="createData1"/>
+            <deleteData createDataKey="createData1" stepKey="deleteData1"/>
+            <dontSee userInput="Text" stepKey="dontSee1"/>
+            <dontSee userInput="Text" selector=".title" stepKey="dontSee2"/>
+            <dontSee userInput="Text" selectorArray="['css' => 'body h1']" stepKey="dontSee3"/>
+            <dontSeeCheckboxIsChecked selector="#checkbox" stepKey="dontSeeCheckboxIsChecked"/>
+            <dontSeeCookie userInput="cookieName" stepKey="dontSeeCookie1"/>
+            <dontSeeCookie userInput="cookieName" parameterArray="['domainName' => 'stuff']" stepKey="dontSeeCookie2"/>
+            <dontSeeCurrentUrlEquals url="/stuff" stepKey="dontSeeCurrentUrlEquals"/>
+            <dontSeeCurrentUrlMatches url="~$/users/(\d+)~" stepKey="dontSeeCurrentUrlMatches"/>
+            <dontSeeElement selector=".error" stepKey="dontSeeElement1"/>
+            <dontSeeElement selector="input" parameterArray="['name' => 'login']" stepKey="dontSeeElement2"/>
+            <dontSeeElementInDOM selector="#stuff" stepKey="dontSeeElementInDOM1"/>
+            <dontSeeElementInDOM selector="#stuff" parameterArray="['name' => 'login']" stepKey="dontSeeElementInDOM2"/>
+            <dontSeeInCurrentUrl url="/users/" stepKey="dontSeeInCurrentUrl"/>
+            <dontSeeInField selector=".field" userInput="stuff" stepKey="dontSeeInField1"/>
+            <dontSeeInField selectorArray="['name' => 'search']" userInput="Comment Here" stepKey="dontSeeInField2"/>
+            <dontSeeInFormFields selector="form[name=myform]" parameterArray="['input1' => 'non-existent value', 'input2' => 'other non-existent value']" stepKey="dontSeeInFormFields"/>
+            <dontSeeInPageSource userInput="Stuff in Page Source" stepKey="dontSeeInPageSource"/>
+            <!--<dontSeeInSource html="<h1></h1>" stepKey="dontSeeInSource"/>-->
+            <dontSeeInTitle userInput="Title" stepKey="dontSeeInTitle"/>
+            <dontSeeLink userInput="Logout" stepKey="dontSeeLink1"/>
+            <dontSeeLink userInput="Checkout" url="/store/cart.php" stepKey="dontSeeLink2"/>
+            <dontSeeOptionIsSelected selector="#form .stuff" userInput="Option Name" stepKey="dontSeeOptionIsSelected"/>
+            <doubleClick selector="#click .here" stepKey="doubleClick"/>
+            <dragAndDrop selector1="#number1" selector2="#number2" stepKey="dragAndDrop"/>
+            <executeInSelenium function="function(\Facebook\WebDriver\Remote\RemoteWebDriver $webdriver) {$webdriver->get('http://google.com');}" stepKey="executeInSelenium"/>
+            <executeJS function="return $('#myField').val()" stepKey="executeJS"/>
+            <fillField selector="#field" userInput="stuff" stepKey="fillField1"/>
+            <fillField selectorArray="['name' => 'email']" userInput="stuff" stepKey="fillField2"/>
+            <grabAttributeFrom returnVariable="title" selector="#target" userInput="title" stepKey="grabAttributeFrom"/>
+            <grabCookie returnVariable="cookie" userInput="cookie" parameterArray="['domain' => 'www.google.com']" stepKey="grabCookie"/>
+            <grabFromCurrentUrl returnVariable="uri" url="~$/user/(\d+)/~" stepKey="grabFromCurrentUrl"/>
+            <grabMultiple returnVariable="multiple" selector="a" userInput="href" stepKey="grabMultiple"/>
+            <grabPageSource returnVariable="pageSource" stepKey="grabPageSource1"/>
+            <grabTextFrom returnVariable="text" selector="h1" stepKey="grabTextFrom1"/>
+            <grabValueFrom returnVariable="value1" selector=".form" stepKey="grabValueFrom1"/>
+            <grabValueFrom returnVariable="value2" selectorArray="['name' => 'username']" stepKey="grabValueFrom2"/>
+            <loadSessionSnapshot userInput="stuff" stepKey="loadSessionSnapshot1"/>
+            <loadSessionSnapshot returnVariable="snapshot" userInput="stuff" stepKey="loadSessionSnapshot2"/>
+            <makeScreenshot userInput="ScreenshotName" stepKey="makeScreenshot"/>
+            <maximizeWindow stepKey="maximizeWindow"/>
+            <moveBack stepKey="moveBack"/>
+            <moveForward stepKey="moveForward"/>
+            <moveMouseOver selector="#stuff" stepKey="moveMouseOver1"/>
+            <moveMouseOver selectorArray="['css' => '.checkout']" stepKey="moveMouseOver2"/>
+            <moveMouseOver x="5" y="5" stepKey="moveMouseOver3"/>
+            <moveMouseOver selector="#stuff" x="5" y="5" stepKey="moveMouseOver4"/>
+            <moveMouseOver selectorArray="['css' => '.checkout']" x="5" y="5" stepKey="moveMouseOver5"/>
+            <openNewTab stepKey="openNewTab"/>
+            <pauseExecution stepKey="pauseExecution"/>
+            <performOn selector=".rememberMe" function="function (WebDriver $I) { $I->see('Remember me next time'); $I->seeElement('#LoginForm_rememberMe'); $I->dontSee('Login'); }" stepKey="performOn1"/>
+            <performOn selector=".rememberMe" function="ActionSequence::build()->see('Warning')->see('Are you sure you want to delete this?')->click('Yes')" stepKey="performOn2"/>
+            <pressKey selector="#page" userInput="a" stepKey="pressKey1"/>
+            <pressKey selector="#page" parameterArray="[['ctrl','a'],'new']" stepKey="pressKey2"/>
+            <pressKey selector="#page" parameterArray="[['shift','111'],'1','x']" stepKey="pressKey3"/>
+            <pressKey selector="#page" parameterArray="[['ctrl', 'a'], \Facebook\WebDriver\WebDriverKeys::DELETE]" stepKey="pressKey4"/>
+            <!--pressKey selector="descendant-or-self::*[@id='page']" userInput="u" stepKey="pressKey5"/-->
+            <reloadPage stepKey="reloadPage"/>
+            <resetCookie userInput="cookie" stepKey="resetCookie1"/>
+            <resetCookie userInput="cookie" parameterArray="['domainName' => 'www.google.com']" stepKey="resetCookie2"/>
+            <resizeWindow width="800" height="600" stepKey="resizeWindow"/>
+            <saveSessionSnapshot userInput="stuff" stepKey="saveSessionSnapshot"/>
+            <scrollTo selector="#place" x="20" y="50" stepKey="scrollTo1"/>
+            <scrollTo selectorArray="['css' => '.checkout']" x="20" y="50" stepKey="scrollTo2"/>
+            <see userInput="Stuff" stepKey="see1"/>
+            <see userInput="More Stuff" selector=".stuff" stepKey="see2"/>
+            <see userInput="More More Stuff" selectorArray="['css' => 'body h1']" stepKey="see3"/>
+            <seeCheckboxIsChecked selector="#checkbox" stepKey="seeCheckboxIsChecked"/>
+            <seeCookie userInput="PHPSESSID" stepKey="seeCookie1"/>
+            <seeCookie userInput="PHPSESSID" parameterArray="['domainName' => 'www.google.com']" stepKey="seeCookie2"/>
+            <seeCurrentUrlEquals url="/" stepKey="seeCurrentUrlEquals"/>
+            <seeCurrentUrlMatches url="~$/users/(\d+)~" stepKey="seeCurrentUrlMatches"/>
+            <seeElement selector=".error" stepKey="seeElement1"/>
+            <seeElement selectorArray="['css' => 'form input']" stepKey="seeElement2"/>
+            <seeElement selector=".error" parameterArray="['name' => 'login']" stepKey="seeElement3"/>
+            <seeElement selectorArray="['css' => 'form input']" parameterArray="['name' => 'login']" stepKey="seeElement4"/>
+            <seeElementInDOM selector="//form/input[type=hidden]" stepKey="seeElementInDOM1"/>
+            <seeElementInDOM selector="//form/input[type=hidden]" parameterArray="['name' => 'form']" stepKey="seeElementInDOM2"/>
+            <seeInCurrentUrl url="home" stepKey="seeInCurrentUrl1"/>
+            <seeInCurrentUrl url="/home/" stepKey="seeInCurrentUrl2"/>
+            <seeInField userInput="Stuff" selector="#field" stepKey="seeInField1"/>
+            <seeInField userInput="Stuff" selectorArray="['name' => 'search']" stepKey="seeInField2"/>
+            <seeInFormFields selector="form[name=myform]" parameterArray="['input1' => 'value','input2' => 'other value']" stepKey="seeInFormFields1"/>
+            <seeInFormFields selector=".form-class" parameterArray="[['multiselect' => ['value1','value2'],'checkbox[]]' => ['a checked value','another checked value',]]" stepKey="seeInFormFields2"/>
+            <!--<seeInPageSource html="<h1></h1>" stepKey="seeInPageSource"/>-->
+            <seeInPopup userInput="Yes in Popup" stepKey="seeInPopup"/>
+            <!--<seeInSource html="<h1></h1>" stepKey="seeInSource"/>-->
+            <seeInTitle userInput="In Title" stepKey="seeInTitle"/>
+            <seeLink userInput="Logout" stepKey="seeLink1"/>
+            <seeLink userInput="Logout" url="/logout" stepKey="seeLink2"/>
+            <seeNumberOfElements selector="tr" userInput="10" stepKey="seeNumberOfElements1"/>
+            <seeNumberOfElements selector="tr" userInput="[0, 10]" stepKey="seeNumberOfElements2"/>
+            <seeOptionIsSelected selector=".option" userInput="Visa" stepKey="seeOptionIsSelected"/>
+            <selectOption selector=".dropDown" userInput="Option Name" stepKey="selectOption1"/>
+            <selectOption selector="//form/select[@name=account]" parameterArray="['Windows','Linux']" stepKey="selectOption2"/>
+            <selectOption selector="Which OS do you use?" parameterArray="['text' => 'Windows']" stepKey="selectOption3"/>
+            <setCookie userInput="PHPSESSID" value="stuff" stepKey="setCookie1"/>
+            <setCookie userInput="PHPSESSID" value="stuff" parameterArray="['domainName' => 'www.google.com']" stepKey="setCookie2"/>
+            <submitForm selector="#my-form" parameterArray="['field' => ['value','another value',]]" button="#submit" stepKey="submitForm2"/>
+            <switchToIFrame stepKey="switchToIFrame1"/>
+            <switchToIFrame userInput="another_frame" stepKey="switchToIFrame2"/>
+            <switchToNextTab stepKey="switchToNextTab1"/>
+            <switchToNextTab userInput="2" stepKey="switchToNextTab2"/>
+            <switchToPreviousTab stepKey="switchToPreviewTab1"/>
+            <switchToPreviousTab userInput="1" stepKey="switchToPreviewTab2"/>
+            <switchToWindow stepKey="switchToWindow1"/>
+            <switchToWindow userInput="another_window" stepKey="switchToWindow2"/>
+            <typeInPopup userInput="Stuff for popup" stepKey="typeInPopup"/>
+            <uncheckOption selector="#option" stepKey="uncheckOption"/>
+            <unselectOption selector="#dropDown" userInput="Option" stepKey="unselectOption"/>
+            <wait time="15" stepKey="wait"/>
+            <waitForElement selector="#button" time="10" stepKey="waitForElement"/>
+            <waitForElementChange selector="#menu" function="function(\WebDriverElement $el) {return $el->isDisplayed();}" time="100" stepKey="waitForElementChange"/>
+            <waitForElementNotVisible selector="#a_thing .className" time="30" stepKey="waitForElementNotVisible"/>
+            <waitForElementVisible selector="#a_thing .className" time="15" stepKey="waitForElementVisible"/>
+            <waitForJS function="return $.active == 0;" time="30" stepKey="waitForJS"/>
+            <waitForText userInput="foo" time="30" stepKey="waitForText1"/>
+            <waitForText userInput="foo" selector=".title" time="30" stepKey="waitForText2"/>
         </test>
         <test name="AllCustomMethodsTest">
             <annotations>
@@ -180,32 +180,32 @@
                 <severity value="CRITICAL"/>
                 <testCaseId value="#"/>
             </annotations>
-            <assertElementContainsAttribute selector="#username" attribute="class" expectedValue="admin__control-text" mergeKey="assertElementContainsAttribute1"/>
-            <assertElementContainsAttribute selector="#username" attribute="type" expectedValue="text" mergeKey="assertElementContainsAttribute2"/>
-            <assertElementContainsAttribute selector="#username" attribute="name" expectedValue="login[username]" mergeKey="assertElementContainsAttribute3"/>
-            <assertElementContainsAttribute selector="#username" attribute="autofocus" expectedValue="" mergeKey="assertElementContainsAttribute4"/>
-            <assertElementContainsAttribute selector="#username" attribute="data-validate" expectedValue="{required:true}" mergeKey="assertElementContainsAttribute5"/>
-            <assertElementContainsAttribute selector="#username" attribute="placeholder" expectedValue="user name" mergeKey="assertElementContainsAttribute6"/>
-            <assertElementContainsAttribute selector="#username" attribute="autocomplete" expectedValue="off" mergeKey="assertElementContainsAttribute7"/>
-            <assertElementContainsAttribute selector=".admin__menu-overlay" attribute="style" expectedValue="display: none;" mergeKey="assertElementContainsAttribute8"/>
-            <assertElementContainsAttribute selector=".admin__menu-overlay" attribute="border" expectedValue="0" mergeKey="assertElementContainsAttribute9"/>
-            <loginAsAdmin mergeKey="loginAsAdmin1"/>
-            <loginAsAdmin username="admin" password="123123q" mergeKey="loginAsAdmin2"/>
-            <closeAdminNotification mergeKey="closeAdminNotification1"/>
-            <searchAndMultiSelectOption selector="#stuff" parameterArray="['Item 1', 'Item 2']" mergeKey="searchAndMultiSelect1"/>
-            <searchAndMultiSelectOption selector="#stuff" parameterArray="['Item 1', 'Item 2']" requiredAction="true" mergeKey="searchAndMultiSelect2"/>
-            <waitForPageLoad mergeKey="waitForPageLoad1"/>
-            <waitForPageLoad time="15" mergeKey="waitForPageLoad2"/>
-            <waitForAjaxLoad mergeKey="waitForAjax1"/>
-            <waitForAjaxLoad time="15" mergeKey="waitForAjax2"/>
-            <dontSeeJsError mergeKey="dontSeeJsError"/>
-            <formatMoney userInput="$300,000" mergeKey="formatMoney1"/>
-            <formatMoney userInput="$300,000" locale="en_US.UTF-8" mergeKey="formatMoney2"/>
-            <mSetLocale userInput="300" locale="en_US.UTF-8" mergeKey="mSetLocale1"/>
-            <mResetLocale mergeKey="mResetLocale1"/>
-            <waitForLoadingMaskToDisappear mergeKey="waitForLoadingMaskToDisappear1"/>
-            <scrollToTopOfPage mergeKey="scrollToTopOfPage"/>
-            <parseFloat userInput="300,000.2325" mergeKey="parseFloat1"/>
+            <assertElementContainsAttribute selector="#username" attribute="class" expectedValue="admin__control-text" stepKey="assertElementContainsAttribute1"/>
+            <assertElementContainsAttribute selector="#username" attribute="type" expectedValue="text" stepKey="assertElementContainsAttribute2"/>
+            <assertElementContainsAttribute selector="#username" attribute="name" expectedValue="login[username]" stepKey="assertElementContainsAttribute3"/>
+            <assertElementContainsAttribute selector="#username" attribute="autofocus" expectedValue="" stepKey="assertElementContainsAttribute4"/>
+            <assertElementContainsAttribute selector="#username" attribute="data-validate" expectedValue="{required:true}" stepKey="assertElementContainsAttribute5"/>
+            <assertElementContainsAttribute selector="#username" attribute="placeholder" expectedValue="user name" stepKey="assertElementContainsAttribute6"/>
+            <assertElementContainsAttribute selector="#username" attribute="autocomplete" expectedValue="off" stepKey="assertElementContainsAttribute7"/>
+            <assertElementContainsAttribute selector=".admin__menu-overlay" attribute="style" expectedValue="display: none;" stepKey="assertElementContainsAttribute8"/>
+            <assertElementContainsAttribute selector=".admin__menu-overlay" attribute="border" expectedValue="0" stepKey="assertElementContainsAttribute9"/>
+            <loginAsAdmin stepKey="loginAsAdmin1"/>
+            <loginAsAdmin username="admin" password="123123q" stepKey="loginAsAdmin2"/>
+            <closeAdminNotification stepKey="closeAdminNotification1"/>
+            <searchAndMultiSelectOption selector="#stuff" parameterArray="['Item 1', 'Item 2']" stepKey="searchAndMultiSelect1"/>
+            <searchAndMultiSelectOption selector="#stuff" parameterArray="['Item 1', 'Item 2']" requiredAction="true" stepKey="searchAndMultiSelect2"/>
+            <waitForPageLoad stepKey="waitForPageLoad1"/>
+            <waitForPageLoad time="15" stepKey="waitForPageLoad2"/>
+            <waitForAjaxLoad stepKey="waitForAjax1"/>
+            <waitForAjaxLoad time="15" stepKey="waitForAjax2"/>
+            <dontSeeJsError stepKey="dontSeeJsError"/>
+            <formatMoney userInput="$300,000" stepKey="formatMoney1"/>
+            <formatMoney userInput="$300,000" locale="en_US.UTF-8" stepKey="formatMoney2"/>
+            <mSetLocale userInput="300" locale="en_US.UTF-8" stepKey="mSetLocale1"/>
+            <mResetLocale stepKey="mResetLocale1"/>
+            <waitForLoadingMaskToDisappear stepKey="waitForLoadingMaskToDisappear1"/>
+            <scrollToTopOfPage stepKey="scrollToTopOfPage"/>
+            <parseFloat userInput="300,000.2325" stepKey="parseFloat1"/>
         </test>
         <test name="AllVariableMethodsTest">
             <annotations>
@@ -214,51 +214,51 @@
                 <severity value="CRITICAL"/>
                 <testCaseId value="#"/>
             </annotations>
-            <grabFromCurrentUrl returnVariable="randomStuff" mergeKey="grabFromCurrentUrl1"/>
-            <amOnPage variable="randomStuff" mergeKey="amOnPage1"/>
-            <amOnSubdomain variable="randomStuff" mergeKey="amOnSubdomain1"/>
-            <amOnUrl variable="randomStuff" mergeKey="amOnUrl1"/>
-            <appendField variable="randomStuff" selector="#randomField" mergeKey="appendField1"/>
-            <attachFile variable="randomStuff" selector="#filePathField" mergeKey="attachFile1"/>
-            <click variable="randomStuff" mergeKey="click1"/>
-            <dontSee variable="randomStuff" mergeKey="dontSee1"/>
-            <dontSeeCookie variable="randomStuff" mergeKey="dontSeeCookie1"/>
-            <dontSeeCurrentUrlEquals variable="randomStuff" mergeKey="dontSeeCurrentUrlEquals1"/>
-            <dontSeeCurrentUrlMatches variable="randomStuff" mergeKey="dontSeeCurrentUrlMatches1"/>
-            <dontSeeInCurrentUrl variable="randomStuff" mergeKey="dontSeeInCurrentUrl1"/>
-            <dontSeeInField selector="#stuff" variable="randomStuff" mergeKey="dontSeeInField1"/>
-            <dontSeeInPageSource variable="randomStuff" mergeKey="dontSeeInPageSource1"/>
-            <dontSeeInTitle variable="randomStuff" mergeKey="dontSeeInTitle1"/>
-            <dontSeeLink variable="randomStuff" mergeKey="dontSeeLink1"/>
-            <dontSeeOptionIsSelected selector="#dropdown" variable="randomStuff" mergeKey="dontSeeOptionIsSelected1"/>
-            <fillField variable="randomStuff" selector="#field" mergeKey="fillField1"/>
-            <grabAttributeFrom selector="#stuff" returnVariable="moreRandomStuff" variable="randomStuff" mergeKey="grabAttributeFrom1"/>
-            <grabCookie returnVariable="cookies" variable="randomStuff" mergeKey="grabValueFrom1"/>
-            <grabFromCurrentUrl returnVariable="url" variable="randomStuff" mergeKey="grabFromCurrentUrl"/>
-            <grabMultiple returnVariable="multipleThings" selector="a" variable="randomStuff" mergeKey="grabMultiple1"/>
-            <loadSessionSnapshot variable="randomStuff" mergeKey="loadSessionSnapshot"/>
-            <pressKey selector="a" variable="randomStuff" mergeKey="pressKey1"/>
-            <saveSessionSnapshot variable="randomStuff" mergeKey="saveSessionSnapshot1"/>
-            <see variable="randomStuff" mergeKey="see1"/>
-            <seeCookie variable="randomStuff" mergeKey="seeCookie1"/>
-            <seeCurrentUrlEquals variable="randomStuff" mergeKey="seeCurrentUrlEquals1"/>
-            <seeCurrentUrlMatches variable="randomStuff" mergeKey="seeCurrentUrlMatches1"/>
-            <seeInCurrentUrl variable="randomStuff" mergeKey="seeInCurrentUrl1"/>
-            <seeInField selector="a" variable="randomStuff" mergeKey="seeInField1"/>
-            <seeInPopup variable="randomStuff" mergeKey="seeInPopup"/>
-            <seeInTitle variable="randomStuff" mergeKey="seeInTitle1"/>
-            <seeLink variable="randomStuff" mergeKey="seeLink1"/>
-            <seeNumberOfElements selector="#stuff" variable="randomStuff" mergeKey="seeNumberOfElements1"/>
-            <seeOptionIsSelected selector="#stuff" variable="randomStuff" mergeKey="seeOptionIsSelected1"/>
-            <selectOption selector="#stuff" variable="randomStuff" mergeKey="selectOption1"/>
-            <switchToIFrame variable="randomStuff" mergeKey="switchToIFrame1"/>
-            <switchToNextTab variable="randomStuff" mergeKey="switchToNextTab1"/>
-            <switchToPreviousTab variable="randomStuff" mergeKey="switchToPreviousTab1"/>
-            <switchToNextTab variable="randomStuff" mergeKey="switchToNextTab1"/>
-            <switchToWindow variable="randomStuff" mergeKey="switchToWindow1"/>
-            <typeInPopup variable="randomStuff" mergeKey="typeInPopup"/>
-            <unselectOption selector="#option" variable="randomStuff" mergeKey="unselectOption1"/>
-            <waitForText variable="randomStuff" time="5" mergeKey="waitForText1"/>
+            <grabFromCurrentUrl returnVariable="randomStuff" stepKey="grabFromCurrentUrl1"/>
+            <amOnPage variable="randomStuff" stepKey="amOnPage1"/>
+            <amOnSubdomain variable="randomStuff" stepKey="amOnSubdomain1"/>
+            <amOnUrl variable="randomStuff" stepKey="amOnUrl1"/>
+            <appendField variable="randomStuff" selector="#randomField" stepKey="appendField1"/>
+            <attachFile variable="randomStuff" selector="#filePathField" stepKey="attachFile1"/>
+            <click variable="randomStuff" stepKey="click1"/>
+            <dontSee variable="randomStuff" stepKey="dontSee1"/>
+            <dontSeeCookie variable="randomStuff" stepKey="dontSeeCookie1"/>
+            <dontSeeCurrentUrlEquals variable="randomStuff" stepKey="dontSeeCurrentUrlEquals1"/>
+            <dontSeeCurrentUrlMatches variable="randomStuff" stepKey="dontSeeCurrentUrlMatches1"/>
+            <dontSeeInCurrentUrl variable="randomStuff" stepKey="dontSeeInCurrentUrl1"/>
+            <dontSeeInField selector="#stuff" variable="randomStuff" stepKey="dontSeeInField1"/>
+            <dontSeeInPageSource variable="randomStuff" stepKey="dontSeeInPageSource1"/>
+            <dontSeeInTitle variable="randomStuff" stepKey="dontSeeInTitle1"/>
+            <dontSeeLink variable="randomStuff" stepKey="dontSeeLink1"/>
+            <dontSeeOptionIsSelected selector="#dropdown" variable="randomStuff" stepKey="dontSeeOptionIsSelected1"/>
+            <fillField variable="randomStuff" selector="#field" stepKey="fillField1"/>
+            <grabAttributeFrom selector="#stuff" returnVariable="moreRandomStuff" variable="randomStuff" stepKey="grabAttributeFrom1"/>
+            <grabCookie returnVariable="cookies" variable="randomStuff" stepKey="grabValueFrom1"/>
+            <grabFromCurrentUrl returnVariable="url" variable="randomStuff" stepKey="grabFromCurrentUrl"/>
+            <grabMultiple returnVariable="multipleThings" selector="a" variable="randomStuff" stepKey="grabMultiple1"/>
+            <loadSessionSnapshot variable="randomStuff" stepKey="loadSessionSnapshot"/>
+            <pressKey selector="a" variable="randomStuff" stepKey="pressKey1"/>
+            <saveSessionSnapshot variable="randomStuff" stepKey="saveSessionSnapshot1"/>
+            <see variable="randomStuff" stepKey="see1"/>
+            <seeCookie variable="randomStuff" stepKey="seeCookie1"/>
+            <seeCurrentUrlEquals variable="randomStuff" stepKey="seeCurrentUrlEquals1"/>
+            <seeCurrentUrlMatches variable="randomStuff" stepKey="seeCurrentUrlMatches1"/>
+            <seeInCurrentUrl variable="randomStuff" stepKey="seeInCurrentUrl1"/>
+            <seeInField selector="a" variable="randomStuff" stepKey="seeInField1"/>
+            <seeInPopup variable="randomStuff" stepKey="seeInPopup"/>
+            <seeInTitle variable="randomStuff" stepKey="seeInTitle1"/>
+            <seeLink variable="randomStuff" stepKey="seeLink1"/>
+            <seeNumberOfElements selector="#stuff" variable="randomStuff" stepKey="seeNumberOfElements1"/>
+            <seeOptionIsSelected selector="#stuff" variable="randomStuff" stepKey="seeOptionIsSelected1"/>
+            <selectOption selector="#stuff" variable="randomStuff" stepKey="selectOption1"/>
+            <switchToIFrame variable="randomStuff" stepKey="switchToIFrame1"/>
+            <switchToNextTab variable="randomStuff" stepKey="switchToNextTab1"/>
+            <switchToPreviousTab variable="randomStuff" stepKey="switchToPreviousTab1"/>
+            <switchToNextTab variable="randomStuff" stepKey="switchToNextTab1"/>
+            <switchToWindow variable="randomStuff" stepKey="switchToWindow1"/>
+            <typeInPopup variable="randomStuff" stepKey="typeInPopup"/>
+            <unselectOption selector="#option" variable="randomStuff" stepKey="unselectOption1"/>
+            <waitForText variable="randomStuff" time="5" stepKey="waitForText1"/>
         </test>
         <test name="AllReplacementTest">
             <annotations>
@@ -268,36 +268,36 @@
                 <testCaseId value="#"/>
             </annotations>
 
-            <createData entity="CustomerEntity1" mergeKey="testScopeData"/>
-            <createData entity="AssertThis" mergeKey="testScopeData2"/>
+            <createData entity="CustomerEntity1" stepKey="testScopeData"/>
+            <createData entity="AssertThis" stepKey="testScopeData2"/>
 
             <!-- parameterized url that uses literal params -->
-            <amOnPage url="{{SamplePage.url('success','success2')}}" mergeKey="a0"/>
+            <amOnPage url="{{SamplePage.url('success','success2')}}" stepKey="a0"/>
 
             <!-- url referencing data that was created in this <test> -->
-            <amOnPage url="$testScopeData.firstname$.html" mergeKey="a1"/>
+            <amOnPage url="$testScopeData.firstname$.html" stepKey="a1"/>
 
             <!-- url referencing data that was created in a <before> -->
-            <amOnPage url="$$createData1.firstname$$.html" mergeKey="a2"/>
+            <amOnPage url="$$createData1.firstname$$.html" stepKey="a2"/>
 
             <!-- parameterized url that uses created data params -->
-            <amOnPage url="{{SamplePage.url($testScopeData.firstname$,$testScopeData.lastname$)}}" mergeKey="a3"/>
-            <amOnPage url="{{SamplePage.url($$createData1.firstname$$,$$createData1.lastname$$)}}" mergeKey="a4"/>
+            <amOnPage url="{{SamplePage.url($testScopeData.firstname$,$testScopeData.lastname$)}}" stepKey="a3"/>
+            <amOnPage url="{{SamplePage.url($$createData1.firstname$$,$$createData1.lastname$$)}}" stepKey="a4"/>
 
             <!-- parameterized selector that uses literal params -->
-            <click selector="{{SampleSection.oneParamElement('success')}}" mergeKey="c1"/>
-            <click selector="{{SampleSection.twoParamElement('success','success2')}}" mergeKey="c2"/>
+            <click selector="{{SampleSection.oneParamElement('success')}}" stepKey="c1"/>
+            <click selector="{{SampleSection.twoParamElement('success','success2')}}" stepKey="c2"/>
 
             <!-- parameterized selector with literal, static data, and created data  -->
-            <click selector="{{SampleSection.threeParamElement('John', SamplePerson.lastname, $testScopeData.lastname$)}}" mergeKey="c3"/>
+            <click selector="{{SampleSection.threeParamElement('John', SamplePerson.lastname, $testScopeData.lastname$)}}" stepKey="c3"/>
 
             <!-- selector that uses created data -->
-            <click selector="#$testScopeData.firstname$ .$testScopeData.lastname$" mergeKey="c4"/>
-            <click selector="#$$createData1.firstname$$ .$$createData1.lastname$$" mergeKey="c5"/>
+            <click selector="#$testScopeData.firstname$ .$testScopeData.lastname$" stepKey="c4"/>
+            <click selector="#$$createData1.firstname$$ .$$createData1.lastname$$" stepKey="c5"/>
 
             <!-- userInput that uses created data -->
-            <fillField selector="#sample" userInput="Hello $testScopeData.firstname$ $testScopeData.lastname$" mergeKey="f1"/>
-            <fillField selector="#sample" userInput="Hello $$createData1.firstname$$ $$createData1.lastname$$" mergeKey="f2"/>
+            <fillField selector="#sample" userInput="Hello $testScopeData.firstname$ $testScopeData.lastname$" stepKey="f1"/>
+            <fillField selector="#sample" userInput="Hello $$createData1.firstname$$ $$createData1.lastname$$" stepKey="f2"/>
         </test>
     </cest>
 </config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/SetPaymentConfigurationCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/SetPaymentConfigurationCest.xml
index 60b1f945e6b..005031284b5 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/SetPaymentConfigurationCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/SetPaymentConfigurationCest.xml
@@ -10,12 +10,12 @@
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Test/etc/testSchema.xsd">
     <cest name="SetPaymentConfigurationCest">
         <test name="SetPaypalConfigurationTest">
-            <createData entity="SamplePaypalConfig" mergeKey="createSamplePaypalConfig"/>
-            <createData entity="DefaultPayPalConfig" mergeKey="restoreDefaultPaypalConfig"/>
+            <createData entity="SamplePaypalConfig" stepKey="createSamplePaypalConfig"/>
+            <createData entity="DefaultPayPalConfig" stepKey="restoreDefaultPaypalConfig"/>
         </test>
         <test name="SetBraintreeConfigurationTest">
-            <createData entity="SampleBraintreeConfig" mergeKey="createSampleBraintreeConfig"/>
-            <createData entity="DefaultBraintreeConfig" mergeKey="restoreDefaultBraintreeConfig"/>
+            <createData entity="SampleBraintreeConfig" stepKey="createSampleBraintreeConfig"/>
+            <createData entity="DefaultBraintreeConfig" stepKey="restoreDefaultBraintreeConfig"/>
         </test>
     </cest>
 </config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/UpdateSimpleProductByApiCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/UpdateSimpleProductByApiCest.xml
index 7d80719a227..48e87294411 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/UpdateSimpleProductByApiCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/UpdateSimpleProductByApiCest.xml
@@ -18,14 +18,14 @@
             <env value="headless"/>
         </annotations>
         <before>
-            <createData mergeKey="categoryHandle" entity="SimpleSubCategory"/>
-            <createData mergeKey="productHandle" entity="SimpleProduct" >
+            <createData stepKey="categoryHandle" entity="SimpleSubCategory"/>
+            <createData stepKey="productHandle" entity="SimpleProduct" >
                 <required-entity createDataKey="categoryHandle"/>
             </createData>
-            <updateData mergeKey="updateProduct" entity="NewSimpleProduct" createDataKey="productHandle"/>
+            <updateData stepKey="updateProduct" entity="NewSimpleProduct" createDataKey="productHandle"/>
         </before>
         <after>
-            <deleteData mergeKey="delete" createDataKey="productHandle"/>
+            <deleteData stepKey="delete" createDataKey="updateProduct"/>
         </after>
         <test name="UpdateSimpleProductByApiTest">
         </test>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/Cest/AdminCreateStoreGroupCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/Cest/AdminCreateStoreGroupCest.xml
index 53692f3f41d..ef04dfd795a 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/Cest/AdminCreateStoreGroupCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/Cest/AdminCreateStoreGroupCest.xml
@@ -17,34 +17,34 @@
             <group value="store"/>
         </annotations>
         <before>
-            <createData mergeKey="b1" entity="customStoreGroup"/>
-            <createData mergeKey="b2" entity="customStoreGroup"/>
+            <createData stepKey="b1" entity="customStoreGroup"/>
+            <createData stepKey="b2" entity="customStoreGroup"/>
         </before>
         <test name="AdminCreateStoreGroupTest">
             <annotations>
                 <title value="Create a store group in admin"/>
                 <description value="Create a store group in admin"/>
             </annotations>
-            <amOnPage mergeKey="s1" url="{{AdminLoginPage.url}}"/>
-            <fillField mergeKey="s3" selector="{{AdminLoginFormSection.username}}" userInput="{{_ENV.MAGENTO_ADMIN_USERNAME}}"/>
-            <fillField mergeKey="s5" selector="{{AdminLoginFormSection.password}}" userInput="{{_ENV.MAGENTO_ADMIN_PASSWORD}}"/>
-            <click mergeKey="s7" selector="{{AdminLoginFormSection.signIn}}"/>
-            <amOnPage mergeKey="s9" url="{{AdminSystemStorePage.url}}"/>
+            <amOnPage stepKey="s1" url="{{AdminLoginPage.url}}"/>
+            <fillField stepKey="s3" selector="{{AdminLoginFormSection.username}}" userInput="{{_ENV.MAGENTO_ADMIN_USERNAME}}"/>
+            <fillField stepKey="s5" selector="{{AdminLoginFormSection.password}}" userInput="{{_ENV.MAGENTO_ADMIN_PASSWORD}}"/>
+            <click stepKey="s7" selector="{{AdminLoginFormSection.signIn}}"/>
+            <amOnPage stepKey="s9" url="{{AdminSystemStorePage.url}}"/>
 
-            <click mergeKey="s11" selector="{{AdminStoresGridSection.resetButton}}"/>
-            <waitForPageLoad mergeKey="s15" time="10"/>
+            <click stepKey="s11" selector="{{AdminStoresGridSection.resetButton}}"/>
+            <waitForPageLoad stepKey="s15" time="10"/>
 
-            <fillField mergeKey="s17" selector="{{AdminStoresGridSection.storeGrpFilterTextField}}" userInput="$$b1.group[name]$$"/>
-            <click mergeKey="s19" selector="{{AdminStoresGridSection.searchButton}}"/>
-            <waitForPageLoad mergeKey="s21" time="10"/>
-            <see mergeKey="s23" selector="{{AdminStoresGridSection.storeGrpNameInFirstRow}}" userInput="$$b1.group[name]$$"/>
+            <fillField stepKey="s17" selector="{{AdminStoresGridSection.storeGrpFilterTextField}}" userInput="$$b1.group[name]$$"/>
+            <click stepKey="s19" selector="{{AdminStoresGridSection.searchButton}}"/>
+            <waitForPageLoad stepKey="s21" time="10"/>
+            <see stepKey="s23" selector="{{AdminStoresGridSection.storeGrpNameInFirstRow}}" userInput="$$b1.group[name]$$"/>
 
-            <click mergeKey="s31" selector="{{AdminStoresGridSection.resetButton}}"/>
-            <waitForPageLoad mergeKey="s35" time="10"/>
-            <fillField mergeKey="s37" selector="{{AdminStoresGridSection.storeGrpFilterTextField}}" userInput="$$b2.group[name]$$"/>
-            <click mergeKey="s39" selector="{{AdminStoresGridSection.searchButton}}"/>
-            <waitForPageLoad mergeKey="s41" time="10"/>
-            <see mergeKey="s43" selector="{{AdminStoresGridSection.storeGrpNameInFirstRow}}" userInput="$$b2.group[name]$$"/>
+            <click stepKey="s31" selector="{{AdminStoresGridSection.resetButton}}"/>
+            <waitForPageLoad stepKey="s35" time="10"/>
+            <fillField stepKey="s37" selector="{{AdminStoresGridSection.storeGrpFilterTextField}}" userInput="$$b2.group[name]$$"/>
+            <click stepKey="s39" selector="{{AdminStoresGridSection.searchButton}}"/>
+            <waitForPageLoad stepKey="s41" time="10"/>
+            <see stepKey="s43" selector="{{AdminStoresGridSection.storeGrpNameInFirstRow}}" userInput="$$b2.group[name]$$"/>
         </test>
     </cest>
 </config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Wishlist/Cest/StorefrontDeletePersistedWishlistCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Wishlist/Cest/StorefrontDeletePersistedWishlistCest.xml
index b1f452ac565..80aa26e20a9 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Wishlist/Cest/StorefrontDeletePersistedWishlistCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Wishlist/Cest/StorefrontDeletePersistedWishlistCest.xml
@@ -17,41 +17,41 @@
             <group value="wishlist"/>
         </annotations>
         <before>
-            <createData mergeKey="category" entity="SimpleSubCategory"/>
-            <createData mergeKey="product" entity="SimpleProduct" >
+            <createData stepKey="category" entity="SimpleSubCategory"/>
+            <createData stepKey="product" entity="SimpleProduct" >
                 <required-entity createDataKey="category"/>
             </createData>
-            <createData mergeKey="customer" entity="Simple_US_Customer"/>
-            <createData mergeKey="wishlist" entity="Wishlist">
+            <createData stepKey="customer" entity="Simple_US_Customer"/>
+            <createData stepKey="wishlist" entity="Wishlist">
                 <required-entity createDataKey="customer"/>
                 <required-entity createDataKey="product"/>
             </createData>
         </before>
         <after>
-            <deleteData mergeKey="deleteProduct" createDataKey="product"/>
-            <deleteData mergeKey="deleteCategory" createDataKey="category"/>
-            <deleteData mergeKey="deleteCustomer" createDataKey="customer"/>
+            <deleteData stepKey="deleteProduct" createDataKey="product"/>
+            <deleteData stepKey="deleteCategory" createDataKey="category"/>
+            <deleteData stepKey="deleteCustomer" createDataKey="customer"/>
         </after>
         <test name="StorefrontDeletePersistedWishlistTest">
             <annotations>
                 <title value="Delete a persist wishlist for a customer"/>
                 <description value="Delete a persist wishlist for a customer"/>
             </annotations>
-            <amOnPage mergeKey="amOnSignInPage"  url="{{StorefrontCustomerSignInPage.url}}"/>
-            <fillField  mergeKey="fillEmail" userInput="$$customer.email$$" selector="{{StorefrontCustomerSignInFormSection.emailField}}"/>
-            <fillField  mergeKey="fillPassword" userInput="$$customer.password$$" selector="{{StorefrontCustomerSignInFormSection.passwordField}}"/>
-            <waitForElementVisible mergeKey="waitForButton" selector="{{StorefrontCustomerSignInFormSection.signInAccountButton}}"/>
-            <click mergeKey="clickSignInAccountButton" selector="{{StorefrontCustomerSignInFormSection.signInAccountButton}}"/>
-            <see mergeKey="seeFirstName" userInput="$$customer.firstname$$" selector="{{StorefrontCustomerDashboardAccountInformationSection.ContactInformation}}" />
-            <see mergeKey="seeLastName" userInput="$$customer.lastname$$" selector="{{StorefrontCustomerDashboardAccountInformationSection.ContactInformation}}" />
-            <see mergeKey="seeEmail" userInput="$$customer.email$$" selector="{{StorefrontCustomerDashboardAccountInformationSection.ContactInformation}}" />
-            <waitForPageLoad mergeKey="15"/>
-            <amOnPage mergeKey="amOnWishlist" url="{{StorefrontCustomerWishlistPage.url}}"/>
-            <see mergeKey="seeWishlist" userInput="$$product.name$$" selector="{{StorefrontCustomerWishlistSection.productItemNameText}}"/>
-            <moveMouseOver mergeKey="mouseOver" selector="{{StorefrontCustomerWishlistSection.productItemNameText}}"/>
-            <waitForElementVisible mergeKey="waitForRemoveButton" selector="{{StorefrontCustomerWishlistSection.removeWishlistButton}}"/>
-            <click mergeKey="clickRemove" selector="{{StorefrontCustomerWishlistSection.removeWishlistButton}}"/>
-            <see mergeKey="seeEmptyWishlist" userInput="You have no items in your wish list" selector="{{StorefrontCustomerWishlistSection.emptyWishlistText}}"/>
+            <amOnPage stepKey="amOnSignInPage"  url="{{StorefrontCustomerSignInPage.url}}"/>
+            <fillField  stepKey="fillEmail" userInput="$$customer.email$$" selector="{{StorefrontCustomerSignInFormSection.emailField}}"/>
+            <fillField  stepKey="fillPassword" userInput="$$customer.password$$" selector="{{StorefrontCustomerSignInFormSection.passwordField}}"/>
+            <waitForElementVisible stepKey="waitForButton" selector="{{StorefrontCustomerSignInFormSection.signInAccountButton}}"/>
+            <click stepKey="clickSignInAccountButton" selector="{{StorefrontCustomerSignInFormSection.signInAccountButton}}"/>
+            <see stepKey="seeFirstName" userInput="$$customer.firstname$$" selector="{{StorefrontCustomerDashboardAccountInformationSection.ContactInformation}}" />
+            <see stepKey="seeLastName" userInput="$$customer.lastname$$" selector="{{StorefrontCustomerDashboardAccountInformationSection.ContactInformation}}" />
+            <see stepKey="seeEmail" userInput="$$customer.email$$" selector="{{StorefrontCustomerDashboardAccountInformationSection.ContactInformation}}" />
+            <waitForPageLoad stepKey="15"/>
+            <amOnPage stepKey="amOnWishlist" url="{{StorefrontCustomerWishlistPage.url}}"/>
+            <see stepKey="seeWishlist" userInput="$$product.name$$" selector="{{StorefrontCustomerWishlistSection.productItemNameText}}"/>
+            <moveMouseOver stepKey="mouseOver" selector="{{StorefrontCustomerWishlistSection.productItemNameText}}"/>
+            <waitForElementVisible stepKey="waitForRemoveButton" selector="{{StorefrontCustomerWishlistSection.removeWishlistButton}}"/>
+            <click stepKey="clickRemove" selector="{{StorefrontCustomerWishlistSection.removeWishlistButton}}"/>
+            <see stepKey="seeEmptyWishlist" userInput="You have no items in your wish list" selector="{{StorefrontCustomerWishlistSection.emptyWishlistText}}"/>
         </test>
     </cest>
 </config>
-- 
GitLab


From 2a139884e230e3eab648ee06620a46a34f4bd470 Mon Sep 17 00:00:00 2001
From: Ji Lu <jilu1@magento.com>
Date: Fri, 1 Dec 2017 23:34:22 +0200
Subject: [PATCH 296/380] MQE-569: added SampleTests in module blacklist and
 not allowed to generate them.

---
 dev/tests/acceptance/.env.example | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/dev/tests/acceptance/.env.example b/dev/tests/acceptance/.env.example
index 01c375010db..596252ff6a1 100644
--- a/dev/tests/acceptance/.env.example
+++ b/dev/tests/acceptance/.env.example
@@ -20,7 +20,7 @@
 # TESTS_BP=/Users/First_Last/GitHub/magento2ce/dev/tests/acceptance/tests/functional
 # FW_BP=/Users/First_Last/GitHub/magento2-functional-testing-framework
 # TESTS_MODULE_PATH=/Users/First_Last/GitHub/magento2ce/dev/tests/acceptance/tests/functional/Magento/FunctionalTest
-# MODULE_WHITELIST=Magento_SampleTests,Magento_NewModule
+# MODULE_WHITELIST=Magento_NewModule
 #
 #*** End of example .env ***#
 
-- 
GitLab


From afe1e5bc40443ace3384561ed63cfe85ca05f010 Mon Sep 17 00:00:00 2001
From: Kevin Kozan <kkozan@magento.com>
Date: Tue, 5 Dec 2017 23:08:10 +0200
Subject: [PATCH 297/380] MQE-570: Sanitize MAGENTO_BASE_URL (.env file) and
 Selenium params

- Made SELENIUM_VARS optional in .example, as they now can be.
---
 dev/tests/acceptance/.env.example | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/dev/tests/acceptance/.env.example b/dev/tests/acceptance/.env.example
index 596252ff6a1..9cb45c149a9 100644
--- a/dev/tests/acceptance/.env.example
+++ b/dev/tests/acceptance/.env.example
@@ -35,11 +35,11 @@ MAGENTO_BACKEND_NAME=
 MAGENTO_ADMIN_USERNAME=
 MAGENTO_ADMIN_PASSWORD=
 
-#*** Selenium Server Protocol, Host, Port, and Path, with local defaults. Change if not running Selenium locally.
-SELENIUM_HOST=127.0.0.1
-SELENIUM_PORT=4444
-SELENIUM_PROTOCOL=http
-SELENIUM_PATH=/wd/hub
+#*** Selenium Server Protocol, Host, Port, and Path, with local defaults. Uncomment and change if not running Selenium locally.
+#SELENIUM_HOST=127.0.0.1
+#SELENIUM_PORT=4444
+#SELENIUM_PROTOCOL=http
+#SELENIUM_PATH=/wd/hub
 
 #*** Uncomment and set host & port if your dev environment needs different value other than MAGENTO_BASE_URL for Rest API Requests ***#
 #MAGENTO_RESTAPI_SERVER_HOST=
-- 
GitLab


From 10c4bf90461abaf8ed351b44ddfdaff117634d2a Mon Sep 17 00:00:00 2001
From: Ji Lu <jilu1@magento.com>
Date: Wed, 6 Dec 2017 18:49:50 +0200
Subject: [PATCH 298/380] MQE-574: selector or selectorArray attribute is
 required for 'click' action; fixed sample cest.

---
 .../Magento/FunctionalTest/SampleTests/Cest/SampleCest.xml       | 1 -
 1 file changed, 1 deletion(-)

diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/SampleCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/SampleCest.xml
index 0d2facdb09b..022e9a5d064 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/SampleCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/SampleCest.xml
@@ -44,7 +44,6 @@
             <click selector="#button" userInput="Context" stepKey="click1"/>
             <click selectorArray="['link' => 'Login']" stepKey="click2"/>
             <click selectorArray="['link' => 'Login']" userInput="stuff" stepKey="click3"/>
-            <click userInput="Click" stepKey="click4"/>
             <clickWithLeftButton selector="#clickHere" stepKey="clickWithLeftButton1" x="23" y="324"/>
             <clickWithLeftButton selectorArray="['css' => '.checkout']" stepKey="clickWithLeftButton2" x="23" y="324"/>
             <clickWithLeftButton stepKey="clickWithLeftButton3" x="23" y="324"/>
-- 
GitLab


From ca7bb241b0f843bc875c26b00b636ca7afdddc75 Mon Sep 17 00:00:00 2001
From: Ji Lu <jilu1@magento.com>
Date: Thu, 7 Dec 2017 17:53:10 +0200
Subject: [PATCH 299/380] MQE-583: set release version to 1.0.0 and updated
 composer dependencies.

---
 .../AdminNotification/README.md               |  4 +-
 .../AdminNotification/composer.json           | 40 ++++-----
 .../AdvancedPricingImportExport/README.md     |  4 +-
 .../AdvancedPricingImportExport/composer.json | 50 +++++------
 .../FunctionalTest/Authorization/README.md    |  4 +-
 .../Authorization/composer.json               | 38 +++------
 .../FunctionalTest/Authorizenet/README.md     |  4 +-
 .../FunctionalTest/Authorizenet/composer.json | 50 +++++------
 .../Magento/FunctionalTest/Backend/README.md  |  4 +-
 .../FunctionalTest/Backend/composer.json      | 67 +++++++--------
 .../Magento/FunctionalTest/Backup/README.md   |  4 +-
 .../FunctionalTest/Backup/composer.json       | 41 ++++------
 .../FunctionalTest/Braintree/README.md        |  4 +-
 .../FunctionalTest/Braintree/composer.json    | 61 ++++++--------
 .../Magento/FunctionalTest/Bundle/README.md   |  4 +-
 .../FunctionalTest/Bundle/composer.json       | 66 ++++++---------
 .../BundleImportExport/README.md              |  4 +-
 .../BundleImportExport/composer.json          | 46 ++++-------
 .../FunctionalTest/CacheInvalidate/README.md  |  4 +-
 .../CacheInvalidate/composer.json             | 38 +++------
 .../Magento/FunctionalTest/Captcha/README.md  |  4 +-
 .../FunctionalTest/Captcha/composer.json      | 44 ++++------
 .../Magento/FunctionalTest/Catalog/README.md  |  4 +-
 .../FunctionalTest/Catalog/composer.json      | 82 ++++++++-----------
 .../CatalogImportExport/composer.json         | 54 +++++-------
 .../FunctionalTest/CatalogInventory/README.md |  4 +-
 .../CatalogInventory/composer.json            | 50 +++++------
 .../FunctionalTest/CatalogRule/README.md      |  4 +-
 .../FunctionalTest/CatalogRule/composer.json  | 50 +++++------
 .../CatalogRuleConfigurable/README.md         |  4 +-
 .../CatalogRuleConfigurable/composer.json     | 42 ++++------
 .../FunctionalTest/CatalogSearch/README.md    |  4 +-
 .../CatalogSearch/composer.json               | 56 +++++--------
 .../CatalogUrlRewrite/composer.json           | 52 +++++-------
 .../FunctionalTest/CatalogWidget/README.md    |  4 +-
 .../CatalogWidget/composer.json               | 52 +++++-------
 .../Magento/FunctionalTest/Checkout/README.md |  4 +-
 .../FunctionalTest/Checkout/composer.json     | 72 +++++++---------
 .../CheckoutAgreements/README.md              |  4 +-
 .../CheckoutAgreements/composer.json          | 44 ++++------
 .../Magento/FunctionalTest/Cms/README.md      |  4 +-
 .../Magento/FunctionalTest/Cms/composer.json  | 54 +++++-------
 .../FunctionalTest/CmsUrlRewrite/README.md    |  7 +-
 .../CmsUrlRewrite/composer.json               | 42 ++++------
 .../Magento/FunctionalTest/Config/README.md   |  9 +-
 .../FunctionalTest/Config/composer.json       | 48 +++++------
 .../ConfigurableImportExport/composer.json    | 46 ++++-------
 .../ConfigurableProduct/README.md             |  4 +-
 .../ConfigurableProduct/composer.json         | 58 ++++++-------
 .../ConfigurableProductSales/README.md        |  4 +-
 .../ConfigurableProductSales/composer.json    | 42 ++++------
 .../Magento/FunctionalTest/Contact/README.md  |  4 +-
 .../FunctionalTest/Contact/composer.json      | 44 ++++------
 .../Magento/FunctionalTest/Cookie/README.md   |  4 +-
 .../FunctionalTest/Cookie/composer.json       | 38 +++------
 .../Magento/FunctionalTest/Cron/LICENSE.txt   | 48 +++++++++++
 .../FunctionalTest/Cron/LICENSE_AFL.txt       | 48 +++++++++++
 .../Magento/FunctionalTest/Cron/README.md     |  3 +
 .../Magento/FunctionalTest/Cron/composer.json | 38 +++++++++
 .../FunctionalTest/CurrencySymbol/README.md   |  4 +-
 .../CurrencySymbol/composer.json              | 46 ++++-------
 .../Magento/FunctionalTest/Customer/README.md |  4 +-
 .../FunctionalTest/Customer/composer.json     | 74 +++++++----------
 .../CustomerImportExport/README.md            |  4 +-
 .../CustomerImportExport/composer.json        | 48 ++++-------
 .../Magento/FunctionalTest/Deploy/LICENSE.txt | 48 +++++++++++
 .../FunctionalTest/Deploy/LICENSE_AFL.txt     | 48 +++++++++++
 .../Magento/FunctionalTest/Deploy/README.md   |  3 +
 .../FunctionalTest/Deploy/composer.json       | 41 ++++++++++
 .../FunctionalTest/Developer/README.md        |  4 +-
 .../FunctionalTest/Developer/composer.json    | 40 ++++-----
 .../Magento/FunctionalTest/Dhl/README.md      |  4 +-
 .../Magento/FunctionalTest/Dhl/composer.json  | 54 +++++-------
 .../FunctionalTest/Directory/README.md        |  4 +-
 .../FunctionalTest/Directory/composer.json    | 42 ++++------
 .../FunctionalTest/Downloadable/README.md     |  4 +-
 .../FunctionalTest/Downloadable/composer.json | 68 +++++++--------
 .../DownloadableImportExport/README.md        |  4 +-
 .../DownloadableImportExport/composer.json    | 48 ++++-------
 .../Magento/FunctionalTest/Eav/README.md      |  4 +-
 .../Magento/FunctionalTest/Eav/composer.json  | 46 ++++-------
 .../Magento/FunctionalTest/Email/README.md    |  4 +-
 .../FunctionalTest/Email/composer.json        | 48 ++++-------
 .../FunctionalTest/EncryptionKey/README.md    |  4 +-
 .../EncryptionKey/composer.json               | 40 ++++-----
 .../Magento/FunctionalTest/Fedex/README.md    |  4 +-
 .../FunctionalTest/Fedex/composer.json        | 52 +++++-------
 .../FunctionalTest/GiftMessage/README.md      |  4 +-
 .../FunctionalTest/GiftMessage/composer.json  | 52 +++++-------
 .../FunctionalTest/GoogleAdwords/README.md    |  4 +-
 .../GoogleAdwords/composer.json               | 40 ++++-----
 .../FunctionalTest/GoogleAnalytics/README.md  |  4 +-
 .../GoogleAnalytics/composer.json             | 42 ++++------
 .../FunctionalTest/GoogleOptimizer/README.md  |  4 +-
 .../GoogleOptimizer/composer.json             | 48 ++++-------
 .../FunctionalTest/GraphQl/LICENSE.txt        | 48 +++++++++++
 .../FunctionalTest/GraphQl/LICENSE_AFL.txt    | 48 +++++++++++
 .../Magento/FunctionalTest/GraphQl/README.md  |  3 +
 .../FunctionalTest/GraphQl/composer.json      | 40 +++++++++
 .../GroupedImportExport/composer.json         | 46 ++++-------
 .../FunctionalTest/GroupedProduct/README.md   |  4 +-
 .../GroupedProduct/composer.json              | 60 ++++++--------
 .../FunctionalTest/ImportExport/README.md     |  4 +-
 .../FunctionalTest/ImportExport/composer.json | 46 ++++-------
 .../Magento/FunctionalTest/Indexer/README.md  |  4 +-
 .../FunctionalTest/Indexer/composer.json      | 38 +++------
 .../InstantPurchase/LICENSE.txt               | 48 +++++++++++
 .../InstantPurchase/LICENSE_AFL.txt           | 48 +++++++++++
 .../FunctionalTest/InstantPurchase/README.md  |  3 +
 .../InstantPurchase/composer.json             | 43 ++++++++++
 .../FunctionalTest/Integration/README.md      |  4 +-
 .../FunctionalTest/Integration/composer.json  | 48 ++++-------
 .../LayeredNavigation/README.md               |  4 +-
 .../LayeredNavigation/composer.json           | 40 ++++-----
 .../FunctionalTest/Marketplace/README.md      |  4 +-
 .../FunctionalTest/Marketplace/composer.json  | 38 +++------
 .../FunctionalTest/MediaStorage/README.md     |  4 +-
 .../FunctionalTest/MediaStorage/composer.json | 42 ++++------
 .../Magento/FunctionalTest/Msrp/composer.json | 48 ++++-------
 .../FunctionalTest/Multishipping/README.md    |  4 +-
 .../Multishipping/composer.json               | 52 +++++-------
 .../NewRelicReporting/README.md               |  4 +-
 .../NewRelicReporting/composer.json           | 48 ++++-------
 .../FunctionalTest/Newsletter/README.md       |  4 +-
 .../FunctionalTest/Newsletter/composer.json   | 51 +++++-------
 .../FunctionalTest/OfflinePayments/README.md  |  4 +-
 .../OfflinePayments/composer.json             | 40 ++++-----
 .../FunctionalTest/OfflineShipping/README.md  |  4 +-
 .../OfflineShipping/composer.json             | 53 +++++-------
 .../FunctionalTest/PageCache/README.md        |  4 +-
 .../FunctionalTest/PageCache/composer.json    | 42 ++++------
 .../Magento/FunctionalTest/Payment/README.md  |  4 +-
 .../FunctionalTest/Payment/composer.json      | 48 ++++-------
 .../Magento/FunctionalTest/Paypal/README.md   |  4 +-
 .../FunctionalTest/Paypal/composer.json       | 67 +++++++--------
 .../FunctionalTest/Persistent/README.md       |  4 +-
 .../FunctionalTest/Persistent/composer.json   | 47 ++++-------
 .../FunctionalTest/ProductAlert/README.md     |  4 +-
 .../FunctionalTest/ProductAlert/composer.json | 44 ++++------
 .../FunctionalTest/ProductVideo/README.md     |  4 +-
 .../FunctionalTest/ProductVideo/composer.json | 46 ++++-------
 .../Magento/FunctionalTest/Quote/README.md    |  4 +-
 .../FunctionalTest/Quote/composer.json        | 64 ++++++---------
 .../Magento/FunctionalTest/Reports/README.md  |  4 +-
 .../FunctionalTest/Reports/composer.json      | 68 +++++++--------
 .../FunctionalTest/RequireJs/LICENSE.txt      | 48 +++++++++++
 .../FunctionalTest/RequireJs/LICENSE_AFL.txt  | 48 +++++++++++
 .../FunctionalTest/RequireJs/README.md        |  3 +
 .../FunctionalTest/RequireJs/composer.json    | 35 ++++++++
 .../Magento/FunctionalTest/Review/README.md   |  4 +-
 .../FunctionalTest/Review/composer.json       | 52 +++++-------
 .../Magento/FunctionalTest/Robots/README.md   |  4 +-
 .../FunctionalTest/Robots/composer.json       | 38 +++------
 .../Magento/FunctionalTest/Rss/README.md      |  4 +-
 .../Magento/FunctionalTest/Rss/composer.json  | 42 ++++------
 .../Magento/FunctionalTest/Rule/README.md     |  4 +-
 .../Magento/FunctionalTest/Rule/composer.json | 44 ++++------
 .../Magento/FunctionalTest/Sales/README.md    |  4 +-
 .../FunctionalTest/Sales/composer.json        | 82 ++++++++-----------
 .../FunctionalTest/SalesInventory/README.md   |  4 +-
 .../SalesInventory/composer.json              | 44 ++++------
 .../FunctionalTest/SalesRule/README.md        |  4 +-
 .../FunctionalTest/SalesRule/composer.json    | 70 +++++++---------
 .../FunctionalTest/SalesSequence/README.md    |  4 +-
 .../SalesSequence/composer.json               | 36 +++-----
 .../FunctionalTest/SampleData/README.md       |  4 +-
 .../FunctionalTest/SampleData/composer.json   | 36 +++-----
 .../Magento/FunctionalTest/Search/README.md   |  4 +-
 .../FunctionalTest/Search/composer.json       | 46 ++++-------
 .../Magento/FunctionalTest/Security/README.md |  4 +-
 .../FunctionalTest/Security/composer.json     | 40 ++++-----
 .../FunctionalTest/SendFriend/README.md       |  4 +-
 .../FunctionalTest/SendFriend/composer.json   | 42 ++++------
 .../Magento/FunctionalTest/Shipping/README.md |  4 +-
 .../FunctionalTest/Shipping/composer.json     | 62 ++++++--------
 .../Magento/FunctionalTest/Sitemap/README.md  |  4 +-
 .../FunctionalTest/Sitemap/composer.json      | 54 +++++-------
 .../Magento/FunctionalTest/Store/README.md    |  4 +-
 .../FunctionalTest/Store/composer.json        | 46 ++++-------
 .../Magento/FunctionalTest/Swagger/README.md  |  4 +-
 .../FunctionalTest/Swagger/composer.json      | 36 +++-----
 .../Magento/FunctionalTest/Swatches/README.md |  4 +-
 .../FunctionalTest/Swatches/composer.json     | 54 +++++-------
 .../SwatchesLayeredNavigation/README.md       |  4 +-
 .../SwatchesLayeredNavigation/composer.json   | 36 +++-----
 .../Magento/FunctionalTest/Tax/README.md      |  4 +-
 .../Magento/FunctionalTest/Tax/composer.json  | 62 ++++++--------
 .../TaxImportExport/composer.json             | 44 ++++------
 .../Magento/FunctionalTest/Theme/README.md    |  4 +-
 .../FunctionalTest/Theme/composer.json        | 55 +++++--------
 .../FunctionalTest/Translation/README.md      |  4 +-
 .../FunctionalTest/Translation/composer.json  | 42 ++++------
 .../Magento/FunctionalTest/Ui/README.md       |  4 +-
 .../Magento/FunctionalTest/Ui/composer.json   | 44 ++++------
 .../Magento/FunctionalTest/Ups/README.md      |  4 +-
 .../Magento/FunctionalTest/Ups/composer.json  | 50 +++++------
 .../FunctionalTest/UrlRewrite/README.md       |  4 +-
 .../FunctionalTest/UrlRewrite/composer.json   | 48 ++++-------
 .../Magento/FunctionalTest/User/README.md     |  4 +-
 .../Magento/FunctionalTest/User/composer.json | 48 ++++-------
 .../Magento/FunctionalTest/Usps/LICENSE.txt   | 48 +++++++++++
 .../FunctionalTest/Usps/LICENSE_AFL.txt       | 48 +++++++++++
 .../Magento/FunctionalTest/Usps/README.md     |  3 +
 .../Magento/FunctionalTest/Usps/composer.json | 45 ++++++++++
 .../Magento/FunctionalTest/Variable/README.md |  4 +-
 .../FunctionalTest/Variable/composer.json     | 42 ++++------
 .../Magento/FunctionalTest/Vault/README.md    |  4 +-
 .../FunctionalTest/Vault/composer.json        | 48 ++++-------
 .../Magento/FunctionalTest/Version/README.md  |  4 +-
 .../FunctionalTest/Version/composer.json      | 37 +++------
 .../Magento/FunctionalTest/Webapi/README.md   |  4 +-
 .../FunctionalTest/Webapi/composer.json       | 44 ++++------
 .../FunctionalTest/WebapiSecurity/README.md   |  4 +-
 .../WebapiSecurity/composer.json              | 38 +++------
 .../Magento/FunctionalTest/Weee/README.md     |  4 +-
 .../Magento/FunctionalTest/Weee/composer.json | 60 ++++++--------
 .../Magento/FunctionalTest/Widget/README.md   |  4 +-
 .../FunctionalTest/Widget/composer.json       | 50 +++++------
 .../Magento/FunctionalTest/Wishlist/README.md |  4 +-
 .../FunctionalTest/Wishlist/composer.json     | 54 +++++-------
 220 files changed, 2905 insertions(+), 3276 deletions(-)
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cron/LICENSE.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cron/LICENSE_AFL.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cron/README.md
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cron/composer.json
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Deploy/LICENSE.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Deploy/LICENSE_AFL.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Deploy/README.md
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Deploy/composer.json
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GraphQl/LICENSE.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GraphQl/LICENSE_AFL.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GraphQl/README.md
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GraphQl/composer.json
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/InstantPurchase/LICENSE.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/InstantPurchase/LICENSE_AFL.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/InstantPurchase/README.md
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/InstantPurchase/composer.json
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/RequireJs/LICENSE.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/RequireJs/LICENSE_AFL.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/RequireJs/README.md
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/RequireJs/composer.json
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Usps/LICENSE.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Usps/LICENSE_AFL.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Usps/README.md
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Usps/composer.json

diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/AdminNotification/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/AdminNotification/README.md
index 4a84a064d1c..c9275af071f 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/AdminNotification/README.md
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/AdminNotification/README.md
@@ -1,3 +1,3 @@
-# Magento 2 Acceptance Tests
+# Magento 2 Functional Tests
 
-The Acceptance Tests Module for **Magento_AdminNotification** Module.
+The Functional Tests Module for **Magento_AdminNotification** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/AdminNotification/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/AdminNotification/composer.json
index 328161117f7..5e4c79075ea 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/AdminNotification/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/AdminNotification/composer.json
@@ -1,46 +1,40 @@
 {
-    "name": "magento/magento2-functional-test-admin-notification",
-    "description": "Magento 2 Acceptance Test Module Admin Notification",
-    "repositories": [
-        {
-            "type" : "composer",
-            "url" : "https://repo.magento.com/"
-        }
-    ],
+    "name": "magento/magento2-functional-test-module-admin-notification",
+    "description": "Magento 2 Functional Test Module Admin Notification",
+    "config": {
+        "sort-packages": true
+    },
     "require": {
-        "php": "~7.0",
-        "codeception/codeception": "2.2|2.3",
-        "allure-framework/allure-codeception": "dev-master",
+        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
+        "codeception/codeception": "~2.3.4",
         "consolidation/robo": "^1.0.0",
         "henrikbjorn/lurker": "^1.2",
-        "vlucas/phpdotenv": "~2.4",
-        "magento/magento2-functional-testing-framework": "dev-develop"
+        "magento/magento2-functional-testing-framework": "1.0.0",
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
+        "vlucas/phpdotenv": "~2.4"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-store": "dev-master",
-        "magento/magento2-functional-test-module-backend": "dev-master",
-        "magento/magento2-functional-test-media-storage": "dev-master",
-        "magento/magento2-functional-test-module-ui": "dev-master"
+        "magento/magento2-functional-test-module-backend": "1.0.0",
+        "magento/magento2-functional-test-module-media-storage": "1.0.0",
+        "magento/magento2-functional-test-module-store": "1.0.0",
+        "magento/magento2-functional-test-module-ui": "1.0.0"
     },
     "type": "magento2-test-module",
-    "version": "dev-master",
+    "version": "1.0.0",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
         "psr-4": {
-            "Magento\\FunctionalTest\\": [
-                "tests/functional/Magento/FunctionalTest",
-                "generated/Magento/FunctionalTest"
-            ]
+            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
         }
     },
     "extra": {
         "map": [
             [
                 "*",
-                "tests/functional/Magento/FunctionalTest/AdminNotification"
+                "dev/tests/acceptance/tests/functional/Magento/FunctionalTest/AdminNotification"
             ]
         ]
     }
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/AdvancedPricingImportExport/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/AdvancedPricingImportExport/README.md
index 224e08d3e84..2f01efe5952 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/AdvancedPricingImportExport/README.md
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/AdvancedPricingImportExport/README.md
@@ -1,3 +1,3 @@
-# Magento 2 Acceptance Tests
+# Magento 2 Functional Tests
 
-The Acceptance Tests Module for **Magento_AdvancedPricingImportExport** Module.
+The Functional Tests Module for **Magento_AdvancedPricingImportExport** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/AdvancedPricingImportExport/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/AdvancedPricingImportExport/composer.json
index 32562af2094..c104d3f9cf5 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/AdvancedPricingImportExport/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/AdvancedPricingImportExport/composer.json
@@ -1,55 +1,43 @@
 {
     "name": "magento/magento2-functional-test-module-advanced-pricing-import-export",
-    "description": "Magento 2 Acceptance Test Module Advanced Pricing Import Export",
-    "repositories": [
-        {
-            "type" : "composer",
-            "url" : "https://repo.magento.com/"
-        }
-    ],
+    "description": "Magento 2 Functional Test Module Advanced Pricing Import Export",
+    "config": {
+        "sort-packages": true
+    },
     "require": {
-        "php": "~7.0",
-        "codeception/codeception": "2.2|2.3",
-        "allure-framework/allure-codeception": "dev-master",
+        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
+        "codeception/codeception": "~2.3.4",
         "consolidation/robo": "^1.0.0",
         "henrikbjorn/lurker": "^1.2",
-        "vlucas/phpdotenv": "~2.4",
-        "magento/magento2-functional-testing-framework": "dev-develop"
+        "magento/magento2-functional-testing-framework": "1.0.0",
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
+        "vlucas/phpdotenv": "~2.4"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-store": "dev-master",
-        "magento/magento2-functional-test-module-catalog": "dev-master",
-        "magento/magento2-functional-test-module-catalog-inventory": "dev-master",
-        "magento/magento2-functional-test-module-eav": "dev-master",
-        "magento/magento2-functional-test-module-import-export": "dev-master",
-        "magento/magento2-functional-test-module-catalog-import-export": "dev-master",
-        "magento/magento2-functional-test-module-customer": "dev-master"
+        "magento/magento2-functional-test-module-catalog": "1.0.0",
+        "magento/magento2-functional-test-module-catalog-import-export": "1.0.0",
+        "magento/magento2-functional-test-module-catalog-inventory": "1.0.0",
+        "magento/magento2-functional-test-module-customer": "1.0.0",
+        "magento/magento2-functional-test-module-eav": "1.0.0",
+        "magento/magento2-functional-test-module-import-export": "1.0.0",
+        "magento/magento2-functional-test-module-store": "1.0.0"
     },
     "type": "magento2-test-module",
-    "version": "dev-master",
+    "version": "1.0.0",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
-        "psr-0": {
-            "Yandex": "vendor/allure-framework/allure-codeception/src/"
-        },
         "psr-4": {
-            "Magento\\FunctionalTestingFramework\\": [
-                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
-            ],
-            "Magento\\FunctionalTest\\": [
-                "tests/functional/Magento/FunctionalTest",
-                "generated/Magento/FunctionalTest"
-            ]
+            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
         }
     },
     "extra": {
         "map": [
             [
                 "*",
-                "tests/functional/Magento/FunctionalTest/AdvancedPricingImportExport"
+                "dev/tests/acceptance/tests/functional/Magento/FunctionalTest/AdvancedPricingImportExport"
             ]
         ]
     }
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Authorization/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Authorization/README.md
index b540c210faf..c21edf02d3b 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Authorization/README.md
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Authorization/README.md
@@ -1,3 +1,3 @@
-# Magento 2 Acceptance Tests
+# Magento 2 Functional Tests
 
-The Acceptance Tests Module for **Magento_Authorization** Module.
+The Functional Tests Module for **Magento_Authorization** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Authorization/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Authorization/composer.json
index 6c0ac320087..05e88d90f10 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Authorization/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Authorization/composer.json
@@ -1,49 +1,37 @@
 {
     "name": "magento/magento2-functional-test-module-authorization",
-    "description": "Magento 2 Acceptance Test Module Authorization",
-    "repositories": [
-        {
-            "type" : "composer",
-            "url" : "https://repo.magento.com/"
-        }
-    ],
+    "description": "Magento 2 Functional Test Module Authorization",
+    "config": {
+        "sort-packages": true
+    },
     "require": {
-        "php": "~7.0",
-        "codeception/codeception": "2.2|2.3",
-        "allure-framework/allure-codeception": "dev-master",
+        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
+        "codeception/codeception": "~2.3.4",
         "consolidation/robo": "^1.0.0",
         "henrikbjorn/lurker": "^1.2",
-        "vlucas/phpdotenv": "~2.4",
-        "magento/magento2-functional-testing-framework": "dev-develop"
+        "magento/magento2-functional-testing-framework": "1.0.0",
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
+        "vlucas/phpdotenv": "~2.4"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-backend": "dev-master"
+        "magento/magento2-functional-test-module-backend": "1.0.0"
     },
     "type": "magento2-test-module",
-    "version": "dev-master",
+    "version": "1.0.0",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
-        "psr-0": {
-            "Yandex": "vendor/allure-framework/allure-codeception/src/"
-        },
         "psr-4": {
-            "Magento\\FunctionalTestingFramework\\": [
-                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
-            ],
-            "Magento\\FunctionalTest\\": [
-                "tests/functional/Magento/FunctionalTest",
-                "generated/Magento/FunctionalTest"
-            ]
+            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
         }
     },
     "extra": {
         "map": [
             [
                 "*",
-                "tests/functional/Magento/FunctionalTest/Authorization"
+                "dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Authorization"
             ]
         ]
     }
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Authorizenet/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Authorizenet/README.md
index 86a31896a22..c3a550699f6 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Authorizenet/README.md
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Authorizenet/README.md
@@ -1,3 +1,3 @@
-# Magento 2 Acceptance Tests
+# Magento 2 Functional Tests
 
-The Acceptance Tests Module for **Magento_Authorizenet** Module.
+The Functional Tests Module for **Magento_Authorizenet** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Authorizenet/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Authorizenet/composer.json
index 898a84016c6..69055e95ddd 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Authorizenet/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Authorizenet/composer.json
@@ -1,55 +1,43 @@
 {
     "name": "magento/magento2-functional-test-module-authorizenet",
-    "description": "Magento 2 Acceptance Test Module Authorizenet",
-    "repositories": [
-        {
-            "type" : "composer",
-            "url" : "https://repo.magento.com/"
-        }
-    ],
+    "description": "Magento 2 Functional Test Module Authorizenet",
+    "config": {
+        "sort-packages": true
+    },
     "require": {
-        "php": "~7.0",
-        "codeception/codeception": "2.2|2.3",
-        "allure-framework/allure-codeception": "dev-master",
+        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
+        "codeception/codeception": "~2.3.4",
         "consolidation/robo": "^1.0.0",
         "henrikbjorn/lurker": "^1.2",
-        "vlucas/phpdotenv": "~2.4",
-        "magento/magento2-functional-testing-framework": "dev-develop"
+        "magento/magento2-functional-testing-framework": "1.0.0",
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
+        "vlucas/phpdotenv": "~2.4"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-backend": "dev-master",
-        "magento/magento2-functional-test-module-sales": "dev-master",
-        "magento/magento2-functional-test-module-store": "dev-master",
-        "magento/magento2-functional-test-module-quote": "dev-master",
-        "magento/magento2-functional-test-module-checkout": "dev-master",
-        "magento/magento2-functional-test-module-payment": "dev-master",
-        "magento/magento2-functional-test-module-catalog": "dev-master"
+        "magento/magento2-functional-test-module-backend": "1.0.0",
+        "magento/magento2-functional-test-module-catalog": "1.0.0",
+        "magento/magento2-functional-test-module-checkout": "1.0.0",
+        "magento/magento2-functional-test-module-payment": "1.0.0",
+        "magento/magento2-functional-test-module-quote": "1.0.0",
+        "magento/magento2-functional-test-module-sales": "1.0.0",
+        "magento/magento2-functional-test-module-store": "1.0.0"
     },
     "type": "magento2-test-module",
-    "version": "dev-master",
+    "version": "1.0.0",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
-        "psr-0": {
-            "Yandex": "vendor/allure-framework/allure-codeception/src/"
-        },
         "psr-4": {
-            "Magento\\FunctionalTestingFramework\\": [
-                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
-            ],
-            "Magento\\FunctionalTest\\": [
-                "tests/functional/Magento/FunctionalTest",
-                "generated/Magento/FunctionalTest"
-            ]
+            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
         }
     },
     "extra": {
         "map": [
             [
                 "*",
-                "tests/functional/Magento/FunctionalTest/Authorizenet"
+                "dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Authorizenet"
             ]
         ]
     }
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/README.md
index 4cbe742ea6b..0a7d14223c0 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/README.md
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/README.md
@@ -1,3 +1,3 @@
-# Magento 2 Acceptance Tests
+# Magento 2 Functional Tests
 
-The Acceptance Tests Module for **Magento_Backend** Module.
+The Functional Tests Module for **Magento_Backend** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/composer.json
index 6aa559de5c3..771aeb4af1b 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/composer.json
@@ -1,63 +1,52 @@
 {
     "name": "magento/magento2-functional-test-module-backend",
-    "description": "Magento 2 Acceptance Test Module Backend",
-    "repositories": [
-        {
-            "type" : "composer",
-            "url" : "https://repo.magento.com/"
-        }
-    ],
+    "description": "Magento 2 Functional Test Module Backend",
+    "config": {
+        "sort-packages": true
+    },
     "require": {
-        "php": "~7.0",
-        "codeception/codeception": "2.2|2.3",
-        "allure-framework/allure-codeception": "dev-master",
+        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
+        "codeception/codeception": "~2.3.4",
         "consolidation/robo": "^1.0.0",
         "henrikbjorn/lurker": "^1.2",
-        "vlucas/phpdotenv": "~2.4",
-        "magento/magento2-functional-testing-framework": "dev-develop"
+        "magento/magento2-functional-testing-framework": "1.0.0",
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
+        "vlucas/phpdotenv": "~2.4"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-store": "dev-master",
-        "magento/magento2-functional-test-module-directory": "dev-master",
-        "magento/magento2-functional-test-module-developer": "dev-master",
-        "magento/magento2-functional-test-module-eav": "dev-master",
-        "magento/magento2-functional-test-module-reports": "dev-master",
-        "magento/magento2-functional-test-module-sales": "dev-master",
-        "magento/magento2-functional-test-module-quote": "dev-master",
-        "magento/magento2-functional-test-module-catalog": "dev-master",
-        "magento/magento2-functional-test-module-user": "dev-master",
-        "magento/magento2-functional-test-module-security": "dev-master",
-        "magento/magento2-functional-test-module-backup": "dev-master",
-        "magento/magento2-functional-test-module-customer": "dev-master",
-        "magento/magento2-functional-test-module-translation": "dev-master",
-        "magento/magento2-functional-test-module-config": "dev-master",
-        "magento/magento2-functional-test-module-require-js": "dev-master"
+        "magento/magento2-functional-test-module-backup": "1.0.0",
+        "magento/magento2-functional-test-module-catalog": "1.0.0",
+        "magento/magento2-functional-test-module-config": "1.0.0",
+        "magento/magento2-functional-test-module-customer": "1.0.0",
+        "magento/magento2-functional-test-module-developer": "1.0.0",
+        "magento/magento2-functional-test-module-directory": "1.0.0",
+        "magento/magento2-functional-test-module-eav": "1.0.0",
+        "magento/magento2-functional-test-module-quote": "1.0.0",
+        "magento/magento2-functional-test-module-reports": "1.0.0",
+        "magento/magento2-functional-test-module-require-js": "1.0.0",
+        "magento/magento2-functional-test-module-sales": "1.0.0",
+        "magento/magento2-functional-test-module-security": "1.0.0",
+        "magento/magento2-functional-test-module-store": "1.0.0",
+        "magento/magento2-functional-test-module-translation": "1.0.0",
+        "magento/magento2-functional-test-module-ui": "1.0.0",
+        "magento/magento2-functional-test-module-user": "1.0.0"
     },
     "type": "magento2-test-module",
-    "version": "dev-master",
+    "version": "1.0.0",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
-        "psr-0": {
-            "Yandex": "vendor/allure-framework/allure-codeception/src/"
-        },
         "psr-4": {
-            "Magento\\FunctionalTestingFramework\\": [
-                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
-            ],
-            "Magento\\FunctionalTest\\": [
-                "tests/functional/Magento/FunctionalTest",
-                "generated/Magento/FunctionalTest"
-            ]
+            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
         }
     },
     "extra": {
         "map": [
             [
                 "*",
-                "tests/functional/Magento/FunctionalTest/Backend"
+                "dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend"
             ]
         ]
     }
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backup/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backup/README.md
index 962fdffd88d..dc2a3ab06f9 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backup/README.md
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backup/README.md
@@ -1,3 +1,3 @@
-# Magento 2 Acceptance Tests
+# Magento 2 Functional Tests
 
-The Acceptance Tests Module for **Magento_Backup** Module.
+The Functional Tests Module for **Magento_Backup** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backup/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backup/composer.json
index 95dc878ef34..1e1e3e7901e 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backup/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backup/composer.json
@@ -1,50 +1,39 @@
 {
     "name": "magento/magento2-functional-test-module-backup",
-    "description": "Magento 2 Acceptance Test Module Backup",
-    "repositories": [
-        {
-            "type" : "composer",
-            "url" : "https://repo.magento.com/"
-        }
-    ],
+    "description": "Magento 2 Functional Test Module Backup",
+    "config": {
+        "sort-packages": true
+    },
     "require": {
-        "php": "~7.0",
-        "codeception/codeception": "2.2|2.3",
-        "allure-framework/allure-codeception": "dev-master",
+        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
+        "codeception/codeception": "~2.3.4",
         "consolidation/robo": "^1.0.0",
         "henrikbjorn/lurker": "^1.2",
-        "vlucas/phpdotenv": "~2.4",
-        "magento/magento2-functional-testing-framework": "dev-develop"
+        "magento/magento2-functional-testing-framework": "1.0.0",
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
+        "vlucas/phpdotenv": "~2.4"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-store": "dev-master",
-        "magento/magento2-functional-test-module-backup": "dev-master"
+        "magento/magento2-functional-test-module-backend": "1.0.0",
+        "magento/magento2-functional-test-module-cron": "1.0.0",
+        "magento/magento2-functional-test-module-store": "1.0.0"
     },
     "type": "magento2-test-module",
-    "version": "dev-master",
+    "version": "1.0.0",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
-        "psr-0": {
-            "Yandex": "vendor/allure-framework/allure-codeception/src/"
-        },
         "psr-4": {
-            "Magento\\FunctionalTestingFramework\\": [
-                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
-            ],
-            "Magento\\FunctionalTest\\": [
-                "tests/functional/Magento/FunctionalTest",
-                "generated/Magento/FunctionalTest"
-            ]
+            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
         }
     },
     "extra": {
         "map": [
             [
                 "*",
-                "tests/functional/Magento/FunctionalTest/Backup"
+                "dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backup"
             ]
         ]
     }
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Braintree/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Braintree/README.md
index a4217e846b5..b0b637c9d96 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Braintree/README.md
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Braintree/README.md
@@ -1,3 +1,3 @@
-# Magento 2 Acceptance Tests
+# Magento 2 Functional Tests
 
-The Acceptance Tests Module for **Magento_Braintree** Module.
+The Functional Tests Module for **Magento_Braintree** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Braintree/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Braintree/composer.json
index c9eeab4fdb5..b781cadf8bb 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Braintree/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Braintree/composer.json
@@ -1,60 +1,49 @@
 {
     "name": "magento/magento2-functional-test-module-braintree",
-    "description": "Magento 2 Acceptance Test Module Braintree",
-    "repositories": [
-        {
-            "type" : "composer",
-            "url" : "https://repo.magento.com/"
-        }
-    ],
+    "description": "Magento 2 Functional Test Module Braintree",
+    "config": {
+        "sort-packages": true
+    },
     "require": {
-        "php": "~7.0",
-        "codeception/codeception": "2.2|2.3",
-        "allure-framework/allure-codeception": "dev-master",
+        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
+        "codeception/codeception": "~2.3.4",
         "consolidation/robo": "^1.0.0",
         "henrikbjorn/lurker": "^1.2",
-        "vlucas/phpdotenv": "~2.4",
-        "magento/magento2-functional-testing-framework": "dev-develop"
+        "magento/magento2-functional-testing-framework": "1.0.0",
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
+        "vlucas/phpdotenv": "~2.4"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-config": "dev-master",
-        "magento/magento2-functional-test-module-directory": "dev-master",
-        "magento/magento2-functional-test-module-payment": "dev-master",
-        "magento/magento2-functional-test-module-checkout": "dev-master",
-        "magento/magento2-functional-test-module-sales": "dev-master",
-        "magento/magento2-functional-test-module-backend": "dev-master",
-        "magento/magento2-functional-test-module-vault": "dev-master",
-        "magento/magento2-functional-test-module-customer": "dev-master",
-        "magento/magento2-functional-test-module-catalog": "dev-master",
-        "magento/magento2-functional-test-module-quote": "dev-master",
-        "magento/magento2-functional-test-module-paypal": "dev-master",
-        "magento/magento2-functional-test-module-ui": "dev-master"
+        "magento/magento2-functional-test-module-catalog": "1.0.0",
+        "magento/magento2-functional-test-module-backend": "1.0.0",
+        "magento/magento2-functional-test-module-checkout": "1.0.0",
+        "magento/magento2-functional-test-module-config": "1.0.0",
+        "magento/magento2-functional-test-module-customer": "1.0.0",
+        "magento/magento2-functional-test-module-directory": "1.0.0",
+        "magento/magento2-functional-test-module-instant-purchase": "1.0.0",
+        "magento/magento2-functional-test-module-payment": "1.0.0",
+        "magento/magento2-functional-test-module-paypal": "1.0.0",
+        "magento/magento2-functional-test-module-quote": "1.0.0",
+        "magento/magento2-functional-test-module-sales": "1.0.0",
+        "magento/magento2-functional-test-module-ui": "1.0.0",
+        "magento/magento2-functional-test-module-vault": "1.0.0"
     },
     "type": "magento2-test-module",
-    "version": "dev-master",
+    "version": "1.0.0",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
-        "psr-0": {
-            "Yandex": "vendor/allure-framework/allure-codeception/src/"
-        },
         "psr-4": {
-            "Magento\\FunctionalTestingFramework\\": [
-                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
-            ],
-            "Magento\\FunctionalTest\\": [
-                "tests/functional/Magento/FunctionalTest",
-                "generated/Magento/FunctionalTest"
-            ]
+            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
         }
     },
     "extra": {
         "map": [
             [
                 "*",
-                "tests/functional/Magento/FunctionalTest/Braintree"
+                "dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Braintree"
             ]
         ]
     }
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Bundle/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Bundle/README.md
index 95794907f2c..9579aec287f 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Bundle/README.md
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Bundle/README.md
@@ -1,3 +1,3 @@
-# Magento 2 Acceptance Tests
+# Magento 2 Functional Tests
 
-The Acceptance Tests Module for **Magento_Bundle** Module.
+The Functional Tests Module for **Magento_Bundle** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Bundle/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Bundle/composer.json
index 649a2f29700..4613c5df9fe 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Bundle/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Bundle/composer.json
@@ -1,63 +1,51 @@
 {
     "name": "magento/magento2-functional-test-module-bundle",
-    "description": "Magento 2 Acceptance Test Module Bundle",
-    "repositories": [
-        {
-            "type" : "composer",
-            "url" : "https://repo.magento.com/"
-        }
-    ],
+    "description": "Magento 2 Functional Test Module Bundle",
+    "config": {
+        "sort-packages": true
+    },
     "require": {
-        "php": "~7.0",
-        "codeception/codeception": "2.2|2.3",
-        "allure-framework/allure-codeception": "dev-master",
+        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
+        "codeception/codeception": "~2.3.4",
         "consolidation/robo": "^1.0.0",
         "henrikbjorn/lurker": "^1.2",
-        "vlucas/phpdotenv": "~2.4",
-        "magento/magento2-functional-testing-framework": "dev-develop"
+        "magento/magento2-functional-testing-framework": "1.0.0",
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
+        "vlucas/phpdotenv": "~2.4"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-store": "dev-master",
-        "magento/magento2-functional-test-module-catalog": "dev-master",
-        "magento/magento2-functional-test-module-tax": "dev-master",
-        "magento/magento2-functional-test-module-backend": "dev-master",
-        "magento/magento2-functional-test-module-sales": "dev-master",
-        "magento/magento2-functional-test-module-checkout": "dev-master",
-        "magento/magento2-functional-test-module-catalog-inventory": "dev-master",
-        "magento/magento2-functional-test-module-customer": "dev-master",
-        "magento/magento2-functional-test-module-catalog-rule": "dev-master",
-        "magento/magento2-functional-test-module-eav": "dev-master",
-        "magento/magento2-functional-test-module-config": "dev-master",
-        "magento/magento2-functional-test-module-gift-message": "dev-master",
-        "magento/magento2-functional-test-module-quote": "dev-master",
-        "magento/magento2-functional-test-module-media-storage": "dev-master",
-        "magento/magento2-functional-test-module-ui": "dev-master"
+        "magento/magento2-functional-test-module-backend": "1.0.0",
+        "magento/magento2-functional-test-module-catalog": "1.0.0",
+        "magento/magento2-functional-test-module-catalog-inventory": "1.0.0",
+        "magento/magento2-functional-test-module-catalog-rule": "1.0.0",
+        "magento/magento2-functional-test-module-checkout": "1.0.0",
+        "magento/magento2-functional-test-module-config": "1.0.0",
+        "magento/magento2-functional-test-module-customer": "1.0.0",
+        "magento/magento2-functional-test-module-eav": "1.0.0",
+        "magento/magento2-functional-test-module-gift-message": "1.0.0",
+        "magento/magento2-functional-test-module-media-storage": "1.0.0",
+        "magento/magento2-functional-test-module-quote": "1.0.0",
+        "magento/magento2-functional-test-module-sales": "1.0.0",
+        "magento/magento2-functional-test-module-store": "1.0.0",
+        "magento/magento2-functional-test-module-tax": "1.0.0",
+        "magento/magento2-functional-test-module-ui": "1.0.0"
     },
     "type": "magento2-test-module",
-    "version": "dev-master",
+    "version": "1.0.0",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
-        "psr-0": {
-            "Yandex": "vendor/allure-framework/allure-codeception/src/"
-        },
         "psr-4": {
-            "Magento\\FunctionalTestingFramework\\": [
-                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
-            ],
-            "Magento\\FunctionalTest\\": [
-                "tests/functional/Magento/FunctionalTest",
-                "generated/Magento/FunctionalTest"
-            ]
+            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
         }
     },
     "extra": {
         "map": [
             [
                 "*",
-                "tests/functional/Magento/FunctionalTest/Bundle"
+                "dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Bundle"
             ]
         ]
     }
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/BundleImportExport/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/BundleImportExport/README.md
index 83453308c0c..dc155d12f30 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/BundleImportExport/README.md
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/BundleImportExport/README.md
@@ -1,3 +1,3 @@
-# Magento 2 Acceptance Tests
+# Magento 2 Functional Tests
 
-The Acceptance Tests Module for **Magento_BundleImportExport** Module.
+The Functional Tests Module for **Magento_BundleImportExport** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/BundleImportExport/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/BundleImportExport/composer.json
index 2abf6a22a8e..86eeb63a91b 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/BundleImportExport/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/BundleImportExport/composer.json
@@ -1,53 +1,41 @@
 {
     "name": "magento/magento2-functional-test-module-bundle-import-export",
-    "description": "Magento 2 Acceptance Test Module Bundle Import Export",
-    "repositories": [
-        {
-            "type" : "composer",
-            "url" : "https://repo.magento.com/"
-        }
-    ],
+    "description": "Magento 2 Functional Test Module Bundle Import Export",
+    "config": {
+        "sort-packages": true
+    },
     "require": {
-        "php": "~7.0",
-        "codeception/codeception": "2.2|2.3",
-        "allure-framework/allure-codeception": "dev-master",
+        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
+        "codeception/codeception": "~2.3.4",
         "consolidation/robo": "^1.0.0",
         "henrikbjorn/lurker": "^1.2",
-        "vlucas/phpdotenv": "~2.4",
-        "magento/magento2-functional-testing-framework": "dev-develop"
+        "magento/magento2-functional-testing-framework": "1.0.0",
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
+        "vlucas/phpdotenv": "~2.4"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-catalog": "dev-master",
-        "magento/magento2-functional-test-module-import-export": "dev-master",
-        "magento/magento2-functional-test-module-catalog-import-export": "dev-master",
-        "magento/magento2-functional-test-module-bundle": "dev-master",
-        "magento/magento2-functional-test-module-eav": "dev-master"
+        "magento/magento2-functional-test-module-bundle": "1.0.0",
+        "magento/magento2-functional-test-module-catalog": "1.0.0",
+        "magento/magento2-functional-test-module-catalog-import-export": "1.0.0",
+        "magento/magento2-functional-test-module-eav": "1.0.0",
+        "magento/magento2-functional-test-module-import-export": "1.0.0"
     },
     "type": "magento2-test-module",
-    "version": "dev-master",
+    "version": "1.0.0",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
-        "psr-0": {
-            "Yandex": "vendor/allure-framework/allure-codeception/src/"
-        },
         "psr-4": {
-            "Magento\\FunctionalTestingFramework\\": [
-                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
-            ],
-            "Magento\\FunctionalTest\\": [
-                "tests/functional/Magento/FunctionalTest",
-                "generated/Magento/FunctionalTest"
-            ]
+            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
         }
     },
     "extra": {
         "map": [
             [
                 "*",
-                "tests/functional/Magento/FunctionalTest/BundleImportExport"
+                "dev/tests/acceptance/tests/functional/Magento/FunctionalTest/BundleImportExport"
             ]
         ]
     }
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CacheInvalidate/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CacheInvalidate/README.md
index 34d8ae9c366..47571bdb7f2 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CacheInvalidate/README.md
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CacheInvalidate/README.md
@@ -1,3 +1,3 @@
-# Magento 2 Acceptance Tests
+# Magento 2 Functional Tests
 
-The Acceptance Tests Module for **Magento_CacheInvalidate** Module.
+The Functional Tests Module for **Magento_CacheInvalidate** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CacheInvalidate/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CacheInvalidate/composer.json
index 9ac9043f1b1..ad7a1575265 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CacheInvalidate/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CacheInvalidate/composer.json
@@ -1,49 +1,37 @@
 {
     "name": "magento/magento2-functional-test-module-cache-invalidate",
-    "description": "Magento 2 Acceptance Test Module Cache Invalidate",
-    "repositories": [
-        {
-            "type" : "composer",
-            "url" : "https://repo.magento.com/"
-        }
-    ],
+    "description": "Magento 2 Functional Test Module Cache Invalidate",
+    "config": {
+        "sort-packages": true
+    },
     "require": {
-        "php": "~7.0",
-        "codeception/codeception": "2.2|2.3",
-        "allure-framework/allure-codeception": "dev-master",
+        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
+        "codeception/codeception": "~2.3.4",
         "consolidation/robo": "^1.0.0",
         "henrikbjorn/lurker": "^1.2",
-        "vlucas/phpdotenv": "~2.4",
-        "magento/magento2-functional-testing-framework": "dev-develop"
+        "magento/magento2-functional-testing-framework": "1.0.0",
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
+        "vlucas/phpdotenv": "~2.4"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-page-cache": "dev-master"
+        "magento/magento2-functional-test-module-page-cache": "1.0.0"
     },
     "type": "magento2-test-module",
-    "version": "dev-master",
+    "version": "1.0.0",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
-        "psr-0": {
-            "Yandex": "vendor/allure-framework/allure-codeception/src/"
-        },
         "psr-4": {
-            "Magento\\FunctionalTestingFramework\\": [
-                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
-            ],
-            "Magento\\FunctionalTest\\": [
-                "tests/functional/Magento/FunctionalTest",
-                "generated/Magento/FunctionalTest"
-            ]
+            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
         }
     },
     "extra": {
         "map": [
             [
                 "*",
-                "tests/functional/Magento/FunctionalTest/CacheInvalidate"
+                "dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CacheInvalidate"
             ]
         ]
     }
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Captcha/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Captcha/README.md
index 3eee7b92bd3..f0d35613be7 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Captcha/README.md
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Captcha/README.md
@@ -1,3 +1,3 @@
-# Magento 2 Acceptance Tests
+# Magento 2 Functional Tests
 
-The Acceptance Tests Module for **Magento_Captcha** Module.
+The Functional Tests Module for **Magento_Captcha** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Captcha/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Captcha/composer.json
index 60fff5eb2fe..7b68ff5beac 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Captcha/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Captcha/composer.json
@@ -1,52 +1,40 @@
 {
     "name": "magento/magento2-functional-test-module-captcha",
-    "description": "Magento 2 Acceptance Test Module Captcha",
-    "repositories": [
-        {
-            "type" : "composer",
-            "url" : "https://repo.magento.com/"
-        }
-    ],
+    "description": "Magento 2 Functional Test Module Captcha",
+    "config": {
+        "sort-packages": true
+    },
     "require": {
-        "php": "~7.0",
-        "codeception/codeception": "2.2|2.3",
-        "allure-framework/allure-codeception": "dev-master",
+        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
+        "codeception/codeception": "~2.3.4",
         "consolidation/robo": "^1.0.0",
         "henrikbjorn/lurker": "^1.2",
-        "vlucas/phpdotenv": "~2.4",
-        "magento/magento2-functional-testing-framework": "dev-develop"
+        "magento/magento2-functional-testing-framework": "1.0.0",
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
+        "vlucas/phpdotenv": "~2.4"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-store": "dev-master",
-        "magento/magento2-functional-test-module-customer": "dev-master",
-        "magento/magento2-functional-test-module-checkout": "dev-master",
-        "magento/magento2-functional-test-module-backend": "dev-master"
+        "magento/magento2-functional-test-module-backend": "1.0.0",
+        "magento/magento2-functional-test-module-checkout": "1.0.0",
+        "magento/magento2-functional-test-module-customer": "1.0.0",
+        "magento/magento2-functional-test-module-store": "1.0.0"
     },
     "type": "magento2-test-module",
-    "version": "dev-master",
+    "version": "1.0.0",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
-        "psr-0": {
-            "Yandex": "vendor/allure-framework/allure-codeception/src/"
-        },
         "psr-4": {
-            "Magento\\FunctionalTestingFramework\\": [
-                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
-            ],
-            "Magento\\FunctionalTest\\": [
-                "tests/functional/Magento/FunctionalTest",
-                "generated/Magento/FunctionalTest"
-            ]
+            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
         }
     },
     "extra": {
         "map": [
             [
                 "*",
-                "tests/functional/Magento/FunctionalTest/Captcha"
+                "dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Captcha"
             ]
         ]
     }
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/README.md
index 308f84b867a..41bb2b0d604 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/README.md
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/README.md
@@ -1,3 +1,3 @@
-# Magento 2 Acceptance Tests
+# Magento 2 Functional Tests
 
-The Acceptance Tests Module for **Magento_Catalog** Module.
+The Functional Tests Module for **Magento_Catalog** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/composer.json
index 53c1bafbe43..06739996a4d 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/composer.json
@@ -1,71 +1,59 @@
 {
     "name": "magento/magento2-functional-test-module-catalog",
-    "description": "Magento 2 Acceptance Test Module Catalog",
-    "repositories": [
-        {
-            "type" : "composer",
-            "url" : "https://repo.magento.com/"
-        }
-    ],
+    "description": "Magento 2 Functional Test Module Catalog",
+    "config": {
+        "sort-packages": true
+    },
     "require": {
-        "php": "~7.0",
-        "codeception/codeception": "2.2|2.3",
-        "allure-framework/allure-codeception": "dev-master",
+        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
+        "codeception/codeception": "~2.3.4",
         "consolidation/robo": "^1.0.0",
         "henrikbjorn/lurker": "^1.2",
-        "vlucas/phpdotenv": "~2.4",
-        "magento/magento2-functional-testing-framework": "dev-develop"
+        "magento/magento2-functional-testing-framework": "1.0.0",
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
+        "vlucas/phpdotenv": "~2.4"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-store": "dev-master",
-        "magento/magento2-functional-test-module-eav": "dev-master",
-        "magento/magento2-functional-test-module-cms": "dev-master",
-        "magento/magento2-functional-test-module-indexer": "dev-master",
-        "magento/magento2-functional-test-module-customer": "dev-master",
-        "magento/magento2-functional-test-module-theme": "dev-master",
-        "magento/magento2-functional-test-module-checkout": "dev-master",
-        "magento/magento2-functional-test-module-backend": "dev-master",
-        "magento/magento2-functional-test-module-widget": "dev-master",
-        "magento/magento2-functional-test-module-wishlist": "dev-master",
-        "magento/magento2-functional-test-module-tax": "dev-master",
-        "magento/magento2-functional-test-module-msrp": "dev-master",
-        "magento/magento2-functional-test-module-catalog-inventory": "dev-master",
-        "magento/magento2-functional-test-module-catalog-rule": "dev-master",
-        "magento/magento2-functional-test-module-product-alert": "dev-master",
-        "magento/magento2-functional-test-module-url-rewrite": "dev-master",
-        "magento/magento2-functional-test-module-catalog-url-rewrite": "dev-master",
-        "magento/magento2-functional-test-module-page-cache": "dev-master",
-        "magento/magento2-functional-test-module-config": "dev-master",
-        "magento/magento2-functional-test-module-media-storage": "dev-master",
-        "magento/magento2-functional-test-module-ui": "dev-master",
-        "magento/magento2-functional-test-module-cookie": "dev-master",
-        "magento/magento2-functional-test-module-sales": "dev-master"
+        "magento/magento2-functional-test-module-backend": "1.0.0",
+        "magento/magento2-functional-test-module-catalog-inventory": "1.0.0",
+        "magento/magento2-functional-test-module-catalog-rule": "1.0.0",
+        "magento/magento2-functional-test-module-catalog-url-rewrite": "1.0.0",
+        "magento/magento2-functional-test-module-checkout": "1.0.0",
+        "magento/magento2-functional-test-module-cms": "1.0.0",
+        "magento/magento2-functional-test-module-config": "1.0.0",
+        "magento/magento2-functional-test-module-customer": "1.0.0",
+        "magento/magento2-functional-test-module-directory": "1.0.0",
+        "magento/magento2-functional-test-module-eav": "1.0.0",
+        "magento/magento2-functional-test-module-indexer": "1.0.0",
+        "magento/magento2-functional-test-module-media-storage": "1.0.0",
+        "magento/magento2-functional-test-module-msrp": "1.0.0",
+        "magento/magento2-functional-test-module-page-cache": "1.0.0",
+        "magento/magento2-functional-test-module-product-alert": "1.0.0",
+        "magento/magento2-functional-test-module-quote": "1.0.0",
+        "magento/magento2-functional-test-module-store": "1.0.0",
+        "magento/magento2-functional-test-module-tax": "1.0.0",
+        "magento/magento2-functional-test-module-theme": "1.0.0",
+        "magento/magento2-functional-test-module-ui": "1.0.0",
+        "magento/magento2-functional-test-module-url-rewrite": "1.0.0",
+        "magento/magento2-functional-test-module-widget": "1.0.0",
+        "magento/magento2-functional-test-module-wishlist": "1.0.0"
     },
     "type": "magento2-test-module",
-    "version": "dev-master",
+    "version": "1.0.0",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
-        "psr-0": {
-            "Yandex": "vendor/allure-framework/allure-codeception/src/"
-        },
         "psr-4": {
-            "Magento\\FunctionalTestingFramework\\": [
-                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
-            ],
-            "Magento\\FunctionalTest\\": [
-                "tests/functional/Magento/FunctionalTest",
-                "generated/Magento/FunctionalTest"
-            ]
+            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
         }
     },
     "extra": {
         "map": [
             [
                 "*",
-                "tests/functional/Magento/FunctionalTest/Catalog"
+                "dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog"
             ]
         ]
     }
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogImportExport/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogImportExport/composer.json
index 81ee5ddcfda..dd230d8e4d9 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogImportExport/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogImportExport/composer.json
@@ -1,57 +1,45 @@
 {
     "name": "magento/magento2-functional-test-module-catalog-import-export",
-    "description": "Magento 2 Acceptance Test Module Catalog Import Export",
-    "repositories": [
-        {
-            "type" : "composer",
-            "url" : "https://repo.magento.com/"
-        }
-    ],
+    "description": "Magento 2 Functional Test Module Catalog Import Export",
+    "config": {
+        "sort-packages": true
+    },
     "require": {
-        "php": "~7.0",
-        "codeception/codeception": "2.2|2.3",
-        "allure-framework/allure-codeception": "dev-master",
+        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
+        "codeception/codeception": "~2.3.4",
         "consolidation/robo": "^1.0.0",
         "henrikbjorn/lurker": "^1.2",
-        "vlucas/phpdotenv": "~2.4",
-        "magento/magento2-functional-testing-framework": "dev-develop"
+        "magento/magento2-functional-testing-framework": "1.0.0",
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
+        "vlucas/phpdotenv": "~2.4"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-catalog": "dev-master",
-        "magento/magento2-functional-test-module-catalog-url-rewrite": "dev-master",
-        "magento/magento2-functional-test-module-eav": "dev-master",
-        "magento/magento2-functional-test-module-import-export": "dev-master",
-        "magento/magento2-functional-test-module-store": "dev-master",
-        "magento/magento2-functional-test-module-tax": "dev-master",
-        "magento/magento2-functional-test-module-catalog-inventory": "dev-master",
-        "magento/magento2-functional-test-module-media-storage": "dev-master",
-        "magento/magento2-functional-test-module-customer": "dev-master"
+        "magento/magento2-functional-test-module-catalog": "1.0.0",
+        "magento/magento2-functional-test-module-catalog-inventory": "1.0.0",
+        "magento/magento2-functional-test-module-catalog-url-rewrite": "1.0.0",
+        "magento/magento2-functional-test-module-customer": "1.0.0",
+        "magento/magento2-functional-test-module-eav": "1.0.0",
+        "magento/magento2-functional-test-module-import-export": "1.0.0",
+        "magento/magento2-functional-test-module-media-storage": "1.0.0",
+        "magento/magento2-functional-test-module-store": "1.0.0",
+        "magento/magento2-functional-test-module-tax": "1.0.0"
     },
     "type": "magento2-test-module",
-    "version": "dev-master",
+    "version": "1.0.0",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
-        "psr-0": {
-            "Yandex": "vendor/allure-framework/allure-codeception/src/"
-        },
         "psr-4": {
-            "Magento\\FunctionalTestingFramework\\": [
-                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
-            ],
-            "Magento\\FunctionalTest\\": [
-                "tests/functional/Magento/FunctionalTest",
-                "generated/Magento/FunctionalTest"
-            ]
+            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
         }
     },
     "extra": {
         "map": [
             [
                 "*",
-                "tests/functional/Magento/FunctionalTest/CatalogImportExport"
+                "dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogImportExport"
             ]
         ]
     }
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogInventory/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogInventory/README.md
index 03f581dfd23..512a5f319fe 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogInventory/README.md
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogInventory/README.md
@@ -1,3 +1,3 @@
-# Magento 2 Acceptance Tests
+# Magento 2 Functional Tests
 
-The Acceptance Tests Module for **Magento_CatalogInventory** Module.
+The Functional Tests Module for **Magento_CatalogInventory** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogInventory/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogInventory/composer.json
index de845f8f5a8..aec0f3f3c80 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogInventory/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogInventory/composer.json
@@ -1,55 +1,43 @@
 {
     "name": "magento/magento2-functional-test-module-catalog-inventory",
-    "description": "Magento 2 Acceptance Test Module Catalog Inventory",
-    "repositories": [
-        {
-            "type" : "composer",
-            "url" : "https://repo.magento.com/"
-        }
-    ],
+    "description": "Magento 2 Functional Test Module Catalog Inventory",
+    "config": {
+        "sort-packages": true
+    },
     "require": {
-        "php": "~7.0",
-        "codeception/codeception": "2.2|2.3",
-        "allure-framework/allure-codeception": "dev-master",
+        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
+        "codeception/codeception": "~2.3.4",
         "consolidation/robo": "^1.0.0",
         "henrikbjorn/lurker": "^1.2",
-        "vlucas/phpdotenv": "~2.4",
-        "magento/magento2-functional-testing-framework": "dev-develop"
+        "magento/magento2-functional-testing-framework": "1.0.0",
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
+        "vlucas/phpdotenv": "~2.4"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-config": "dev-master",
-        "magento/magento2-functional-test-module-store": "dev-master",
-        "magento/magento2-functional-test-module-catalog": "dev-master",
-        "magento/magento2-functional-test-module-customer": "dev-master",
-        "magento/magento2-functional-test-module-eav": "dev-master",
-        "magento/magento2-functional-test-module-quote": "dev-master",
-        "magento/magento2-functional-test-module-ui": "dev-master"
+        "magento/magento2-functional-test-module-catalog": "1.0.0",
+        "magento/magento2-functional-test-module-config": "1.0.0",
+        "magento/magento2-functional-test-module-customer": "1.0.0",
+        "magento/magento2-functional-test-module-eav": "1.0.0",
+        "magento/magento2-functional-test-module-quote": "1.0.0",
+        "magento/magento2-functional-test-module-store": "1.0.0",
+        "magento/magento2-functional-test-module-ui": "1.0.0"
     },
     "type": "magento2-test-module",
-    "version": "dev-master",
+    "version": "1.0.0",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
-        "psr-0": {
-            "Yandex": "vendor/allure-framework/allure-codeception/src/"
-        },
         "psr-4": {
-            "Magento\\FunctionalTestingFramework\\": [
-                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
-            ],
-            "Magento\\FunctionalTest\\": [
-                "tests/functional/Magento/FunctionalTest",
-                "generated/Magento/FunctionalTest"
-            ]
+            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
         }
     },
     "extra": {
         "map": [
             [
                 "*",
-                "tests/functional/Magento/FunctionalTest/CatalogInventory"
+                "dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogInventory"
             ]
         ]
     }
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogRule/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogRule/README.md
index 0e318cd24b0..5c67ac5b0ba 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogRule/README.md
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogRule/README.md
@@ -1,3 +1,3 @@
-# Magento 2 Acceptance Tests
+# Magento 2 Functional Tests
 
-The Acceptance Tests Module for **Magento_CatalogRule** Module.
+The Functional Tests Module for **Magento_CatalogRule** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogRule/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogRule/composer.json
index 3952c494c78..eaab47bcdc3 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogRule/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogRule/composer.json
@@ -1,55 +1,43 @@
 {
     "name": "magento/magento2-functional-test-module-catalog-rule",
-    "description": "Magento 2 Acceptance Test Module Catalog Rule",
-    "repositories": [
-        {
-            "type" : "composer",
-            "url" : "https://repo.magento.com/"
-        }
-    ],
+    "description": "Magento 2 Functional Test Module Catalog Rule",
+    "config": {
+        "sort-packages": true
+    },
     "require": {
-        "php": "~7.0",
-        "codeception/codeception": "2.2|2.3",
-        "allure-framework/allure-codeception": "dev-master",
+        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
+        "codeception/codeception": "~2.3.4",
         "consolidation/robo": "^1.0.0",
         "henrikbjorn/lurker": "^1.2",
-        "vlucas/phpdotenv": "~2.4",
-        "magento/magento2-functional-testing-framework": "dev-develop"
+        "magento/magento2-functional-testing-framework": "1.0.0",
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
+        "vlucas/phpdotenv": "~2.4"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-store": "dev-master",
-        "magento/magento2-functional-test-module-rule": "dev-master",
-        "magento/magento2-functional-test-module-catalog": "dev-master",
-        "magento/magento2-functional-test-module-customer": "dev-master",
-        "magento/magento2-functional-test-module-backend": "dev-master",
-        "magento/magento2-functional-test-module-eav": "dev-master",
-        "magento/magento2-functional-test-module-ui": "dev-master"
+        "magento/magento2-functional-test-module-backend": "1.0.0",
+        "magento/magento2-functional-test-module-catalog": "1.0.0",
+        "magento/magento2-functional-test-module-customer": "1.0.0",
+        "magento/magento2-functional-test-module-eav": "1.0.0",
+        "magento/magento2-functional-test-module-rule": "1.0.0",
+        "magento/magento2-functional-test-module-store": "1.0.0",
+        "magento/magento2-functional-test-module-ui": "1.0.0"
     },
     "type": "magento2-test-module",
-    "version": "dev-master",
+    "version": "1.0.0",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
-        "psr-0": {
-            "Yandex": "vendor/allure-framework/allure-codeception/src/"
-        },
         "psr-4": {
-            "Magento\\FunctionalTestingFramework\\": [
-                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
-            ],
-            "Magento\\FunctionalTest\\": [
-                "tests/functional/Magento/FunctionalTest",
-                "generated/Magento/FunctionalTest"
-            ]
+            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
         }
     },
     "extra": {
         "map": [
             [
                 "*",
-                "tests/functional/Magento/FunctionalTest/CatalogRule"
+                "dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogRule"
             ]
         ]
     }
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogRuleConfigurable/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogRuleConfigurable/README.md
index 81b8ad86799..ed2796d211d 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogRuleConfigurable/README.md
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogRuleConfigurable/README.md
@@ -1,3 +1,3 @@
-# Magento 2 Acceptance Tests
+# Magento 2 Functional Tests
 
-The Acceptance Tests Module for **Magento_CatalogRuleConfigurable** Module.
+The Functional Tests Module for **Magento_CatalogRuleConfigurable** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogRuleConfigurable/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogRuleConfigurable/composer.json
index a20e6b7a389..2ef15bd6868 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogRuleConfigurable/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogRuleConfigurable/composer.json
@@ -1,51 +1,39 @@
 {
     "name": "magento/magento2-functional-test-module-catalog-rule-configurable",
-    "description": "Magento 2 Acceptance Test Module Catalog Rule Configurable",
-    "repositories": [
-        {
-            "type" : "composer",
-            "url" : "https://repo.magento.com/"
-        }
-    ],
+    "description": "Magento 2 Functional Test Module Catalog Rule Configurable",
+    "config": {
+        "sort-packages": true
+    },
     "require": {
-        "php": "~7.0",
-        "codeception/codeception": "2.2|2.3",
-        "allure-framework/allure-codeception": "dev-master",
+        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
+        "codeception/codeception": "~2.3.4",
         "consolidation/robo": "^1.0.0",
         "henrikbjorn/lurker": "^1.2",
-        "vlucas/phpdotenv": "~2.4",
-        "magento/magento2-functional-testing-framework": "dev-develop"
+        "magento/magento2-functional-testing-framework": "1.0.0",
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
+        "vlucas/phpdotenv": "~2.4"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-configurable-product": "dev-master",
-        "magento/magento2-functional-test-module-catalog": "dev-master",
-        "magento/magento2-functional-test-module-catalog-rule": "dev-master"
+        "magento/magento2-functional-test-module-catalog": "1.0.0",
+        "magento/magento2-functional-test-module-catalog-rule": "1.0.0",
+        "magento/magento2-functional-test-module-configurable-product": "1.0.0"
     },
     "type": "magento2-test-module",
-    "version": "dev-master",
+    "version": "1.0.0",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
-        "psr-0": {
-            "Yandex": "vendor/allure-framework/allure-codeception/src/"
-        },
         "psr-4": {
-            "Magento\\FunctionalTestingFramework\\": [
-                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
-            ],
-            "Magento\\FunctionalTest\\": [
-                "tests/functional/Magento/FunctionalTest",
-                "generated/Magento/FunctionalTest"
-            ]
+            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
         }
     },
     "extra": {
         "map": [
             [
                 "*",
-                "tests/functional/Magento/FunctionalTest/CatalogRuleConfigurable"
+                "dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogRuleConfigurable"
             ]
         ]
     }
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogSearch/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogSearch/README.md
index 85ed3bcf15d..092e7bc1425 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogSearch/README.md
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogSearch/README.md
@@ -1,3 +1,3 @@
-# Magento 2 Acceptance Tests
+# Magento 2 Functional Tests
 
-The Acceptance Tests Module for **Magento_CatalogSearch** Module.
+The Functional Tests Module for **Magento_CatalogSearch** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogSearch/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogSearch/composer.json
index cb88f4139c8..36d21144894 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogSearch/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogSearch/composer.json
@@ -1,58 +1,46 @@
 {
     "name": "magento/magento2-functional-test-module-catalog-search",
-    "description": "Magento 2 Acceptance Test Module Catalog Search",
-    "repositories": [
-        {
-            "type" : "composer",
-            "url" : "https://repo.magento.com/"
-        }
-    ],
+    "description": "Magento 2 Functional Test Module Catalog Search",
+    "config": {
+        "sort-packages": true
+    },
     "require": {
-        "php": "~7.0",
-        "codeception/codeception": "2.2|2.3",
-        "allure-framework/allure-codeception": "dev-master",
+        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
+        "codeception/codeception": "~2.3.4",
         "consolidation/robo": "^1.0.0",
         "henrikbjorn/lurker": "^1.2",
-        "vlucas/phpdotenv": "~2.4",
-        "magento/magento2-functional-testing-framework": "dev-develop"
+        "magento/magento2-functional-testing-framework": "1.0.0",
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
+        "vlucas/phpdotenv": "~2.4"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-store": "dev-master",
-        "magento/magento2-functional-test-module-catalog": "dev-master",
-        "magento/magento2-functional-test-module-search": "dev-master",
-        "magento/magento2-functional-test-module-customer": "dev-master",
-        "magento/magento2-functional-test-module-directory": "dev-master",
-        "magento/magento2-functional-test-module-eav": "dev-master",
-        "magento/magento2-functional-test-module-backend": "dev-master",
-        "magento/magento2-functional-test-module-theme": "dev-master",
-        "magento/magento2-functional-test-module-ui": "dev-master",
-        "magento/magento2-functional-test-module-catalog-inventory": "dev-master"
+        "magento/magento2-functional-test-module-backend": "1.0.0",
+        "magento/magento2-functional-test-module-catalog": "1.0.0",
+        "magento/magento2-functional-test-module-catalog-inventory": "1.0.0",
+        "magento/magento2-functional-test-module-customer": "1.0.0",
+        "magento/magento2-functional-test-module-directory": "1.0.0",
+        "magento/magento2-functional-test-module-eav": "1.0.0",
+        "magento/magento2-functional-test-module-search": "1.0.0",
+        "magento/magento2-functional-test-module-store": "1.0.0",
+        "magento/magento2-functional-test-module-theme": "1.0.0",
+        "magento/magento2-functional-test-module-ui": "1.0.0"
     },
     "type": "magento2-test-module",
-    "version": "dev-master",
+    "version": "1.0.0",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
-        "psr-0": {
-            "Yandex": "vendor/allure-framework/allure-codeception/src/"
-        },
         "psr-4": {
-            "Magento\\FunctionalTestingFramework\\": [
-                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
-            ],
-            "Magento\\FunctionalTest\\": [
-                "tests/functional/Magento/FunctionalTest",
-                "generated/Magento/FunctionalTest"
-            ]
+            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
         }
     },
     "extra": {
         "map": [
             [
                 "*",
-                "tests/functional/Magento/FunctionalTest/CatalogSearch"
+                "dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogSearch"
             ]
         ]
     }
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogUrlRewrite/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogUrlRewrite/composer.json
index a563bff42a4..22f9c95f296 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogUrlRewrite/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogUrlRewrite/composer.json
@@ -1,56 +1,44 @@
 {
     "name": "magento/magento2-functional-test-module-catalog-url-rewrite",
-    "description": "Magento 2 Acceptance Test Module Catalog Url Rewrite",
-    "repositories": [
-        {
-            "type" : "composer",
-            "url" : "https://repo.magento.com/"
-        }
-    ],
+    "description": "Magento 2 Functional Test Module Catalog Url Rewrite",
+    "config": {
+        "sort-packages": true
+    },
     "require": {
-        "php": "~7.0",
-        "codeception/codeception": "2.2|2.3",
-        "allure-framework/allure-codeception": "dev-master",
+        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
+        "codeception/codeception": "~2.3.4",
         "consolidation/robo": "^1.0.0",
         "henrikbjorn/lurker": "^1.2",
-        "vlucas/phpdotenv": "~2.4",
-        "magento/magento2-functional-testing-framework": "dev-develop"
+        "magento/magento2-functional-testing-framework": "1.0.0",
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
+        "vlucas/phpdotenv": "~2.4"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-backend": "dev-master",
-        "magento/magento2-functional-test-module-catalog": "dev-master",
-        "magento/magento2-functional-test-module-catalog-import-export": "dev-master",
-        "magento/magento2-functional-test-module-eav": "dev-master",
-        "magento/magento2-functional-test-module-import-export": "dev-master",
-        "magento/magento2-functional-test-module-store": "dev-master",
-        "magento/magento2-functional-test-module-url-rewrite": "dev-master",
-        "magento/magento2-functional-test-module-ui": "dev-master"
+        "magento/magento2-functional-test-module-backend": "1.0.0",
+        "magento/magento2-functional-test-module-catalog": "1.0.0",
+        "magento/magento2-functional-test-module-catalog-import-export": "1.0.0",
+        "magento/magento2-functional-test-module-eav": "1.0.0",
+        "magento/magento2-functional-test-module-import-export": "1.0.0",
+        "magento/magento2-functional-test-module-store": "1.0.0",
+        "magento/magento2-functional-test-module-ui": "1.0.0",
+        "magento/magento2-functional-test-module-url-rewrite": "1.0.0"
     },
     "type": "magento2-test-module",
-    "version": "dev-master",
+    "version": "1.0.0",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
-        "psr-0": {
-            "Yandex": "vendor/allure-framework/allure-codeception/src/"
-        },
         "psr-4": {
-            "Magento\\FunctionalTestingFramework\\": [
-                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
-            ],
-            "Magento\\FunctionalTest\\": [
-                "tests/functional/Magento/FunctionalTest",
-                "generated/Magento/FunctionalTest"
-            ]
+            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
         }
     },
     "extra": {
         "map": [
             [
                 "*",
-                "tests/functional/Magento/FunctionalTest/CatalogUrlRewrite"
+                "dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogUrlRewrite"
             ]
         ]
     }
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogWidget/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogWidget/README.md
index b05124ac4bb..43aa796462c 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogWidget/README.md
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogWidget/README.md
@@ -1,3 +1,3 @@
-# Magento 2 Acceptance Tests
+# Magento 2 Functional Tests
 
-The Acceptance Tests Module for **Magento_CatalogWidget** Module.
+The Functional Tests Module for **Magento_CatalogWidget** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogWidget/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogWidget/composer.json
index 457c7c30dff..b5729ebc9dd 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogWidget/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogWidget/composer.json
@@ -1,56 +1,44 @@
 {
     "name": "magento/magento2-functional-test-module-catalog-widget",
-    "description": "Magento 2 Acceptance Test Module Catalog Widget",
-    "repositories": [
-        {
-            "type" : "composer",
-            "url" : "https://repo.magento.com/"
-        }
-    ],
+    "description": "Magento 2 Functional Test Module Catalog Widget",
+    "config": {
+        "sort-packages": true
+    },
     "require": {
-        "php": "~7.0",
-        "codeception/codeception": "2.2|2.3",
-        "allure-framework/allure-codeception": "dev-master",
+        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
+        "codeception/codeception": "~2.3.4",
         "consolidation/robo": "^1.0.0",
         "henrikbjorn/lurker": "^1.2",
-        "vlucas/phpdotenv": "~2.4",
-        "magento/magento2-functional-testing-framework": "dev-develop"
+        "magento/magento2-functional-testing-framework": "1.0.0",
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
+        "vlucas/phpdotenv": "~2.4"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-catalog": "dev-master",
-        "magento/magento2-functional-test-module-widget": "dev-master",
-        "magento/magento2-functional-test-module-backend": "dev-master",
-        "magento/magento2-functional-test-module-rule": "dev-master",
-        "magento/magento2-functional-test-module-eav": "dev-master",
-        "magento/magento2-functional-test-module-customer": "dev-master",
-        "magento/magento2-functional-test-module-store": "dev-master",
-        "magento/magento2-functional-test-module-wishlist": "dev-master"
+        "magento/magento2-functional-test-module-backend": "1.0.0",
+        "magento/magento2-functional-test-module-catalog": "1.0.0",
+        "magento/magento2-functional-test-module-customer": "1.0.0",
+        "magento/magento2-functional-test-module-eav": "1.0.0",
+        "magento/magento2-functional-test-module-rule": "1.0.0",
+        "magento/magento2-functional-test-module-store": "1.0.0",
+        "magento/magento2-functional-test-module-widget": "1.0.0",
+        "magento/magento2-functional-test-module-wishlist": "1.0.0"
     },
     "type": "magento2-test-module",
-    "version": "dev-master",
+    "version": "1.0.0",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
-        "psr-0": {
-            "Yandex": "vendor/allure-framework/allure-codeception/src/"
-        },
         "psr-4": {
-            "Magento\\FunctionalTestingFramework\\": [
-                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
-            ],
-            "Magento\\FunctionalTest\\": [
-                "tests/functional/Magento/FunctionalTest",
-                "generated/Magento/FunctionalTest"
-            ]
+            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
         }
     },
     "extra": {
         "map": [
             [
                 "*",
-                "tests/functional/Magento/FunctionalTest/CatalogWidget"
+                "dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogWidget"
             ]
         ]
     }
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/README.md
index b36a7cf6d5d..fc63b2f3948 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/README.md
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/README.md
@@ -1,3 +1,3 @@
-# Magento 2 Acceptance Tests
+# Magento 2 Functional Tests
 
-The Acceptance Tests Module for **Magento_Checkout** Module.
+The Functional Tests Module for **Magento_Checkout** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/composer.json
index aec57da084f..e8f08e57088 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/composer.json
@@ -1,66 +1,54 @@
 {
     "name": "magento/magento2-functional-test-module-checkout",
-    "description": "Magento 2 Acceptance Test Module Checkout",
-    "repositories": [
-        {
-            "type" : "composer",
-            "url" : "https://repo.magento.com/"
-        }
-    ],
+    "description": "Magento 2 Functional Test Module Checkout",
+    "config": {
+        "sort-packages": true
+    },
     "require": {
-        "php": "~7.0",
-        "codeception/codeception": "2.2|2.3",
-        "allure-framework/allure-codeception": "dev-master",
+        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
+        "codeception/codeception": "~2.3.4",
         "consolidation/robo": "^1.0.0",
         "henrikbjorn/lurker": "^1.2",
-        "vlucas/phpdotenv": "~2.4",
-        "magento/magento2-functional-testing-framework": "dev-develop",
-        "magento/magento2-functional-test-module-catalog": "dev-master",
-        "magento/magento2-functional-test-module-sales": "dev-master"
+        "magento/magento2-functional-testing-framework": "1.0.0",
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
+        "vlucas/phpdotenv": "~2.4"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-store": "dev-master",
-        "magento/magento2-functional-test-module-backend": "dev-master",
-        "magento/magento2-functional-test-module-catalog-inventory": "dev-master",
-        "magento/magento2-functional-test-module-config": "dev-master",
-        "magento/magento2-functional-test-module-customer": "dev-master",
-        "magento/magento2-functional-test-module-payment": "dev-master",
-        "magento/magento2-functional-test-module-shipping": "dev-master",
-        "magento/magento2-functional-test-module-tax": "dev-master",
-        "magento/magento2-functional-test-module-directory": "dev-master",
-        "magento/magento2-functional-test-module-eav": "dev-master",
-        "magento/magento2-functional-test-module-page-cache": "dev-master",
-        "magento/magento2-functional-test-module-sales-rule": "dev-master",
-        "magento/magento2-functional-test-module-theme": "dev-master",
-        "magento/magento2-functional-test-module-msrp": "dev-master",
-        "magento/magento2-functional-test-module-ui": "dev-master",
-        "magento/magento2-functional-test-module-quote": "dev-master"
+        "magento/magento2-functional-test-module-backend": "1.0.0",
+        "magento/magento2-functional-test-module-catalog": "1.0.0",
+        "magento/magento2-functional-test-module-catalog-inventory": "1.0.0",
+        "magento/magento2-functional-test-module-config": "1.0.0",
+        "magento/magento2-functional-test-module-customer": "1.0.0",
+        "magento/magento2-functional-test-module-directory": "1.0.0",
+        "magento/magento2-functional-test-module-eav": "1.0.0",
+        "magento/magento2-functional-test-module-msrp": "1.0.0",
+        "magento/magento2-functional-test-module-page-cache": "1.0.0",
+        "magento/magento2-functional-test-module-payment": "1.0.0",
+        "magento/magento2-functional-test-module-quote": "1.0.0",
+        "magento/magento2-functional-test-module-sales": "1.0.0",
+        "magento/magento2-functional-test-module-sales-rule": "1.0.0",
+        "magento/magento2-functional-test-module-shipping": "1.0.0",
+        "magento/magento2-functional-test-module-store": "1.0.0",
+        "magento/magento2-functional-test-module-tax": "1.0.0",
+        "magento/magento2-functional-test-module-theme": "1.0.0",
+        "magento/magento2-functional-test-module-ui": "1.0.0"
     },
     "type": "magento2-test-module",
-    "version": "dev-master",
+    "version": "1.0.0",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
-        "psr-0": {
-            "Yandex": "vendor/allure-framework/allure-codeception/src/"
-        },
         "psr-4": {
-            "Magento\\FunctionalTestingFramework\\": [
-                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
-            ],
-            "Magento\\FunctionalTest\\": [
-                "tests/functional/Magento/FunctionalTest",
-                "generated/Magento/FunctionalTest"
-            ]
+            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
         }
     },
     "extra": {
         "map": [
             [
                 "*",
-                "tests/functional/Magento/FunctionalTest/Checkout"
+                "dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout"
             ]
         ]
     }
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CheckoutAgreements/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CheckoutAgreements/README.md
index a985bc4dfe1..35423659f62 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CheckoutAgreements/README.md
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CheckoutAgreements/README.md
@@ -1,3 +1,3 @@
-# Magento 2 Acceptance Tests
+# Magento 2 Functional Tests
 
-The Acceptance Tests Module for **Magento_CheckoutAgreements** Module.
+The Functional Tests Module for **Magento_CheckoutAgreements** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CheckoutAgreements/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CheckoutAgreements/composer.json
index ab5629e117d..fd86cdd03ac 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CheckoutAgreements/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CheckoutAgreements/composer.json
@@ -1,52 +1,40 @@
 {
     "name": "magento/magento2-functional-test-module-checkout-agreements",
-    "description": "Magento 2 Acceptance Test Module Checkout Agreements",
-    "repositories": [
-        {
-            "type" : "composer",
-            "url" : "https://repo.magento.com/"
-        }
-    ],
+    "description": "Magento 2 Functional Test Module Checkout Agreements",
+    "config": {
+        "sort-packages": true
+    },
     "require": {
-        "php": "~7.0",
-        "codeception/codeception": "2.2|2.3",
-        "allure-framework/allure-codeception": "dev-master",
+        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
+        "codeception/codeception": "~2.3.4",
         "consolidation/robo": "^1.0.0",
         "henrikbjorn/lurker": "^1.2",
-        "vlucas/phpdotenv": "~2.4",
-        "magento/magento2-functional-testing-framework": "dev-develop"
+        "magento/magento2-functional-testing-framework": "1.0.0",
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
+        "vlucas/phpdotenv": "~2.4"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-checkout": "dev-master",
-        "magento/magento2-functional-test-module-quote": "dev-master",
-        "magento/magento2-functional-test-module-store": "dev-master",
-        "magento/magento2-functional-test-module-backend": "dev-master"
+        "magento/magento2-functional-test-module-backend": "1.0.0",
+        "magento/magento2-functional-test-module-checkout": "1.0.0",
+        "magento/magento2-functional-test-module-quote": "1.0.0",
+        "magento/magento2-functional-test-module-store": "1.0.0"
     },
     "type": "magento2-test-module",
-    "version": "dev-master",
+    "version": "1.0.0",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
-        "psr-0": {
-            "Yandex": "vendor/allure-framework/allure-codeception/src/"
-        },
         "psr-4": {
-            "Magento\\FunctionalTestingFramework\\": [
-                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
-            ],
-            "Magento\\FunctionalTest\\": [
-                "tests/functional/Magento/FunctionalTest",
-                "generated/Magento/FunctionalTest"
-            ]
+            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
         }
     },
     "extra": {
         "map": [
             [
                 "*",
-                "tests/functional/Magento/FunctionalTest/CheckoutAgreements"
+                "dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CheckoutAgreements"
             ]
         ]
     }
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/README.md
index 4de61c2fb27..d1214efec91 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/README.md
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/README.md
@@ -1,3 +1,3 @@
-# Magento 2 Acceptance Tests
+# Magento 2 Functional Tests
 
-The Acceptance Tests Module for **Magento_Cms** Module.
+The Functional Tests Module for **Magento_Cms** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/composer.json
index ad21c6beeaf..9a2b9f19946 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/composer.json
@@ -1,57 +1,45 @@
 {
     "name": "magento/magento2-functional-test-module-cms",
-    "description": "Magento 2 Acceptance Test Module Cms",
-    "repositories": [
-        {
-            "type" : "composer",
-            "url" : "https://repo.magento.com/"
-        }
-    ],
+    "description": "Magento 2 Functional Test Module Cms",
+    "config": {
+        "sort-packages": true
+    },
     "require": {
-        "php": "~7.0",
-        "codeception/codeception": "2.2|2.3",
-        "allure-framework/allure-codeception": "dev-master",
+        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
+        "codeception/codeception": "~2.3.4",
         "consolidation/robo": "^1.0.0",
         "henrikbjorn/lurker": "^1.2",
-        "vlucas/phpdotenv": "~2.4",
-        "magento/magento2-functional-testing-framework": "dev-develop"
+        "magento/magento2-functional-testing-framework": "1.0.0",
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
+        "vlucas/phpdotenv": "~2.4"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-store": "dev-master",
-        "magento/magento2-functional-test-module-theme": "dev-master",
-        "magento/magento2-functional-test-module-widget": "dev-master",
-        "magento/magento2-functional-test-module-backend": "dev-master",
-        "magento/magento2-functional-test-module-catalog": "dev-master",
-        "magento/magento2-functional-test-module-email": "dev-master",
-        "magento/magento2-functional-test-module-ui": "dev-master",
-        "magento/magento2-functional-test-module-variable": "dev-master",
-        "magento/magento2-functional-test-module-media-storage": "dev-master"
+        "magento/magento2-functional-test-module-backend": "1.0.0",
+        "magento/magento2-functional-test-module-catalog": "1.0.0",
+        "magento/magento2-functional-test-module-email": "1.0.0",
+        "magento/magento2-functional-test-module-media-storage": "1.0.0",
+        "magento/magento2-functional-test-module-store": "1.0.0",
+        "magento/magento2-functional-test-module-theme": "1.0.0",
+        "magento/magento2-functional-test-module-ui": "1.0.0",
+        "magento/magento2-functional-test-module-variable": "1.0.0",
+        "magento/magento2-functional-test-module-widget": "1.0.0"
     },
     "type": "magento2-test-module",
-    "version": "dev-master",
+    "version": "1.0.0",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
-        "psr-0": {
-            "Yandex": "vendor/allure-framework/allure-codeception/src/"
-        },
         "psr-4": {
-            "Magento\\FunctionalTestingFramework\\": [
-                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
-            ],
-            "Magento\\FunctionalTest\\": [
-                "tests/functional/Magento/FunctionalTest",
-                "generated/Magento/FunctionalTest"
-            ]
+            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
         }
     },
     "extra": {
         "map": [
             [
                 "*",
-                "tests/functional/Magento/FunctionalTest/Cms"
+                "dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms"
             ]
         ]
     }
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CmsUrlRewrite/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CmsUrlRewrite/README.md
index 1f1b1ca7825..cc52700eba9 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CmsUrlRewrite/README.md
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CmsUrlRewrite/README.md
@@ -1,6 +1,3 @@
-## Overview
- 
-The Magento_CmsUrlRewrite module adds support for URL rewrite rules for CMS pages. See also Magento_UrlRewrite module. 
+# Magento 2 Functional Tests
 
-The module adds and removes URL rewrite rules as CMS pages are added or removed by a user.
-The rules can be edited by an admin user as any other URL rewrite rule. 
+The Functional Tests Module for **Magento_CmsUrlRewrite** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CmsUrlRewrite/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CmsUrlRewrite/composer.json
index 4c27ee9c61e..7036bbdcdb3 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CmsUrlRewrite/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CmsUrlRewrite/composer.json
@@ -1,51 +1,39 @@
 {
     "name": "magento/magento2-functional-test-module-cms-url-rewrite",
-    "description": "Magento 2 Acceptance Test Module Cms Url Rewrite",
-    "repositories": [
-        {
-            "type" : "composer",
-            "url" : "https://repo.magento.com/"
-        }
-    ],
+    "description": "Magento 2 Functional Test Module Cms Url Rewrite",
+    "config": {
+        "sort-packages": true
+    },
     "require": {
-        "php": "~7.0",
-        "codeception/codeception": "2.2|2.3",
-        "allure-framework/allure-codeception": "dev-master",
+        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
+        "codeception/codeception": "~2.3.4",
         "consolidation/robo": "^1.0.0",
         "henrikbjorn/lurker": "^1.2",
-        "vlucas/phpdotenv": "~2.4",
-        "magento/magento2-functional-testing-framework": "dev-develop"
+        "magento/magento2-functional-testing-framework": "1.0.0",
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
+        "vlucas/phpdotenv": "~2.4"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-store": "dev-master",
-        "magento/magento2-functional-test-module-cms": "dev-master",
-        "magento/magento2-functional-test-module-url-rewrite": "dev-master"
+        "magento/magento2-functional-test-module-cms": "1.0.0",
+        "magento/magento2-functional-test-module-store": "1.0.0",
+        "magento/magento2-functional-test-module-url-rewrite": "1.0.0"
     },
     "type": "magento2-test-module",
-    "version": "dev-master",
+    "version": "1.0.0",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
-        "psr-0": {
-            "Yandex": "vendor/allure-framework/allure-codeception/src/"
-        },
         "psr-4": {
-            "Magento\\FunctionalTestingFramework\\": [
-                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
-            ],
-            "Magento\\FunctionalTest\\": [
-                "tests/functional/Magento/FunctionalTest",
-                "generated/Magento/FunctionalTest"
-            ]
+            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
         }
     },
     "extra": {
         "map": [
             [
                 "*",
-                "tests/functional/Magento/FunctionalTest/CmsUrlRewrite"
+                "dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CmsUrlRewrite"
             ]
         ]
     }
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Config/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Config/README.md
index 6214cc94b04..eb0b57b2886 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Config/README.md
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Config/README.md
@@ -1,8 +1,3 @@
-#Config
-The Config module is designed to implement system configuration functionality.
-It provides mechanisms to add, edit, store and retrieve the configuration data
-for each scope (there can be a default scope as well as scopes for each website and store).
+# Magento 2 Functional Tests
 
-Modules can add items to be configured on the system configuration page by creating 
-system.xml files in their etc/adminhtml directories. These system.xml files get merged 
-to populate the forms in the config page.
+The Functional Tests Module for **Magento_Config** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Config/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Config/composer.json
index b82ea131819..46ee6cfad90 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Config/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Config/composer.json
@@ -1,53 +1,43 @@
 {
     "name": "magento/magento2-functional-test-module-config",
-    "description": "Magento 2 Acceptance Test Module Config",
-    "repositories": [
-        {
-            "type" : "composer",
-            "url" : "https://repo.magento.com/"
-        }
-    ],
+    "description": "Magento 2 Functional Test Module Config",
+    "config": {
+        "sort-packages": true
+    },
     "require": {
-        "php": "~7.0",
-        "codeception/codeception": "2.2|2.3",
-        "allure-framework/allure-codeception": "dev-master",
+        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
+        "codeception/codeception": "~2.3.4",
         "consolidation/robo": "^1.0.0",
         "henrikbjorn/lurker": "^1.2",
-        "vlucas/phpdotenv": "~2.4",
-        "magento/magento2-functional-testing-framework": "dev-develop"
+        "magento/magento2-functional-testing-framework": "1.0.0",
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
+        "vlucas/phpdotenv": "~2.4"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-store": "dev-master",
-        "magento/magento2-functional-test-module-email": "dev-master",
-        "magento/magento2-functional-test-module-directory": "dev-master",
-        "magento/magento2-functional-test-module-backend": "dev-master",
-        "magento/magento2-functional-test-module-media-storage": "dev-master"
+        "magento/magento2-functional-test-module-backend": "1.0.0",
+        "magento/magento2-functional-test-module-cron": "1.0.0",
+        "magento/magento2-functional-test-module-deploy": "1.0.0",
+        "magento/magento2-functional-test-module-directory": "1.0.0",
+        "magento/magento2-functional-test-module-email": "1.0.0",
+        "magento/magento2-functional-test-module-media-storage": "1.0.0",
+        "magento/magento2-functional-test-module-store": "1.0.0"
     },
     "type": "magento2-test-module",
-    "version": "dev-master",
+    "version": "1.0.0",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
-        "psr-0": {
-            "Yandex": "vendor/allure-framework/allure-codeception/src/"
-        },
         "psr-4": {
-            "Magento\\FunctionalTestingFramework\\": [
-                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
-            ],
-            "Magento\\FunctionalTest\\": [
-                "tests/functional/Magento/FunctionalTest",
-                "generated/Magento/FunctionalTest"
-            ]
+            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
         }
     },
     "extra": {
         "map": [
             [
                 "*",
-                "tests/functional/Magento/FunctionalTest/Config"
+                "dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Config"
             ]
         ]
     }
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableImportExport/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableImportExport/composer.json
index 8af4f9591cf..8b956bab819 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableImportExport/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableImportExport/composer.json
@@ -1,53 +1,41 @@
 {
     "name": "magento/magento2-functional-test-module-configurable-import-export",
-    "description": "Magento 2 Acceptance Test Module Configurable Import Export",
-    "repositories": [
-        {
-            "type" : "composer",
-            "url" : "https://repo.magento.com/"
-        }
-    ],
+    "description": "Magento 2 Functional Test Module Configurable Import Export",
+    "config": {
+        "sort-packages": true
+    },
     "require": {
-        "php": "~7.0",
-        "codeception/codeception": "2.2|2.3",
-        "allure-framework/allure-codeception": "dev-master",
+        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
+        "codeception/codeception": "~2.3.4",
         "consolidation/robo": "^1.0.0",
         "henrikbjorn/lurker": "^1.2",
-        "vlucas/phpdotenv": "~2.4",
-        "magento/magento2-functional-testing-framework": "dev-develop"
+        "magento/magento2-functional-testing-framework": "1.0.0",
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
+        "vlucas/phpdotenv": "~2.4"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-catalog": "dev-master",
-        "magento/magento2-functional-test-module-catalog-import-export": "dev-master",
-        "magento/magento2-functional-test-module-eav": "dev-master",
-        "magento/magento2-functional-test-module-import-export": "dev-master",
-        "magento/magento2-functional-test-module-configurable-product": "dev-master"
+        "magento/magento2-functional-test-module-catalog": "1.0.0",
+        "magento/magento2-functional-test-module-catalog-import-export": "1.0.0",
+        "magento/magento2-functional-test-module-configurable-product": "1.0.0",
+        "magento/magento2-functional-test-module-eav": "1.0.0",
+        "magento/magento2-functional-test-module-import-export": "1.0.0"
     },
     "type": "magento2-test-module",
-    "version": "dev-master",
+    "version": "1.0.0",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
-        "psr-0": {
-            "Yandex": "vendor/allure-framework/allure-codeception/src/"
-        },
         "psr-4": {
-            "Magento\\FunctionalTestingFramework\\": [
-                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
-            ],
-            "Magento\\FunctionalTest\\": [
-                "tests/functional/Magento/FunctionalTest",
-                "generated/Magento/FunctionalTest"
-            ]
+            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
         }
     },
     "extra": {
         "map": [
             [
                 "*",
-                "tests/functional/Magento/FunctionalTest/ConfigurableImportExport"
+                "dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableImportExport"
             ]
         ]
     }
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/README.md
index aa4342bf3a4..3db572028f7 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/README.md
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/README.md
@@ -1,3 +1,3 @@
-# Magento 2 Acceptance Tests
+# Magento 2 Functional Tests
 
-The Acceptance Tests Module for **Magento_ConfigurableProduct** Module.
+The Functional Tests Module for **Magento_ConfigurableProduct** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/composer.json
index 6cdd99c2e0c..77b33a9fc4c 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/composer.json
@@ -1,59 +1,47 @@
 {
     "name": "magento/magento2-functional-test-module-configurable-product",
-    "description": "Magento 2 Acceptance Test Module Configurable Product",
-    "repositories": [
-        {
-            "type" : "composer",
-            "url" : "https://repo.magento.com/"
-        }
-    ],
+    "description": "Magento 2 Functional Test Module Configurable Product",
+    "config": {
+        "sort-packages": true
+    },
     "require": {
-        "php": "~7.0",
-        "codeception/codeception": "2.2|2.3",
-        "allure-framework/allure-codeception": "dev-master",
+        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
+        "codeception/codeception": "~2.3.4",
         "consolidation/robo": "^1.0.0",
         "henrikbjorn/lurker": "^1.2",
-        "vlucas/phpdotenv": "~2.4",
-        "magento/magento2-functional-testing-framework": "dev-develop",
-        "magento/magento2-functional-test-module-catalog": "dev-master"
+        "magento/magento2-functional-testing-framework": "1.0.0",
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
+        "vlucas/phpdotenv": "~2.4"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-store": "dev-master",
-        "magento/magento2-functional-test-module-catalog-inventory": "dev-master",
-        "magento/magento2-functional-test-module-checkout": "dev-master",
-        "magento/magento2-functional-test-module-msrp": "dev-master",
-        "magento/magento2-functional-test-module-backend": "dev-master",
-        "magento/magento2-functional-test-module-eav": "dev-master",
-        "magento/magento2-functional-test-module-customer": "dev-master",
-        "magento/magento2-functional-test-module-media-storage": "dev-master",
-        "magento/magento2-functional-test-module-quote": "dev-master",
-        "magento/magento2-functional-test-module-ui": "dev-master"
+        "magento/magento2-functional-test-module-backend": "1.0.0",
+        "magento/magento2-functional-test-module-catalog": "1.0.0",
+        "magento/magento2-functional-test-module-catalog-inventory": "1.0.0",
+        "magento/magento2-functional-test-module-checkout": "1.0.0",
+        "magento/magento2-functional-test-module-customer": "1.0.0",
+        "magento/magento2-functional-test-module-eav": "1.0.0",
+        "magento/magento2-functional-test-module-media-storage": "1.0.0",
+        "magento/magento2-functional-test-module-msrp": "1.0.0",
+        "magento/magento2-functional-test-module-quote": "1.0.0",
+        "magento/magento2-functional-test-module-store": "1.0.0",
+        "magento/magento2-functional-test-module-ui": "1.0.0"
     },
     "type": "magento2-test-module",
-    "version": "dev-master",
+    "version": "1.0.0",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
-        "psr-0": {
-            "Yandex": "vendor/allure-framework/allure-codeception/src/"
-        },
         "psr-4": {
-            "Magento\\FunctionalTestingFramework\\": [
-                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
-            ],
-            "Magento\\FunctionalTest\\": [
-                "tests/functional/Magento/FunctionalTest",
-                "generated/Magento/FunctionalTest"
-            ]
+            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
         }
     },
     "extra": {
         "map": [
             [
                 "*",
-                "tests/functional/Magento/FunctionalTest/ConfigurableProduct"
+                "dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct"
             ]
         ]
     }
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProductSales/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProductSales/README.md
index f64eca364e9..ebd5a01b14f 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProductSales/README.md
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProductSales/README.md
@@ -1,3 +1,3 @@
-# Magento 2 Acceptance Tests
+# Magento 2 Functional Tests
 
-The Acceptance Tests Module for **Magento_ConfigurableProductSales** Module.
+The Functional Tests Module for **Magento_ConfigurableProductSales** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProductSales/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProductSales/composer.json
index f9cb9a3e404..65749fe4fd2 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProductSales/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProductSales/composer.json
@@ -1,51 +1,39 @@
 {
     "name": "magento/magento2-functional-test-module-configurable-product-sales",
-    "description": "Magento 2 Acceptance Test Module Configurable Product Sales",
-    "repositories": [
-        {
-            "type" : "composer",
-            "url" : "https://repo.magento.com/"
-        }
-    ],
+    "description": "Magento 2 Functional Test Module Configurable Product Sales",
+    "config": {
+        "sort-packages": true
+    },
     "require": {
-        "php": "~7.0",
-        "codeception/codeception": "2.2|2.3",
-        "allure-framework/allure-codeception": "dev-master",
+        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
+        "codeception/codeception": "~2.3.4",
         "consolidation/robo": "^1.0.0",
         "henrikbjorn/lurker": "^1.2",
-        "vlucas/phpdotenv": "~2.4",
-        "magento/magento2-functional-testing-framework": "dev-develop"
+        "magento/magento2-functional-testing-framework": "1.0.0",
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
+        "vlucas/phpdotenv": "~2.4"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-store": "dev-master",
-        "magento/magento2-functional-test-module-catalog": "dev-master",
-        "magento/magento2-functional-test-module-sales": "dev-master"
+        "magento/magento2-functional-test-module-catalog": "1.0.0",
+        "magento/magento2-functional-test-module-sales": "1.0.0",
+        "magento/magento2-functional-test-module-store": "1.0.0"
     },
     "type": "magento2-test-module",
-    "version": "dev-master",
+    "version": "1.0.0",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
-        "psr-0": {
-            "Yandex": "vendor/allure-framework/allure-codeception/src/"
-        },
         "psr-4": {
-            "Magento\\FunctionalTestingFramework\\": [
-                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
-            ],
-            "Magento\\FunctionalTest\\": [
-                "tests/functional/Magento/FunctionalTest",
-                "generated/Magento/FunctionalTest"
-            ]
+            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
         }
     },
     "extra": {
         "map": [
             [
                 "*",
-                "tests/functional/Magento/FunctionalTest/ConfigurableProductSales"
+                "dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProductSales"
             ]
         ]
     }
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Contact/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Contact/README.md
index 4b862fdfeea..1baafbefac0 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Contact/README.md
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Contact/README.md
@@ -1,3 +1,3 @@
-# Magento 2 Acceptance Tests
+# Magento 2 Functional Tests
 
-The Acceptance Tests Module for **Magento_Contact** Module.
+The Functional Tests Module for **Magento_Contact** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Contact/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Contact/composer.json
index 11531b5e5f4..642fec7ae82 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Contact/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Contact/composer.json
@@ -1,52 +1,40 @@
 {
     "name": "magento/magento2-functional-test-module-contact",
-    "description": "Magento 2 Acceptance Test Module Contact",
-    "repositories": [
-        {
-            "type" : "composer",
-            "url" : "https://repo.magento.com/"
-        }
-    ],
+    "description": "Magento 2 Functional Test Module Contact",
+    "config": {
+        "sort-packages": true
+    },
     "require": {
-        "php": "~7.0",
-        "codeception/codeception": "2.2|2.3",
-        "allure-framework/allure-codeception": "dev-master",
+        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
+        "codeception/codeception": "~2.3.4",
         "consolidation/robo": "^1.0.0",
         "henrikbjorn/lurker": "^1.2",
-        "vlucas/phpdotenv": "~2.4",
-        "magento/magento2-functional-testing-framework": "dev-develop"
+        "magento/magento2-functional-testing-framework": "1.0.0",
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
+        "vlucas/phpdotenv": "~2.4"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-store": "dev-master",
-        "magento/magento2-functional-test-module-config": "dev-master",
-        "magento/magento2-functional-test-module-customer": "dev-master",
-        "magento/magento2-functional-test-module-cms": "dev-master"
+        "magento/magento2-functional-test-module-cms": "1.0.0",
+        "magento/magento2-functional-test-module-config": "1.0.0",
+        "magento/magento2-functional-test-module-customer": "1.0.0",
+        "magento/magento2-functional-test-module-store": "1.0.0"
     },
     "type": "magento2-test-module",
-    "version": "dev-master",
+    "version": "1.0.0",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
-        "psr-0": {
-            "Yandex": "vendor/allure-framework/allure-codeception/src/"
-        },
         "psr-4": {
-            "Magento\\FunctionalTestingFramework\\": [
-                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
-            ],
-            "Magento\\FunctionalTest\\": [
-                "tests/functional/Magento/FunctionalTest",
-                "generated/Magento/FunctionalTest"
-            ]
+            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
         }
     },
     "extra": {
         "map": [
             [
                 "*",
-                "tests/functional/Magento/FunctionalTest/Contact"
+                "dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Contact"
             ]
         ]
     }
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cookie/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cookie/README.md
index f218201d7c9..ed80d8f232c 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cookie/README.md
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cookie/README.md
@@ -1,3 +1,3 @@
-# Magento 2 Acceptance Tests
+# Magento 2 Functional Tests
 
-The Acceptance Tests Module for **Magento_Cookie** Module.
+The Functional Tests Module for **Magento_Cookie** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cookie/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cookie/composer.json
index cf0a7bc2cb4..f120fbf3de4 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cookie/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cookie/composer.json
@@ -1,49 +1,37 @@
 {
     "name": "magento/magento2-functional-test-module-cookie",
-    "description": "Magento 2 Acceptance Test Module Cookie",
-    "repositories": [
-        {
-            "type" : "composer",
-            "url" : "https://repo.magento.com/"
-        }
-    ],
+    "description": "Magento 2 Functional Test Module Cookie",
+    "config": {
+        "sort-packages": true
+    },
     "require": {
-        "php": "~7.0",
-        "codeception/codeception": "2.2|2.3",
-        "allure-framework/allure-codeception": "dev-master",
+        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
+        "codeception/codeception": "~2.3.4",
         "consolidation/robo": "^1.0.0",
         "henrikbjorn/lurker": "^1.2",
-        "vlucas/phpdotenv": "~2.4",
-        "magento/magento2-functional-testing-framework": "dev-develop"
+        "magento/magento2-functional-testing-framework": "1.0.0",
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
+        "vlucas/phpdotenv": "~2.4"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-store": "dev-master"
+        "magento/magento2-functional-test-module-store": "1.0.0"
     },
     "type": "magento2-test-module",
-    "version": "dev-master",
+    "version": "1.0.0",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
-        "psr-0": {
-            "Yandex": "vendor/allure-framework/allure-codeception/src/"
-        },
         "psr-4": {
-            "Magento\\FunctionalTestingFramework\\": [
-                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
-            ],
-            "Magento\\FunctionalTest\\": [
-                "tests/functional/Magento/FunctionalTest",
-                "generated/Magento/FunctionalTest"
-            ]
+            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
         }
     },
     "extra": {
         "map": [
             [
                 "*",
-                "tests/functional/Magento/FunctionalTest/Cookie"
+                "dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cookie"
             ]
         ]
     }
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cron/LICENSE.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cron/LICENSE.txt
new file mode 100644
index 00000000000..49525fd99da
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cron/LICENSE.txt
@@ -0,0 +1,48 @@
+
+Open Software License ("OSL") v. 3.0
+
+This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Open Software License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Open Software License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly. 
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including 'fair use' or 'fair dealing'). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright (C) 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cron/LICENSE_AFL.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cron/LICENSE_AFL.txt
new file mode 100644
index 00000000000..f39d641b18a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cron/LICENSE_AFL.txt
@@ -0,0 +1,48 @@
+
+Academic Free License ("AFL") v. 3.0
+
+This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Academic Free License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, under any license of your choice that does not contradict the terms and conditions, including Licensor's reserved rights and remedies, in this Academic Free License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly.
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including "fair use" or "fair dealing"). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright © 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Academic Free License" or "AFL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cron/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cron/README.md
new file mode 100644
index 00000000000..a3394b9a181
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cron/README.md
@@ -0,0 +1,3 @@
+# Magento 2 Functional Tests
+
+The Functional Tests Module for **Magento_Cron** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cron/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cron/composer.json
new file mode 100644
index 00000000000..7ca41f02625
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cron/composer.json
@@ -0,0 +1,38 @@
+{
+    "name": "magento/magento2-functional-test-module-cron",
+    "description": "Magento 2 Functional Test Module Cron",
+    "config": {
+        "sort-packages": true
+    },
+    "require": {
+        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
+        "codeception/codeception": "~2.3.4",
+        "consolidation/robo": "^1.0.0",
+        "henrikbjorn/lurker": "^1.2",
+        "magento/magento2-functional-testing-framework": "1.0.0",
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
+        "vlucas/phpdotenv": "~2.4"
+    },
+    "suggest": {
+        "magento/magento2-functional-test-module-store": "1.0.0"
+    },
+    "type": "magento2-test-module",
+    "version": "1.0.0",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
+    "autoload": {
+        "psr-4": {
+            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
+        }
+    },
+    "extra": {
+        "map": [
+            [
+                "*",
+                "dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cron"
+            ]
+        ]
+    }
+}
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CurrencySymbol/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CurrencySymbol/README.md
index 110a01dc96d..e5e9c0458b1 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CurrencySymbol/README.md
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CurrencySymbol/README.md
@@ -1,3 +1,3 @@
-# Magento 2 Acceptance Tests
+# Magento 2 Functional Tests
 
-The Acceptance Tests Module for **Magento_CurrencySymbol** Module.
+The Functional Tests Module for **Magento_CurrencySymbol** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CurrencySymbol/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CurrencySymbol/composer.json
index 9568fdb29ca..1127d3ea32f 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CurrencySymbol/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CurrencySymbol/composer.json
@@ -1,53 +1,41 @@
 {
     "name": "magento/magento2-functional-test-module-currency-symbol",
-    "description": "Magento 2 Acceptance Test Module Currency Symbol",
-    "repositories": [
-        {
-            "type" : "composer",
-            "url" : "https://repo.magento.com/"
-        }
-    ],
+    "description": "Magento 2 Functional Test Module Currency Symbol",
+    "config": {
+        "sort-packages": true
+    },
     "require": {
-        "php": "~7.0",
-        "codeception/codeception": "2.2|2.3",
-        "allure-framework/allure-codeception": "dev-master",
+        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
+        "codeception/codeception": "~2.3.4",
         "consolidation/robo": "^1.0.0",
         "henrikbjorn/lurker": "^1.2",
-        "vlucas/phpdotenv": "~2.4",
-        "magento/magento2-functional-testing-framework": "dev-develop"
+        "magento/magento2-functional-testing-framework": "1.0.0",
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
+        "vlucas/phpdotenv": "~2.4"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-store": "dev-master",
-        "magento/magento2-functional-test-module-config": "dev-master",
-        "magento/magento2-functional-test-module-page-cache": "dev-master",
-        "magento/magento2-functional-test-module-directory": "dev-master",
-        "magento/magento2-functional-test-module-backend": "dev-master"
+        "magento/magento2-functional-test-module-backend": "1.0.0",
+        "magento/magento2-functional-test-module-config": "1.0.0",
+        "magento/magento2-functional-test-module-directory": "1.0.0",
+        "magento/magento2-functional-test-module-page-cache": "1.0.0",
+        "magento/magento2-functional-test-module-store": "1.0.0"
     },
     "type": "magento2-test-module",
-    "version": "dev-master",
+    "version": "1.0.0",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
-        "psr-0": {
-            "Yandex": "vendor/allure-framework/allure-codeception/src/"
-        },
         "psr-4": {
-            "Magento\\FunctionalTestingFramework\\": [
-                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
-            ],
-            "Magento\\FunctionalTest\\": [
-                "tests/functional/Magento/FunctionalTest",
-                "generated/Magento/FunctionalTest"
-            ]
+            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
         }
     },
     "extra": {
         "map": [
             [
                 "*",
-                "tests/functional/Magento/FunctionalTest/CurrencySymbol"
+                "dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CurrencySymbol"
             ]
         ]
     }
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/README.md
index a7c25afc9a3..cb51dcef8c4 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/README.md
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/README.md
@@ -1,3 +1,3 @@
-# Magento 2 Acceptance Tests
+# Magento 2 Functional Tests
 
-The Acceptance Tests Module for **Magento_Customer** Module.
+The Functional Tests Module for **Magento_Customer** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/composer.json
index 61a6eddb0ed..009472f57d6 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/composer.json
@@ -1,67 +1,55 @@
 {
     "name": "magento/magento2-functional-test-module-customer",
-    "description": "Magento 2 Acceptance Test Module Customer",
-    "repositories": [
-        {
-            "type" : "composer",
-            "url" : "https://repo.magento.com/"
-        }
-    ],
+    "description": "Magento 2 Functional Test Module Customer",
+    "config": {
+        "sort-packages": true
+    },
     "require": {
-        "php": "~7.0",
-        "codeception/codeception": "2.2|2.3",
-        "allure-framework/allure-codeception": "dev-master",
+        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
+        "codeception/codeception": "~2.3.4",
         "consolidation/robo": "^1.0.0",
         "henrikbjorn/lurker": "^1.2",
-        "vlucas/phpdotenv": "~2.4",
-        "magento/magento2-functional-testing-framework": "dev-develop",
-        "magento/magento2-functional-test-module-catalog": "dev-master"
+        "magento/magento2-functional-testing-framework": "1.0.0",
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
+        "vlucas/phpdotenv": "~2.4"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-store": "dev-master",
-        "magento/magento2-functional-test-module-eav": "dev-master",
-        "magento/magento2-functional-test-module-directory": "dev-master",
-        "magento/magento2-functional-test-module-newsletter": "dev-master",
-        "magento/magento2-functional-test-module-sales": "dev-master",
-        "magento/magento2-functional-test-module-checkout": "dev-master",
-        "magento/magento2-functional-test-module-wishlist": "dev-master",
-        "magento/magento2-functional-test-module-theme": "dev-master",
-        "magento/magento2-functional-test-module-backend": "dev-master",
-        "magento/magento2-functional-test-module-review": "dev-master",
-        "magento/magento2-functional-test-module-tax": "dev-master",
-        "magento/magento2-functional-test-module-authorization": "dev-master",
-        "magento/magento2-functional-test-module-integration": "dev-master",
-        "magento/magento2-functional-test-module-media-storage": "dev-master",
-        "magento/magento2-functional-test-module-ui": "dev-master",
-        "magento/magento2-functional-test-module-config": "dev-master",
-        "magento/magento2-functional-test-module-quote": "dev-master",
-        "magento/magento2-functional-test-module-page-cache": "dev-master"
+        "magento/magento2-functional-test-module-authorization": "1.0.0",
+        "magento/magento2-functional-test-module-backend": "1.0.0",
+        "magento/magento2-functional-test-module-catalog": "1.0.0",
+        "magento/magento2-functional-test-module-checkout": "1.0.0",
+        "magento/magento2-functional-test-module-config": "1.0.0",
+        "magento/magento2-functional-test-module-directory": "1.0.0",
+        "magento/magento2-functional-test-module-eav": "1.0.0",
+        "magento/magento2-functional-test-module-integration": "1.0.0",
+        "magento/magento2-functional-test-module-media-storage": "1.0.0",
+        "magento/magento2-functional-test-module-newsletter": "1.0.0",
+        "magento/magento2-functional-test-module-page-cache": "1.0.0",
+        "magento/magento2-functional-test-module-quote": "1.0.0",
+        "magento/magento2-functional-test-module-review": "1.0.0",
+        "magento/magento2-functional-test-module-sales": "1.0.0",
+        "magento/magento2-functional-test-module-store": "1.0.0",
+        "magento/magento2-functional-test-module-tax": "1.0.0",
+        "magento/magento2-functional-test-module-theme": "1.0.0",
+        "magento/magento2-functional-test-module-ui": "1.0.0",
+        "magento/magento2-functional-test-module-wishlist": "1.0.0"
     },
     "type": "magento2-test-module",
-    "version": "dev-master",
+    "version": "1.0.0",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
-        "psr-0": {
-            "Yandex": "vendor/allure-framework/allure-codeception/src/"
-        },
         "psr-4": {
-            "Magento\\FunctionalTestingFramework\\": [
-                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
-            ],
-            "Magento\\FunctionalTest\\": [
-                "tests/functional/Magento/FunctionalTest",
-                "generated/Magento/FunctionalTest"
-            ]
+            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
         }
     },
     "extra": {
         "map": [
             [
                 "*",
-                "tests/functional/Magento/FunctionalTest/Customer"
+                "dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer"
             ]
         ]
     }
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CustomerImportExport/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CustomerImportExport/README.md
index 05e03b11a1b..ebeb51bf1e4 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CustomerImportExport/README.md
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CustomerImportExport/README.md
@@ -1,3 +1,3 @@
-# Magento 2 Acceptance Tests
+# Magento 2 Functional Tests
 
-The Acceptance Tests Module for **Magento_CustomerImportExport** Module.
+The Functional Tests Module for **Magento_CustomerImportExport** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CustomerImportExport/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CustomerImportExport/composer.json
index df1b19f9e52..d3f21cfc5ae 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CustomerImportExport/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CustomerImportExport/composer.json
@@ -1,54 +1,42 @@
 {
     "name": "magento/magento2-functional-test-module-customer-import-export",
-    "description": "Magento 2 Acceptance Test Module Customer Import Export",
-    "repositories": [
-        {
-            "type" : "composer",
-            "url" : "https://repo.magento.com/"
-        }
-    ],
+    "description": "Magento 2 Functional Test Module Customer Import Export",
+    "config": {
+        "sort-packages": true
+    },
     "require": {
-        "php": "~7.0",
-        "codeception/codeception": "2.2|2.3",
-        "allure-framework/allure-codeception": "dev-master",
+        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
+        "codeception/codeception": "~2.3.4",
         "consolidation/robo": "^1.0.0",
         "henrikbjorn/lurker": "^1.2",
-        "vlucas/phpdotenv": "~2.4",
-        "magento/magento2-functional-testing-framework": "dev-develop"
+        "magento/magento2-functional-testing-framework": "1.0.0",
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
+        "vlucas/phpdotenv": "~2.4"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-store": "dev-master",
-        "magento/magento2-functional-test-module-backend": "dev-master",
-        "magento/magento2-functional-test-module-customer": "dev-master",
-        "magento/magento2-functional-test-module-eav": "dev-master",
-        "magento/magento2-functional-test-module-import-export": "dev-master",
-        "magento/magento2-functional-test-module-directory": "dev-master"
+        "magento/magento2-functional-test-module-backend": "1.0.0",
+        "magento/magento2-functional-test-module-customer": "1.0.0",
+        "magento/magento2-functional-test-module-directory": "1.0.0",
+        "magento/magento2-functional-test-module-eav": "1.0.0",
+        "magento/magento2-functional-test-module-import-export": "1.0.0",
+        "magento/magento2-functional-test-module-store": "1.0.0"
     },
     "type": "magento2-test-module",
-    "version": "dev-master",
+    "version": "1.0.0",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
-        "psr-0": {
-            "Yandex": "vendor/allure-framework/allure-codeception/src/"
-        },
         "psr-4": {
-            "Magento\\FunctionalTestingFramework\\": [
-                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
-            ],
-            "Magento\\FunctionalTest\\": [
-                "tests/functional/Magento/FunctionalTest",
-                "generated/Magento/FunctionalTest"
-            ]
+            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
         }
     },
     "extra": {
         "map": [
             [
                 "*",
-                "tests/functional/Magento/FunctionalTest/CustomerImportExport"
+                "dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CustomerImportExport"
             ]
         ]
     }
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Deploy/LICENSE.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Deploy/LICENSE.txt
new file mode 100644
index 00000000000..49525fd99da
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Deploy/LICENSE.txt
@@ -0,0 +1,48 @@
+
+Open Software License ("OSL") v. 3.0
+
+This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Open Software License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Open Software License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly. 
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including 'fair use' or 'fair dealing'). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright (C) 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Deploy/LICENSE_AFL.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Deploy/LICENSE_AFL.txt
new file mode 100644
index 00000000000..f39d641b18a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Deploy/LICENSE_AFL.txt
@@ -0,0 +1,48 @@
+
+Academic Free License ("AFL") v. 3.0
+
+This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Academic Free License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, under any license of your choice that does not contradict the terms and conditions, including Licensor's reserved rights and remedies, in this Academic Free License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly.
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including "fair use" or "fair dealing"). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright © 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Academic Free License" or "AFL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Deploy/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Deploy/README.md
new file mode 100644
index 00000000000..20704cfd90c
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Deploy/README.md
@@ -0,0 +1,3 @@
+# Magento 2 Functional Tests
+
+The Functional Tests Module for **Magento_Deploy** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Deploy/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Deploy/composer.json
new file mode 100644
index 00000000000..ebdbc83e2c5
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Deploy/composer.json
@@ -0,0 +1,41 @@
+{
+    "name": "magento/magento2-functional-test-module-deploy",
+    "description": "Magento 2 Functional Test Module Deploy",
+    "config": {
+        "sort-packages": true
+    },
+    "require": {
+        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
+        "codeception/codeception": "~2.3.4",
+        "consolidation/robo": "^1.0.0",
+        "henrikbjorn/lurker": "^1.2",
+        "magento/magento2-functional-testing-framework": "1.0.0",
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
+        "vlucas/phpdotenv": "~2.4"
+    },
+    "suggest": {
+        "magento/magento2-functional-test-module-config": "1.0.0",
+        "magento/magento2-functional-test-module-require-js": "1.0.0",
+        "magento/magento2-functional-test-module-store": "1.0.0",
+        "magento/magento2-functional-test-module-user": "1.0.0"
+    },
+    "type": "magento2-test-module",
+    "version": "1.0.0",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
+    "autoload": {
+        "psr-4": {
+            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
+        }
+    },
+    "extra": {
+        "map": [
+            [
+                "*",
+                "dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Deploy"
+            ]
+        ]
+    }
+}
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Developer/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Developer/README.md
index f22b6ee1bf8..4aff70291bb 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Developer/README.md
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Developer/README.md
@@ -1,3 +1,3 @@
-# Magento 2 Acceptance Tests
+# Magento 2 Functional Tests
 
-The Acceptance Tests Module for **Magento_Developer** Module.
+The Functional Tests Module for **Magento_Developer** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Developer/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Developer/composer.json
index dee920ee031..1075a5415f0 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Developer/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Developer/composer.json
@@ -1,50 +1,38 @@
 {
     "name": "magento/magento2-functional-test-module-developer",
-    "description": "Magento 2 Acceptance Test Module Developer",
-    "repositories": [
-        {
-            "type" : "composer",
-            "url" : "https://repo.magento.com/"
-        }
-    ],
+    "description": "Magento 2 Functional Test Module Developer",
+    "config": {
+        "sort-packages": true
+    },
     "require": {
-        "php": "~7.0",
-        "codeception/codeception": "2.2|2.3",
-        "allure-framework/allure-codeception": "dev-master",
+        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
+        "codeception/codeception": "~2.3.4",
         "consolidation/robo": "^1.0.0",
         "henrikbjorn/lurker": "^1.2",
-        "vlucas/phpdotenv": "~2.4",
-        "magento/magento2-functional-testing-framework": "dev-develop"
+        "magento/magento2-functional-testing-framework": "1.0.0",
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
+        "vlucas/phpdotenv": "~2.4"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-store": "dev-master",
-        "magento/magento2-functional-test-module-config": "dev-master"
+        "magento/magento2-functional-test-module-config": "1.0.0",
+        "magento/magento2-functional-test-module-store": "1.0.0"
     },
     "type": "magento2-test-module",
-    "version": "dev-master",
+    "version": "1.0.0",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
-        "psr-0": {
-            "Yandex": "vendor/allure-framework/allure-codeception/src/"
-        },
         "psr-4": {
-            "Magento\\FunctionalTestingFramework\\": [
-                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
-            ],
-            "Magento\\FunctionalTest\\": [
-                "tests/functional/Magento/FunctionalTest",
-                "generated/Magento/FunctionalTest"
-            ]
+            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
         }
     },
     "extra": {
         "map": [
             [
                 "*",
-                "tests/functional/Magento/FunctionalTest/Developer"
+                "dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Developer"
             ]
         ]
     }
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Dhl/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Dhl/README.md
index aca768d2510..bda156c74e0 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Dhl/README.md
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Dhl/README.md
@@ -1,3 +1,3 @@
-# Magento 2 Acceptance Tests
+# Magento 2 Functional Tests
 
-The Acceptance Tests Module for **Magento_Dhl** Module.
+The Functional Tests Module for **Magento_Dhl** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Dhl/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Dhl/composer.json
index 0a9e884bde6..9933fd63717 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Dhl/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Dhl/composer.json
@@ -1,57 +1,45 @@
 {
     "name": "magento/magento2-functional-test-module-dhl",
-    "description": "Magento 2 Acceptance Test Module Dhl",
-    "repositories": [
-        {
-            "type" : "composer",
-            "url" : "https://repo.magento.com/"
-        }
-    ],
+    "description": "Magento 2 Functional Test Module Dhl",
+    "config": {
+        "sort-packages": true
+    },
     "require": {
-        "php": "~7.0",
-        "codeception/codeception": "2.2|2.3",
-        "allure-framework/allure-codeception": "dev-master",
+        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
+        "codeception/codeception": "~2.3.4",
         "consolidation/robo": "^1.0.0",
         "henrikbjorn/lurker": "^1.2",
-        "vlucas/phpdotenv": "~2.4",
-        "magento/magento2-functional-testing-framework": "dev-develop"
+        "magento/magento2-functional-testing-framework": "1.0.0",
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
+        "vlucas/phpdotenv": "~2.4"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-store": "dev-master",
-        "magento/magento2-functional-test-module-config": "dev-master",
-        "magento/magento2-functional-test-module-shipping": "dev-master",
-        "magento/magento2-functional-test-module-backend": "dev-master",
-        "magento/magento2-functional-test-module-directory": "dev-master",
-        "magento/magento2-functional-test-module-sales": "dev-master",
-        "magento/magento2-functional-test-module-catalog": "dev-master",
-        "magento/magento2-functional-test-module-catalog-inventory": "dev-master",
-        "magento/magento2-functional-test-module-quote": "dev-master"
+        "magento/magento2-functional-test-module-backend": "1.0.0",
+        "magento/magento2-functional-test-module-catalog": "1.0.0",
+        "magento/magento2-functional-test-module-catalog-inventory": "1.0.0",
+        "magento/magento2-functional-test-module-config": "1.0.0",
+        "magento/magento2-functional-test-module-directory": "1.0.0",
+        "magento/magento2-functional-test-module-quote": "1.0.0",
+        "magento/magento2-functional-test-module-sales": "1.0.0",
+        "magento/magento2-functional-test-module-shipping": "1.0.0",
+        "magento/magento2-functional-test-module-store": "1.0.0"
     },
     "type": "magento2-test-module",
-    "version": "dev-master",
+    "version": "1.0.0",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
-        "psr-0": {
-            "Yandex": "vendor/allure-framework/allure-codeception/src/"
-        },
         "psr-4": {
-            "Magento\\FunctionalTestingFramework\\": [
-                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
-            ],
-            "Magento\\FunctionalTest\\": [
-                "tests/functional/Magento/FunctionalTest",
-                "generated/Magento/FunctionalTest"
-            ]
+            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
         }
     },
     "extra": {
         "map": [
             [
                 "*",
-                "tests/functional/Magento/FunctionalTest/Dhl"
+                "dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Dhl"
             ]
         ]
     }
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Directory/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Directory/README.md
index 450176d5650..b028b5b4c9c 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Directory/README.md
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Directory/README.md
@@ -1,3 +1,3 @@
-# Magento 2 Acceptance Tests
+# Magento 2 Functional Tests
 
-The Acceptance Tests Module for **Magento_Directory** Module.
+The Functional Tests Module for **Magento_Directory** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Directory/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Directory/composer.json
index 32891838350..1485278162d 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Directory/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Directory/composer.json
@@ -1,51 +1,39 @@
 {
     "name": "magento/magento2-functional-test-module-directory",
-    "description": "Magento 2 Acceptance Test Module Directory",
-    "repositories": [
-        {
-            "type" : "composer",
-            "url" : "https://repo.magento.com/"
-        }
-    ],
+    "description": "Magento 2 Functional Test Module Directory",
+    "config": {
+        "sort-packages": true
+    },
     "require": {
-        "php": "~7.0",
-        "codeception/codeception": "2.2|2.3",
-        "allure-framework/allure-codeception": "dev-master",
+        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
+        "codeception/codeception": "~2.3.4",
         "consolidation/robo": "^1.0.0",
         "henrikbjorn/lurker": "^1.2",
-        "vlucas/phpdotenv": "~2.4",
-        "magento/magento2-functional-testing-framework": "dev-develop"
+        "magento/magento2-functional-testing-framework": "1.0.0",
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
+        "vlucas/phpdotenv": "~2.4"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-store": "dev-master",
-        "magento/magento2-functional-test-module-config": "dev-master",
-        "magento/magento2-functional-test-module-backend": "dev-master"
+        "magento/magento2-functional-test-module-backend": "1.0.0",
+        "magento/magento2-functional-test-module-config": "1.0.0",
+        "magento/magento2-functional-test-module-store": "1.0.0"
     },
     "type": "magento2-test-module",
-    "version": "dev-master",
+    "version": "1.0.0",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
-        "psr-0": {
-            "Yandex": "vendor/allure-framework/allure-codeception/src/"
-        },
         "psr-4": {
-            "Magento\\FunctionalTestingFramework\\": [
-                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
-            ],
-            "Magento\\FunctionalTest\\": [
-                "tests/functional/Magento/FunctionalTest",
-                "generated/Magento/FunctionalTest"
-            ]
+            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
         }
     },
     "extra": {
         "map": [
             [
                 "*",
-                "tests/functional/Magento/FunctionalTest/Directory"
+                "dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Directory"
             ]
         ]
     }
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Downloadable/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Downloadable/README.md
index b32c7fd5a8d..cf2e356526c 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Downloadable/README.md
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Downloadable/README.md
@@ -1,3 +1,3 @@
-# Magento 2 Acceptance Tests
+# Magento 2 Functional Tests
 
-The Acceptance Tests Module for **Magento_Downloadable** Module.
+The Functional Tests Module for **Magento_Downloadable** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Downloadable/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Downloadable/composer.json
index 7f3a10bdbca..5622b5246c2 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Downloadable/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Downloadable/composer.json
@@ -1,64 +1,52 @@
 {
     "name": "magento/magento2-functional-test-module-downloadable",
-    "description": "Magento 2 Acceptance Test Module Downloadable",
-    "repositories": [
-        {
-            "type" : "composer",
-            "url" : "https://repo.magento.com/"
-        }
-    ],
+    "description": "Magento 2 Functional Test Module Downloadable",
+    "config": {
+        "sort-packages": true
+    },
     "require": {
-        "php": "~7.0",
-        "codeception/codeception": "2.2|2.3",
-        "allure-framework/allure-codeception": "dev-master",
+        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
+        "codeception/codeception": "~2.3.4",
         "consolidation/robo": "^1.0.0",
         "henrikbjorn/lurker": "^1.2",
-        "vlucas/phpdotenv": "~2.4",
-        "magento/magento2-functional-testing-framework": "dev-develop"
+        "magento/magento2-functional-testing-framework": "1.0.0",
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
+        "vlucas/phpdotenv": "~2.4"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-store": "dev-master",
-        "magento/magento2-functional-test-module-catalog": "dev-master",
-        "magento/magento2-functional-test-module-customer": "dev-master",
-        "magento/magento2-functional-test-module-tax": "dev-master",
-        "magento/magento2-functional-test-module-theme": "dev-master",
-        "magento/magento2-functional-test-module-eav": "dev-master",
-        "magento/magento2-functional-test-module-backend": "dev-master",
-        "magento/magento2-functional-test-module-sales": "dev-master",
-        "magento/magento2-functional-test-module-checkout": "dev-master",
-        "magento/magento2-functional-test-module-directory": "dev-master",
-        "magento/magento2-functional-test-module-gift-message": "dev-master",
-        "magento/magento2-functional-test-module-catalog-inventory": "dev-master",
-        "magento/magento2-functional-test-module-config": "dev-master",
-        "magento/magento2-functional-test-module-media-storage": "dev-master",
-        "magento/magento2-functional-test-module-quote": "dev-master",
-        "magento/magento2-functional-test-module-ui": "dev-master"
+        "magento/magento2-functional-test-module-backend": "1.0.0",
+        "magento/magento2-functional-test-module-catalog": "1.0.0",
+        "magento/magento2-functional-test-module-catalog-inventory": "1.0.0",
+        "magento/magento2-functional-test-module-checkout": "1.0.0",
+        "magento/magento2-functional-test-module-config": "1.0.0",
+        "magento/magento2-functional-test-module-customer": "1.0.0",
+        "magento/magento2-functional-test-module-directory": "1.0.0",
+        "magento/magento2-functional-test-module-eav": "1.0.0",
+        "magento/magento2-functional-test-module-gift-message": "1.0.0",
+        "magento/magento2-functional-test-module-media-storage": "1.0.0",
+        "magento/magento2-functional-test-module-quote": "1.0.0",
+        "magento/magento2-functional-test-module-sales": "1.0.0",
+        "magento/magento2-functional-test-module-store": "1.0.0",
+        "magento/magento2-functional-test-module-tax": "1.0.0",
+        "magento/magento2-functional-test-module-theme": "1.0.0",
+        "magento/magento2-functional-test-module-ui": "1.0.0"
     },
     "type": "magento2-test-module",
-    "version": "dev-master",
+    "version": "1.0.0",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
-        "psr-0": {
-            "Yandex": "vendor/allure-framework/allure-codeception/src/"
-        },
         "psr-4": {
-            "Magento\\FunctionalTestingFramework\\": [
-                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
-            ],
-            "Magento\\FunctionalTest\\": [
-                "tests/functional/Magento/FunctionalTest",
-                "generated/Magento/FunctionalTest"
-            ]
+            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
         }
     },
     "extra": {
         "map": [
             [
                 "*",
-                "tests/functional/Magento/FunctionalTest/Downloadable"
+                "dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Downloadable"
             ]
         ]
     }
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/DownloadableImportExport/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/DownloadableImportExport/README.md
index 7d1d4ce5938..7edcc4ffcb3 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/DownloadableImportExport/README.md
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/DownloadableImportExport/README.md
@@ -1,3 +1,3 @@
-# Magento 2 Acceptance Tests
+# Magento 2 Functional Tests
 
-The Acceptance Tests Module for **Magento_DownloadableImportExport** Module.
+The Functional Tests Module for **Magento_DownloadableImportExport** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/DownloadableImportExport/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/DownloadableImportExport/composer.json
index a6290026e9c..1be41e6ddcf 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/DownloadableImportExport/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/DownloadableImportExport/composer.json
@@ -1,54 +1,42 @@
 {
     "name": "magento/magento2-functional-test-module-downloadable-import-export",
-    "description": "Magento 2 Acceptance Test Module Downloadable Import Export",
-    "repositories": [
-        {
-            "type" : "composer",
-            "url" : "https://repo.magento.com/"
-        }
-    ],
+    "description": "Magento 2 Functional Test Module Downloadable Import Export",
+    "config": {
+        "sort-packages": true
+    },
     "require": {
-        "php": "~7.0",
-        "codeception/codeception": "2.2|2.3",
-        "allure-framework/allure-codeception": "dev-master",
+        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
+        "codeception/codeception": "~2.3.4",
         "consolidation/robo": "^1.0.0",
         "henrikbjorn/lurker": "^1.2",
-        "vlucas/phpdotenv": "~2.4",
-        "magento/magento2-functional-testing-framework": "dev-develop"
+        "magento/magento2-functional-testing-framework": "1.0.0",
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
+        "vlucas/phpdotenv": "~2.4"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-catalog": "dev-master",
-        "magento/magento2-functional-test-module-import-export": "dev-master",
-        "magento/magento2-functional-test-module-catalog-import-export": "dev-master",
-        "magento/magento2-functional-test-module-downloadable": "dev-master",
-        "magento/magento2-functional-test-module-store": "dev-master",
-        "magento/magento2-functional-test-module-eav": "dev-master"
+        "magento/magento2-functional-test-module-catalog": "1.0.0",
+        "magento/magento2-functional-test-module-catalog-import-export": "1.0.0",
+        "magento/magento2-functional-test-module-downloadable": "1.0.0",
+        "magento/magento2-functional-test-module-eav": "1.0.0",
+        "magento/magento2-functional-test-module-import-export": "1.0.0",
+        "magento/magento2-functional-test-module-store": "1.0.0"
     },
     "type": "magento2-test-module",
-    "version": "dev-master",
+    "version": "1.0.0",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
-        "psr-0": {
-            "Yandex": "vendor/allure-framework/allure-codeception/src/"
-        },
         "psr-4": {
-            "Magento\\FunctionalTestingFramework\\": [
-                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
-            ],
-            "Magento\\FunctionalTest\\": [
-                "tests/functional/Magento/FunctionalTest",
-                "generated/Magento/FunctionalTest"
-            ]
+            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
         }
     },
     "extra": {
         "map": [
             [
                 "*",
-                "tests/functional/Magento/FunctionalTest/DownloadableImportExport"
+                "dev/tests/acceptance/tests/functional/Magento/FunctionalTest/DownloadableImportExport"
             ]
         ]
     }
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Eav/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Eav/README.md
index 3ab73a4d5c7..23724b09bd2 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Eav/README.md
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Eav/README.md
@@ -1,3 +1,3 @@
-# Magento 2 Acceptance Tests
+# Magento 2 Functional Tests
 
-The Acceptance Tests Module for **Magento_EAV** Module.
+The Functional Tests Module for **Magento_Eav** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Eav/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Eav/composer.json
index 8052d51dfb3..c5f4aeabe23 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Eav/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Eav/composer.json
@@ -1,53 +1,41 @@
 {
     "name": "magento/magento2-functional-test-module-eav",
-    "description": "Magento 2 Acceptance Test Module Eav",
-    "repositories": [
-        {
-            "type" : "composer",
-            "url" : "https://repo.magento.com/"
-        }
-    ],
+    "description": "Magento 2 Functional Test Module Eav",
+    "config": {
+        "sort-packages": true
+    },
     "require": {
-        "php": "~7.0",
-        "codeception/codeception": "2.2|2.3",
-        "allure-framework/allure-codeception": "dev-master",
+        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
+        "codeception/codeception": "~2.3.4",
         "consolidation/robo": "^1.0.0",
         "henrikbjorn/lurker": "^1.2",
-        "vlucas/phpdotenv": "~2.4",
-        "magento/magento2-functional-testing-framework": "dev-develop"
+        "magento/magento2-functional-testing-framework": "1.0.0",
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
+        "vlucas/phpdotenv": "~2.4"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-store": "dev-master",
-        "magento/magento2-functional-test-module-backend": "dev-master",
-        "magento/magento2-functional-test-module-catalog": "dev-master",
-        "magento/magento2-functional-test-module-config": "dev-master",
-        "magento/magento2-functional-test-module-media-storage": "dev-master"
+        "magento/magento2-functional-test-module-backend": "1.0.0",
+        "magento/magento2-functional-test-module-catalog": "1.0.0",
+        "magento/magento2-functional-test-module-config": "1.0.0",
+        "magento/magento2-functional-test-module-media-storage": "1.0.0",
+        "magento/magento2-functional-test-module-store": "1.0.0"
     },
     "type": "magento2-test-module",
-    "version": "dev-master",
+    "version": "1.0.0",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
-        "psr-0": {
-            "Yandex": "vendor/allure-framework/allure-codeception/src/"
-        },
         "psr-4": {
-            "Magento\\FunctionalTestingFramework\\": [
-                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
-            ],
-            "Magento\\FunctionalTest\\": [
-                "tests/functional/Magento/FunctionalTest",
-                "generated/Magento/FunctionalTest"
-            ]
+            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
         }
     },
     "extra": {
         "map": [
             [
                 "*",
-                "tests/functional/Magento/FunctionalTest/Eav"
+                "dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Eav"
             ]
         ]
     }
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Email/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Email/README.md
index af55ead5c20..413b1bcbbb5 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Email/README.md
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Email/README.md
@@ -1,3 +1,3 @@
-# Magento 2 Acceptance Tests
+# Magento 2 Functional Tests
 
-The Acceptance Tests Module for **Magento_Email** Module.
+The Functional Tests Module for **Magento_Email** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Email/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Email/composer.json
index 98f01cf7ec5..0d13e60cb0e 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Email/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Email/composer.json
@@ -1,54 +1,42 @@
 {
     "name": "magento/magento2-functional-test-module-email",
-    "description": "Magento 2 Acceptance Test Module Email",
-    "repositories": [
-        {
-            "type" : "composer",
-            "url" : "https://repo.magento.com/"
-        }
-    ],
+    "description": "Magento 2 Functional Test Module Email",
+    "config": {
+        "sort-packages": true
+    },
     "require": {
-        "php": "~7.0",
-        "codeception/codeception": "2.2|2.3",
-        "allure-framework/allure-codeception": "dev-master",
+        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
+        "codeception/codeception": "~2.3.4",
         "consolidation/robo": "^1.0.0",
         "henrikbjorn/lurker": "^1.2",
-        "vlucas/phpdotenv": "~2.4",
-        "magento/magento2-functional-testing-framework": "dev-develop"
+        "magento/magento2-functional-testing-framework": "1.0.0",
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
+        "vlucas/phpdotenv": "~2.4"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-theme": "dev-master",
-        "magento/magento2-functional-test-module-config": "dev-master",
-        "magento/magento2-functional-test-module-store": "dev-master",
-        "magento/magento2-functional-test-module-cms": "dev-master",
-        "magento/magento2-functional-test-module-backend": "dev-master",
-        "magento/magento2-functional-test-module-variable": "dev-master"
+        "magento/magento2-functional-test-module-backend": "1.0.0",
+        "magento/magento2-functional-test-module-cms": "1.0.0",
+        "magento/magento2-functional-test-module-config": "1.0.0",
+        "magento/magento2-functional-test-module-store": "1.0.0",
+        "magento/magento2-functional-test-module-theme": "1.0.0",
+        "magento/magento2-functional-test-module-variable": "1.0.0"
     },
     "type": "magento2-test-module",
-    "version": "dev-master",
+    "version": "1.0.0",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
-        "psr-0": {
-            "Yandex": "vendor/allure-framework/allure-codeception/src/"
-        },
         "psr-4": {
-            "Magento\\FunctionalTestingFramework\\": [
-                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
-            ],
-            "Magento\\FunctionalTest\\": [
-                "tests/functional/Magento/FunctionalTest",
-                "generated/Magento/FunctionalTest"
-            ]
+            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
         }
     },
     "extra": {
         "map": [
             [
                 "*",
-                "tests/functional/Magento/FunctionalTest/Email"
+                "dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Email"
             ]
         ]
     }
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/EncryptionKey/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/EncryptionKey/README.md
index c37fc732b0b..61aa9a448b7 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/EncryptionKey/README.md
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/EncryptionKey/README.md
@@ -1,3 +1,3 @@
-# Magento 2 Acceptance Tests
+# Magento 2 Functional Tests
 
-The Acceptance Tests Module for **Magento_EncryptionKey** Module.
+The Functional Tests Module for **Magento_EncryptionKey** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/EncryptionKey/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/EncryptionKey/composer.json
index 933fe884401..3718de923da 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/EncryptionKey/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/EncryptionKey/composer.json
@@ -1,50 +1,38 @@
 {
     "name": "magento/magento2-functional-test-module-encryption-key",
-    "description": "Magento 2 Acceptance Test Module Encryption Key",
-    "repositories": [
-        {
-            "type" : "composer",
-            "url" : "https://repo.magento.com/"
-        }
-    ],
+    "description": "Magento 2 Functional Test Module Encryption Key",
+    "config": {
+        "sort-packages": true
+    },
     "require": {
-        "php": "~7.0",
-        "codeception/codeception": "2.2|2.3",
-        "allure-framework/allure-codeception": "dev-master",
+        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
+        "codeception/codeception": "~2.3.4",
         "consolidation/robo": "^1.0.0",
         "henrikbjorn/lurker": "^1.2",
-        "vlucas/phpdotenv": "~2.4",
-        "magento/magento2-functional-testing-framework": "dev-develop"
+        "magento/magento2-functional-testing-framework": "1.0.0",
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
+        "vlucas/phpdotenv": "~2.4"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-backend": "dev-master",
-        "magento/magento2-functional-test-module-config": "dev-master"
+        "magento/magento2-functional-test-module-backend": "1.0.0",
+        "magento/magento2-functional-test-module-config": "1.0.0"
     },
     "type": "magento2-test-module",
-    "version": "dev-master",
+    "version": "1.0.0",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
-        "psr-0": {
-            "Yandex": "vendor/allure-framework/allure-codeception/src/"
-        },
         "psr-4": {
-            "Magento\\FunctionalTestingFramework\\": [
-                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
-            ],
-            "Magento\\FunctionalTest\\": [
-                "tests/functional/Magento/FunctionalTest",
-                "generated/Magento/FunctionalTest"
-            ]
+            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
         }
     },
     "extra": {
         "map": [
             [
                 "*",
-                "tests/functional/Magento/FunctionalTest/EncryptionKey"
+                "dev/tests/acceptance/tests/functional/Magento/FunctionalTest/EncryptionKey"
             ]
         ]
     }
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Fedex/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Fedex/README.md
index cd33bda917f..93d1828ef4c 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Fedex/README.md
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Fedex/README.md
@@ -1,3 +1,3 @@
-# Magento 2 Acceptance Tests
+# Magento 2 Functional Tests
 
-The Acceptance Tests Module for **Magento_Fedex** Module.
+The Functional Tests Module for **Magento_Fedex** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Fedex/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Fedex/composer.json
index f5102092a43..b55a5d5efad 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Fedex/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Fedex/composer.json
@@ -1,56 +1,44 @@
 {
     "name": "magento/magento2-functional-test-module-fedex",
-    "description": "Magento 2 Acceptance Test Module Fedex",
-    "repositories": [
-        {
-            "type" : "composer",
-            "url" : "https://repo.magento.com/"
-        }
-    ],
+    "description": "Magento 2 Functional Test Module Fedex",
+    "config": {
+        "sort-packages": true
+    },
     "require": {
-        "php": "~7.0",
-        "codeception/codeception": "2.2|2.3",
-        "allure-framework/allure-codeception": "dev-master",
+        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
+        "codeception/codeception": "~2.3.4",
         "consolidation/robo": "^1.0.0",
         "henrikbjorn/lurker": "^1.2",
-        "vlucas/phpdotenv": "~2.4",
-        "magento/magento2-functional-testing-framework": "dev-develop"
+        "magento/magento2-functional-testing-framework": "1.0.0",
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
+        "vlucas/phpdotenv": "~2.4"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-store": "dev-master",
-        "magento/magento2-functional-test-module-shipping": "dev-master",
-        "magento/magento2-functional-test-module-directory": "dev-master",
-        "magento/magento2-functional-test-module-catalog": "dev-master",
-        "magento/magento2-functional-test-module-sales": "dev-master",
-        "magento/magento2-functional-test-module-catalog-inventory": "dev-master",
-        "magento/magento2-functional-test-module-quote": "dev-master",
-        "magento/magento2-functional-test-module-config": "dev-master"
+        "magento/magento2-functional-test-module-catalog": "1.0.0",
+        "magento/magento2-functional-test-module-catalog-inventory": "1.0.0",
+        "magento/magento2-functional-test-module-config": "1.0.0",
+        "magento/magento2-functional-test-module-directory": "1.0.0",
+        "magento/magento2-functional-test-module-quote": "1.0.0",
+        "magento/magento2-functional-test-module-sales": "1.0.0",
+        "magento/magento2-functional-test-module-shipping": "1.0.0",
+        "magento/magento2-functional-test-module-store": "1.0.0"
     },
     "type": "magento2-test-module",
-    "version": "dev-master",
+    "version": "1.0.0",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
-        "psr-0": {
-            "Yandex": "vendor/allure-framework/allure-codeception/src/"
-        },
         "psr-4": {
-            "Magento\\FunctionalTestingFramework\\": [
-                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
-            ],
-            "Magento\\FunctionalTest\\": [
-                "tests/functional/Magento/FunctionalTest",
-                "generated/Magento/FunctionalTest"
-            ]
+            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
         }
     },
     "extra": {
         "map": [
             [
                 "*",
-                "tests/functional/Magento/FunctionalTest/Fedex"
+                "dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Fedex"
             ]
         ]
     }
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GiftMessage/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GiftMessage/README.md
index bc57464b7ed..49fd114a43a 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GiftMessage/README.md
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GiftMessage/README.md
@@ -1,3 +1,3 @@
-# Magento 2 Acceptance Tests
+# Magento 2 Functional Tests
 
-The Acceptance Tests Module for **Magento_GiftMessage** Module.
+The Functional Tests Module for **Magento_GiftMessage** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GiftMessage/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GiftMessage/composer.json
index cf76a42eddc..8a65032c600 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GiftMessage/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GiftMessage/composer.json
@@ -1,56 +1,44 @@
 {
     "name": "magento/magento2-functional-test-module-gift-message",
-    "description": "Magento 2 Acceptance Test Module Gift Message",
-    "repositories": [
-        {
-            "type" : "composer",
-            "url" : "https://repo.magento.com/"
-        }
-    ],
+    "description": "Magento 2 Functional Test Module Gift Message",
+    "config": {
+        "sort-packages": true
+    },
     "require": {
-        "php": "~7.0",
-        "codeception/codeception": "2.2|2.3",
-        "allure-framework/allure-codeception": "dev-master",
+        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
+        "codeception/codeception": "~2.3.4",
         "consolidation/robo": "^1.0.0",
         "henrikbjorn/lurker": "^1.2",
-        "vlucas/phpdotenv": "~2.4",
-        "magento/magento2-functional-testing-framework": "dev-develop"
+        "magento/magento2-functional-testing-framework": "1.0.0",
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
+        "vlucas/phpdotenv": "~2.4"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-store": "dev-master",
-        "magento/magento2-functional-test-module-catalog": "dev-master",
-        "magento/magento2-functional-test-module-checkout": "dev-master",
-        "magento/magento2-functional-test-module-sales": "dev-master",
-        "magento/magento2-functional-test-module-backend": "dev-master",
-        "magento/magento2-functional-test-module-customer": "dev-master",
-        "magento/magento2-functional-test-module-quote": "dev-master",
-        "magento/magento2-functional-test-module-ui": "dev-master"
+        "magento/magento2-functional-test-module-backend": "1.0.0",
+        "magento/magento2-functional-test-module-catalog": "1.0.0",
+        "magento/magento2-functional-test-module-checkout": "1.0.0",
+        "magento/magento2-functional-test-module-customer": "1.0.0",
+        "magento/magento2-functional-test-module-quote": "1.0.0",
+        "magento/magento2-functional-test-module-sales": "1.0.0",
+        "magento/magento2-functional-test-module-store": "1.0.0",
+        "magento/magento2-functional-test-module-ui": "1.0.0"
     },
     "type": "magento2-test-module",
-    "version": "dev-master",
+    "version": "1.0.0",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
-        "psr-0": {
-            "Yandex": "vendor/allure-framework/allure-codeception/src/"
-        },
         "psr-4": {
-            "Magento\\FunctionalTestingFramework\\": [
-                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
-            ],
-            "Magento\\FunctionalTest\\": [
-                "tests/functional/Magento/FunctionalTest",
-                "generated/Magento/FunctionalTest"
-            ]
+            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
         }
     },
     "extra": {
         "map": [
             [
                 "*",
-                "tests/functional/Magento/FunctionalTest/GiftMessage"
+                "dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GiftMessage"
             ]
         ]
     }
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GoogleAdwords/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GoogleAdwords/README.md
index 14b40663eff..6e3595cd366 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GoogleAdwords/README.md
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GoogleAdwords/README.md
@@ -1,3 +1,3 @@
-# Magento 2 Acceptance Tests
+# Magento 2 Functional Tests
 
-The Acceptance Tests Module for **Magento_GoogleAdwords** Module.
+The Functional Tests Module for **Magento_GoogleAdwords** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GoogleAdwords/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GoogleAdwords/composer.json
index ca0a31fa031..e95d81c5168 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GoogleAdwords/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GoogleAdwords/composer.json
@@ -1,50 +1,38 @@
 {
     "name": "magento/magento2-functional-test-module-google-adwords",
-    "description": "Magento 2 Acceptance Test Module Google Adwords",
-    "repositories": [
-        {
-            "type" : "composer",
-            "url" : "https://repo.magento.com/"
-        }
-    ],
+    "description": "Magento 2 Functional Test Module Google Adwords",
+    "config": {
+        "sort-packages": true
+    },
     "require": {
-        "php": "~7.0",
-        "codeception/codeception": "2.2|2.3",
-        "allure-framework/allure-codeception": "dev-master",
+        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
+        "codeception/codeception": "~2.3.4",
         "consolidation/robo": "^1.0.0",
         "henrikbjorn/lurker": "^1.2",
-        "vlucas/phpdotenv": "~2.4",
-        "magento/magento2-functional-testing-framework": "dev-develop"
+        "magento/magento2-functional-testing-framework": "1.0.0",
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
+        "vlucas/phpdotenv": "~2.4"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-store": "dev-master",
-        "magento/magento2-functional-test-module-sales": "dev-master"
+        "magento/magento2-functional-test-module-sales": "1.0.0",
+        "magento/magento2-functional-test-module-store": "1.0.0"
     },
     "type": "magento2-test-module",
-    "version": "dev-master",
+    "version": "1.0.0",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
-        "psr-0": {
-            "Yandex": "vendor/allure-framework/allure-codeception/src/"
-        },
         "psr-4": {
-            "Magento\\FunctionalTestingFramework\\": [
-                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
-            ],
-            "Magento\\FunctionalTest\\": [
-                "tests/functional/Magento/FunctionalTest",
-                "generated/Magento/FunctionalTest"
-            ]
+            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
         }
     },
     "extra": {
         "map": [
             [
                 "*",
-                "tests/functional/Magento/FunctionalTest/GoogleAdwords"
+                "dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GoogleAdwords"
             ]
         ]
     }
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GoogleAnalytics/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GoogleAnalytics/README.md
index 28c1ed435ea..0fa9dbd614a 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GoogleAnalytics/README.md
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GoogleAnalytics/README.md
@@ -1,3 +1,3 @@
-# Magento 2 Acceptance Tests
+# Magento 2 Functional Tests
 
-The Acceptance Tests Module for **Magento_GoogleAnalytics** Module.
+The Functional Tests Module for **Magento_GoogleAnalytics** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GoogleAnalytics/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GoogleAnalytics/composer.json
index 5bbef3c149b..46a8d634b7e 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GoogleAnalytics/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GoogleAnalytics/composer.json
@@ -1,51 +1,39 @@
 {
     "name": "magento/magento2-functional-test-module-google-analytics",
-    "description": "Magento 2 Acceptance Test Module Google Analytics",
-    "repositories": [
-        {
-            "type" : "composer",
-            "url" : "https://repo.magento.com/"
-        }
-    ],
+    "description": "Magento 2 Functional Test Module Google Analytics",
+    "config": {
+        "sort-packages": true
+    },
     "require": {
-        "php": "~7.0",
-        "codeception/codeception": "2.2|2.3",
-        "allure-framework/allure-codeception": "dev-master",
+        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
+        "codeception/codeception": "~2.3.4",
         "consolidation/robo": "^1.0.0",
         "henrikbjorn/lurker": "^1.2",
-        "vlucas/phpdotenv": "~2.4",
-        "magento/magento2-functional-testing-framework": "dev-develop"
+        "magento/magento2-functional-testing-framework": "1.0.0",
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
+        "vlucas/phpdotenv": "~2.4"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-store": "dev-master",
-        "magento/magento2-functional-test-module-sales": "dev-master",
-        "magento/magento2-functional-test-module-cookie": "dev-master"
+        "magento/magento2-functional-test-module-cookie": "1.0.0",
+        "magento/magento2-functional-test-module-sales": "1.0.0",
+        "magento/magento2-functional-test-module-store": "1.0.0"
     },
     "type": "magento2-test-module",
-    "version": "dev-master",
+    "version": "1.0.0",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
-        "psr-0": {
-            "Yandex": "vendor/allure-framework/allure-codeception/src/"
-        },
         "psr-4": {
-            "Magento\\FunctionalTestingFramework\\": [
-                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
-            ],
-            "Magento\\FunctionalTest\\": [
-                "tests/functional/Magento/FunctionalTest",
-                "generated/Magento/FunctionalTest"
-            ]
+            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
         }
     },
     "extra": {
         "map": [
             [
                 "*",
-                "tests/functional/Magento/FunctionalTest/GoogleAnalytics"
+                "dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GoogleAnalytics"
             ]
         ]
     }
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GoogleOptimizer/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GoogleOptimizer/README.md
index cf934ee7882..9bdf02b6170 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GoogleOptimizer/README.md
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GoogleOptimizer/README.md
@@ -1,3 +1,3 @@
-# Magento 2 Acceptance Tests
+# Magento 2 Functional Tests
 
-The Acceptance Tests Module for **Magento_GoogleOptimizer** Module.
+The Functional Tests Module for **Magento_GoogleOptimizer** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GoogleOptimizer/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GoogleOptimizer/composer.json
index 1454630bd0a..820a7ae8b10 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GoogleOptimizer/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GoogleOptimizer/composer.json
@@ -1,54 +1,42 @@
 {
     "name": "magento/magento2-functional-test-module-google-optimizer",
-    "description": "Magento 2 Acceptance Test Module Google Optimizer",
-    "repositories": [
-        {
-            "type" : "composer",
-            "url" : "https://repo.magento.com/"
-        }
-    ],
+    "description": "Magento 2 Functional Test Module Google Optimizer",
+    "config": {
+        "sort-packages": true
+    },
     "require": {
-        "php": "~7.0",
-        "codeception/codeception": "2.2|2.3",
-        "allure-framework/allure-codeception": "dev-master",
+        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
+        "codeception/codeception": "~2.3.4",
         "consolidation/robo": "^1.0.0",
         "henrikbjorn/lurker": "^1.2",
-        "vlucas/phpdotenv": "~2.4",
-        "magento/magento2-functional-testing-framework": "dev-develop"
+        "magento/magento2-functional-testing-framework": "1.0.0",
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
+        "vlucas/phpdotenv": "~2.4"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-store": "dev-master",
-        "magento/magento2-functional-test-module-google-analytics": "dev-master",
-        "magento/magento2-functional-test-module-catalog": "dev-master",
-        "magento/magento2-functional-test-module-cms": "dev-master",
-        "magento/magento2-functional-test-module-backend": "dev-master",
-        "magento/magento2-functional-test-module-ui": "dev-master"
+        "magento/magento2-functional-test-module-backend": "1.0.0",
+        "magento/magento2-functional-test-module-catalog": "1.0.0",
+        "magento/magento2-functional-test-module-cms": "1.0.0",
+        "magento/magento2-functional-test-module-google-analytics": "1.0.0",
+        "magento/magento2-functional-test-module-store": "1.0.0",
+        "magento/magento2-functional-test-module-ui": "1.0.0"
     },
     "type": "magento2-test-module",
-    "version": "dev-master",
+    "version": "1.0.0",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
-        "psr-0": {
-            "Yandex": "vendor/allure-framework/allure-codeception/src/"
-        },
         "psr-4": {
-            "Magento\\FunctionalTestingFramework\\": [
-                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
-            ],
-            "Magento\\FunctionalTest\\": [
-                "tests/functional/Magento/FunctionalTest",
-                "generated/Magento/FunctionalTest"
-            ]
+            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
         }
     },
     "extra": {
         "map": [
             [
                 "*",
-                "tests/functional/Magento/FunctionalTest/GoogleOptimizer"
+                "dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GoogleOptimizer"
             ]
         ]
     }
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GraphQl/LICENSE.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GraphQl/LICENSE.txt
new file mode 100644
index 00000000000..49525fd99da
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GraphQl/LICENSE.txt
@@ -0,0 +1,48 @@
+
+Open Software License ("OSL") v. 3.0
+
+This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Open Software License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Open Software License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly. 
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including 'fair use' or 'fair dealing'). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright (C) 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GraphQl/LICENSE_AFL.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GraphQl/LICENSE_AFL.txt
new file mode 100644
index 00000000000..f39d641b18a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GraphQl/LICENSE_AFL.txt
@@ -0,0 +1,48 @@
+
+Academic Free License ("AFL") v. 3.0
+
+This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Academic Free License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, under any license of your choice that does not contradict the terms and conditions, including Licensor's reserved rights and remedies, in this Academic Free License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly.
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including "fair use" or "fair dealing"). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright © 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Academic Free License" or "AFL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GraphQl/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GraphQl/README.md
new file mode 100644
index 00000000000..1f48eef7f97
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GraphQl/README.md
@@ -0,0 +1,3 @@
+# Magento 2 Functional Tests
+
+The Functional Tests Module for **Magento_GraphQl** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GraphQl/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GraphQl/composer.json
new file mode 100644
index 00000000000..ff338103d9d
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GraphQl/composer.json
@@ -0,0 +1,40 @@
+{
+    "name": "magento/magento2-functional-test-module-graph-ql",
+    "description": "Magento 2 Functional Test Module Graph Ql",
+    "config": {
+        "sort-packages": true
+    },
+    "require": {
+        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
+        "codeception/codeception": "~2.3.4",
+        "consolidation/robo": "^1.0.0",
+        "henrikbjorn/lurker": "^1.2",
+        "magento/magento2-functional-testing-framework": "1.0.0",
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
+        "vlucas/phpdotenv": "~2.4"
+    },
+    "suggest": {
+        "magento/magento2-functional-test-module-webapi": "1.0.0",
+        "magento/magento2-functional-test-module-eav": "1.0.0",
+        "magento/magento2-functional-test-module-catalog": "1.0.0"
+    },
+    "type": "magento2-test-module",
+    "version": "1.0.0",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
+    "autoload": {
+        "psr-4": {
+            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
+        }
+    },
+    "extra": {
+        "map": [
+            [
+                "*",
+                "dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GraphQl"
+            ]
+        ]
+    }
+}
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GroupedImportExport/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GroupedImportExport/composer.json
index faafa32659f..cd96b7a0efe 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GroupedImportExport/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GroupedImportExport/composer.json
@@ -1,53 +1,41 @@
 {
     "name": "magento/magento2-functional-test-module-grouped-import-export",
-    "description": "Magento 2 Acceptance Test Module Grouped Import Export",
-    "repositories": [
-        {
-            "type" : "composer",
-            "url" : "https://repo.magento.com/"
-        }
-    ],
+    "description": "Magento 2 Functional Test Module Grouped Import Export",
+    "config": {
+        "sort-packages": true
+    },
     "require": {
-        "php": "~7.0",
-        "codeception/codeception": "2.2|2.3",
-        "allure-framework/allure-codeception": "dev-master",
+        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
+        "codeception/codeception": "~2.3.4",
         "consolidation/robo": "^1.0.0",
         "henrikbjorn/lurker": "^1.2",
-        "vlucas/phpdotenv": "~2.4",
-        "magento/magento2-functional-testing-framework": "dev-develop"
+        "magento/magento2-functional-testing-framework": "1.0.0",
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
+        "vlucas/phpdotenv": "~2.4"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-catalog": "dev-master",
-        "magento/magento2-functional-test-module-import-export": "dev-master",
-        "magento/magento2-functional-test-module-catalog-import-export": "dev-master",
-        "magento/magento2-functional-test-module-grouped-product": "dev-master",
-        "magento/magento2-functional-test-module-eav": "dev-master"
+        "magento/magento2-functional-test-module-catalog": "1.0.0",
+        "magento/magento2-functional-test-module-catalog-import-export": "1.0.0",
+        "magento/magento2-functional-test-module-eav": "1.0.0",
+        "magento/magento2-functional-test-module-grouped-product": "1.0.0",
+        "magento/magento2-functional-test-module-import-export": "1.0.0"
     },
     "type": "magento2-test-module",
-    "version": "dev-master",
+    "version": "1.0.0",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
-        "psr-0": {
-            "Yandex": "vendor/allure-framework/allure-codeception/src/"
-        },
         "psr-4": {
-            "Magento\\FunctionalTestingFramework\\": [
-                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
-            ],
-            "Magento\\FunctionalTest\\": [
-                "tests/functional/Magento/FunctionalTest",
-                "generated/Magento/FunctionalTest"
-            ]
+            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
         }
     },
     "extra": {
         "map": [
             [
                 "*",
-                "tests/functional/Magento/FunctionalTest/GroupedImportExport"
+                "dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GroupedImportExport"
             ]
         ]
     }
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GroupedProduct/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GroupedProduct/README.md
index ed07eaabba7..edf1e0dc3d2 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GroupedProduct/README.md
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GroupedProduct/README.md
@@ -1,3 +1,3 @@
-# Magento 2 Acceptance Tests
+# Magento 2 Functional Tests
 
-The Acceptance Tests Module for **Magento_GroupedProduct** Module.
+The Functional Tests Module for **Magento_GroupedProduct** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GroupedProduct/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GroupedProduct/composer.json
index 7b76ef1ad97..4305a6bdb52 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GroupedProduct/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GroupedProduct/composer.json
@@ -1,60 +1,48 @@
 {
     "name": "magento/magento2-functional-test-module-grouped-product",
-    "description": "Magento 2 Acceptance Test Module Grouped Product",
-    "repositories": [
-        {
-            "type" : "composer",
-            "url" : "https://repo.magento.com/"
-        }
-    ],
+    "description": "Magento 2 Functional Test Module Grouped Product",
+    "config": {
+        "sort-packages": true
+    },
     "require": {
-        "php": "~7.0",
-        "codeception/codeception": "2.2|2.3",
-        "allure-framework/allure-codeception": "dev-master",
+        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
+        "codeception/codeception": "~2.3.4",
         "consolidation/robo": "^1.0.0",
         "henrikbjorn/lurker": "^1.2",
-        "vlucas/phpdotenv": "~2.4",
-        "magento/magento2-functional-testing-framework": "dev-develop"
+        "magento/magento2-functional-testing-framework": "1.0.0",
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
+        "vlucas/phpdotenv": "~2.4"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-store": "dev-master",
-        "magento/magento2-functional-test-module-catalog": "dev-master",
-        "magento/magento2-functional-test-module-catalog-inventory": "dev-master",
-        "magento/magento2-functional-test-module-sales": "dev-master",
-        "magento/magento2-functional-test-module-checkout": "dev-master",
-        "magento/magento2-functional-test-module-backend": "dev-master",
-        "magento/magento2-functional-test-module-eav": "dev-master",
-        "magento/magento2-functional-test-module-customer": "dev-master",
-        "magento/magento2-functional-test-module-media-storage": "dev-master",
-        "magento/magento2-functional-test-module-msrp": "dev-master",
-        "magento/magento2-functional-test-module-quote": "dev-master",
-        "magento/magento2-functional-test-module-ui": "dev-master"
+        "magento/magento2-functional-test-module-backend": "1.0.0",
+        "magento/magento2-functional-test-module-catalog": "1.0.0",
+        "magento/magento2-functional-test-module-catalog-inventory": "1.0.0",
+        "magento/magento2-functional-test-module-checkout": "1.0.0",
+        "magento/magento2-functional-test-module-customer": "1.0.0",
+        "magento/magento2-functional-test-module-eav": "1.0.0",
+        "magento/magento2-functional-test-module-media-storage": "1.0.0",
+        "magento/magento2-functional-test-module-msrp": "1.0.0",
+        "magento/magento2-functional-test-module-quote": "1.0.0",
+        "magento/magento2-functional-test-module-sales": "1.0.0",
+        "magento/magento2-functional-test-module-store": "1.0.0",
+        "magento/magento2-functional-test-module-ui": "1.0.0"
     },
     "type": "magento2-test-module",
-    "version": "dev-master",
+    "version": "1.0.0",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
-        "psr-0": {
-            "Yandex": "vendor/allure-framework/allure-codeception/src/"
-        },
         "psr-4": {
-            "Magento\\FunctionalTestingFramework\\": [
-                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
-            ],
-            "Magento\\FunctionalTest\\": [
-                "tests/functional/Magento/FunctionalTest",
-                "generated/Magento/FunctionalTest"
-            ]
+            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
         }
     },
     "extra": {
         "map": [
             [
                 "*",
-                "tests/functional/Magento/FunctionalTest/GroupedProduct"
+                "dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GroupedProduct"
             ]
         ]
     }
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ImportExport/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ImportExport/README.md
index 5723866dc44..b762f5fb735 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ImportExport/README.md
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ImportExport/README.md
@@ -1,3 +1,3 @@
-# Magento 2 Acceptance Tests
+# Magento 2 Functional Tests
 
-The Acceptance Tests Module for **Magento_ImportExport** Module.
+The Functional Tests Module for **Magento_ImportExport** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ImportExport/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ImportExport/composer.json
index 1e254c70045..20662b4f76d 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ImportExport/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ImportExport/composer.json
@@ -1,53 +1,41 @@
 {
     "name": "magento/magento2-functional-test-module-import-export",
-    "description": "Magento 2 Acceptance Test Module Import Export",
-    "repositories": [
-        {
-            "type" : "composer",
-            "url" : "https://repo.magento.com/"
-        }
-    ],
+    "description": "Magento 2 Functional Test Module Import Export",
+    "config": {
+        "sort-packages": true
+    },
     "require": {
-        "php": "~7.0",
-        "codeception/codeception": "2.2|2.3",
-        "allure-framework/allure-codeception": "dev-master",
+        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
+        "codeception/codeception": "~2.3.4",
         "consolidation/robo": "^1.0.0",
         "henrikbjorn/lurker": "^1.2",
-        "vlucas/phpdotenv": "~2.4",
-        "magento/magento2-functional-testing-framework": "dev-develop"
+        "magento/magento2-functional-testing-framework": "1.0.0",
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
+        "vlucas/phpdotenv": "~2.4"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-catalog": "dev-master",
-        "magento/magento2-functional-test-module-store": "dev-master",
-        "magento/magento2-functional-test-module-backend": "dev-master",
-        "magento/magento2-functional-test-module-eav": "dev-master",
-        "magento/magento2-functional-test-module-media-storage": "dev-master"
+        "magento/magento2-functional-test-module-backend": "1.0.0",
+        "magento/magento2-functional-test-module-catalog": "1.0.0",
+        "magento/magento2-functional-test-module-eav": "1.0.0",
+        "magento/magento2-functional-test-module-media-storage": "1.0.0",
+        "magento/magento2-functional-test-module-store": "1.0.0"
     },
     "type": "magento2-test-module",
-    "version": "dev-master",
+    "version": "1.0.0",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
-        "psr-0": {
-            "Yandex": "vendor/allure-framework/allure-codeception/src/"
-        },
         "psr-4": {
-            "Magento\\FunctionalTestingFramework\\": [
-                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
-            ],
-            "Magento\\FunctionalTest\\": [
-                "tests/functional/Magento/FunctionalTest",
-                "generated/Magento/FunctionalTest"
-            ]
+            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
         }
     },
     "extra": {
         "map": [
             [
                 "*",
-                "tests/functional/Magento/FunctionalTest/ImportExport"
+                "dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ImportExport"
             ]
         ]
     }
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Indexer/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Indexer/README.md
index f59821dc099..21212a0fed3 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Indexer/README.md
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Indexer/README.md
@@ -1,3 +1,3 @@
-# Magento 2 Acceptance Tests
+# Magento 2 Functional Tests
 
-The Acceptance Tests Module for **Magento_Indexer** Module.
+The Functional Tests Module for **Magento_Indexer** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Indexer/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Indexer/composer.json
index a56ee31fae1..e8372f1d9be 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Indexer/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Indexer/composer.json
@@ -1,49 +1,37 @@
 {
     "name": "magento/magento2-functional-test-module-indexer",
-    "description": "Magento 2 Acceptance Test Module Indexer",
-    "repositories": [
-        {
-            "type" : "composer",
-            "url" : "https://repo.magento.com/"
-        }
-    ],
+    "description": "Magento 2 Functional Test Module Indexer",
+    "config": {
+        "sort-packages": true
+    },
     "require": {
-        "php": "~7.0",
-        "codeception/codeception": "2.2|2.3",
-        "allure-framework/allure-codeception": "dev-master",
+        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
+        "codeception/codeception": "~2.3.4",
         "consolidation/robo": "^1.0.0",
         "henrikbjorn/lurker": "^1.2",
-        "vlucas/phpdotenv": "~2.4",
-        "magento/magento2-functional-testing-framework": "dev-develop"
+        "magento/magento2-functional-testing-framework": "1.0.0",
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
+        "vlucas/phpdotenv": "~2.4"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-backend": "dev-master"
+        "magento/magento2-functional-test-module-backend": "1.0.0"
     },
     "type": "magento2-test-module",
-    "version": "dev-master",
+    "version": "1.0.0",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
-        "psr-0": {
-            "Yandex": "vendor/allure-framework/allure-codeception/src/"
-        },
         "psr-4": {
-            "Magento\\FunctionalTestingFramework\\": [
-                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
-            ],
-            "Magento\\FunctionalTest\\": [
-                "tests/functional/Magento/FunctionalTest",
-                "generated/Magento/FunctionalTest"
-            ]
+            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
         }
     },
     "extra": {
         "map": [
             [
                 "*",
-                "tests/functional/Magento/FunctionalTest/Indexer"
+                "dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Indexer"
             ]
         ]
     }
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/InstantPurchase/LICENSE.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/InstantPurchase/LICENSE.txt
new file mode 100644
index 00000000000..49525fd99da
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/InstantPurchase/LICENSE.txt
@@ -0,0 +1,48 @@
+
+Open Software License ("OSL") v. 3.0
+
+This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Open Software License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Open Software License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly. 
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including 'fair use' or 'fair dealing'). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright (C) 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/InstantPurchase/LICENSE_AFL.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/InstantPurchase/LICENSE_AFL.txt
new file mode 100644
index 00000000000..f39d641b18a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/InstantPurchase/LICENSE_AFL.txt
@@ -0,0 +1,48 @@
+
+Academic Free License ("AFL") v. 3.0
+
+This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Academic Free License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, under any license of your choice that does not contradict the terms and conditions, including Licensor's reserved rights and remedies, in this Academic Free License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly.
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including "fair use" or "fair dealing"). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright © 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Academic Free License" or "AFL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/InstantPurchase/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/InstantPurchase/README.md
new file mode 100644
index 00000000000..9975174d27e
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/InstantPurchase/README.md
@@ -0,0 +1,3 @@
+# Magento 2 Functional Tests
+
+The Functional Tests Module for **Magento_InstantPurchase** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/InstantPurchase/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/InstantPurchase/composer.json
new file mode 100644
index 00000000000..d525694a3ae
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/InstantPurchase/composer.json
@@ -0,0 +1,43 @@
+{
+    "name": "magento/magento2-functional-test-module-instant-purchase",
+    "description": "Magento 2 Functional Test Module Instant Purchase",
+    "config": {
+        "sort-packages": true
+    },
+    "require": {
+        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
+        "codeception/codeception": "~2.3.4",
+        "consolidation/robo": "^1.0.0",
+        "henrikbjorn/lurker": "^1.2",
+        "magento/magento2-functional-testing-framework": "1.0.0",
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
+        "vlucas/phpdotenv": "~2.4"
+    },
+    "suggest": {
+        "magento/magento2-functional-test-module-store": "1.0.0",
+        "magento/magento2-functional-test-module-catalog": "1.0.0",
+        "magento/magento2-functional-test-module-customer": "1.0.0",
+        "magento/magento2-functional-test-module-sales": "1.0.0",
+        "magento/magento2-functional-test-module-quote": "1.0.0",
+        "magento/magento2-functional-test-module-vault": "1.0.0"
+    },
+    "type": "magento2-test-module",
+    "version": "1.0.0",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
+    "autoload": {
+        "psr-4": {
+            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
+        }
+    },
+    "extra": {
+        "map": [
+            [
+                "*",
+                "dev/tests/acceptance/tests/functional/Magento/FunctionalTest/InstantPurchase"
+            ]
+        ]
+    }
+}
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Integration/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Integration/README.md
index 08c9cd5f24f..2f024c81e51 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Integration/README.md
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Integration/README.md
@@ -1,3 +1,3 @@
-# Magento 2 Acceptance Tests
+# Magento 2 Functional Tests
 
-The Acceptance Tests Module for **Magento_Integration** Module.
+The Functional Tests Module for **Magento_Integration** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Integration/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Integration/composer.json
index 2c776a48ae4..3e95a348991 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Integration/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Integration/composer.json
@@ -1,54 +1,42 @@
 {
     "name": "magento/magento2-functional-test-module-integration",
-    "description": "Magento 2 Acceptance Test Module Integration",
-    "repositories": [
-        {
-            "type" : "composer",
-            "url" : "https://repo.magento.com/"
-        }
-    ],
+    "description": "Magento 2 Functional Test Module Integration",
+    "config": {
+        "sort-packages": true
+    },
     "require": {
-        "php": "~7.0",
-        "codeception/codeception": "2.2|2.3",
-        "allure-framework/allure-codeception": "dev-master",
+        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
+        "codeception/codeception": "~2.3.4",
         "consolidation/robo": "^1.0.0",
         "henrikbjorn/lurker": "^1.2",
-        "vlucas/phpdotenv": "~2.4",
-        "magento/magento2-functional-testing-framework": "dev-develop"
+        "magento/magento2-functional-testing-framework": "1.0.0",
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
+        "vlucas/phpdotenv": "~2.4"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-store": "dev-master",
-        "magento/magento2-functional-test-module-backend": "dev-master",
-        "magento/magento2-functional-test-module-customer": "dev-master",
-        "magento/magento2-functional-test-module-user": "dev-master",
-        "magento/magento2-functional-test-module-security": "dev-master",
-        "magento/magento2-functional-test-module-authorization": "dev-master"
+        "magento/magento2-functional-test-module-authorization": "1.0.0",
+        "magento/magento2-functional-test-module-backend": "1.0.0",
+        "magento/magento2-functional-test-module-customer": "1.0.0",
+        "magento/magento2-functional-test-module-security": "1.0.0",
+        "magento/magento2-functional-test-module-store": "1.0.0",
+        "magento/magento2-functional-test-module-user": "1.0.0"
     },
     "type": "magento2-test-module",
-    "version": "dev-master",
+    "version": "1.0.0",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
-        "psr-0": {
-            "Yandex": "vendor/allure-framework/allure-codeception/src/"
-        },
         "psr-4": {
-            "Magento\\FunctionalTestingFramework\\": [
-                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
-            ],
-            "Magento\\FunctionalTest\\": [
-                "tests/functional/Magento/FunctionalTest",
-                "generated/Magento/FunctionalTest"
-            ]
+            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
         }
     },
     "extra": {
         "map": [
             [
                 "*",
-                "tests/functional/Magento/FunctionalTest/Integration"
+                "dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Integration"
             ]
         ]
     }
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/LayeredNavigation/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/LayeredNavigation/README.md
index 89ac42d6134..6c864b9f5ee 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/LayeredNavigation/README.md
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/LayeredNavigation/README.md
@@ -1,3 +1,3 @@
-# Magento 2 Acceptance Tests
+# Magento 2 Functional Tests
 
-The Acceptance Tests Module for **Magento_LayeredNavigation** Module.
+The Functional Tests Module for **Magento_LayeredNavigation** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/LayeredNavigation/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/LayeredNavigation/composer.json
index 5b74e905bee..7aa8b370aec 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/LayeredNavigation/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/LayeredNavigation/composer.json
@@ -1,50 +1,38 @@
 {
     "name": "magento/magento2-functional-test-module-layered-navigation",
-    "description": "Magento 2 Acceptance Test Module Layered Navigation",
-    "repositories": [
-        {
-            "type" : "composer",
-            "url" : "https://repo.magento.com/"
-        }
-    ],
+    "description": "Magento 2 Functional Test Module Layered Navigation",
+    "config": {
+        "sort-packages": true
+    },
     "require": {
-        "php": "~7.0",
-        "codeception/codeception": "2.2|2.3",
-        "allure-framework/allure-codeception": "dev-master",
+        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
+        "codeception/codeception": "~2.3.4",
         "consolidation/robo": "^1.0.0",
         "henrikbjorn/lurker": "^1.2",
-        "vlucas/phpdotenv": "~2.4",
-        "magento/magento2-functional-testing-framework": "dev-develop"
+        "magento/magento2-functional-testing-framework": "1.0.0",
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
+        "vlucas/phpdotenv": "~2.4"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-config": "dev-master",
-        "magento/magento2-functional-test-module-catalog": "dev-master"
+        "magento/magento2-functional-test-module-catalog": "1.0.0",
+        "magento/magento2-functional-test-module-config": "1.0.0"
     },
     "type": "magento2-test-module",
-    "version": "dev-master",
+    "version": "1.0.0",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
-        "psr-0": {
-            "Yandex": "vendor/allure-framework/allure-codeception/src/"
-        },
         "psr-4": {
-            "Magento\\FunctionalTestingFramework\\": [
-                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
-            ],
-            "Magento\\FunctionalTest\\": [
-                "tests/functional/Magento/FunctionalTest",
-                "generated/Magento/FunctionalTest"
-            ]
+            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
         }
     },
     "extra": {
         "map": [
             [
                 "*",
-                "tests/functional/Magento/FunctionalTest/LayeredNavigation"
+                "dev/tests/acceptance/tests/functional/Magento/FunctionalTest/LayeredNavigation"
             ]
         ]
     }
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Marketplace/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Marketplace/README.md
index cfd23dfcbac..5c744ec36f1 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Marketplace/README.md
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Marketplace/README.md
@@ -1,3 +1,3 @@
-# Magento 2 Acceptance Tests
+# Magento 2 Functional Tests
 
-The Acceptance Tests Module for **Magento_Marketplace** Module.
+The Functional Tests Module for **Magento_Marketplace** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Marketplace/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Marketplace/composer.json
index d3f589a31a0..35c4720ce34 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Marketplace/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Marketplace/composer.json
@@ -1,49 +1,37 @@
 {
     "name": "magento/magento2-functional-test-module-marketplace",
-    "description": "Magento 2 Acceptance Test Module Marketplace",
-    "repositories": [
-        {
-            "type" : "composer",
-            "url" : "https://repo.magento.com/"
-        }
-    ],
+    "description": "Magento 2 Functional Test Module Marketplace",
+    "config": {
+        "sort-packages": true
+    },
     "require": {
-        "php": "~7.0",
-        "codeception/codeception": "2.2|2.3",
-        "allure-framework/allure-codeception": "dev-master",
+        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
+        "codeception/codeception": "~2.3.4",
         "consolidation/robo": "^1.0.0",
         "henrikbjorn/lurker": "^1.2",
-        "vlucas/phpdotenv": "~2.4",
-        "magento/magento2-functional-testing-framework": "dev-develop"
+        "magento/magento2-functional-testing-framework": "1.0.0",
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
+        "vlucas/phpdotenv": "~2.4"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-backend": "dev-master"
+        "magento/magento2-functional-test-module-backend": "1.0.0"
     },
     "type": "magento2-test-module",
-    "version": "dev-master",
+    "version": "1.0.0",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
-        "psr-0": {
-            "Yandex": "vendor/allure-framework/allure-codeception/src/"
-        },
         "psr-4": {
-            "Magento\\FunctionalTestingFramework\\": [
-                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
-            ],
-            "Magento\\FunctionalTest\\": [
-                "tests/functional/Magento/FunctionalTest",
-                "generated/Magento/FunctionalTest"
-            ]
+            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
         }
     },
     "extra": {
         "map": [
             [
                 "*",
-                "tests/functional/Magento/FunctionalTest/Marketplace"
+                "dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Marketplace"
             ]
         ]
     }
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/MediaStorage/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/MediaStorage/README.md
index bd023f6f926..ee885969bb1 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/MediaStorage/README.md
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/MediaStorage/README.md
@@ -1,3 +1,3 @@
-# Magento 2 Acceptance Tests
+# Magento 2 Functional Tests
 
-The Acceptance Tests Module for **Magento_MediaStorage** Module.
+The Functional Tests Module for **Magento_MediaStorage** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/MediaStorage/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/MediaStorage/composer.json
index cc893b603f4..c853fdef3e3 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/MediaStorage/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/MediaStorage/composer.json
@@ -1,51 +1,39 @@
 {
     "name": "magento/magento2-functional-test-module-media-storage",
-    "description": "Magento 2 Acceptance Test Module Media Storage",
-    "repositories": [
-        {
-            "type" : "composer",
-            "url" : "https://repo.magento.com/"
-        }
-    ],
+    "description": "Magento 2 Functional Test Module Media Storage",
+    "config": {
+        "sort-packages": true
+    },
     "require": {
-        "php": "~7.0",
-        "codeception/codeception": "2.2|2.3",
-        "allure-framework/allure-codeception": "dev-master",
+        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
+        "codeception/codeception": "~2.3.4",
         "consolidation/robo": "^1.0.0",
         "henrikbjorn/lurker": "^1.2",
-        "vlucas/phpdotenv": "~2.4",
-        "magento/magento2-functional-testing-framework": "dev-develop"
+        "magento/magento2-functional-testing-framework": "1.0.0",
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
+        "vlucas/phpdotenv": "~2.4"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-store": "dev-master",
-        "magento/magento2-functional-test-module-config": "dev-master",
-        "magento/magento2-functional-test-module-backend": "dev-master"
+        "magento/magento2-functional-test-module-backend": "1.0.0",
+        "magento/magento2-functional-test-module-config": "1.0.0",
+        "magento/magento2-functional-test-module-store": "1.0.0"
     },
     "type": "magento2-test-module",
-    "version": "dev-master",
+    "version": "1.0.0",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
-        "psr-0": {
-            "Yandex": "vendor/allure-framework/allure-codeception/src/"
-        },
         "psr-4": {
-            "Magento\\FunctionalTestingFramework\\": [
-                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
-            ],
-            "Magento\\FunctionalTest\\": [
-                "tests/functional/Magento/FunctionalTest",
-                "generated/Magento/FunctionalTest"
-            ]
+            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
         }
     },
     "extra": {
         "map": [
             [
                 "*",
-                "tests/functional/Magento/FunctionalTest/MediaStorage"
+                "dev/tests/acceptance/tests/functional/Magento/FunctionalTest/MediaStorage"
             ]
         ]
     }
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Msrp/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Msrp/composer.json
index 8b3fcba7e67..97eaf57c60e 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Msrp/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Msrp/composer.json
@@ -1,54 +1,42 @@
 {
     "name": "magento/magento2-functional-test-module-msrp",
-    "description": "Magento 2 Acceptance Test Module Msrp",
-    "repositories": [
-        {
-            "type" : "composer",
-            "url" : "https://repo.magento.com/"
-        }
-    ],
+    "description": "Magento 2 Functional Test Module Msrp",
+    "config": {
+        "sort-packages": true
+    },
     "require": {
-        "php": "~7.0",
-        "codeception/codeception": "2.2|2.3",
-        "allure-framework/allure-codeception": "dev-master",
+        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
+        "codeception/codeception": "~2.3.4",
         "consolidation/robo": "^1.0.0",
         "henrikbjorn/lurker": "^1.2",
-        "vlucas/phpdotenv": "~2.4",
-        "magento/magento2-functional-testing-framework": "dev-develop"
+        "magento/magento2-functional-testing-framework": "1.0.0",
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
+        "vlucas/phpdotenv": "~2.4"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-store": "dev-master",
-        "magento/magento2-functional-test-module-catalog": "dev-master",
-        "magento/magento2-functional-test-module-downloadable": "dev-master",
-        "magento/magento2-functional-test-module-eav": "dev-master",
-        "magento/magento2-functional-test-module-grouped-product": "dev-master",
-        "magento/magento2-functional-test-module-tax": "dev-master"
+        "magento/magento2-functional-test-module-catalog": "1.0.0",
+        "magento/magento2-functional-test-module-downloadable": "1.0.0",
+        "magento/magento2-functional-test-module-eav": "1.0.0",
+        "magento/magento2-functional-test-module-grouped-product": "1.0.0",
+        "magento/magento2-functional-test-module-store": "1.0.0",
+        "magento/magento2-functional-test-module-tax": "1.0.0"
     },
     "type": "magento2-test-module",
-    "version": "dev-master",
+    "version": "1.0.0",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
-        "psr-0": {
-            "Yandex": "vendor/allure-framework/allure-codeception/src/"
-        },
         "psr-4": {
-            "Magento\\FunctionalTestingFramework\\": [
-                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
-            ],
-            "Magento\\FunctionalTest\\": [
-                "tests/functional/Magento/FunctionalTest",
-                "generated/Magento/FunctionalTest"
-            ]
+            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
         }
     },
     "extra": {
         "map": [
             [
                 "*",
-                "tests/functional/Magento/FunctionalTest/Msrp"
+                "dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Msrp"
             ]
         ]
     }
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Multishipping/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Multishipping/README.md
index 5eac4359473..b6e1b54d6ac 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Multishipping/README.md
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Multishipping/README.md
@@ -1,3 +1,3 @@
-# Magento 2 Acceptance Tests
+# Magento 2 Functional Tests
 
-The Acceptance Tests Module for **Magento_Multishipping** Module.
\ No newline at end of file
+The Functional Tests Module for **Magento_Multishipping** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Multishipping/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Multishipping/composer.json
index 809353b1eaa..e9841884b99 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Multishipping/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Multishipping/composer.json
@@ -1,56 +1,44 @@
 {
     "name": "magento/magento2-functional-test-module-multishipping",
-    "description": "Magento 2 Acceptance Test Module Multishipping",
-    "repositories": [
-        {
-            "type" : "composer",
-            "url" : "https://repo.magento.com/"
-        }
-    ],
+    "description": "Magento 2 Functional Test Module Multishipping",
+    "config": {
+        "sort-packages": true
+    },
     "require": {
-        "php": "~7.0",
-        "codeception/codeception": "2.2|2.3",
-        "allure-framework/allure-codeception": "dev-master",
+        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
+        "codeception/codeception": "~2.3.4",
         "consolidation/robo": "^1.0.0",
         "henrikbjorn/lurker": "^1.2",
-        "vlucas/phpdotenv": "~2.4",
-        "magento/magento2-functional-testing-framework": "dev-develop"
+        "magento/magento2-functional-testing-framework": "1.0.0",
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
+        "vlucas/phpdotenv": "~2.4"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-store": "dev-master",
-        "magento/magento2-functional-test-module-checkout": "dev-master",
-        "magento/magento2-functional-test-module-sales": "dev-master",
-        "magento/magento2-functional-test-module-payment": "dev-master",
-        "magento/magento2-functional-test-module-tax": "dev-master",
-        "magento/magento2-functional-test-module-customer": "dev-master",
-        "magento/magento2-functional-test-module-quote": "dev-master",
-        "magento/magento2-functional-test-module-directory": "dev-master"
+        "magento/magento2-functional-test-module-checkout": "1.0.0",
+        "magento/magento2-functional-test-module-customer": "1.0.0",
+        "magento/magento2-functional-test-module-directory": "1.0.0",
+        "magento/magento2-functional-test-module-payment": "1.0.0",
+        "magento/magento2-functional-test-module-quote": "1.0.0",
+        "magento/magento2-functional-test-module-sales": "1.0.0",
+        "magento/magento2-functional-test-module-store": "1.0.0",
+        "magento/magento2-functional-test-module-tax": "1.0.0"
     },
     "type": "magento2-test-module",
-    "version": "dev-master",
+    "version": "1.0.0",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
-        "psr-0": {
-            "Yandex": "vendor/allure-framework/allure-codeception/src/"
-        },
         "psr-4": {
-            "Magento\\FunctionalTestingFramework\\": [
-                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
-            ],
-            "Magento\\FunctionalTest\\": [
-                "tests/functional/Magento/FunctionalTest",
-                "generated/Magento/FunctionalTest"
-            ]
+            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
         }
     },
     "extra": {
         "map": [
             [
                 "*",
-                "tests/functional/Magento/FunctionalTest/Multishipping"
+                "dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Multishipping"
             ]
         ]
     }
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/NewRelicReporting/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/NewRelicReporting/README.md
index 68dd1d5267a..c6d4c6906be 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/NewRelicReporting/README.md
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/NewRelicReporting/README.md
@@ -1,3 +1,3 @@
-# Magento 2 Acceptance Tests
+# Magento 2 Functional Tests
 
-The Acceptance Tests Module for **Magento_NewRelicReporting** Module.
\ No newline at end of file
+The Functional Tests Module for **Magento_NewRelicReporting** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/NewRelicReporting/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/NewRelicReporting/composer.json
index e2ce994efa1..b7c0fdd7f43 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/NewRelicReporting/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/NewRelicReporting/composer.json
@@ -1,54 +1,42 @@
 {
     "name": "magento/magento2-functional-test-module-new-relic-reporting",
-    "description": "Magento 2 Acceptance Test Module New Relic Reporting",
-    "repositories": [
-        {
-            "type" : "composer",
-            "url" : "https://repo.magento.com/"
-        }
-    ],
+    "description": "Magento 2 Functional Test Module New Relic Reporting",
+    "config": {
+        "sort-packages": true
+    },
     "require": {
-        "php": "~7.0",
-        "codeception/codeception": "2.2|2.3",
-        "allure-framework/allure-codeception": "dev-master",
+        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
+        "codeception/codeception": "~2.3.4",
         "consolidation/robo": "^1.0.0",
         "henrikbjorn/lurker": "^1.2",
-        "vlucas/phpdotenv": "~2.4",
-        "magento/magento2-functional-testing-framework": "dev-develop"
+        "magento/magento2-functional-testing-framework": "1.0.0",
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
+        "vlucas/phpdotenv": "~2.4"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-store": "dev-master",
-        "magento/magento2-functional-test-module-backend": "dev-master",
-        "magento/magento2-functional-test-module-customer": "dev-master",
-        "magento/magento2-functional-test-module-configurable-product": "dev-master",
-        "magento/magento2-functional-test-module-catalog": "dev-master",
-        "magento/magento2-functional-test-module-config": "dev-master"
+        "magento/magento2-functional-test-module-backend": "1.0.0",
+        "magento/magento2-functional-test-module-catalog": "1.0.0",
+        "magento/magento2-functional-test-module-config": "1.0.0",
+        "magento/magento2-functional-test-module-configurable-product": "1.0.0",
+        "magento/magento2-functional-test-module-customer": "1.0.0",
+        "magento/magento2-functional-test-module-store": "1.0.0"
     },
     "type": "magento2-test-module",
-    "version": "dev-master",
+    "version": "1.0.0",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
-        "psr-0": {
-            "Yandex": "vendor/allure-framework/allure-codeception/src/"
-        },
         "psr-4": {
-            "Magento\\FunctionalTestingFramework\\": [
-                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
-            ],
-            "Magento\\FunctionalTest\\": [
-                "tests/functional/Magento/FunctionalTest",
-                "generated/Magento/FunctionalTest"
-            ]
+            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
         }
     },
     "extra": {
         "map": [
             [
                 "*",
-                "tests/functional/Magento/FunctionalTest/NewRelicReporting"
+                "dev/tests/acceptance/tests/functional/Magento/FunctionalTest/NewRelicReporting"
             ]
         ]
     }
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Newsletter/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Newsletter/README.md
index b38526eec86..95a365b8b8f 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Newsletter/README.md
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Newsletter/README.md
@@ -1,3 +1,3 @@
-# Magento 2 Acceptance Tests
+# Magento 2 Functional Tests
 
-The Acceptance Tests Module for **Magento_Newsletter** Module.
\ No newline at end of file
+The Functional Tests Module for **Magento_Newsletter** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Newsletter/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Newsletter/composer.json
index 34046ce9e83..189fa347b45 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Newsletter/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Newsletter/composer.json
@@ -1,55 +1,44 @@
 {
     "name": "magento/magento2-functional-test-module-newsletter",
-    "description": "Magento 2 Acceptance Test Module Newsletter",
-    "repositories": [
-        {
-            "type" : "composer",
-            "url" : "https://repo.magento.com/"
-        }
-    ],
+    "description": "Magento 2 Functional Test Module Newsletter",
+    "config": {
+        "sort-packages": true
+    },
     "require": {
-        "php": "~7.0",
-        "codeception/codeception": "2.2|2.3",
-        "allure-framework/allure-codeception": "dev-master",
+        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
+        "codeception/codeception": "~2.3.4",
         "consolidation/robo": "^1.0.0",
         "henrikbjorn/lurker": "^1.2",
-        "vlucas/phpdotenv": "~2.4",
-        "magento/magento2-functional-testing-framework": "dev-develop"
+        "magento/magento2-functional-testing-framework": "1.0.0",
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
+        "vlucas/phpdotenv": "~2.4"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-store": "dev-master",
-        "magento/magento2-functional-test-module-customer": "dev-master",
-        "magento/magento2-functional-test-module-widget": "dev-master",
-        "magento/magento2-functional-test-module-backend": "dev-master",
-        "magento/magento2-functional-test-module-cms": "dev-master",
-        "magento/magento2-functional-test-module-email": "dev-master",
-        "magento/magento2-functional-test-module-eav": "dev-master"
+        "magento/magento2-functional-test-module-backend": "1.0.0",
+        "magento/magento2-functional-test-module-cms": "1.0.0",
+        "magento/magento2-functional-test-module-customer": "1.0.0",
+        "magento/magento2-functional-test-module-eav": "1.0.0",
+        "magento/magento2-functional-test-module-email": "1.0.0",
+        "magento/magento2-functional-test-module-require-js": "1.0.0",
+        "magento/magento2-functional-test-module-store": "1.0.0",
+        "magento/magento2-functional-test-module-widget": "1.0.0"
     },
     "type": "magento2-test-module",
-    "version": "dev-master",
+    "version": "1.0.0",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
-        "psr-0": {
-            "Yandex": "vendor/allure-framework/allure-codeception/src/"
-        },
         "psr-4": {
-            "Magento\\FunctionalTestingFramework\\": [
-                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
-            ],
-            "Magento\\FunctionalTest\\": [
-                "tests/functional/Magento/FunctionalTest",
-                "generated/Magento/FunctionalTest"
-            ]
+            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
         }
     },
     "extra": {
         "map": [
             [
                 "*",
-                "tests/functional/Magento/FunctionalTest/Newsletter"
+                "dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Newsletter"
             ]
         ]
     }
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/OfflinePayments/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/OfflinePayments/README.md
index 46fc09f181a..ba6e5c9680d 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/OfflinePayments/README.md
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/OfflinePayments/README.md
@@ -1,3 +1,3 @@
-# Magento 2 Acceptance Tests
+# Magento 2 Functional Tests
 
-The Acceptance Tests Module for **Magento_OfflinePayments** Module.
\ No newline at end of file
+The Functional Tests Module for **Magento_OfflinePayments** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/OfflinePayments/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/OfflinePayments/composer.json
index aeed68809ac..f3a5da39e2a 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/OfflinePayments/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/OfflinePayments/composer.json
@@ -1,50 +1,38 @@
 {
     "name": "magento/magento2-functional-test-module-offline-payments",
-    "description": "Magento 2 Acceptance Test Module Offline Payments",
-    "repositories": [
-        {
-            "type" : "composer",
-            "url" : "https://repo.magento.com/"
-        }
-    ],
+    "description": "Magento 2 Functional Test Module Offline Payments",
+    "config": {
+        "sort-packages": true
+    },
     "require": {
-        "php": "~7.0",
-        "codeception/codeception": "2.2|2.3",
-        "allure-framework/allure-codeception": "dev-master",
+        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
+        "codeception/codeception": "~2.3.4",
         "consolidation/robo": "^1.0.0",
         "henrikbjorn/lurker": "^1.2",
-        "vlucas/phpdotenv": "~2.4",
-        "magento/magento2-functional-testing-framework": "dev-develop"
+        "magento/magento2-functional-testing-framework": "1.0.0",
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
+        "vlucas/phpdotenv": "~2.4"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-checkout": "dev-master",
-        "magento/magento2-functional-test-module-payment": "dev-master"
+        "magento/magento2-functional-test-module-checkout": "1.0.0",
+        "magento/magento2-functional-test-module-payment": "1.0.0"
     },
     "type": "magento2-test-module",
-    "version": "dev-master",
+    "version": "1.0.0",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
-        "psr-0": {
-            "Yandex": "vendor/allure-framework/allure-codeception/src/"
-        },
         "psr-4": {
-            "Magento\\FunctionalTestingFramework\\": [
-                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
-            ],
-            "Magento\\FunctionalTest\\": [
-                "tests/functional/Magento/FunctionalTest",
-                "generated/Magento/FunctionalTest"
-            ]
+            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
         }
     },
     "extra": {
         "map": [
             [
                 "*",
-                "tests/functional/Magento/FunctionalTest/OfflinePayments"
+                "dev/tests/acceptance/tests/functional/Magento/FunctionalTest/OfflinePayments"
             ]
         ]
     }
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/OfflineShipping/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/OfflineShipping/README.md
index f430b9b2a1f..42a12e4398e 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/OfflineShipping/README.md
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/OfflineShipping/README.md
@@ -1,3 +1,3 @@
-# Magento 2 Acceptance Tests
+# Magento 2 Functional Tests
 
-The Acceptance Tests Module for **Magento_OfflineShipping** Module.
\ No newline at end of file
+The Functional Tests Module for **Magento_OfflineShipping** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/OfflineShipping/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/OfflineShipping/composer.json
index babeb8ad2ec..a3b3a786899 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/OfflineShipping/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/OfflineShipping/composer.json
@@ -1,56 +1,45 @@
 {
     "name": "magento/magento2-functional-test-module-offline-shipping",
-    "description": "Magento 2 Acceptance Test Module Offline Shipping",
-    "repositories": [
-        {
-            "type" : "composer",
-            "url" : "https://repo.magento.com/"
-        }
-    ],
+    "description": "Magento 2 Functional Test Module Offline Shipping",
+    "config": {
+        "sort-packages": true
+    },
     "require": {
-        "php": "~7.0",
-        "codeception/codeception": "2.2|2.3",
-        "allure-framework/allure-codeception": "dev-master",
+        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
+        "codeception/codeception": "~2.3.4",
         "consolidation/robo": "^1.0.0",
         "henrikbjorn/lurker": "^1.2",
-        "vlucas/phpdotenv": "~2.4",
-        "magento/magento2-functional-testing-framework": "dev-develop"
+        "magento/magento2-functional-testing-framework": "1.0.0",
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
+        "vlucas/phpdotenv": "~2.4"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-config": "dev-master",
-        "magento/magento2-functional-test-module-store": "dev-master",
-        "magento/magento2-functional-test-module-backend": "dev-master",
-        "magento/magento2-functional-test-module-shipping": "dev-master",
-        "magento/magento2-functional-test-module-catalog": "dev-master",
-        "magento/magento2-functional-test-module-sales-rule": "dev-master",
-        "magento/magento2-functional-test-module-directory": "dev-master",
-        "magento/magento2-functional-test-module-quote": "dev-master"
+        "magento/magento2-functional-test-module-backend": "1.0.0",
+        "magento/magento2-functional-test-module-catalog": "1.0.0",
+        "magento/magento2-functional-test-module-config": "1.0.0",
+        "magento/magento2-functional-test-module-directory": "1.0.0",
+        "magento/magento2-functional-test-module-quote": "1.0.0",
+        "magento/magento2-functional-test-module-sales": "1.0.0",
+        "magento/magento2-functional-test-module-sales-rule": "1.0.0",
+        "magento/magento2-functional-test-module-shipping": "1.0.0",
+        "magento/magento2-functional-test-module-store": "1.0.0"
     },
     "type": "magento2-test-module",
-    "version": "dev-master",
+    "version": "1.0.0",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
-        "psr-0": {
-            "Yandex": "vendor/allure-framework/allure-codeception/src/"
-        },
         "psr-4": {
-            "Magento\\FunctionalTestingFramework\\": [
-                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
-            ],
-            "Magento\\FunctionalTest\\": [
-                "tests/functional/Magento/FunctionalTest",
-                "generated/Magento/FunctionalTest"
-            ]
+            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
         }
     },
     "extra": {
         "map": [
             [
                 "*",
-                "tests/functional/Magento/FunctionalTest/OfflineShipping"
+                "dev/tests/acceptance/tests/functional/Magento/FunctionalTest/OfflineShipping"
             ]
         ]
     }
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/PageCache/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/PageCache/README.md
index b35a9877c8b..8db3000b940 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/PageCache/README.md
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/PageCache/README.md
@@ -1,3 +1,3 @@
-# Magento 2 Acceptance Tests
+# Magento 2 Functional Tests
 
-The Acceptance Tests Module for **Magento_PageCache** Module.
\ No newline at end of file
+The Functional Tests Module for **Magento_PageCache** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/PageCache/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/PageCache/composer.json
index 59205152e0d..47d5f78e378 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/PageCache/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/PageCache/composer.json
@@ -1,51 +1,39 @@
 {
     "name": "magento/magento2-functional-test-module-page-cache",
-    "description": "Magento 2 Acceptance Test Module Page Cache",
-    "repositories": [
-        {
-            "type" : "composer",
-            "url" : "https://repo.magento.com/"
-        }
-    ],
+    "description": "Magento 2 Functional Test Module Page Cache",
+    "config": {
+        "sort-packages": true
+    },
     "require": {
-        "php": "~7.0",
-        "codeception/codeception": "2.2|2.3",
-        "allure-framework/allure-codeception": "dev-master",
+        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
+        "codeception/codeception": "~2.3.4",
         "consolidation/robo": "^1.0.0",
         "henrikbjorn/lurker": "^1.2",
-        "vlucas/phpdotenv": "~2.4",
-        "magento/magento2-functional-testing-framework": "dev-develop"
+        "magento/magento2-functional-testing-framework": "1.0.0",
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
+        "vlucas/phpdotenv": "~2.4"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-store": "dev-master",
-        "magento/magento2-functional-test-module-config": "dev-master",
-        "magento/magento2-functional-test-module-backend": "dev-master"
+        "magento/magento2-functional-test-module-backend": "1.0.0",
+        "magento/magento2-functional-test-module-config": "1.0.0",
+        "magento/magento2-functional-test-module-store": "1.0.0"
     },
     "type": "magento2-test-module",
-    "version": "dev-master",
+    "version": "1.0.0",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
-        "psr-0": {
-            "Yandex": "vendor/allure-framework/allure-codeception/src/"
-        },
         "psr-4": {
-            "Magento\\FunctionalTestingFramework\\": [
-                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
-            ],
-            "Magento\\FunctionalTest\\": [
-                "tests/functional/Magento/FunctionalTest",
-                "generated/Magento/FunctionalTest"
-            ]
+            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
         }
     },
     "extra": {
         "map": [
             [
                 "*",
-                "tests/functional/Magento/FunctionalTest/PageCache"
+                "dev/tests/acceptance/tests/functional/Magento/FunctionalTest/PageCache"
             ]
         ]
     }
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Payment/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Payment/README.md
index a87d9a4f12b..7a8fcc6210c 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Payment/README.md
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Payment/README.md
@@ -1,3 +1,3 @@
-# Magento 2 Acceptance Tests
+# Magento 2 Functional Tests
 
-The Acceptance Tests Module for **Magento_Payment** Module.
\ No newline at end of file
+The Functional Tests Module for **Magento_Payment** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Payment/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Payment/composer.json
index ed77d470823..575fde56a84 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Payment/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Payment/composer.json
@@ -1,54 +1,42 @@
 {
     "name": "magento/magento2-functional-test-module-payment",
-    "description": "Magento 2 Acceptance Test Module Payment",
-    "repositories": [
-        {
-            "type" : "composer",
-            "url" : "https://repo.magento.com/"
-        }
-    ],
+    "description": "Magento 2 Functional Test Module Payment",
+    "config": {
+        "sort-packages": true
+    },
     "require": {
-        "php": "~7.0",
-        "codeception/codeception": "2.2|2.3",
-        "allure-framework/allure-codeception": "dev-master",
+        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
+        "codeception/codeception": "~2.3.4",
         "consolidation/robo": "^1.0.0",
         "henrikbjorn/lurker": "^1.2",
-        "vlucas/phpdotenv": "~2.4",
-        "magento/magento2-functional-testing-framework": "dev-develop"
+        "magento/magento2-functional-testing-framework": "1.0.0",
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
+        "vlucas/phpdotenv": "~2.4"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-store": "dev-master",
-        "magento/magento2-functional-test-module-config": "dev-master",
-        "magento/magento2-functional-test-module-sales": "dev-master",
-        "magento/magento2-functional-test-module-checkout": "dev-master",
-        "magento/magento2-functional-test-module-quote": "dev-master",
-        "magento/magento2-functional-test-module-directory": "dev-master"
+        "magento/magento2-functional-test-module-checkout": "1.0.0",
+        "magento/magento2-functional-test-module-config": "1.0.0",
+        "magento/magento2-functional-test-module-directory": "1.0.0",
+        "magento/magento2-functional-test-module-quote": "1.0.0",
+        "magento/magento2-functional-test-module-sales": "1.0.0",
+        "magento/magento2-functional-test-module-store": "1.0.0"
     },
     "type": "magento2-test-module",
-    "version": "dev-master",
+    "version": "1.0.0",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
-        "psr-0": {
-            "Yandex": "vendor/allure-framework/allure-codeception/src/"
-        },
         "psr-4": {
-            "Magento\\FunctionalTestingFramework\\": [
-                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
-            ],
-            "Magento\\FunctionalTest\\": [
-                "tests/functional/Magento/FunctionalTest",
-                "generated/Magento/FunctionalTest"
-            ]
+            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
         }
     },
     "extra": {
         "map": [
             [
                 "*",
-                "tests/functional/Magento/FunctionalTest/Payment"
+                "dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Payment"
             ]
         ]
     }
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Paypal/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Paypal/README.md
index e6c828ce072..820d3acc2e1 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Paypal/README.md
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Paypal/README.md
@@ -1,3 +1,3 @@
-# Magento 2 Acceptance Tests
+# Magento 2 Functional Tests
 
-The Acceptance Tests Module for **Magento_PayPal** Module.
\ No newline at end of file
+The Functional Tests Module for **Magento_Paypal** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Paypal/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Paypal/composer.json
index d82c9ccb34a..ad62287e584 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Paypal/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Paypal/composer.json
@@ -1,63 +1,52 @@
 {
     "name": "magento/magento2-functional-test-module-paypal",
-    "description": "Magento 2 Acceptance Test Module Paypal",
-    "repositories": [
-        {
-            "type" : "composer",
-            "url" : "https://repo.magento.com/"
-        }
-    ],
+    "description": "Magento 2 Functional Test Module Paypal",
+    "config": {
+        "sort-packages": true
+    },
     "require": {
-        "php": "~7.0",
-        "codeception/codeception": "2.2|2.3",
-        "allure-framework/allure-codeception": "dev-master",
+        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
+        "codeception/codeception": "~2.3.4",
         "consolidation/robo": "^1.0.0",
         "henrikbjorn/lurker": "^1.2",
-        "vlucas/phpdotenv": "~2.4",
-        "magento/magento2-functional-testing-framework": "dev-develop"
+        "magento/magento2-functional-testing-framework": "1.0.0",
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
+        "vlucas/phpdotenv": "~2.4"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-store": "dev-master",
-        "magento/magento2-functional-test-module-config": "dev-master",
-        "magento/magento2-functional-test-module-checkout": "dev-master",
-        "magento/magento2-functional-test-module-sales": "dev-master",
-        "magento/magento2-functional-test-module-quote": "dev-master",
-        "magento/magento2-functional-test-module-customer": "dev-master",
-        "magento/magento2-functional-test-module-payment": "dev-master",
-        "magento/magento2-functional-test-module-backend": "dev-master",
-        "magento/magento2-functional-test-module-tax": "dev-master",
-        "magento/magento2-functional-test-module-directory": "dev-master",
-        "magento/magento2-functional-test-module-theme": "dev-master",
-        "magento/magento2-functional-test-module-catalog": "dev-master",
-        "magento/magento2-functional-test-module-eav": "dev-master",
-        "magento/magento2-functional-test-module-ui": "dev-master",
-        "magento/magento2-functional-test-module-vault": "dev-master"
+        "magento/magento2-functional-test-module-backend": "1.0.0",
+        "magento/magento2-functional-test-module-catalog": "1.0.0",
+        "magento/magento2-functional-test-module-checkout": "1.0.0",
+        "magento/magento2-functional-test-module-config": "1.0.0",
+        "magento/magento2-functional-test-module-customer": "1.0.0",
+        "magento/magento2-functional-test-module-directory": "1.0.0",
+        "magento/magento2-functional-test-module-eav": "1.0.0",
+        "magento/magento2-functional-test-module-instant-purchase": "1.0.0",
+        "magento/magento2-functional-test-module-payment": "1.0.0",
+        "magento/magento2-functional-test-module-quote": "1.0.0",
+        "magento/magento2-functional-test-module-sales": "1.0.0",
+        "magento/magento2-functional-test-module-store": "1.0.0",
+        "magento/magento2-functional-test-module-tax": "1.0.0",
+        "magento/magento2-functional-test-module-theme": "1.0.0",
+        "magento/magento2-functional-test-module-ui": "1.0.0",
+        "magento/magento2-functional-test-module-vault": "1.0.0"
     },
     "type": "magento2-test-module",
-    "version": "dev-master",
+    "version": "1.0.0",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
-        "psr-0": {
-            "Yandex": "vendor/allure-framework/allure-codeception/src/"
-        },
         "psr-4": {
-            "Magento\\FunctionalTestingFramework\\": [
-                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
-            ],
-            "Magento\\FunctionalTest\\": [
-                "tests/functional/Magento/FunctionalTest",
-                "generated/Magento/FunctionalTest"
-            ]
+            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
         }
     },
     "extra": {
         "map": [
             [
                 "*",
-                "tests/functional/Magento/FunctionalTest/Paypal"
+                "dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Paypal"
             ]
         ]
     }
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Persistent/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Persistent/README.md
index f0678daf757..690db182dcb 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Persistent/README.md
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Persistent/README.md
@@ -1,3 +1,3 @@
-# Magento 2 Acceptance Tests
+# Magento 2 Functional Tests
 
-The Acceptance Tests Module for **Magento_Persistent** Module.
\ No newline at end of file
+The Functional Tests Module for **Magento_Persistent** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Persistent/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Persistent/composer.json
index 0ee20653fbb..790578527bf 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Persistent/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Persistent/composer.json
@@ -1,53 +1,42 @@
 {
     "name": "magento/magento2-functional-test-module-persistent",
-    "description": "Magento 2 Acceptance Test Module Persistent",
-    "repositories": [
-        {
-            "type" : "composer",
-            "url" : "https://repo.magento.com/"
-        }
-    ],
+    "description": "Magento 2 Functional Test Module Persistent",
+    "config": {
+        "sort-packages": true
+    },
     "require": {
-        "php": "~7.0",
-        "codeception/codeception": "2.2|2.3",
-        "allure-framework/allure-codeception": "dev-master",
+        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
+        "codeception/codeception": "~2.3.4",
         "consolidation/robo": "^1.0.0",
         "henrikbjorn/lurker": "^1.2",
-        "vlucas/phpdotenv": "~2.4",
-        "magento/magento2-functional-testing-framework": "dev-develop"
+        "magento/magento2-functional-testing-framework": "1.0.0",
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
+        "vlucas/phpdotenv": "~2.4"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-store": "dev-master",
-        "magento/magento2-functional-test-module-checkout": "dev-master",
-        "magento/magento2-functional-test-module-customer": "dev-master",
-        "magento/magento2-functional-test-module-page-cache": "dev-master",
-        "magento/magento2-functional-test-module-quote": "dev-master"
+        "magento/magento2-functional-test-module-checkout": "1.0.0",
+        "magento/magento2-functional-test-module-cron": "1.0.0",
+        "magento/magento2-functional-test-module-customer": "1.0.0",
+        "magento/magento2-functional-test-module-page-cache": "1.0.0",
+        "magento/magento2-functional-test-module-quote": "1.0.0",
+        "magento/magento2-functional-test-module-store": "1.0.0"
     },
     "type": "magento2-test-module",
-    "version": "dev-master",
+    "version": "1.0.0",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
-        "psr-0": {
-            "Yandex": "vendor/allure-framework/allure-codeception/src/"
-        },
         "psr-4": {
-            "Magento\\FunctionalTestingFramework\\": [
-                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
-            ],
-            "Magento\\FunctionalTest\\": [
-                "tests/functional/Magento/FunctionalTest",
-                "generated/Magento/FunctionalTest"
-            ]
+            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
         }
     },
     "extra": {
         "map": [
             [
                 "*",
-                "tests/functional/Magento/FunctionalTest/Persistent"
+                "dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Persistent"
             ]
         ]
     }
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ProductAlert/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ProductAlert/README.md
index 00b577465e5..1a78d82877b 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ProductAlert/README.md
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ProductAlert/README.md
@@ -1,3 +1,3 @@
-# Magento 2 Acceptance Tests
+# Magento 2 Functional Tests
 
-The Acceptance Tests Module for **Magento_ProductAlert** Module.
\ No newline at end of file
+The Functional Tests Module for **Magento_ProductAlert** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ProductAlert/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ProductAlert/composer.json
index 15988266a20..8eba5c0e098 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ProductAlert/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ProductAlert/composer.json
@@ -1,52 +1,40 @@
 {
     "name": "magento/magento2-functional-test-module-product-alert",
-    "description": "Magento 2 Acceptance Test Module Product Alert",
-    "repositories": [
-        {
-            "type" : "composer",
-            "url" : "https://repo.magento.com/"
-        }
-    ],
+    "description": "Magento 2 Functional Test Module Product Alert",
+    "config": {
+        "sort-packages": true
+    },
     "require": {
-        "php": "~7.0",
-        "codeception/codeception": "2.2|2.3",
-        "allure-framework/allure-codeception": "dev-master",
+        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
+        "codeception/codeception": "~2.3.4",
         "consolidation/robo": "^1.0.0",
         "henrikbjorn/lurker": "^1.2",
-        "vlucas/phpdotenv": "~2.4",
-        "magento/magento2-functional-testing-framework": "dev-develop"
+        "magento/magento2-functional-testing-framework": "1.0.0",
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
+        "vlucas/phpdotenv": "~2.4"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-store": "dev-master",
-        "magento/magento2-functional-test-module-backend": "dev-master",
-        "magento/magento2-functional-test-module-catalog": "dev-master",
-        "magento/magento2-functional-test-module-customer": "dev-master"
+        "magento/magento2-functional-test-module-backend": "1.0.0",
+        "magento/magento2-functional-test-module-catalog": "1.0.0",
+        "magento/magento2-functional-test-module-customer": "1.0.0",
+        "magento/magento2-functional-test-module-store": "1.0.0"
     },
     "type": "magento2-test-module",
-    "version": "dev-master",
+    "version": "1.0.0",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
-        "psr-0": {
-            "Yandex": "vendor/allure-framework/allure-codeception/src/"
-        },
         "psr-4": {
-            "Magento\\FunctionalTestingFramework\\": [
-                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
-            ],
-            "Magento\\FunctionalTest\\": [
-                "tests/functional/Magento/FunctionalTest",
-                "generated/Magento/FunctionalTest"
-            ]
+            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
         }
     },
     "extra": {
         "map": [
             [
                 "*",
-                "tests/functional/Magento/FunctionalTest/ProductAlert"
+                "dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ProductAlert"
             ]
         ]
     }
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ProductVideo/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ProductVideo/README.md
index 73ee15ca28f..0a19d3a9d1e 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ProductVideo/README.md
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ProductVideo/README.md
@@ -1,3 +1,3 @@
-# Magento 2 Acceptance Tests
+# Magento 2 Functional Tests
 
-The Acceptance Tests Module for **Magento_ProductVideo** Module.
\ No newline at end of file
+The Functional Tests Module for **Magento_ProductVideo** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ProductVideo/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ProductVideo/composer.json
index bc08abd34a1..f06f59c18ab 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ProductVideo/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ProductVideo/composer.json
@@ -1,53 +1,41 @@
 {
     "name": "magento/magento2-functional-test-module-product-video",
-    "description": "Magento 2 Acceptance Test Module Product Video",
-    "repositories": [
-        {
-            "type" : "composer",
-            "url" : "https://repo.magento.com/"
-        }
-    ],
+    "description": "Magento 2 Functional Test Module Product Video",
+    "config": {
+        "sort-packages": true
+    },
     "require": {
-        "php": "~7.0",
-        "codeception/codeception": "2.2|2.3",
-        "allure-framework/allure-codeception": "dev-master",
+        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
+        "codeception/codeception": "~2.3.4",
         "consolidation/robo": "^1.0.0",
         "henrikbjorn/lurker": "^1.2",
-        "vlucas/phpdotenv": "~2.4",
-        "magento/magento2-functional-testing-framework": "dev-develop"
+        "magento/magento2-functional-testing-framework": "1.0.0",
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
+        "vlucas/phpdotenv": "~2.4"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-store": "dev-master",
-        "magento/magento2-functional-test-module-catalog": "dev-master",
-        "magento/magento2-functional-test-module-backend": "dev-master",
-        "magento/magento2-functional-test-module-eav": "dev-master",
-        "magento/magento2-functional-test-module-media-storage": "dev-master"
+        "magento/magento2-functional-test-module-backend": "1.0.0",
+        "magento/magento2-functional-test-module-catalog": "1.0.0",
+        "magento/magento2-functional-test-module-eav": "1.0.0",
+        "magento/magento2-functional-test-module-media-storage": "1.0.0",
+        "magento/magento2-functional-test-module-store": "1.0.0"
     },
     "type": "magento2-test-module",
-    "version": "dev-master",
+    "version": "1.0.0",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
-        "psr-0": {
-            "Yandex": "vendor/allure-framework/allure-codeception/src/"
-        },
         "psr-4": {
-            "Magento\\FunctionalTestingFramework\\": [
-                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
-            ],
-            "Magento\\FunctionalTest\\": [
-                "tests/functional/Magento/FunctionalTest",
-                "generated/Magento/FunctionalTest"
-            ]
+            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
         }
     },
     "extra": {
         "map": [
             [
                 "*",
-                "tests/functional/Magento/FunctionalTest/ProductVideo"
+                "dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ProductVideo"
             ]
         ]
     }
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Quote/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Quote/README.md
index 510a9d5f16d..17b0bf4c605 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Quote/README.md
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Quote/README.md
@@ -1,3 +1,3 @@
-# Magento 2 Acceptance Tests
+# Magento 2 Functional Tests
 
-The Acceptance Tests Module for **Magento_Quote** Module.
\ No newline at end of file
+The Functional Tests Module for **Magento_Quote** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Quote/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Quote/composer.json
index 2dba18c3fa4..0b114e03a36 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Quote/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Quote/composer.json
@@ -1,62 +1,50 @@
 {
     "name": "magento/magento2-functional-test-module-quote",
-    "description": "Magento 2 Acceptance Test Module Quote",
-    "repositories": [
-        {
-            "type" : "composer",
-            "url" : "https://repo.magento.com/"
-        }
-    ],
+    "description": "Magento 2 Functional Test Module Quote",
+    "config": {
+        "sort-packages": true
+    },
     "require": {
-        "php": "~7.0",
-        "codeception/codeception": "2.2|2.3",
-        "allure-framework/allure-codeception": "dev-master",
+        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
+        "codeception/codeception": "~2.3.4",
         "consolidation/robo": "^1.0.0",
         "henrikbjorn/lurker": "^1.2",
-        "vlucas/phpdotenv": "~2.4",
-        "magento/magento2-functional-testing-framework": "dev-develop"
+        "magento/magento2-functional-testing-framework": "1.0.0",
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
+        "vlucas/phpdotenv": "~2.4"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-store": "dev-master",
-        "magento/magento2-functional-test-module-catalog": "dev-master",
-        "magento/magento2-functional-test-module-customer": "dev-master",
-        "magento/magento2-functional-test-module-checkout": "dev-master",
-        "magento/magento2-functional-test-module-authorization": "dev-master",
-        "magento/magento2-functional-test-module-payment": "dev-master",
-        "magento/magento2-functional-test-module-sales": "dev-master",
-        "magento/magento2-functional-test-module-shipping": "dev-master",
-        "magento/magento2-functional-test-module-sales-sequence": "dev-master",
-        "magento/magento2-functional-test-module-backend": "dev-master",
-        "magento/magento2-functional-test-module-directory": "dev-master",
-        "magento/magento2-functional-test-module-eav": "dev-master",
-        "magento/magento2-functional-test-module-tax": "dev-master",
-        "magento/magento2-functional-test-module-catalog-inventory": "dev-master"
+        "magento/magento2-functional-test-module-authorization": "1.0.0",
+        "magento/magento2-functional-test-module-backend": "1.0.0",
+        "magento/magento2-functional-test-module-catalog": "1.0.0",
+        "magento/magento2-functional-test-module-catalog-inventory": "1.0.0",
+        "magento/magento2-functional-test-module-checkout": "1.0.0",
+        "magento/magento2-functional-test-module-customer": "1.0.0",
+        "magento/magento2-functional-test-module-directory": "1.0.0",
+        "magento/magento2-functional-test-module-eav": "1.0.0",
+        "magento/magento2-functional-test-module-payment": "1.0.0",
+        "magento/magento2-functional-test-module-sales": "1.0.0",
+        "magento/magento2-functional-test-module-sales-sequence": "1.0.0",
+        "magento/magento2-functional-test-module-shipping": "1.0.0",
+        "magento/magento2-functional-test-module-store": "1.0.0",
+        "magento/magento2-functional-test-module-tax": "1.0.0"
     },
     "type": "magento2-test-module",
-    "version": "dev-master",
+    "version": "1.0.0",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
-        "psr-0": {
-            "Yandex": "vendor/allure-framework/allure-codeception/src/"
-        },
         "psr-4": {
-            "Magento\\FunctionalTestingFramework\\": [
-                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
-            ],
-            "Magento\\FunctionalTest\\": [
-                "tests/functional/Magento/FunctionalTest",
-                "generated/Magento/FunctionalTest"
-            ]
+            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
         }
     },
     "extra": {
         "map": [
             [
                 "*",
-                "tests/functional/Magento/FunctionalTest/Quote"
+                "dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Quote"
             ]
         ]
     }
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Reports/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Reports/README.md
index ad49607139a..d2bcbe81339 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Reports/README.md
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Reports/README.md
@@ -1,3 +1,3 @@
-# Magento 2 Acceptance Tests
+# Magento 2 Functional Tests
 
-The Acceptance Tests Module for **Magento_Reports** Module.
\ No newline at end of file
+The Functional Tests Module for **Magento_Reports** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Reports/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Reports/composer.json
index f73c4da907f..8c2b3d0b174 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Reports/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Reports/composer.json
@@ -1,64 +1,52 @@
 {
     "name": "magento/magento2-functional-test-module-reports",
-    "description": "Magento 2 Acceptance Test Module Reports",
-    "repositories": [
-        {
-            "type" : "composer",
-            "url" : "https://repo.magento.com/"
-        }
-    ],
+    "description": "Magento 2 Functional Test Module Reports",
+    "config": {
+        "sort-packages": true
+    },
     "require": {
-        "php": "~7.0",
-        "codeception/codeception": "2.2|2.3",
-        "allure-framework/allure-codeception": "dev-master",
+        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
+        "codeception/codeception": "~2.3.4",
         "consolidation/robo": "^1.0.0",
         "henrikbjorn/lurker": "^1.2",
-        "vlucas/phpdotenv": "~2.4",
-        "magento/magento2-functional-testing-framework": "dev-develop"
+        "magento/magento2-functional-testing-framework": "1.0.0",
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
+        "vlucas/phpdotenv": "~2.4"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-store": "dev-master",
-        "magento/magento2-functional-test-module-config": "dev-master",
-        "magento/magento2-functional-test-module-eav": "dev-master",
-        "magento/magento2-functional-test-module-customer": "dev-master",
-        "magento/magento2-functional-test-module-catalog": "dev-master",
-        "magento/magento2-functional-test-module-sales": "dev-master",
-        "magento/magento2-functional-test-module-cms": "dev-master",
-        "magento/magento2-functional-test-module-backend": "dev-master",
-        "magento/magento2-functional-test-module-widget": "dev-master",
-        "magento/magento2-functional-test-module-wishlist": "dev-master",
-        "magento/magento2-functional-test-module-review": "dev-master",
-        "magento/magento2-functional-test-module-catalog-inventory": "dev-master",
-        "magento/magento2-functional-test-module-tax": "dev-master",
-        "magento/magento2-functional-test-module-downloadable": "dev-master",
-        "magento/magento2-functional-test-module-sales-rule": "dev-master",
-        "magento/magento2-functional-test-module-quote": "dev-master"
+        "magento/magento2-functional-test-module-backend": "1.0.0",
+        "magento/magento2-functional-test-module-catalog": "1.0.0",
+        "magento/magento2-functional-test-module-catalog-inventory": "1.0.0",
+        "magento/magento2-functional-test-module-cms": "1.0.0",
+        "magento/magento2-functional-test-module-config": "1.0.0",
+        "magento/magento2-functional-test-module-customer": "1.0.0",
+        "magento/magento2-functional-test-module-downloadable": "1.0.0",
+        "magento/magento2-functional-test-module-eav": "1.0.0",
+        "magento/magento2-functional-test-module-quote": "1.0.0",
+        "magento/magento2-functional-test-module-review": "1.0.0",
+        "magento/magento2-functional-test-module-sales": "1.0.0",
+        "magento/magento2-functional-test-module-sales-rule": "1.0.0",
+        "magento/magento2-functional-test-module-store": "1.0.0",
+        "magento/magento2-functional-test-module-tax": "1.0.0",
+        "magento/magento2-functional-test-module-widget": "1.0.0",
+        "magento/magento2-functional-test-module-wishlist": "1.0.0"
     },
     "type": "magento2-test-module",
-    "version": "dev-master",
+    "version": "1.0.0",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
-        "psr-0": {
-            "Yandex": "vendor/allure-framework/allure-codeception/src/"
-        },
         "psr-4": {
-            "Magento\\FunctionalTestingFramework\\": [
-                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
-            ],
-            "Magento\\FunctionalTest\\": [
-                "tests/functional/Magento/FunctionalTest",
-                "generated/Magento/FunctionalTest"
-            ]
+            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
         }
     },
     "extra": {
         "map": [
             [
                 "*",
-                "tests/functional/Magento/FunctionalTest/Reports"
+                "dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Reports"
             ]
         ]
     }
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/RequireJs/LICENSE.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/RequireJs/LICENSE.txt
new file mode 100644
index 00000000000..49525fd99da
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/RequireJs/LICENSE.txt
@@ -0,0 +1,48 @@
+
+Open Software License ("OSL") v. 3.0
+
+This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Open Software License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Open Software License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly. 
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including 'fair use' or 'fair dealing'). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright (C) 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/RequireJs/LICENSE_AFL.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/RequireJs/LICENSE_AFL.txt
new file mode 100644
index 00000000000..f39d641b18a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/RequireJs/LICENSE_AFL.txt
@@ -0,0 +1,48 @@
+
+Academic Free License ("AFL") v. 3.0
+
+This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Academic Free License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, under any license of your choice that does not contradict the terms and conditions, including Licensor's reserved rights and remedies, in this Academic Free License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly.
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including "fair use" or "fair dealing"). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright © 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Academic Free License" or "AFL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/RequireJs/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/RequireJs/README.md
new file mode 100644
index 00000000000..64e6b0ef6e1
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/RequireJs/README.md
@@ -0,0 +1,3 @@
+# Magento 2 Functional Tests
+
+The Functional Tests Module for **Magento_RequireJs** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/RequireJs/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/RequireJs/composer.json
new file mode 100644
index 00000000000..7b15bff6f93
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/RequireJs/composer.json
@@ -0,0 +1,35 @@
+{
+    "name": "magento/magento2-functional-test-module-require-js",
+    "description": "Magento 2 Functional Test Module Require Js",
+    "config": {
+        "sort-packages": true
+    },
+    "require": {
+        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
+        "codeception/codeception": "~2.3.4",
+        "consolidation/robo": "^1.0.0",
+        "henrikbjorn/lurker": "^1.2",
+        "magento/magento2-functional-testing-framework": "1.0.0",
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
+        "vlucas/phpdotenv": "~2.4"
+    },
+    "type": "magento2-test-module",
+    "version": "1.0.0",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
+    "autoload": {
+        "psr-4": {
+            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
+        }
+    },
+    "extra": {
+        "map": [
+            [
+                "*",
+                "dev/tests/acceptance/tests/functional/Magento/FunctionalTest/RequireJs"
+            ]
+        ]
+    }
+}
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Review/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Review/README.md
index b34f3c949e0..71b1cdc87d9 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Review/README.md
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Review/README.md
@@ -1,3 +1,3 @@
-# Magento 2 Acceptance Tests
+# Magento 2 Functional Tests
 
-The Acceptance Tests Module for **Magento_Review** Module.
\ No newline at end of file
+The Functional Tests Module for **Magento_Review** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Review/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Review/composer.json
index 70f0e295838..f63800abaf8 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Review/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Review/composer.json
@@ -1,56 +1,44 @@
 {
     "name": "magento/magento2-functional-test-module-review",
-    "description": "Magento 2 Acceptance Test Module Review",
-    "repositories": [
-        {
-            "type" : "composer",
-            "url" : "https://repo.magento.com/"
-        }
-    ],
+    "description": "Magento 2 Functional Test Module Review",
+    "config": {
+        "sort-packages": true
+    },
     "require": {
-        "php": "~7.0",
-        "codeception/codeception": "2.2|2.3",
-        "allure-framework/allure-codeception": "dev-master",
+        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
+        "codeception/codeception": "~2.3.4",
         "consolidation/robo": "^1.0.0",
         "henrikbjorn/lurker": "^1.2",
-        "vlucas/phpdotenv": "~2.4",
-        "magento/magento2-functional-testing-framework": "dev-develop"
+        "magento/magento2-functional-testing-framework": "1.0.0",
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
+        "vlucas/phpdotenv": "~2.4"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-store": "dev-master",
-        "magento/magento2-functional-test-module-catalog": "dev-master",
-        "magento/magento2-functional-test-module-customer": "dev-master",
-        "magento/magento2-functional-test-module-eav": "dev-master",
-        "magento/magento2-functional-test-module-theme": "dev-master",
-        "magento/magento2-functional-test-module-backend": "dev-master",
-        "magento/magento2-functional-test-module-newsletter": "dev-master",
-        "magento/magento2-functional-test-module-ui": "dev-master"
+        "magento/magento2-functional-test-module-backend": "1.0.0",
+        "magento/magento2-functional-test-module-catalog": "1.0.0",
+        "magento/magento2-functional-test-module-customer": "1.0.0",
+        "magento/magento2-functional-test-module-eav": "1.0.0",
+        "magento/magento2-functional-test-module-newsletter": "1.0.0",
+        "magento/magento2-functional-test-module-store": "1.0.0",
+        "magento/magento2-functional-test-module-theme": "1.0.0",
+        "magento/magento2-functional-test-module-ui": "1.0.0"
     },
     "type": "magento2-test-module",
-    "version": "dev-master",
+    "version": "1.0.0",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
-        "psr-0": {
-            "Yandex": "vendor/allure-framework/allure-codeception/src/"
-        },
         "psr-4": {
-            "Magento\\FunctionalTestingFramework\\": [
-                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
-            ],
-            "Magento\\FunctionalTest\\": [
-                "tests/functional/Magento/FunctionalTest",
-                "generated/Magento/FunctionalTest"
-            ]
+            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
         }
     },
     "extra": {
         "map": [
             [
                 "*",
-                "tests/functional/Magento/FunctionalTest/Review"
+                "dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Review"
             ]
         ]
     }
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Robots/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Robots/README.md
index 864304d41ee..87ea94e0f1d 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Robots/README.md
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Robots/README.md
@@ -1,3 +1,3 @@
-# Magento 2 Acceptance Tests
+# Magento 2 Functional Tests
 
-The Acceptance Tests Module for **Magento_Robots** Module.
\ No newline at end of file
+The Functional Tests Module for **Magento_Robots** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Robots/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Robots/composer.json
index 082211c40a6..77f360571a4 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Robots/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Robots/composer.json
@@ -1,49 +1,37 @@
 {
     "name": "magento/magento2-functional-test-module-robots",
-    "description": "Magento 2 Acceptance Test Module Robots",
-    "repositories": [
-        {
-            "type" : "composer",
-            "url" : "https://repo.magento.com/"
-        }
-    ],
+    "description": "Magento 2 Functional Test Module Robots",
+    "config": {
+        "sort-packages": true
+    },
     "require": {
-        "php": "~7.0",
-        "codeception/codeception": "2.2|2.3",
-        "allure-framework/allure-codeception": "dev-master",
+        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
+        "codeception/codeception": "~2.3.4",
         "consolidation/robo": "^1.0.0",
         "henrikbjorn/lurker": "^1.2",
-        "vlucas/phpdotenv": "~2.4",
-        "magento/magento2-functional-testing-framework": "dev-develop"
+        "magento/magento2-functional-testing-framework": "1.0.0",
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
+        "vlucas/phpdotenv": "~2.4"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-store": "dev-master"
+        "magento/magento2-functional-test-module-store": "1.0.0"
     },
     "type": "magento2-test-module",
-    "version": "dev-master",
+    "version": "1.0.0",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
-        "psr-0": {
-            "Yandex": "vendor/allure-framework/allure-codeception/src/"
-        },
         "psr-4": {
-            "Magento\\FunctionalTestingFramework\\": [
-                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
-            ],
-            "Magento\\FunctionalTest\\": [
-                "tests/functional/Magento/FunctionalTest",
-                "generated/Magento/FunctionalTest"
-            ]
+            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
         }
     },
     "extra": {
         "map": [
             [
                 "*",
-                "tests/functional/Magento/FunctionalTest/Robots"
+                "dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Robots"
             ]
         ]
     }
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Rss/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Rss/README.md
index 04fc8e1c0d0..5002c878c2e 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Rss/README.md
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Rss/README.md
@@ -1,3 +1,3 @@
-# Magento 2 Acceptance Tests
+# Magento 2 Functional Tests
 
-The Acceptance Tests Module for **Magento_Rss** Module.
\ No newline at end of file
+The Functional Tests Module for **Magento_Rss** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Rss/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Rss/composer.json
index d950390b0e1..2b166f4b048 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Rss/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Rss/composer.json
@@ -1,51 +1,39 @@
 {
     "name": "magento/magento2-functional-test-module-rss",
-    "description": "Magento 2 Acceptance Test Module Rss",
-    "repositories": [
-        {
-            "type" : "composer",
-            "url" : "https://repo.magento.com/"
-        }
-    ],
+    "description": "Magento 2 Functional Test Module Rss",
+    "config": {
+        "sort-packages": true
+    },
     "require": {
-        "php": "~7.0",
-        "codeception/codeception": "2.2|2.3",
-        "allure-framework/allure-codeception": "dev-master",
+        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
+        "codeception/codeception": "~2.3.4",
         "consolidation/robo": "^1.0.0",
         "henrikbjorn/lurker": "^1.2",
-        "vlucas/phpdotenv": "~2.4",
-        "magento/magento2-functional-testing-framework": "dev-develop"
+        "magento/magento2-functional-testing-framework": "1.0.0",
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
+        "vlucas/phpdotenv": "~2.4"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-store": "dev-master",
-        "magento/magento2-functional-test-module-backend": "dev-master",
-        "magento/magento2-functional-test-module-customer": "dev-master"
+        "magento/magento2-functional-test-module-backend": "1.0.0",
+        "magento/magento2-functional-test-module-customer": "1.0.0",
+        "magento/magento2-functional-test-module-store": "1.0.0"
     },
     "type": "magento2-test-module",
-    "version": "dev-master",
+    "version": "1.0.0",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
-        "psr-0": {
-            "Yandex": "vendor/allure-framework/allure-codeception/src/"
-        },
         "psr-4": {
-            "Magento\\FunctionalTestingFramework\\": [
-                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
-            ],
-            "Magento\\FunctionalTest\\": [
-                "tests/functional/Magento/FunctionalTest",
-                "generated/Magento/FunctionalTest"
-            ]
+            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
         }
     },
     "extra": {
         "map": [
             [
                 "*",
-                "tests/functional/Magento/FunctionalTest/Rss"
+                "dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Rss"
             ]
         ]
     }
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Rule/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Rule/README.md
index 02eb487f33c..a797fd63dc6 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Rule/README.md
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Rule/README.md
@@ -1,3 +1,3 @@
-# Magento 2 Acceptance Tests
+# Magento 2 Functional Tests
 
-The Acceptance Tests Module for **Magento_Rule** Module.
\ No newline at end of file
+The Functional Tests Module for **Magento_Rule** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Rule/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Rule/composer.json
index 11cefb3a7df..d6d98a82234 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Rule/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Rule/composer.json
@@ -1,52 +1,40 @@
 {
     "name": "magento/magento2-functional-test-module-rule",
-    "description": "Magento 2 Acceptance Test Module Rule",
-    "repositories": [
-        {
-            "type" : "composer",
-            "url" : "https://repo.magento.com/"
-        }
-    ],
+    "description": "Magento 2 Functional Test Module Rule",
+    "config": {
+        "sort-packages": true
+    },
     "require": {
-        "php": "~7.0",
-        "codeception/codeception": "2.2|2.3",
-        "allure-framework/allure-codeception": "dev-master",
+        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
+        "codeception/codeception": "~2.3.4",
         "consolidation/robo": "^1.0.0",
         "henrikbjorn/lurker": "^1.2",
-        "vlucas/phpdotenv": "~2.4",
-        "magento/magento2-functional-testing-framework": "dev-develop"
+        "magento/magento2-functional-testing-framework": "1.0.0",
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
+        "vlucas/phpdotenv": "~2.4"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-store": "dev-master",
-        "magento/magento2-functional-test-module-eav": "dev-master",
-        "magento/magento2-functional-test-module-catalog": "dev-master",
-        "magento/magento2-functional-test-module-backend": "dev-master"
+        "magento/magento2-functional-test-module-backend": "1.0.0",
+        "magento/magento2-functional-test-module-catalog": "1.0.0",
+        "magento/magento2-functional-test-module-eav": "1.0.0",
+        "magento/magento2-functional-test-module-store": "1.0.0"
     },
     "type": "magento2-test-module",
-    "version": "dev-master",
+    "version": "1.0.0",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
-        "psr-0": {
-            "Yandex": "vendor/allure-framework/allure-codeception/src/"
-        },
         "psr-4": {
-            "Magento\\FunctionalTestingFramework\\": [
-                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
-            ],
-            "Magento\\FunctionalTest\\": [
-                "tests/functional/Magento/FunctionalTest",
-                "generated/Magento/FunctionalTest"
-            ]
+            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
         }
     },
     "extra": {
         "map": [
             [
                 "*",
-                "tests/functional/Magento/FunctionalTest/Rule"
+                "dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Rule"
             ]
         ]
     }
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/README.md
index 8f897de5484..dbaf12404d1 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/README.md
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/README.md
@@ -1,3 +1,3 @@
-# Magento 2 Acceptance Tests
+# Magento 2 Functional Tests
 
-The Acceptance Tests Module for **Magento_Sales** Module.
+The Functional Tests Module for **Magento_Sales** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/composer.json
index 5805b9a34c9..e082d00d109 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/composer.json
@@ -1,71 +1,59 @@
 {
     "name": "magento/magento2-functional-test-module-sales",
-    "description": "Magento 2 Acceptance Test Module Sales",
-    "repositories": [
-        {
-            "type" : "composer",
-            "url" : "https://repo.magento.com/"
-        }
-    ],
+    "description": "Magento 2 Functional Test Module Sales",
+    "config": {
+        "sort-packages": true
+    },
     "require": {
-        "php": "~7.0",
-        "codeception/codeception": "2.2|2.3",
-        "allure-framework/allure-codeception": "dev-master",
+        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
+        "codeception/codeception": "~2.3.4",
         "consolidation/robo": "^1.0.0",
         "henrikbjorn/lurker": "^1.2",
-        "vlucas/phpdotenv": "~2.4",
-        "magento/magento2-functional-testing-framework": "dev-develop"
+        "magento/magento2-functional-testing-framework": "1.0.0",
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
+        "vlucas/phpdotenv": "~2.4"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-store": "dev-master",
-        "magento/magento2-functional-test-module-catalog": "dev-master",
-        "magento/magento2-functional-test-module-customer": "dev-master",
-        "magento/magento2-functional-test-module-authorization": "dev-master",
-        "magento/magento2-functional-test-module-payment": "dev-master",
-        "magento/magento2-functional-test-module-checkout": "dev-master",
-        "magento/magento2-functional-test-module-theme": "dev-master",
-        "magento/magento2-functional-test-module-sales-rule": "dev-master",
-        "magento/magento2-functional-test-module-sales-sequence": "dev-master",
-        "magento/magento2-functional-test-module-backend": "dev-master",
-        "magento/magento2-functional-test-module-widget": "dev-master",
-        "magento/magento2-functional-test-module-directory": "dev-master",
-        "magento/magento2-functional-test-module-eav": "dev-master",
-        "magento/magento2-functional-test-module-tax": "dev-master",
-        "magento/magento2-functional-test-module-gift-message": "dev-master",
-        "magento/magento2-functional-test-module-reports": "dev-master",
-        "magento/magento2-functional-test-module-catalog-inventory": "dev-master",
-        "magento/magento2-functional-test-module-wishlist": "dev-master",
-        "magento/magento2-functional-test-module-shipping": "dev-master",
-        "magento/magento2-functional-test-module-config": "dev-master",
-        "magento/magento2-functional-test-module-media-storage": "dev-master",
-        "magento/magento2-functional-test-module-ui": "dev-master",
-        "magento/magento2-functional-test-module-quote": "dev-master"
+        "magento/magento2-functional-test-module-authorization": "1.0.0",
+        "magento/magento2-functional-test-module-backend": "1.0.0",
+        "magento/magento2-functional-test-module-catalog": "1.0.0",
+        "magento/magento2-functional-test-module-catalog-inventory": "1.0.0",
+        "magento/magento2-functional-test-module-checkout": "1.0.0",
+        "magento/magento2-functional-test-module-config": "1.0.0",
+        "magento/magento2-functional-test-module-customer": "1.0.0",
+        "magento/magento2-functional-test-module-directory": "1.0.0",
+        "magento/magento2-functional-test-module-eav": "1.0.0",
+        "magento/magento2-functional-test-module-gift-message": "1.0.0",
+        "magento/magento2-functional-test-module-media-storage": "1.0.0",
+        "magento/magento2-functional-test-module-payment": "1.0.0",
+        "magento/magento2-functional-test-module-quote": "1.0.0",
+        "magento/magento2-functional-test-module-reports": "1.0.0",
+        "magento/magento2-functional-test-module-sales-rule": "1.0.0",
+        "magento/magento2-functional-test-module-sales-sequence": "1.0.0",
+        "magento/magento2-functional-test-module-shipping": "1.0.0",
+        "magento/magento2-functional-test-module-store": "1.0.0",
+        "magento/magento2-functional-test-module-tax": "1.0.0",
+        "magento/magento2-functional-test-module-theme": "1.0.0",
+        "magento/magento2-functional-test-module-ui": "1.0.0",
+        "magento/magento2-functional-test-module-widget": "1.0.0",
+        "magento/magento2-functional-test-module-wishlist": "1.0.0"
     },
     "type": "magento2-test-module",
-    "version": "dev-master",
+    "version": "1.0.0",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
-        "psr-0": {
-            "Yandex": "vendor/allure-framework/allure-codeception/src/"
-        },
         "psr-4": {
-            "Magento\\FunctionalTestingFramework\\": [
-                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
-            ],
-            "Magento\\FunctionalTest\\": [
-                "tests/functional/Magento/FunctionalTest",
-                "generated/Magento/FunctionalTest"
-            ]
+            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
         }
     },
     "extra": {
         "map": [
             [
                 "*",
-                "tests/functional/Magento/FunctionalTest/Sales"
+                "dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales"
             ]
         ]
     }
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesInventory/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesInventory/README.md
index a0d48d3c628..beeef87b6e7 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesInventory/README.md
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesInventory/README.md
@@ -1,3 +1,3 @@
-# Magento 2 Acceptance Tests
+# Magento 2 Functional Tests
 
-The Acceptance Tests Module for **Magento_SalesInventory** Module.
+The Functional Tests Module for **Magento_SalesInventory** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesInventory/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesInventory/composer.json
index aec10499a86..90cb8ae45ff 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesInventory/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesInventory/composer.json
@@ -1,52 +1,40 @@
 {
     "name": "magento/magento2-functional-test-module-sales-inventory",
-    "description": "Magento 2 Acceptance Test Module Sales Inventory",
-    "repositories": [
-        {
-            "type" : "composer",
-            "url" : "https://repo.magento.com/"
-        }
-    ],
+    "description": "Magento 2 Functional Test Module Sales Inventory",
+    "config": {
+        "sort-packages": true
+    },
     "require": {
-        "php": "~7.0",
-        "codeception/codeception": "2.2|2.3",
-        "allure-framework/allure-codeception": "dev-master",
+        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
+        "codeception/codeception": "~2.3.4",
         "consolidation/robo": "^1.0.0",
         "henrikbjorn/lurker": "^1.2",
-        "vlucas/phpdotenv": "~2.4",
-        "magento/magento2-functional-testing-framework": "dev-develop"
+        "magento/magento2-functional-testing-framework": "1.0.0",
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
+        "vlucas/phpdotenv": "~2.4"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-catalog-inventory": "dev-master",
-        "magento/magento2-functional-test-module-sales": "dev-master",
-        "magento/magento2-functional-test-module-store": "dev-master",
-        "magento/magento2-functional-test-module-catalog": "dev-master"
+        "magento/magento2-functional-test-module-catalog": "1.0.0",
+        "magento/magento2-functional-test-module-catalog-inventory": "1.0.0",
+        "magento/magento2-functional-test-module-sales": "1.0.0",
+        "magento/magento2-functional-test-module-store": "1.0.0"
     },
     "type": "magento2-test-module",
-    "version": "dev-master",
+    "version": "1.0.0",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
-        "psr-0": {
-            "Yandex": "vendor/allure-framework/allure-codeception/src/"
-        },
         "psr-4": {
-            "Magento\\FunctionalTestingFramework\\": [
-                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
-            ],
-            "Magento\\FunctionalTest\\": [
-                "tests/functional/Magento/FunctionalTest",
-                "generated/Magento/FunctionalTest"
-            ]
+            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
         }
     },
     "extra": {
         "map": [
             [
                 "*",
-                "tests/functional/Magento/FunctionalTest/SalesInventory"
+                "dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesInventory"
             ]
         ]
     }
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesRule/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesRule/README.md
index 09f32aad688..2180f41bb7e 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesRule/README.md
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesRule/README.md
@@ -1,3 +1,3 @@
-# Magento 2 Acceptance Tests
+# Magento 2 Functional Tests
 
-The Acceptance Tests Module for **Magento_SalesRule** Module.
+The Functional Tests Module for **Magento_SalesRule** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesRule/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesRule/composer.json
index dca57e5c344..b721a3694b1 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesRule/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesRule/composer.json
@@ -1,66 +1,52 @@
 {
     "name": "magento/magento2-functional-test-module-sales-rule",
-    "description": "Magento 2 Acceptance Test Module Sales Rule",
-    "repositories": [
-        {
-            "type" : "composer",
-            "url" : "https://repo.magento.com/"
-        }
-    ],
+    "description": "Magento 2 Functional Test Module Sales Rule",
+    "config": {
+        "sort-packages": true
+    },
     "require": {
-        "php": "~7.0",
-        "codeception/codeception": "2.2|2.3",
-        "allure-framework/allure-codeception": "dev-master",
+        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
+        "codeception/codeception": "~2.3.4",
         "consolidation/robo": "^1.0.0",
         "henrikbjorn/lurker": "^1.2",
-        "vlucas/phpdotenv": "~2.4",
-        "magento/magento2-functional-testing-framework": "dev-develop"
+        "magento/magento2-functional-testing-framework": "1.0.0",
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
+        "vlucas/phpdotenv": "~2.4"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-store": "dev-master",
-        "magento/magento2-functional-test-module-theme": "dev-master",
-        "magento/magento2-functional-test-module-backend": "dev-master",
-        "magento/magento2-functional-test-module-catalog": "dev-master",
-        "magento/magento2-functional-test-module-customer": "dev-master",
-        "magento/magento2-functional-test-module-checkout": "dev-master",
-        "magento/magento2-functional-test-module-shipping": "dev-master",
-        "magento/magento2-functional-test-module-sales": "dev-master",
-        "magento/magento2-functional-test-module-config": "dev-master",
-        "magento/magento2-functional-test-module-rule": "dev-master",
-        "magento/magento2-functional-test-module-eav": "dev-master",
-        "magento/magento2-functional-test-module-directory": "dev-master",
-        "magento/magento2-functional-test-module-payment": "dev-master",
-        "magento/magento2-functional-test-module-reports": "dev-master",
-        "magento/magento2-functional-test-module-catalog-rule": "dev-master",
-        "magento/magento2-functional-test-module-widget": "dev-master",
-        "magento/magento2-functional-test-module-quote": "dev-master",
-        "magento/magento2-functional-test-module-ui": "dev-master"
+        "magento/magento2-functional-test-module-backend": "1.0.0",
+        "magento/magento2-functional-test-module-catalog": "1.0.0",
+        "magento/magento2-functional-test-module-catalog-rule": "1.0.0",
+        "magento/magento2-functional-test-module-config": "1.0.0",
+        "magento/magento2-functional-test-module-customer": "1.0.0",
+        "magento/magento2-functional-test-module-directory": "1.0.0",
+        "magento/magento2-functional-test-module-eav": "1.0.0",
+        "magento/magento2-functional-test-module-payment": "1.0.0",
+        "magento/magento2-functional-test-module-quote": "1.0.0",
+        "magento/magento2-functional-test-module-reports": "1.0.0",
+        "magento/magento2-functional-test-module-rule": "1.0.0",
+        "magento/magento2-functional-test-module-sales": "1.0.0",
+        "magento/magento2-functional-test-module-shipping": "1.0.0",
+        "magento/magento2-functional-test-module-store": "1.0.0",
+        "magento/magento2-functional-test-module-ui": "1.0.0",
+        "magento/magento2-functional-test-module-widget": "1.0.0"
     },
     "type": "magento2-test-module",
-    "version": "dev-master",
+    "version": "1.0.0",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
-        "psr-0": {
-            "Yandex": "vendor/allure-framework/allure-codeception/src/"
-        },
         "psr-4": {
-            "Magento\\FunctionalTestingFramework\\": [
-                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
-            ],
-            "Magento\\FunctionalTest\\": [
-                "tests/functional/Magento/FunctionalTest",
-                "generated/Magento/FunctionalTest"
-            ]
+            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
         }
     },
     "extra": {
         "map": [
             [
                 "*",
-                "tests/functional/Magento/FunctionalTest/SalesRule"
+                "dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesRule"
             ]
         ]
     }
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesSequence/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesSequence/README.md
index 8dc5c1445cc..8b3e36c3fda 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesSequence/README.md
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesSequence/README.md
@@ -1,3 +1,3 @@
-# Magento 2 Acceptance Tests
+# Magento 2 Functional Tests
 
-The Acceptance Tests Module for **Magento_SalesSequence** Module.
+The Functional Tests Module for **Magento_SalesSequence** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesSequence/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesSequence/composer.json
index c395bbb71c5..3d5819045d2 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesSequence/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesSequence/composer.json
@@ -1,46 +1,34 @@
 {
     "name": "magento/magento2-functional-test-module-sales-sequence",
-    "description": "Magento 2 Acceptance Test Module Sales Sequence",
-    "repositories": [
-        {
-            "type" : "composer",
-            "url" : "https://repo.magento.com/"
-        }
-    ],
+    "description": "Magento 2 Functional Test Module Sales Sequence",
+    "config": {
+        "sort-packages": true
+    },
     "require": {
-        "php": "~7.0",
-        "codeception/codeception": "2.2|2.3",
-        "allure-framework/allure-codeception": "dev-master",
+        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
+        "codeception/codeception": "~2.3.4",
         "consolidation/robo": "^1.0.0",
         "henrikbjorn/lurker": "^1.2",
-        "vlucas/phpdotenv": "~2.4",
-        "magento/magento2-functional-testing-framework": "dev-develop"
+        "magento/magento2-functional-testing-framework": "1.0.0",
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
+        "vlucas/phpdotenv": "~2.4"
     },
     "type": "magento2-test-module",
-    "version": "dev-master",
+    "version": "1.0.0",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
-        "psr-0": {
-            "Yandex": "vendor/allure-framework/allure-codeception/src/"
-        },
         "psr-4": {
-            "Magento\\FunctionalTestingFramework\\": [
-                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
-            ],
-            "Magento\\FunctionalTest\\": [
-                "tests/functional/Magento/FunctionalTest",
-                "generated/Magento/FunctionalTest"
-            ]
+            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
         }
     },
     "extra": {
         "map": [
             [
                 "*",
-                "tests/functional/Magento/FunctionalTest/SalesSequence"
+                "dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesSequence"
             ]
         ]
     }
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleData/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleData/README.md
index edcd1629bd5..1dcde417aed 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleData/README.md
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleData/README.md
@@ -1,3 +1,3 @@
-# Magento 2 Acceptance Tests
+# Magento 2 Functional Tests
 
-The Acceptance Tests Module for **Magento_SampleData** Module.
+The Functional Tests Module for **Magento_SampleData** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleData/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleData/composer.json
index ef30780208b..4b3c2ca9c4e 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleData/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleData/composer.json
@@ -1,46 +1,34 @@
 {
     "name": "magento/magento2-functional-test-module-sample-data",
-    "description": "Magento 2 Acceptance Test Module Sample Data",
-    "repositories": [
-        {
-            "type" : "composer",
-            "url" : "https://repo.magento.com/"
-        }
-    ],
+    "description": "Magento 2 Functional Test Module Sample Data",
+    "config": {
+        "sort-packages": true
+    },
     "require": {
-        "php": "~7.0",
-        "codeception/codeception": "2.2|2.3",
-        "allure-framework/allure-codeception": "dev-master",
+        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
+        "codeception/codeception": "~2.3.4",
         "consolidation/robo": "^1.0.0",
         "henrikbjorn/lurker": "^1.2",
-        "vlucas/phpdotenv": "~2.4",
-        "magento/magento2-functional-testing-framework": "dev-develop"
+        "magento/magento2-functional-testing-framework": "1.0.0",
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
+        "vlucas/phpdotenv": "~2.4"
     },
     "type": "magento2-test-module",
-    "version": "dev-master",
+    "version": "1.0.0",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
-        "psr-0": {
-            "Yandex": "vendor/allure-framework/allure-codeception/src/"
-        },
         "psr-4": {
-            "Magento\\FunctionalTestingFramework\\": [
-                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
-            ],
-            "Magento\\FunctionalTest\\": [
-                "tests/functional/Magento/FunctionalTest",
-                "generated/Magento/FunctionalTest"
-            ]
+            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
         }
     },
     "extra": {
         "map": [
             [
                 "*",
-                "tests/functional/Magento/FunctionalTest/SampleData"
+                "dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleData"
             ]
         ]
     }
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Search/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Search/README.md
index 17d37794fb0..bb6c6d52df2 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Search/README.md
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Search/README.md
@@ -1,3 +1,3 @@
-# Magento 2 Acceptance Tests
+# Magento 2 Functional Tests
 
-The Acceptance Tests Module for **Magento_Search** Module.
+The Functional Tests Module for **Magento_Search** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Search/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Search/composer.json
index ef78fc2a19c..fdaefcc362b 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Search/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Search/composer.json
@@ -1,53 +1,41 @@
 {
     "name": "magento/magento2-functional-test-module-search",
-    "description": "Magento 2 Acceptance Test Module Search",
-    "repositories": [
-        {
-            "type" : "composer",
-            "url" : "https://repo.magento.com/"
-        }
-    ],
+    "description": "Magento 2 Functional Test Module Search",
+    "config": {
+        "sort-packages": true
+    },
     "require": {
-        "php": "~7.0",
-        "codeception/codeception": "2.2|2.3",
-        "allure-framework/allure-codeception": "dev-master",
+        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
+        "codeception/codeception": "~2.3.4",
         "consolidation/robo": "^1.0.0",
         "henrikbjorn/lurker": "^1.2",
-        "vlucas/phpdotenv": "~2.4",
-        "magento/magento2-functional-testing-framework": "dev-develop"
+        "magento/magento2-functional-testing-framework": "1.0.0",
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
+        "vlucas/phpdotenv": "~2.4"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-store": "dev-master",
-        "magento/magento2-functional-test-module-backend": "dev-master",
-        "magento/magento2-functional-test-module-catalog-search": "dev-master",
-        "magento/magento2-functional-test-module-reports": "dev-master",
-        "magento/magento2-functional-test-module-ui": "dev-master"
+        "magento/magento2-functional-test-module-backend": "1.0.0",
+        "magento/magento2-functional-test-module-catalog-search": "1.0.0",
+        "magento/magento2-functional-test-module-reports": "1.0.0",
+        "magento/magento2-functional-test-module-store": "1.0.0",
+        "magento/magento2-functional-test-module-ui": "1.0.0"
     },
     "type": "magento2-test-module",
-    "version": "dev-master",
+    "version": "1.0.0",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
-        "psr-0": {
-            "Yandex": "vendor/allure-framework/allure-codeception/src/"
-        },
         "psr-4": {
-            "Magento\\FunctionalTestingFramework\\": [
-                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
-            ],
-            "Magento\\FunctionalTest\\": [
-                "tests/functional/Magento/FunctionalTest",
-                "generated/Magento/FunctionalTest"
-            ]
+            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
         }
     },
     "extra": {
         "map": [
             [
                 "*",
-                "tests/functional/Magento/FunctionalTest/Search"
+                "dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Search"
             ]
         ]
     }
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Security/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Security/README.md
index 2507ca55e06..26f535867d4 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Security/README.md
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Security/README.md
@@ -1,3 +1,3 @@
-# Magento 2 Acceptance Tests
+# Magento 2 Functional Tests
 
-The Acceptance Tests Module for **Magento_Security** Module.
+The Functional Tests Module for **Magento_Security** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Security/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Security/composer.json
index 0490f148385..17380dda334 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Security/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Security/composer.json
@@ -1,50 +1,38 @@
 {
     "name": "magento/magento2-functional-test-module-security",
-    "description": "Magento 2 Acceptance Test Module Security",
-    "repositories": [
-        {
-            "type" : "composer",
-            "url" : "https://repo.magento.com/"
-        }
-    ],
+    "description": "Magento 2 Functional Test Module Security",
+    "config": {
+        "sort-packages": true
+    },
     "require": {
-        "php": "~7.0",
-        "codeception/codeception": "2.2|2.3",
-        "allure-framework/allure-codeception": "dev-master",
+        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
+        "codeception/codeception": "~2.3.4",
         "consolidation/robo": "^1.0.0",
         "henrikbjorn/lurker": "^1.2",
-        "vlucas/phpdotenv": "~2.4",
-        "magento/magento2-functional-testing-framework": "dev-develop"
+        "magento/magento2-functional-testing-framework": "1.0.0",
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
+        "vlucas/phpdotenv": "~2.4"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-store": "dev-master",
-        "magento/magento2-functional-test-module-backend": "dev-master"
+        "magento/magento2-functional-test-module-backend": "1.0.0",
+        "magento/magento2-functional-test-module-store": "1.0.0"
     },
     "type": "magento2-test-module",
-    "version": "dev-master",
+    "version": "1.0.0",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
-        "psr-0": {
-            "Yandex": "vendor/allure-framework/allure-codeception/src/"
-        },
         "psr-4": {
-            "Magento\\FunctionalTestingFramework\\": [
-                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
-            ],
-            "Magento\\FunctionalTest\\": [
-                "tests/functional/Magento/FunctionalTest",
-                "generated/Magento/FunctionalTest"
-            ]
+            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
         }
     },
     "extra": {
         "map": [
             [
                 "*",
-                "tests/functional/Magento/FunctionalTest/Security"
+                "dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Security"
             ]
         ]
     }
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SendFriend/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SendFriend/README.md
index 00d818d2406..8759f1b780d 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SendFriend/README.md
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SendFriend/README.md
@@ -1,3 +1,3 @@
-# Magento 2 Acceptance Tests
+# Magento 2 Functional Tests
 
-The Acceptance Tests Module for **Magento_SendFriend** Module.
+The Functional Tests Module for **Magento_SendFriend** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SendFriend/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SendFriend/composer.json
index 4dbd07d2aef..caea753b1a2 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SendFriend/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SendFriend/composer.json
@@ -1,51 +1,39 @@
 {
     "name": "magento/magento2-functional-test-module-send-friend",
-    "description": "Magento 2 Acceptance Test Module Send Friend",
-    "repositories": [
-        {
-            "type" : "composer",
-            "url" : "https://repo.magento.com/"
-        }
-    ],
+    "description": "Magento 2 Functional Test Module Send Friend",
+    "config": {
+        "sort-packages": true
+    },
     "require": {
-        "php": "~7.0",
-        "codeception/codeception": "2.2|2.3",
-        "allure-framework/allure-codeception": "dev-master",
+        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
+        "codeception/codeception": "~2.3.4",
         "consolidation/robo": "^1.0.0",
         "henrikbjorn/lurker": "^1.2",
-        "vlucas/phpdotenv": "~2.4",
-        "magento/magento2-functional-testing-framework": "dev-develop"
+        "magento/magento2-functional-testing-framework": "1.0.0",
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
+        "vlucas/phpdotenv": "~2.4"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-store": "dev-master",
-        "magento/magento2-functional-test-module-catalog": "dev-master",
-        "magento/magento2-functional-test-module-customer": "dev-master"
+        "magento/magento2-functional-test-module-catalog": "1.0.0",
+        "magento/magento2-functional-test-module-customer": "1.0.0",
+        "magento/magento2-functional-test-module-store": "1.0.0"
     },
     "type": "magento2-test-module",
-    "version": "dev-master",
+    "version": "1.0.0",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
-        "psr-0": {
-            "Yandex": "vendor/allure-framework/allure-codeception/src/"
-        },
         "psr-4": {
-            "Magento\\FunctionalTestingFramework\\": [
-                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
-            ],
-            "Magento\\FunctionalTest\\": [
-                "tests/functional/Magento/FunctionalTest",
-                "generated/Magento/FunctionalTest"
-            ]
+            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
         }
     },
     "extra": {
         "map": [
             [
                 "*",
-                "tests/functional/Magento/FunctionalTest/SendFriend"
+                "dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SendFriend"
             ]
         ]
     }
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Shipping/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Shipping/README.md
index fbca31f68ed..2e2ca0df9ea 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Shipping/README.md
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Shipping/README.md
@@ -1,3 +1,3 @@
-# Magento 2 Acceptance Tests
+# Magento 2 Functional Tests
 
-The Acceptance Tests Module for **Magento_Shipping** Module.
+The Functional Tests Module for **Magento_Shipping** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Shipping/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Shipping/composer.json
index e4ad63928ad..18a2ba3d285 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Shipping/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Shipping/composer.json
@@ -1,61 +1,49 @@
 {
     "name": "magento/magento2-functional-test-module-shipping",
-    "description": "Magento 2 Acceptance Test Module Shipping",
-    "repositories": [
-        {
-            "type" : "composer",
-            "url" : "https://repo.magento.com/"
-        }
-    ],
+    "description": "Magento 2 Functional Test Module Shipping",
+    "config": {
+        "sort-packages": true
+    },
     "require": {
-        "php": "~7.0",
-        "codeception/codeception": "2.2|2.3",
-        "allure-framework/allure-codeception": "dev-master",
+        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
+        "codeception/codeception": "~2.3.4",
         "consolidation/robo": "^1.0.0",
         "henrikbjorn/lurker": "^1.2",
-        "vlucas/phpdotenv": "~2.4",
-        "magento/magento2-functional-testing-framework": "dev-develop"
+        "magento/magento2-functional-testing-framework": "1.0.0",
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
+        "vlucas/phpdotenv": "~2.4"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-store": "dev-master",
-        "magento/magento2-functional-test-module-catalog": "dev-master",
-        "magento/magento2-functional-test-module-sales": "dev-master",
-        "magento/magento2-functional-test-module-backend": "dev-master",
-        "magento/magento2-functional-test-module-directory": "dev-master",
-        "magento/magento2-functional-test-module-contact": "dev-master",
-        "magento/magento2-functional-test-module-customer": "dev-master",
-        "magento/magento2-functional-test-module-payment": "dev-master",
-        "magento/magento2-functional-test-module-tax": "dev-master",
-        "magento/magento2-functional-test-module-catalog-inventory": "dev-master",
-        "magento/magento2-functional-test-module-quote": "dev-master",
-        "magento/magento2-functional-test-module-ui": "dev-master",
-        "magento/magento2-functional-test-module-user": "dev-master"
+        "magento/magento2-functional-test-module-backend": "1.0.0",
+        "magento/magento2-functional-test-module-catalog": "1.0.0",
+        "magento/magento2-functional-test-module-catalog-inventory": "1.0.0",
+        "magento/magento2-functional-test-module-contact": "1.0.0",
+        "magento/magento2-functional-test-module-customer": "1.0.0",
+        "magento/magento2-functional-test-module-directory": "1.0.0",
+        "magento/magento2-functional-test-module-payment": "1.0.0",
+        "magento/magento2-functional-test-module-quote": "1.0.0",
+        "magento/magento2-functional-test-module-sales": "1.0.0",
+        "magento/magento2-functional-test-module-store": "1.0.0",
+        "magento/magento2-functional-test-module-tax": "1.0.0",
+        "magento/magento2-functional-test-module-ui": "1.0.0",
+        "magento/magento2-functional-test-module-user": "1.0.0"
     },
     "type": "magento2-test-module",
-    "version": "dev-master",
+    "version": "1.0.0",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
-        "psr-0": {
-            "Yandex": "vendor/allure-framework/allure-codeception/src/"
-        },
         "psr-4": {
-            "Magento\\FunctionalTestingFramework\\": [
-                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
-            ],
-            "Magento\\FunctionalTest\\": [
-                "tests/functional/Magento/FunctionalTest",
-                "generated/Magento/FunctionalTest"
-            ]
+            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
         }
     },
     "extra": {
         "map": [
             [
                 "*",
-                "tests/functional/Magento/FunctionalTest/Shipping"
+                "dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Shipping"
             ]
         ]
     }
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sitemap/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sitemap/README.md
index cc89e5a0bce..9770ead7803 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sitemap/README.md
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sitemap/README.md
@@ -1,3 +1,3 @@
-# Magento 2 Acceptance Tests
+# Magento 2 Functional Tests
 
-The Acceptance Tests Module for **Magento_Sitemap** Module.
+The Functional Tests Module for **Magento_Sitemap** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sitemap/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sitemap/composer.json
index 9b7f0c3e184..d5453bdecfe 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sitemap/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sitemap/composer.json
@@ -1,57 +1,45 @@
 {
     "name": "magento/magento2-functional-test-module-sitemap",
-    "description": "Magento 2 Acceptance Test Module Sitemap",
-    "repositories": [
-        {
-            "type" : "composer",
-            "url" : "https://repo.magento.com/"
-        }
-    ],
+    "description": "Magento 2 Functional Test Module Sitemap",
+    "config": {
+        "sort-packages": true
+    },
     "require": {
-        "php": "~7.0",
-        "codeception/codeception": "2.2|2.3",
-        "allure-framework/allure-codeception": "dev-master",
+        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
+        "codeception/codeception": "~2.3.4",
         "consolidation/robo": "^1.0.0",
         "henrikbjorn/lurker": "^1.2",
-        "vlucas/phpdotenv": "~2.4",
-        "magento/magento2-functional-testing-framework": "dev-develop"
+        "magento/magento2-functional-testing-framework": "1.0.0",
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
+        "vlucas/phpdotenv": "~2.4"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-store": "dev-master",
-        "magento/magento2-functional-test-module-catalog": "dev-master",
-        "magento/magento2-functional-test-module-eav": "dev-master",
-        "magento/magento2-functional-test-module-cms": "dev-master",
-        "magento/magento2-functional-test-module-backend": "dev-master",
-        "magento/magento2-functional-test-module-catalog-url-rewrite": "dev-master",
-        "magento/magento2-functional-test-module-media-storage": "dev-master",
-        "magento/magento2-functional-test-module-config": "dev-master",
-        "magento/magento2-functional-test-module-robots": "dev-master"
+        "magento/magento2-functional-test-module-backend": "1.0.0",
+        "magento/magento2-functional-test-module-catalog": "1.0.0",
+        "magento/magento2-functional-test-module-catalog-url-rewrite": "1.0.0",
+        "magento/magento2-functional-test-module-cms": "1.0.0",
+        "magento/magento2-functional-test-module-config": "1.0.0",
+        "magento/magento2-functional-test-module-eav": "1.0.0",
+        "magento/magento2-functional-test-module-media-storage": "1.0.0",
+        "magento/magento2-functional-test-module-robots": "1.0.0",
+        "magento/magento2-functional-test-module-store": "1.0.0"
     },
     "type": "magento2-test-module",
-    "version": "dev-master",
+    "version": "1.0.0",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
-        "psr-0": {
-            "Yandex": "vendor/allure-framework/allure-codeception/src/"
-        },
         "psr-4": {
-            "Magento\\FunctionalTestingFramework\\": [
-                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
-            ],
-            "Magento\\FunctionalTest\\": [
-                "tests/functional/Magento/FunctionalTest",
-                "generated/Magento/FunctionalTest"
-            ]
+            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
         }
     },
     "extra": {
         "map": [
             [
                 "*",
-                "tests/functional/Magento/FunctionalTest/Sitemap"
+                "dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sitemap"
             ]
         ]
     }
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/README.md
index 108f407dd44..409824ff7bf 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/README.md
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/README.md
@@ -1,3 +1,3 @@
-# Magento 2 Acceptance Tests
+# Magento 2 Functional Tests
 
-The Acceptance Tests Module for **Magento_Store** Module.
+The Functional Tests Module for **Magento_Store** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/composer.json
index 084ebb97b11..39d3cb9d583 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/composer.json
@@ -1,53 +1,41 @@
 {
     "name": "magento/magento2-functional-test-module-store",
-    "description": "Magento 2 Acceptance Test Module Store",
-    "repositories": [
-        {
-            "type" : "composer",
-            "url" : "https://repo.magento.com/"
-        }
-    ],
+    "description": "Magento 2 Functional Test Module Store",
+    "config": {
+        "sort-packages": true
+    },
     "require": {
-        "php": "~7.0",
-        "codeception/codeception": "2.2|2.3",
-        "allure-framework/allure-codeception": "dev-master",
+        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
+        "codeception/codeception": "~2.3.4",
         "consolidation/robo": "^1.0.0",
         "henrikbjorn/lurker": "^1.2",
-        "vlucas/phpdotenv": "~2.4",
-        "magento/magento2-functional-testing-framework": "dev-develop"
+        "magento/magento2-functional-testing-framework": "1.0.0",
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
+        "vlucas/phpdotenv": "~2.4"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-directory": "dev-master",
-        "magento/magento2-functional-test-module-catalog": "dev-master",
-        "magento/magento2-functional-test-module-ui": "dev-master",
-        "magento/magento2-functional-test-module-config": "dev-master",
-        "magento/magento2-functional-test-module-media-storage": "dev-master"
+        "magento/magento2-functional-test-module-catalog": "1.0.0",
+        "magento/magento2-functional-test-module-config": "1.0.0",
+        "magento/magento2-functional-test-module-directory": "1.0.0",
+        "magento/magento2-functional-test-module-media-storage": "1.0.0",
+        "magento/magento2-functional-test-module-ui": "1.0.0"
     },
     "type": "magento2-test-module",
-    "version": "dev-master",
+    "version": "1.0.0",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
-        "psr-0": {
-            "Yandex": "vendor/allure-framework/allure-codeception/src/"
-        },
         "psr-4": {
-            "Magento\\FunctionalTestingFramework\\": [
-                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
-            ],
-            "Magento\\FunctionalTest\\": [
-                "tests/functional/Magento/FunctionalTest",
-                "generated/Magento/FunctionalTest"
-            ]
+            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
         }
     },
     "extra": {
         "map": [
             [
                 "*",
-                "tests/functional/Magento/FunctionalTest/Store"
+                "dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store"
             ]
         ]
     }
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Swagger/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Swagger/README.md
index 767c5b0b729..b9ad9db9668 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Swagger/README.md
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Swagger/README.md
@@ -1,3 +1,3 @@
-# Magento 2 Acceptance Tests
+# Magento 2 Functional Tests
 
-The Acceptance Tests Module for **Magento_Swagger** Module.
+The Functional Tests Module for **Magento_Swagger** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Swagger/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Swagger/composer.json
index 5b62252b3df..8dc3c358c46 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Swagger/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Swagger/composer.json
@@ -1,46 +1,34 @@
 {
     "name": "magento/magento2-functional-test-module-swagger",
-    "description": "Magento 2 Acceptance Test Module Swagger",
-    "repositories": [
-        {
-            "type" : "composer",
-            "url" : "https://repo.magento.com/"
-        }
-    ],
+    "description": "Magento 2 Functional Test Module Swagger",
+    "config": {
+        "sort-packages": true
+    },
     "require": {
-        "php": "~7.0",
-        "codeception/codeception": "2.2|2.3",
-        "allure-framework/allure-codeception": "dev-master",
+        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
+        "codeception/codeception": "~2.3.4",
         "consolidation/robo": "^1.0.0",
         "henrikbjorn/lurker": "^1.2",
-        "vlucas/phpdotenv": "~2.4",
-        "magento/magento2-functional-testing-framework": "dev-develop"
+        "magento/magento2-functional-testing-framework": "1.0.0",
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
+        "vlucas/phpdotenv": "~2.4"
     },
     "type": "magento2-test-module",
-    "version": "dev-master",
+    "version": "1.0.0",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
-        "psr-0": {
-            "Yandex": "vendor/allure-framework/allure-codeception/src/"
-        },
         "psr-4": {
-            "Magento\\FunctionalTestingFramework\\": [
-                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
-            ],
-            "Magento\\FunctionalTest\\": [
-                "tests/functional/Magento/FunctionalTest",
-                "generated/Magento/FunctionalTest"
-            ]
+            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
         }
     },
     "extra": {
         "map": [
             [
                 "*",
-                "tests/functional/Magento/FunctionalTest/Swagger"
+                "dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Swagger"
             ]
         ]
     }
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Swatches/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Swatches/README.md
index cc3852f1ed0..c117f0005c6 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Swatches/README.md
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Swatches/README.md
@@ -1,3 +1,3 @@
-# Magento 2 Acceptance Tests
+# Magento 2 Functional Tests
 
-The Acceptance Tests Module for **Magento_Swatches** Module.
+The Functional Tests Module for **Magento_Swatches** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Swatches/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Swatches/composer.json
index aa541ddd3a4..79689cd586a 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Swatches/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Swatches/composer.json
@@ -1,57 +1,45 @@
 {
     "name": "magento/magento2-functional-test-module-swatches",
-    "description": "Magento 2 Acceptance Test Module Swatches",
-    "repositories": [
-        {
-            "type" : "composer",
-            "url" : "https://repo.magento.com/"
-        }
-    ],
+    "description": "Magento 2 Functional Test Module Swatches",
+    "config": {
+        "sort-packages": true
+    },
     "require": {
-        "php": "~7.0",
-        "codeception/codeception": "2.2|2.3",
-        "allure-framework/allure-codeception": "dev-master",
+        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
+        "codeception/codeception": "~2.3.4",
         "consolidation/robo": "^1.0.0",
         "henrikbjorn/lurker": "^1.2",
-        "vlucas/phpdotenv": "~2.4",
-        "magento/magento2-functional-testing-framework": "dev-develop"
+        "magento/magento2-functional-testing-framework": "1.0.0",
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
+        "vlucas/phpdotenv": "~2.4"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-catalog": "dev-master",
-        "magento/magento2-functional-test-module-configurable-product": "dev-master",
-        "magento/magento2-functional-test-module-eav": "dev-master",
-        "magento/magento2-functional-test-module-customer": "dev-master",
-        "magento/magento2-functional-test-module-store": "dev-master",
-        "magento/magento2-functional-test-module-backend": "dev-master",
-        "magento/magento2-functional-test-module-media-storage": "dev-master",
-        "magento/magento2-functional-test-module-config": "dev-master",
-        "magento/magento2-functional-test-module-theme": "dev-master"
+        "magento/magento2-functional-test-module-backend": "1.0.0",
+        "magento/magento2-functional-test-module-catalog": "1.0.0",
+        "magento/magento2-functional-test-module-config": "1.0.0",
+        "magento/magento2-functional-test-module-configurable-product": "1.0.0",
+        "magento/magento2-functional-test-module-customer": "1.0.0",
+        "magento/magento2-functional-test-module-eav": "1.0.0",
+        "magento/magento2-functional-test-module-media-storage": "1.0.0",
+        "magento/magento2-functional-test-module-store": "1.0.0",
+        "magento/magento2-functional-test-module-theme": "1.0.0"
     },
     "type": "magento2-test-module",
-    "version": "dev-master",
+    "version": "1.0.0",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
-        "psr-0": {
-            "Yandex": "vendor/allure-framework/allure-codeception/src/"
-        },
         "psr-4": {
-            "Magento\\FunctionalTestingFramework\\": [
-                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
-            ],
-            "Magento\\FunctionalTest\\": [
-                "tests/functional/Magento/FunctionalTest",
-                "generated/Magento/FunctionalTest"
-            ]
+            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
         }
     },
     "extra": {
         "map": [
             [
                 "*",
-                "tests/functional/Magento/FunctionalTest/Swatches"
+                "dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Swatches"
             ]
         ]
     }
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SwatchesLayeredNavigation/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SwatchesLayeredNavigation/README.md
index b4b81246d1f..5f25de111fa 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SwatchesLayeredNavigation/README.md
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SwatchesLayeredNavigation/README.md
@@ -1,3 +1,3 @@
-# Magento 2 Acceptance Tests
+# Magento 2 Functional Tests
 
-The Acceptance Tests Module for **Magento_SwatchesLayeredNavigation** Module.
+The Functional Tests Module for **Magento_SwatchesLayeredNavigation** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SwatchesLayeredNavigation/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SwatchesLayeredNavigation/composer.json
index f195f6b7aad..16c1ef4eab8 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SwatchesLayeredNavigation/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SwatchesLayeredNavigation/composer.json
@@ -1,46 +1,34 @@
 {
     "name": "magento/magento2-functional-test-module-swatches-layered-navigation",
-    "description": "Magento 2 Acceptance Test Module Swatches Layered Navigation",
-    "repositories": [
-        {
-            "type" : "composer",
-            "url" : "https://repo.magento.com/"
-        }
-    ],
+    "description": "Magento 2 Functional Test Module Swatches Layered Navigation",
+    "config": {
+        "sort-packages": true
+    },
     "require": {
-        "php": "~7.0",
-        "codeception/codeception": "2.2|2.3",
-        "allure-framework/allure-codeception": "dev-master",
+        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
+        "codeception/codeception": "~2.3.4",
         "consolidation/robo": "^1.0.0",
         "henrikbjorn/lurker": "^1.2",
-        "vlucas/phpdotenv": "~2.4",
-        "magento/magento2-functional-testing-framework": "dev-develop"
+        "magento/magento2-functional-testing-framework": "1.0.0",
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
+        "vlucas/phpdotenv": "~2.4"
     },
     "type": "magento2-test-module",
-    "version": "dev-master",
+    "version": "1.0.0",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
-        "psr-0": {
-            "Yandex": "vendor/allure-framework/allure-codeception/src/"
-        },
         "psr-4": {
-            "Magento\\FunctionalTestingFramework\\": [
-                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
-            ],
-            "Magento\\FunctionalTest\\": [
-                "tests/functional/Magento/FunctionalTest",
-                "generated/Magento/FunctionalTest"
-            ]
+            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
         }
     },
     "extra": {
         "map": [
             [
                 "*",
-                "tests/functional/Magento/FunctionalTest/SwatchesLayeredNavigation"
+                "dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SwatchesLayeredNavigation"
             ]
         ]
     }
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Tax/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Tax/README.md
index 0a3794479ec..0b2f50e217b 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Tax/README.md
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Tax/README.md
@@ -1,3 +1,3 @@
-# Magento 2 Acceptance Tests
+# Magento 2 Functional Tests
 
-The Acceptance Tests Module for **Magento_Tax** Module.
+The Functional Tests Module for **Magento_Tax** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Tax/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Tax/composer.json
index ca12ade2338..29578354bc9 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Tax/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Tax/composer.json
@@ -1,61 +1,49 @@
 {
     "name": "magento/magento2-functional-test-module-tax",
-    "description": "Magento 2 Acceptance Test Module Tax",
-    "repositories": [
-        {
-            "type" : "composer",
-            "url" : "https://repo.magento.com/"
-        }
-    ],
+    "description": "Magento 2 Functional Test Module Tax",
+    "config": {
+        "sort-packages": true
+    },
     "require": {
-        "php": "~7.0",
-        "codeception/codeception": "2.2|2.3",
-        "allure-framework/allure-codeception": "dev-master",
+        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
+        "codeception/codeception": "~2.3.4",
         "consolidation/robo": "^1.0.0",
         "henrikbjorn/lurker": "^1.2",
-        "vlucas/phpdotenv": "~2.4",
-        "magento/magento2-functional-testing-framework": "dev-develop"
+        "magento/magento2-functional-testing-framework": "1.0.0",
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
+        "vlucas/phpdotenv": "~2.4"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-config": "dev-master",
-        "magento/magento2-functional-test-module-store": "dev-master",
-        "magento/magento2-functional-test-module-catalog": "dev-master",
-        "magento/magento2-functional-test-module-customer": "dev-master",
-        "magento/magento2-functional-test-module-backend": "dev-master",
-        "magento/magento2-functional-test-module-directory": "dev-master",
-        "magento/magento2-functional-test-module-checkout": "dev-master",
-        "magento/magento2-functional-test-module-shipping": "dev-master",
-        "magento/magento2-functional-test-module-eav": "dev-master",
-        "magento/magento2-functional-test-module-sales": "dev-master",
-        "magento/magento2-functional-test-module-reports": "dev-master",
-        "magento/magento2-functional-test-module-page-cache": "dev-master",
-        "magento/magento2-functional-test-module-quote": "dev-master"
+        "magento/magento2-functional-test-module-backend": "1.0.0",
+        "magento/magento2-functional-test-module-catalog": "1.0.0",
+        "magento/magento2-functional-test-module-checkout": "1.0.0",
+        "magento/magento2-functional-test-module-config": "1.0.0",
+        "magento/magento2-functional-test-module-customer": "1.0.0",
+        "magento/magento2-functional-test-module-directory": "1.0.0",
+        "magento/magento2-functional-test-module-eav": "1.0.0",
+        "magento/magento2-functional-test-module-page-cache": "1.0.0",
+        "magento/magento2-functional-test-module-quote": "1.0.0",
+        "magento/magento2-functional-test-module-reports": "1.0.0",
+        "magento/magento2-functional-test-module-sales": "1.0.0",
+        "magento/magento2-functional-test-module-shipping": "1.0.0",
+        "magento/magento2-functional-test-module-store": "1.0.0"
     },
     "type": "magento2-test-module",
-    "version": "dev-master",
+    "version": "1.0.0",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
-        "psr-0": {
-            "Yandex": "vendor/allure-framework/allure-codeception/src/"
-        },
         "psr-4": {
-            "Magento\\FunctionalTestingFramework\\": [
-                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
-            ],
-            "Magento\\FunctionalTest\\": [
-                "tests/functional/Magento/FunctionalTest",
-                "generated/Magento/FunctionalTest"
-            ]
+            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
         }
     },
     "extra": {
         "map": [
             [
                 "*",
-                "tests/functional/Magento/FunctionalTest/Tax"
+                "dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Tax"
             ]
         ]
     }
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/TaxImportExport/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/TaxImportExport/composer.json
index 563df720db8..ee998afdc6e 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/TaxImportExport/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/TaxImportExport/composer.json
@@ -1,52 +1,40 @@
 {
     "name": "magento/magento2-functional-test-module-tax-import-export",
-    "description": "Magento 2 Acceptance Test Module Tax Import Export",
-    "repositories": [
-        {
-            "type" : "composer",
-            "url" : "https://repo.magento.com/"
-        }
-    ],
+    "description": "Magento 2 Functional Test Module Tax Import Export",
+    "config": {
+        "sort-packages": true
+    },
     "require": {
-        "php": "~7.0",
-        "codeception/codeception": "2.2|2.3",
-        "allure-framework/allure-codeception": "dev-master",
+        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
+        "codeception/codeception": "~2.3.4",
         "consolidation/robo": "^1.0.0",
         "henrikbjorn/lurker": "^1.2",
-        "vlucas/phpdotenv": "~2.4",
-        "magento/magento2-functional-testing-framework": "dev-develop"
+        "magento/magento2-functional-testing-framework": "1.0.0",
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
+        "vlucas/phpdotenv": "~2.4"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-tax": "dev-master",
-        "magento/magento2-functional-test-module-backend": "dev-master",
-        "magento/magento2-functional-test-module-directory": "dev-master",
-        "magento/magento2-functional-test-module-store": "dev-master"
+        "magento/magento2-functional-test-module-backend": "1.0.0",
+        "magento/magento2-functional-test-module-directory": "1.0.0",
+        "magento/magento2-functional-test-module-store": "1.0.0",
+        "magento/magento2-functional-test-module-tax": "1.0.0"
     },
     "type": "magento2-test-module",
-    "version": "dev-master",
+    "version": "1.0.0",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
-        "psr-0": {
-            "Yandex": "vendor/allure-framework/allure-codeception/src/"
-        },
         "psr-4": {
-            "Magento\\FunctionalTestingFramework\\": [
-                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
-            ],
-            "Magento\\FunctionalTest\\": [
-                "tests/functional/Magento/FunctionalTest",
-                "generated/Magento/FunctionalTest"
-            ]
+            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
         }
     },
     "extra": {
         "map": [
             [
                 "*",
-                "tests/functional/Magento/FunctionalTest/TaxImportExport"
+                "dev/tests/acceptance/tests/functional/Magento/FunctionalTest/TaxImportExport"
             ]
         ]
     }
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Theme/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Theme/README.md
index 187985eb187..d52ba3a2304 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Theme/README.md
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Theme/README.md
@@ -1,3 +1,3 @@
-# Magento 2 Acceptance Tests
+# Magento 2 Functional Tests
 
-The Acceptance Tests Module for **Magento_Theme** Module.
+The Functional Tests Module for **Magento_Theme** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Theme/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Theme/composer.json
index e54095e5ed0..2a05bb1be1e 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Theme/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Theme/composer.json
@@ -1,57 +1,46 @@
 {
     "name": "magento/magento2-functional-test-module-theme",
-    "description": "Magento 2 Acceptance Test Module Theme",
-    "repositories": [
-        {
-            "type" : "composer",
-            "url" : "https://repo.magento.com/"
-        }
-    ],
+    "description": "Magento 2 Functional Test Module Theme",
+    "config": {
+        "sort-packages": true
+    },
     "require": {
-        "php": "~7.0",
-        "codeception/codeception": "2.2|2.3",
-        "allure-framework/allure-codeception": "dev-master",
+        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
+        "codeception/codeception": "~2.3.4",
         "consolidation/robo": "^1.0.0",
         "henrikbjorn/lurker": "^1.2",
-        "vlucas/phpdotenv": "~2.4",
-        "magento/magento2-functional-testing-framework": "dev-develop"
+        "magento/magento2-functional-testing-framework": "1.0.0",
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
+        "vlucas/phpdotenv": "~2.4"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-store": "dev-master",
-        "magento/magento2-functional-test-module-customer": "dev-master",
-        "magento/magento2-functional-test-module-backend": "dev-master",
-        "magento/magento2-functional-test-module-cms": "dev-master",
-        "magento/magento2-functional-test-module-eav": "dev-master",
-        "magento/magento2-functional-test-module-widget": "dev-master",
-        "magento/magento2-functional-test-module-config": "dev-master",
-        "magento/magento2-functional-test-module-media-storage": "dev-master",
-        "magento/magento2-functional-test-module-ui": "dev-master"
+        "magento/magento2-functional-test-module-backend": "1.0.0",
+        "magento/magento2-functional-test-module-cms": "1.0.0",
+        "magento/magento2-functional-test-module-config": "1.0.0",
+        "magento/magento2-functional-test-module-customer": "1.0.0",
+        "magento/magento2-functional-test-module-eav": "1.0.0",
+        "magento/magento2-functional-test-module-media-storage": "1.0.0",
+        "magento/magento2-functional-test-module-require-js": "1.0.0",
+        "magento/magento2-functional-test-module-store": "1.0.0",
+        "magento/magento2-functional-test-module-ui": "1.0.0",
+        "magento/magento2-functional-test-module-widget": "1.0.0"
     },
     "type": "magento2-test-module",
-    "version": "dev-master",
+    "version": "1.0.0",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
-        "psr-0": {
-            "Yandex": "vendor/allure-framework/allure-codeception/src/"
-        },
         "psr-4": {
-            "Magento\\FunctionalTestingFramework\\": [
-                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
-            ],
-            "Magento\\FunctionalTest\\": [
-                "tests/functional/Magento/FunctionalTest",
-                "generated/Magento/FunctionalTest"
-            ]
+            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
         }
     },
     "extra": {
         "map": [
             [
                 "*",
-                "tests/functional/Magento/FunctionalTest/Theme"
+                "dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Theme"
             ]
         ]
     }
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Translation/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Translation/README.md
index 477d0cca791..4f3da0b95f3 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Translation/README.md
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Translation/README.md
@@ -1,3 +1,3 @@
-# Magento 2 Acceptance Tests
+# Magento 2 Functional Tests
 
-The Acceptance Tests Module for **Magento_Translation** Module.
+The Functional Tests Module for **Magento_Translation** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Translation/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Translation/composer.json
index 7825f0b22d6..8a9e1d516cd 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Translation/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Translation/composer.json
@@ -1,51 +1,39 @@
 {
     "name": "magento/magento2-functional-test-module-translation",
-    "description": "Magento 2 Acceptance Test Module Translation",
-    "repositories": [
-        {
-            "type" : "composer",
-            "url" : "https://repo.magento.com/"
-        }
-    ],
+    "description": "Magento 2 Functional Test Module Translation",
+    "config": {
+        "sort-packages": true
+    },
     "require": {
-        "php": "~7.0",
-        "codeception/codeception": "2.2|2.3",
-        "allure-framework/allure-codeception": "dev-master",
+        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
+        "codeception/codeception": "~2.3.4",
         "consolidation/robo": "^1.0.0",
         "henrikbjorn/lurker": "^1.2",
-        "vlucas/phpdotenv": "~2.4",
-        "magento/magento2-functional-testing-framework": "dev-develop"
+        "magento/magento2-functional-testing-framework": "1.0.0",
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
+        "vlucas/phpdotenv": "~2.4"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-store": "dev-master",
-        "magento/magento2-functional-test-module-backend": "dev-master",
-        "magento/magento2-functional-test-module-developer": "dev-master"
+        "magento/magento2-functional-test-module-backend": "1.0.0",
+        "magento/magento2-functional-test-module-developer": "1.0.0",
+        "magento/magento2-functional-test-module-store": "1.0.0"
     },
     "type": "magento2-test-module",
-    "version": "dev-master",
+    "version": "1.0.0",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
-        "psr-0": {
-            "Yandex": "vendor/allure-framework/allure-codeception/src/"
-        },
         "psr-4": {
-            "Magento\\FunctionalTestingFramework\\": [
-                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
-            ],
-            "Magento\\FunctionalTest\\": [
-                "tests/functional/Magento/FunctionalTest",
-                "generated/Magento/FunctionalTest"
-            ]
+            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
         }
     },
     "extra": {
         "map": [
             [
                 "*",
-                "tests/functional/Magento/FunctionalTest/Translation"
+                "dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Translation"
             ]
         ]
     }
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Ui/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Ui/README.md
index ca2fc107409..0e654f6aa5e 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Ui/README.md
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Ui/README.md
@@ -1,3 +1,3 @@
-# Magento 2 Acceptance Tests
+# Magento 2 Functional Tests
 
-The Acceptance Tests Module for **Magento_Ui** Module.
+The Functional Tests Module for **Magento_Ui** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Ui/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Ui/composer.json
index 652a4ebed3a..5144284192f 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Ui/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Ui/composer.json
@@ -1,52 +1,40 @@
 {
     "name": "magento/magento2-functional-test-module-ui",
-    "description": "Magento 2 Acceptance Test Module Ui",
-    "repositories": [
-        {
-            "type" : "composer",
-            "url" : "https://repo.magento.com/"
-        }
-    ],
+    "description": "Magento 2 Functional Test Module Ui",
+    "config": {
+        "sort-packages": true
+    },
     "require": {
-        "php": "~7.0",
-        "codeception/codeception": "2.2|2.3",
-        "allure-framework/allure-codeception": "dev-master",
+        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
+        "codeception/codeception": "~2.3.4",
         "consolidation/robo": "^1.0.0",
         "henrikbjorn/lurker": "^1.2",
-        "vlucas/phpdotenv": "~2.4",
-        "magento/magento2-functional-testing-framework": "dev-develop"
+        "magento/magento2-functional-testing-framework": "1.0.0",
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
+        "vlucas/phpdotenv": "~2.4"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-backend": "dev-master",
-        "magento/magento2-functional-test-module-eav": "dev-master",
-        "magento/magento2-functional-test-module-authorization": "dev-master",
-        "magento/magento2-functional-test-module-user": "dev-master"
+        "magento/magento2-functional-test-module-authorization": "1.0.0",
+        "magento/magento2-functional-test-module-backend": "1.0.0",
+        "magento/magento2-functional-test-module-eav": "1.0.0",
+        "magento/magento2-functional-test-module-user": "1.0.0"
     },
     "type": "magento2-test-module",
-    "version": "dev-master",
+    "version": "1.0.0",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
-        "psr-0": {
-            "Yandex": "vendor/allure-framework/allure-codeception/src/"
-        },
         "psr-4": {
-            "Magento\\FunctionalTestingFramework\\": [
-                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
-            ],
-            "Magento\\FunctionalTest\\": [
-                "tests/functional/Magento/FunctionalTest",
-                "generated/Magento/FunctionalTest"
-            ]
+            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
         }
     },
     "extra": {
         "map": [
             [
                 "*",
-                "tests/functional/Magento/FunctionalTest/Ui"
+                "dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Ui"
             ]
         ]
     }
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Ups/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Ups/README.md
index 95189beffd4..3a7f99729ca 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Ups/README.md
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Ups/README.md
@@ -1,3 +1,3 @@
-# Magento 2 Acceptance Tests
+# Magento 2 Functional Tests
 
-The Acceptance Tests Module for **Magento_Ups** Module.
+The Functional Tests Module for **Magento_Ups** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Ups/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Ups/composer.json
index 6cb246e0d55..86e2ccf62f3 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Ups/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Ups/composer.json
@@ -1,55 +1,43 @@
 {
     "name": "magento/magento2-functional-test-module-ups",
-    "description": "Magento 2 Acceptance Test Module Ups",
-    "repositories": [
-        {
-            "type" : "composer",
-            "url" : "https://repo.magento.com/"
-        }
-    ],
+    "description": "Magento 2 Functional Test Module Ups",
+    "config": {
+        "sort-packages": true
+    },
     "require": {
-        "php": "~7.0",
-        "codeception/codeception": "2.2|2.3",
-        "allure-framework/allure-codeception": "dev-master",
+        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
+        "codeception/codeception": "~2.3.4",
         "consolidation/robo": "^1.0.0",
         "henrikbjorn/lurker": "^1.2",
-        "vlucas/phpdotenv": "~2.4",
-        "magento/magento2-functional-testing-framework": "dev-develop"
+        "magento/magento2-functional-testing-framework": "1.0.0",
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
+        "vlucas/phpdotenv": "~2.4"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-store": "dev-master",
-        "magento/magento2-functional-test-module-backend": "dev-master",
-        "magento/magento2-functional-test-module-sales": "dev-master",
-        "magento/magento2-functional-test-module-shipping": "dev-master",
-        "magento/magento2-functional-test-module-directory": "dev-master",
-        "magento/magento2-functional-test-module-catalog-inventory": "dev-master",
-        "magento/magento2-functional-test-module-quote": "dev-master"
+        "magento/magento2-functional-test-module-backend": "1.0.0",
+        "magento/magento2-functional-test-module-catalog-inventory": "1.0.0",
+        "magento/magento2-functional-test-module-directory": "1.0.0",
+        "magento/magento2-functional-test-module-quote": "1.0.0",
+        "magento/magento2-functional-test-module-sales": "1.0.0",
+        "magento/magento2-functional-test-module-shipping": "1.0.0",
+        "magento/magento2-functional-test-module-store": "1.0.0"
     },
     "type": "magento2-test-module",
-    "version": "dev-master",
+    "version": "1.0.0",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
-        "psr-0": {
-            "Yandex": "vendor/allure-framework/allure-codeception/src/"
-        },
         "psr-4": {
-            "Magento\\FunctionalTestingFramework\\": [
-                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
-            ],
-            "Magento\\FunctionalTest\\": [
-                "tests/functional/Magento/FunctionalTest",
-                "generated/Magento/FunctionalTest"
-            ]
+            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
         }
     },
     "extra": {
         "map": [
             [
                 "*",
-                "tests/functional/Magento/FunctionalTest/Ups"
+                "dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Ups"
             ]
         ]
     }
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/UrlRewrite/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/UrlRewrite/README.md
index a0c3a234569..645ff970002 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/UrlRewrite/README.md
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/UrlRewrite/README.md
@@ -1,3 +1,3 @@
-# Magento 2 Acceptance Tests
+# Magento 2 Functional Tests
 
-The Acceptance Tests Module for **Magento_UrlRewrite** Module.
+The Functional Tests Module for **Magento_UrlRewrite** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/UrlRewrite/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/UrlRewrite/composer.json
index a8b351fc45b..9343f1a448c 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/UrlRewrite/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/UrlRewrite/composer.json
@@ -1,54 +1,42 @@
 {
     "name": "magento/magento2-functional-test-module-url-rewrite",
-    "description": "Magento 2 Acceptance Test Module Url Rewrite",
-    "repositories": [
-        {
-            "type" : "composer",
-            "url" : "https://repo.magento.com/"
-        }
-    ],
+    "description": "Magento 2 Functional Test Module Url Rewrite",
+    "config": {
+        "sort-packages": true
+    },
     "require": {
-        "php": "~7.0",
-        "codeception/codeception": "2.2|2.3",
-        "allure-framework/allure-codeception": "dev-master",
+        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
+        "codeception/codeception": "~2.3.4",
         "consolidation/robo": "^1.0.0",
         "henrikbjorn/lurker": "^1.2",
-        "vlucas/phpdotenv": "~2.4",
-        "magento/magento2-functional-testing-framework": "dev-develop"
+        "magento/magento2-functional-testing-framework": "1.0.0",
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
+        "vlucas/phpdotenv": "~2.4"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-store": "dev-master",
-        "magento/magento2-functional-test-module-catalog": "dev-master",
-        "magento/magento2-functional-test-module-backend": "dev-master",
-        "magento/magento2-functional-test-module-catalog-url-rewrite": "dev-master",
-        "magento/magento2-functional-test-module-cms": "dev-master",
-        "magento/magento2-functional-test-module-cms-url-rewrite": "dev-master"
+        "magento/magento2-functional-test-module-backend": "1.0.0",
+        "magento/magento2-functional-test-module-catalog": "1.0.0",
+        "magento/magento2-functional-test-module-catalog-url-rewrite": "1.0.0",
+        "magento/magento2-functional-test-module-cms": "1.0.0",
+        "magento/magento2-functional-test-module-cms-url-rewrite": "1.0.0",
+        "magento/magento2-functional-test-module-store": "1.0.0"
     },
     "type": "magento2-test-module",
-    "version": "dev-master",
+    "version": "1.0.0",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
-        "psr-0": {
-            "Yandex": "vendor/allure-framework/allure-codeception/src/"
-        },
         "psr-4": {
-            "Magento\\FunctionalTestingFramework\\": [
-                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
-            ],
-            "Magento\\FunctionalTest\\": [
-                "tests/functional/Magento/FunctionalTest",
-                "generated/Magento/FunctionalTest"
-            ]
+            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
         }
     },
     "extra": {
         "map": [
             [
                 "*",
-                "tests/functional/Magento/FunctionalTest/UrlRewrite"
+                "dev/tests/acceptance/tests/functional/Magento/FunctionalTest/UrlRewrite"
             ]
         ]
     }
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/User/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/User/README.md
index 617eb0c0abe..77e18cd31e8 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/User/README.md
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/User/README.md
@@ -1,3 +1,3 @@
-# Magento 2 Acceptance Tests
+# Magento 2 Functional Tests
 
-The Acceptance Tests Module for **Magento_User** Module.
+The Functional Tests Module for **Magento_User** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/User/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/User/composer.json
index c40a4c122ed..b9fc97cbccb 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/User/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/User/composer.json
@@ -1,54 +1,42 @@
 {
     "name": "magento/magento2-functional-test-module-user",
-    "description": "Magento 2 Acceptance Test Module User",
-    "repositories": [
-        {
-            "type" : "composer",
-            "url" : "https://repo.magento.com/"
-        }
-    ],
+    "description": "Magento 2 Functional Test Module User",
+    "config": {
+        "sort-packages": true
+    },
     "require": {
-        "php": "~7.0",
-        "codeception/codeception": "2.2|2.3",
-        "allure-framework/allure-codeception": "dev-master",
+        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
+        "codeception/codeception": "~2.3.4",
         "consolidation/robo": "^1.0.0",
         "henrikbjorn/lurker": "^1.2",
-        "vlucas/phpdotenv": "~2.4",
-        "magento/magento2-functional-testing-framework": "dev-develop"
+        "magento/magento2-functional-testing-framework": "1.0.0",
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
+        "vlucas/phpdotenv": "~2.4"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-store": "dev-master",
-        "magento/magento2-functional-test-module-authorization": "dev-master",
-        "magento/magento2-functional-test-module-backend": "dev-master",
-        "magento/magento2-functional-test-module-security": "dev-master",
-        "magento/magento2-functional-test-module-integration": "dev-master",
-        "magento/magento2-functional-test-module-email": "dev-master"
+        "magento/magento2-functional-test-module-authorization": "1.0.0",
+        "magento/magento2-functional-test-module-backend": "1.0.0",
+        "magento/magento2-functional-test-module-email": "1.0.0",
+        "magento/magento2-functional-test-module-integration": "1.0.0",
+        "magento/magento2-functional-test-module-security": "1.0.0",
+        "magento/magento2-functional-test-module-store": "1.0.0"
     },
     "type": "magento2-test-module",
-    "version": "dev-master",
+    "version": "1.0.0",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
-        "psr-0": {
-            "Yandex": "vendor/allure-framework/allure-codeception/src/"
-        },
         "psr-4": {
-            "Magento\\FunctionalTestingFramework\\": [
-                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
-            ],
-            "Magento\\FunctionalTest\\": [
-                "tests/functional/Magento/FunctionalTest",
-                "generated/Magento/FunctionalTest"
-            ]
+            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
         }
     },
     "extra": {
         "map": [
             [
                 "*",
-                "tests/functional/Magento/FunctionalTest/User"
+                "dev/tests/acceptance/tests/functional/Magento/FunctionalTest/User"
             ]
         ]
     }
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Usps/LICENSE.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Usps/LICENSE.txt
new file mode 100644
index 00000000000..49525fd99da
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Usps/LICENSE.txt
@@ -0,0 +1,48 @@
+
+Open Software License ("OSL") v. 3.0
+
+This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Open Software License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Open Software License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly. 
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including 'fair use' or 'fair dealing'). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright (C) 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Usps/LICENSE_AFL.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Usps/LICENSE_AFL.txt
new file mode 100644
index 00000000000..f39d641b18a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Usps/LICENSE_AFL.txt
@@ -0,0 +1,48 @@
+
+Academic Free License ("AFL") v. 3.0
+
+This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Academic Free License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, under any license of your choice that does not contradict the terms and conditions, including Licensor's reserved rights and remedies, in this Academic Free License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly.
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including "fair use" or "fair dealing"). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright © 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Academic Free License" or "AFL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Usps/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Usps/README.md
new file mode 100644
index 00000000000..0f87c957487
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Usps/README.md
@@ -0,0 +1,3 @@
+# Magento 2 Functional Tests
+
+The Functional Tests Module for **Magento_Usps** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Usps/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Usps/composer.json
new file mode 100644
index 00000000000..d34034b84d4
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Usps/composer.json
@@ -0,0 +1,45 @@
+{
+    "name": "magento/magento2-functional-test-module-usps",
+    "description": "Magento 2 Functional Test Module Usps",
+    "config": {
+        "sort-packages": true
+    },
+    "require": {
+        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
+        "codeception/codeception": "~2.3.4",
+        "consolidation/robo": "^1.0.0",
+        "henrikbjorn/lurker": "^1.2",
+        "magento/magento2-functional-testing-framework": "1.0.0",
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
+        "vlucas/phpdotenv": "~2.4"
+    },
+    "suggest": {
+        "magento/magento2-functional-test-module-catalog": "1.0.0",
+        "magento/magento2-functional-test-module-catalog-inventory": "1.0.0",
+        "magento/magento2-functional-test-module-config": "1.0.0",
+        "magento/magento2-functional-test-module-directory": "1.0.0",
+        "magento/magento2-functional-test-module-quote": "1.0.0",
+        "magento/magento2-functional-test-module-sales": "1.0.0",
+        "magento/magento2-functional-test-module-shipping": "1.0.0",
+        "magento/magento2-functional-test-module-store": "1.0.0"
+    },
+    "type": "magento2-test-module",
+    "version": "1.0.0",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
+    "autoload": {
+        "psr-4": {
+            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
+        }
+    },
+    "extra": {
+        "map": [
+            [
+                "*",
+                "dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Usps"
+            ]
+        ]
+    }
+}
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Variable/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Variable/README.md
index 454eb1e9164..9c847f4db2b 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Variable/README.md
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Variable/README.md
@@ -1,3 +1,3 @@
-# Magento 2 Acceptance Tests
+# Magento 2 Functional Tests
 
-The Acceptance Tests Module for **Magento_Variable** Module.
+The Functional Tests Module for **Magento_Variable** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Variable/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Variable/composer.json
index 178f0401b9b..772dfd4cac6 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Variable/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Variable/composer.json
@@ -1,51 +1,39 @@
 {
     "name": "magento/magento2-functional-test-module-variable",
-    "description": "Magento 2 Acceptance Test Module Variable",
-    "repositories": [
-        {
-            "type" : "composer",
-            "url" : "https://repo.magento.com/"
-        }
-    ],
+    "description": "Magento 2 Functional Test Module Variable",
+    "config": {
+        "sort-packages": true
+    },
     "require": {
-        "php": "~7.0",
-        "codeception/codeception": "2.2|2.3",
-        "allure-framework/allure-codeception": "dev-master",
+        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
+        "codeception/codeception": "~2.3.4",
         "consolidation/robo": "^1.0.0",
         "henrikbjorn/lurker": "^1.2",
-        "vlucas/phpdotenv": "~2.4",
-        "magento/magento2-functional-testing-framework": "dev-develop"
+        "magento/magento2-functional-testing-framework": "1.0.0",
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
+        "vlucas/phpdotenv": "~2.4"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-backend": "dev-master",
-        "magento/magento2-functional-test-module-email": "dev-master",
-        "magento/magento2-functional-test-module-store": "dev-master"
+        "magento/magento2-functional-test-module-backend": "1.0.0",
+        "magento/magento2-functional-test-module-email": "1.0.0",
+        "magento/magento2-functional-test-module-store": "1.0.0"
     },
     "type": "magento2-test-module",
-    "version": "dev-master",
+    "version": "1.0.0",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
-        "psr-0": {
-            "Yandex": "vendor/allure-framework/allure-codeception/src/"
-        },
         "psr-4": {
-            "Magento\\FunctionalTestingFramework\\": [
-                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
-            ],
-            "Magento\\FunctionalTest\\": [
-                "tests/functional/Magento/FunctionalTest",
-                "generated/Magento/FunctionalTest"
-            ]
+            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
         }
     },
     "extra": {
         "map": [
             [
                 "*",
-                "tests/functional/Magento/FunctionalTest/Variable"
+                "dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Variable"
             ]
         ]
     }
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Vault/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Vault/README.md
index c993e275c54..9edda871be5 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Vault/README.md
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Vault/README.md
@@ -1,3 +1,3 @@
-# Magento 2 Acceptance Tests
+# Magento 2 Functional Tests
 
-The Acceptance Tests Module for **Magento_Vault** Module.
+The Functional Tests Module for **Magento_Vault** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Vault/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Vault/composer.json
index e1af1518555..72f78e07e54 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Vault/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Vault/composer.json
@@ -1,54 +1,42 @@
 {
     "name": "magento/magento2-functional-test-module-vault",
-    "description": "Magento 2 Acceptance Test Module Vault",
-    "repositories": [
-        {
-            "type" : "composer",
-            "url" : "https://repo.magento.com/"
-        }
-    ],
+    "description": "Magento 2 Functional Test Module Vault",
+    "config": {
+        "sort-packages": true
+    },
     "require": {
-        "php": "~7.0",
-        "codeception/codeception": "2.2|2.3",
-        "allure-framework/allure-codeception": "dev-master",
+        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
+        "codeception/codeception": "~2.3.4",
         "consolidation/robo": "^1.0.0",
         "henrikbjorn/lurker": "^1.2",
-        "vlucas/phpdotenv": "~2.4",
-        "magento/magento2-functional-testing-framework": "dev-develop"
+        "magento/magento2-functional-testing-framework": "1.0.0",
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
+        "vlucas/phpdotenv": "~2.4"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-store": "dev-master",
-        "magento/magento2-functional-test-module-sales": "dev-master",
-        "magento/magento2-functional-test-module-checkout": "dev-master",
-        "magento/magento2-functional-test-module-payment": "dev-master",
-        "magento/magento2-functional-test-module-customer": "dev-master",
-        "magento/magento2-functional-test-module-quote": "dev-master"
+        "magento/magento2-functional-test-module-checkout": "1.0.0",
+        "magento/magento2-functional-test-module-customer": "1.0.0",
+        "magento/magento2-functional-test-module-payment": "1.0.0",
+        "magento/magento2-functional-test-module-quote": "1.0.0",
+        "magento/magento2-functional-test-module-sales": "1.0.0",
+        "magento/magento2-functional-test-module-store": "1.0.0"
     },
     "type": "magento2-test-module",
-    "version": "dev-master",
+    "version": "1.0.0",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
-        "psr-0": {
-            "Yandex": "vendor/allure-framework/allure-codeception/src/"
-        },
         "psr-4": {
-            "Magento\\FunctionalTestingFramework\\": [
-                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
-            ],
-            "Magento\\FunctionalTest\\": [
-                "tests/functional/Magento/FunctionalTest",
-                "generated/Magento/FunctionalTest"
-            ]
+            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
         }
     },
     "extra": {
         "map": [
             [
                 "*",
-                "tests/functional/Magento/FunctionalTest/Vault"
+                "dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Vault"
             ]
         ]
     }
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Version/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Version/README.md
index c48f288e729..ba933541be8 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Version/README.md
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Version/README.md
@@ -1,3 +1,3 @@
-# Magento 2 Acceptance Tests
+# Magento 2 Functional Tests
 
-The Acceptance Tests Module for **Magento_Version** Module.
+The Functional Tests Module for **Magento_Version** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Version/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Version/composer.json
index 82387c516ac..622210dd194 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Version/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Version/composer.json
@@ -1,48 +1,35 @@
 {
     "name": "magento/magento2-functional-test-module-version",
-    "description": "Magento 2 Acceptance Test Module Version",
-    "repositories": [
-        {
-            "type" : "composer",
-            "url" : "https://repo.magento.com/"
-        }
-    ],
+    "description": "Magento 2 Functional Test Module Version",
+    "config": {
+        "sort-packages": true
+    },
     "require": {
-        "php": "~7.0",
-        "codeception/codeception": "2.2|2.3",
-        "allure-framework/allure-codeception": "dev-master",
+        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
+        "codeception/codeception": "~2.3.4",
         "consolidation/robo": "^1.0.0",
         "henrikbjorn/lurker": "^1.2",
-        "vlucas/phpdotenv": "~2.4",
-        "magento/magento2-functional-testing-framework": "dev-develop"
+        "magento/magento2-functional-testing-framework": "1.0.0",
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
+        "vlucas/phpdotenv": "~2.4"
     },
     "type": "magento2-test-module",
-    "version": "dev-master",
+    "version": "1.0.0",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
-        "psr-0": {
-            "Yandex": "vendor/allure-framework/allure-codeception/src/"
-        },
         "psr-4": {
-            "Magento\\FunctionalTestingFramework\\": [
-                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
-            ],
-            "Magento\\FunctionalTest\\": [
-                "tests/functional/Magento/FunctionalTest",
-                "generated/Magento/FunctionalTest"
-            ]
+            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
         }
     },
     "extra": {
         "map": [
             [
                 "*",
-                "tests/functional/Magento/FunctionalTest/Version"
+                "dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Version"
             ]
         ]
     }
 }
-
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Webapi/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Webapi/README.md
index 3c8cf910c01..bb843ce7185 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Webapi/README.md
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Webapi/README.md
@@ -1,3 +1,3 @@
-# Magento 2 Acceptance Tests
+# Magento 2 Functional Tests
 
-The Acceptance Tests Module for **Magento_Webapi** Module.
+The Functional Tests Module for **Magento_Webapi** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Webapi/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Webapi/composer.json
index af20f4956e2..727fba2cf16 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Webapi/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Webapi/composer.json
@@ -1,52 +1,40 @@
 {
     "name": "magento/magento2-functional-test-module-webapi",
-    "description": "Magento 2 Acceptance Test Module Webapi",
-    "repositories": [
-        {
-            "type" : "composer",
-            "url" : "https://repo.magento.com/"
-        }
-    ],
+    "description": "Magento 2 Functional Test Module Webapi",
+    "config": {
+        "sort-packages": true
+    },
     "require": {
-        "php": "~7.0",
-        "codeception/codeception": "2.2|2.3",
-        "allure-framework/allure-codeception": "dev-master",
+        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
+        "codeception/codeception": "~2.3.4",
         "consolidation/robo": "^1.0.0",
         "henrikbjorn/lurker": "^1.2",
-        "vlucas/phpdotenv": "~2.4",
-        "magento/magento2-functional-testing-framework": "dev-develop"
+        "magento/magento2-functional-testing-framework": "1.0.0",
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
+        "vlucas/phpdotenv": "~2.4"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-store": "dev-master",
-        "magento/magento2-functional-test-module-authorization": "dev-master",
-        "magento/magento2-functional-test-module-integration": "dev-master",
-        "magento/magento2-functional-test-module-backend": "dev-master"
+        "magento/magento2-functional-test-module-authorization": "1.0.0",
+        "magento/magento2-functional-test-module-backend": "1.0.0",
+        "magento/magento2-functional-test-module-integration": "1.0.0",
+        "magento/magento2-functional-test-module-store": "1.0.0"
     },
     "type": "magento2-test-module",
-    "version": "dev-master",
+    "version": "1.0.0",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
-        "psr-0": {
-            "Yandex": "vendor/allure-framework/allure-codeception/src/"
-        },
         "psr-4": {
-            "Magento\\FunctionalTestingFramework\\": [
-                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
-            ],
-            "Magento\\FunctionalTest\\": [
-                "tests/functional/Magento/FunctionalTest",
-                "generated/Magento/FunctionalTest"
-            ]
+            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
         }
     },
     "extra": {
         "map": [
             [
                 "*",
-                "tests/functional/Magento/FunctionalTest/Webapi"
+                "dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Webapi"
             ]
         ]
     }
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/WebapiSecurity/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/WebapiSecurity/README.md
index 24a79533930..25f93d69629 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/WebapiSecurity/README.md
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/WebapiSecurity/README.md
@@ -1,3 +1,3 @@
-# Magento 2 Acceptance Tests
+# Magento 2 Functional Tests
 
-The Acceptance Tests Module for **Magento_WebapiSecurity** Module.
+The Functional Tests Module for **Magento_WebapiSecurity** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/WebapiSecurity/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/WebapiSecurity/composer.json
index 80cfc405e37..f5de750e36d 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/WebapiSecurity/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/WebapiSecurity/composer.json
@@ -1,49 +1,37 @@
 {
     "name": "magento/magento2-functional-test-module-webapi-security",
-    "description": "Magento 2 Acceptance Test Module Webapi Security",
-    "repositories": [
-        {
-            "type" : "composer",
-            "url" : "https://repo.magento.com/"
-        }
-    ],
+    "description": "Magento 2 Functional Test Module Webapi Security",
+    "config": {
+        "sort-packages": true
+    },
     "require": {
-        "php": "~7.0",
-        "codeception/codeception": "2.2|2.3",
-        "allure-framework/allure-codeception": "dev-master",
+        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
+        "codeception/codeception": "~2.3.4",
         "consolidation/robo": "^1.0.0",
         "henrikbjorn/lurker": "^1.2",
-        "vlucas/phpdotenv": "~2.4",
-        "magento/magento2-functional-testing-framework": "dev-develop"
+        "magento/magento2-functional-testing-framework": "1.0.0",
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
+        "vlucas/phpdotenv": "~2.4"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-webapi": "dev-master"
+        "magento/magento2-functional-test-module-webapi": "1.0.0"
     },
     "type": "magento2-test-module",
-    "version": "dev-master",
+    "version": "1.0.0",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
-        "psr-0": {
-            "Yandex": "vendor/allure-framework/allure-codeception/src/"
-        },
         "psr-4": {
-            "Magento\\FunctionalTestingFramework\\": [
-                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
-            ],
-            "Magento\\FunctionalTest\\": [
-                "tests/functional/Magento/FunctionalTest",
-                "generated/Magento/FunctionalTest"
-            ]
+            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
         }
     },
     "extra": {
         "map": [
             [
                 "*",
-                "tests/functional/Magento/FunctionalTest/WebapiSecurity"
+                "dev/tests/acceptance/tests/functional/Magento/FunctionalTest/WebapiSecurity"
             ]
         ]
     }
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Weee/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Weee/README.md
index 5166cfc5d4b..4f199873079 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Weee/README.md
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Weee/README.md
@@ -1,3 +1,3 @@
-# Magento 2 Acceptance Tests
+# Magento 2 Functional Tests
 
-The Acceptance Tests Module for **Magento_Weee** Module.
+The Functional Tests Module for **Magento_Weee** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Weee/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Weee/composer.json
index 7e3f3eac424..29cff64dff5 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Weee/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Weee/composer.json
@@ -1,60 +1,48 @@
 {
     "name": "magento/magento2-functional-test-module-weee",
-    "description": "Magento 2 Acceptance Test Module Weee",
-    "repositories": [
-        {
-            "type" : "composer",
-            "url" : "https://repo.magento.com/"
-        }
-    ],
+    "description": "Magento 2 Functional Test Module Weee",
+    "config": {
+        "sort-packages": true
+    },
     "require": {
-        "php": "~7.0",
-        "codeception/codeception": "2.2|2.3",
-        "allure-framework/allure-codeception": "dev-master",
+        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
+        "codeception/codeception": "~2.3.4",
         "consolidation/robo": "^1.0.0",
         "henrikbjorn/lurker": "^1.2",
-        "vlucas/phpdotenv": "~2.4",
-        "magento/magento2-functional-testing-framework": "dev-develop"
+        "magento/magento2-functional-testing-framework": "1.0.0",
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
+        "vlucas/phpdotenv": "~2.4"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-store": "dev-master",
-        "magento/magento2-functional-test-module-catalog": "dev-master",
-        "magento/magento2-functional-test-module-tax": "dev-master",
-        "magento/magento2-functional-test-module-sales": "dev-master",
-        "magento/magento2-functional-test-module-backend": "dev-master",
-        "magento/magento2-functional-test-module-directory": "dev-master",
-        "magento/magento2-functional-test-module-eav": "dev-master",
-        "magento/magento2-functional-test-module-customer": "dev-master",
-        "magento/magento2-functional-test-module-page-cache": "dev-master",
-        "magento/magento2-functional-test-module-quote": "dev-master",
-        "magento/magento2-functional-test-module-checkout": "dev-master",
-        "magento/magento2-functional-test-module-ui": "dev-master"
+        "magento/magento2-functional-test-module-backend": "1.0.0",
+        "magento/magento2-functional-test-module-catalog": "1.0.0",
+        "magento/magento2-functional-test-module-checkout": "1.0.0",
+        "magento/magento2-functional-test-module-customer": "1.0.0",
+        "magento/magento2-functional-test-module-directory": "1.0.0",
+        "magento/magento2-functional-test-module-eav": "1.0.0",
+        "magento/magento2-functional-test-module-page-cache": "1.0.0",
+        "magento/magento2-functional-test-module-quote": "1.0.0",
+        "magento/magento2-functional-test-module-sales": "1.0.0",
+        "magento/magento2-functional-test-module-store": "1.0.0",
+        "magento/magento2-functional-test-module-tax": "1.0.0",
+        "magento/magento2-functional-test-module-ui": "1.0.0"
     },
     "type": "magento2-test-module",
-    "version": "dev-master",
+    "version": "1.0.0",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
-        "psr-0": {
-            "Yandex": "vendor/allure-framework/allure-codeception/src/"
-        },
         "psr-4": {
-            "Magento\\FunctionalTestingFramework\\": [
-                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
-            ],
-            "Magento\\FunctionalTest\\": [
-                "tests/functional/Magento/FunctionalTest",
-                "generated/Magento/FunctionalTest"
-            ]
+            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
         }
     },
     "extra": {
         "map": [
             [
                 "*",
-                "tests/functional/Magento/FunctionalTest/Weee"
+                "dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Weee"
             ]
         ]
     }
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Widget/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Widget/README.md
index b6fd0b4513b..2a8996c2f33 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Widget/README.md
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Widget/README.md
@@ -1,3 +1,3 @@
-# Magento 2 Acceptance Tests
+# Magento 2 Functional Tests
 
-The Acceptance Tests Module for **Magento_Widget** Module.
+The Functional Tests Module for **Magento_Widget** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Widget/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Widget/composer.json
index 7d546965c3a..aed96d0056e 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Widget/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Widget/composer.json
@@ -1,55 +1,43 @@
 {
     "name": "magento/magento2-functional-test-module-widget",
-    "description": "Magento 2 Acceptance Test Module Widget",
-    "repositories": [
-        {
-            "type" : "composer",
-            "url" : "https://repo.magento.com/"
-        }
-    ],
+    "description": "Magento 2 Functional Test Module Widget",
+    "config": {
+        "sort-packages": true
+    },
     "require": {
-        "php": "~7.0",
-        "codeception/codeception": "2.2|2.3",
-        "allure-framework/allure-codeception": "dev-master",
+        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
+        "codeception/codeception": "~2.3.4",
         "consolidation/robo": "^1.0.0",
         "henrikbjorn/lurker": "^1.2",
-        "vlucas/phpdotenv": "~2.4",
-        "magento/magento2-functional-testing-framework": "dev-develop"
+        "magento/magento2-functional-testing-framework": "1.0.0",
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
+        "vlucas/phpdotenv": "~2.4"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-store": "dev-master",
-        "magento/magento2-functional-test-module-cms": "dev-master",
-        "magento/magento2-functional-test-module-backend": "dev-master",
-        "magento/magento2-functional-test-module-catalog": "dev-master",
-        "magento/magento2-functional-test-module-email": "dev-master",
-        "magento/magento2-functional-test-module-theme": "dev-master",
-        "magento/magento2-functional-test-module-variable": "dev-master"
+        "magento/magento2-functional-test-module-backend": "1.0.0",
+        "magento/magento2-functional-test-module-catalog": "1.0.0",
+        "magento/magento2-functional-test-module-cms": "1.0.0",
+        "magento/magento2-functional-test-module-email": "1.0.0",
+        "magento/magento2-functional-test-module-store": "1.0.0",
+        "magento/magento2-functional-test-module-theme": "1.0.0",
+        "magento/magento2-functional-test-module-variable": "1.0.0"
     },
     "type": "magento2-test-module",
-    "version": "dev-master",
+    "version": "1.0.0",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
-        "psr-0": {
-            "Yandex": "vendor/allure-framework/allure-codeception/src/"
-        },
         "psr-4": {
-            "Magento\\FunctionalTestingFramework\\": [
-                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
-            ],
-            "Magento\\FunctionalTest\\": [
-                "tests/functional/Magento/FunctionalTest",
-                "generated/Magento/FunctionalTest"
-            ]
+            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
         }
     },
     "extra": {
         "map": [
             [
                 "*",
-                "tests/functional/Magento/FunctionalTest/Widget"
+                "dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Widget"
             ]
         ]
     }
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Wishlist/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Wishlist/README.md
index 53615d4273f..d5b0902bd9c 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Wishlist/README.md
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Wishlist/README.md
@@ -1,3 +1,3 @@
-# Magento 2 Acceptance Tests
+# Magento 2 Functional Tests
 
-The Acceptance Tests Module for **Magento_Wishlist** Module.
+The Functional Tests Module for **Magento_Wishlist** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Wishlist/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Wishlist/composer.json
index cfb79284ec5..496419cea22 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Wishlist/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Wishlist/composer.json
@@ -1,57 +1,45 @@
 {
     "name": "magento/magento2-functional-test-module-wishlist",
-    "description": "Magento 2 Acceptance Test Module Wishlist",
-    "repositories": [
-        {
-            "type" : "composer",
-            "url" : "https://repo.magento.com/"
-        }
-    ],
+    "description": "Magento 2 Functional Test Module Wishlist",
+    "config": {
+        "sort-packages": true
+    },
     "require": {
-        "php": "~7.0",
-        "codeception/codeception": "2.2|2.3",
-        "allure-framework/allure-codeception": "dev-master",
+        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
+        "codeception/codeception": "~2.3.4",
         "consolidation/robo": "^1.0.0",
         "henrikbjorn/lurker": "^1.2",
-        "vlucas/phpdotenv": "~2.4",
-        "magento/magento2-functional-testing-framework": "dev-develop"
+        "magento/magento2-functional-testing-framework": "1.0.0",
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
+        "vlucas/phpdotenv": "~2.4"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-store": "dev-master",
-        "magento/magento2-functional-test-module-customer": "dev-master",
-        "magento/magento2-functional-test-module-catalog": "dev-master",
-        "magento/magento2-functional-test-module-checkout": "dev-master",
-        "magento/magento2-functional-test-module-catalog-inventory": "dev-master",
-        "magento/magento2-functional-test-module-rss": "dev-master",
-        "magento/magento2-functional-test-module-backend": "dev-master",
-        "magento/magento2-functional-test-module-sales": "dev-master",
-        "magento/magento2-functional-test-module-ui": "dev-master"
+        "magento/magento2-functional-test-module-backend": "1.0.0",
+        "magento/magento2-functional-test-module-catalog": "1.0.0",
+        "magento/magento2-functional-test-module-catalog-inventory": "1.0.0",
+        "magento/magento2-functional-test-module-checkout": "1.0.0",
+        "magento/magento2-functional-test-module-customer": "1.0.0",
+        "magento/magento2-functional-test-module-rss": "1.0.0",
+        "magento/magento2-functional-test-module-sales": "1.0.0",
+        "magento/magento2-functional-test-module-store": "1.0.0",
+        "magento/magento2-functional-test-module-ui": "1.0.0"
     },
     "type": "magento2-test-module",
-    "version": "dev-master",
+    "version": "1.0.0",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
-        "psr-0": {
-            "Yandex": "vendor/allure-framework/allure-codeception/src/"
-        },
         "psr-4": {
-            "Magento\\FunctionalTestingFramework\\": [
-                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
-            ],
-            "Magento\\FunctionalTest\\": [
-                "tests/functional/Magento/FunctionalTest",
-                "generated/Magento/FunctionalTest"
-            ]
+            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
         }
     },
     "extra": {
         "map": [
             [
                 "*",
-                "tests/functional/Magento/FunctionalTest/Wishlist"
+                "dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Wishlist"
             ]
         ]
     }
-- 
GitLab


From 60ce399b8fa58703bffeeaa385c91cfd56889ac6 Mon Sep 17 00:00:00 2001
From: Ji Lu <jilu1@magento.com>
Date: Thu, 7 Dec 2017 19:24:53 +0200
Subject: [PATCH 300/380] MQE-583: set release version to 1.0.0 and updated
 composer dependencies.

---
 dev/tests/acceptance/composer.json | 34 ++++++++++++++++++++++++++++++
 1 file changed, 34 insertions(+)
 create mode 100755 dev/tests/acceptance/composer.json

diff --git a/dev/tests/acceptance/composer.json b/dev/tests/acceptance/composer.json
new file mode 100755
index 00000000000..4f8abc17b25
--- /dev/null
+++ b/dev/tests/acceptance/composer.json
@@ -0,0 +1,34 @@
+{
+    "name": "magento/magento2ce-functional-tests",
+    "description": "Magento 2 Functional Tests",
+    "type": "project",
+    "version": "1.0.0",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
+    "config": {
+        "sort-packages": true
+    },
+    "repositories": [
+        {
+            "type": "git",
+            "url": "git@github.com:magento/magento2-functional-testing-framework.git"
+        }
+    ],
+    "require": {
+        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
+        "codeception/codeception": "~2.3.4",
+        "consolidation/robo": "^1.0.0",
+        "henrikbjorn/lurker": "^1.2",
+        "magento/magento2-functional-testing-framework": "1.0.0",
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
+        "vlucas/phpdotenv": "~2.4"
+    },
+    "autoload": {
+        "psr-4": {
+            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
+        }
+    },
+    "prefer-stable": true
+}
-- 
GitLab


From 76ba364782ccb63404b21fef6085c8597ad514c2 Mon Sep 17 00:00:00 2001
From: Ian Meron <imeron@magento.com>
Date: Mon, 4 Dec 2017 22:27:59 +0200
Subject: [PATCH 301/380] MQE-347: Use a remove tag instead of a remove
 attribute

- add new debug flag and logic
---
 dev/tests/acceptance/.env.example         | 1 +
 dev/tests/acceptance/tests/_bootstrap.php | 6 ++++++
 2 files changed, 7 insertions(+)

diff --git a/dev/tests/acceptance/.env.example b/dev/tests/acceptance/.env.example
index 9cb45c149a9..7aec49b47bb 100644
--- a/dev/tests/acceptance/.env.example
+++ b/dev/tests/acceptance/.env.example
@@ -50,5 +50,6 @@ MAGENTO_ADMIN_PASSWORD=
 #FW_BP=
 #TESTS_MODULE_PATH=
 #MODULE_WHITELIST=
+#MFTF_DEBUG=true
 
 #*** End of .env ***#
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/_bootstrap.php b/dev/tests/acceptance/tests/_bootstrap.php
index 80392c9f53f..a3d7b41f397 100644
--- a/dev/tests/acceptance/tests/_bootstrap.php
+++ b/dev/tests/acceptance/tests/_bootstrap.php
@@ -22,3 +22,9 @@ if (file_exists(PROJECT_ROOT . '/.env')) {
     }
 }
 defined('FW_BP') || define('FW_BP', PROJECT_ROOT . $RELATIVE_FW_PATH);
+
+// add the debug flag here
+$debug_mode = $_ENV['MFTF_DEBUG'] ?? false;
+if (!$debug_mode) {
+    xdebug_disable();
+}
-- 
GitLab


From c2a7c9a78670ae873eee40e4a83a3151a9b01aaf Mon Sep 17 00:00:00 2001
From: Ian Meron <imeron@magento.com>
Date: Fri, 1 Dec 2017 18:10:14 +0200
Subject: [PATCH 302/380] MQE-386: MFTF Compatibility with Windows Machine

- update Robofile to use DIRECTORY_SEPARATOR constant
---
 dev/tests/acceptance/RoboFile.php | 26 +++++++++++++-------------
 1 file changed, 13 insertions(+), 13 deletions(-)

diff --git a/dev/tests/acceptance/RoboFile.php b/dev/tests/acceptance/RoboFile.php
index c7368c79309..287dce4d38f 100644
--- a/dev/tests/acceptance/RoboFile.php
+++ b/dev/tests/acceptance/RoboFile.php
@@ -22,7 +22,7 @@ class RoboFile extends \Robo\Tasks
     {
         $this->_exec('cp -vn .env.example .env');
         $this->_exec('cp -vf codeception.dist.yml codeception.yml');
-        $this->_exec('cp -vf tests/functional.suite.dist.yml tests/functional.suite.yml');
+        $this->_exec('cp -vf tests'. DIRECTORY_SEPARATOR .'functional.suite.dist.yml tests'. DIRECTORY_SEPARATOR .'functional.suite.yml');
     }
 
     /**
@@ -34,7 +34,7 @@ class RoboFile extends \Robo\Tasks
     function buildProject()
     {
         $this->cloneFiles();
-        $this->_exec('./vendor/bin/codecept build');
+        $this->_exec('vendor'. DIRECTORY_SEPARATOR .'bin'. DIRECTORY_SEPARATOR .'codecept build');
     }
 
     /**
@@ -78,7 +78,7 @@ class RoboFile extends \Robo\Tasks
      */
     function chrome()
     {
-        $this->_exec('./vendor/bin/codecept run functional --env chrome --skip-group skip');
+        $this->_exec('vendor'. DIRECTORY_SEPARATOR .'bin'. DIRECTORY_SEPARATOR .'codecept run functional --env chrome --skip-group skip');
     }
 
     /**
@@ -88,7 +88,7 @@ class RoboFile extends \Robo\Tasks
      */
     function firefox()
     {
-        $this->_exec('./vendor/bin/codecept run functional --env firefox --skip-group skip');
+        $this->_exec('vendor'. DIRECTORY_SEPARATOR .'bin'. DIRECTORY_SEPARATOR .'codecept run functional --env firefox --skip-group skip');
     }
 
     /**
@@ -98,7 +98,7 @@ class RoboFile extends \Robo\Tasks
      */
     function phantomjs()
     {
-        $this->_exec('./vendor/bin/codecept run functional --env phantomjs --skip-group skip');
+        $this->_exec('vendor'. DIRECTORY_SEPARATOR .'bin'. DIRECTORY_SEPARATOR .'codecept run functional --env phantomjs --skip-group skip');
     }
 
     /**
@@ -108,7 +108,7 @@ class RoboFile extends \Robo\Tasks
      */
     function headless()
     {
-        $this->_exec('./vendor/bin/codecept run functional --env headless --skip-group skip');
+        $this->_exec('vendor'. DIRECTORY_SEPARATOR .'bin'. DIRECTORY_SEPARATOR .'codecept run functional --env headless --skip-group skip');
     }
 
     /**
@@ -119,7 +119,7 @@ class RoboFile extends \Robo\Tasks
      */
     function group($args = '')
     {
-        $this->taskExec('./vendor/bin/codecept run functional --verbose --steps --env chrome --skip-group skip --group')->args($args)->run();
+        $this->taskExec('vendor'. DIRECTORY_SEPARATOR .'bin'. DIRECTORY_SEPARATOR .'codecept run functional --verbose --steps --env chrome --skip-group skip --group')->args($args)->run();
     }
 
     /**
@@ -130,7 +130,7 @@ class RoboFile extends \Robo\Tasks
      */
     function folder($args = '')
     {
-        $this->taskExec('./vendor/bin/codecept run functional --env chrome')->args($args)->run();
+        $this->taskExec('vendor'. DIRECTORY_SEPARATOR .'bin'. DIRECTORY_SEPARATOR .'codecept run functional --env chrome')->args($args)->run();
     }
 
     /**
@@ -140,7 +140,7 @@ class RoboFile extends \Robo\Tasks
      */
     function example()
     {
-        $this->_exec('./vendor/bin/codecept run --env chrome --group example --skip-group skip');
+        $this->_exec('vendor'. DIRECTORY_SEPARATOR .'bin'. DIRECTORY_SEPARATOR .'codecept run --env chrome --group example --skip-group skip');
     }
 
     /**
@@ -150,7 +150,7 @@ class RoboFile extends \Robo\Tasks
      */
     function allure1Generate()
     {
-        return $this->_exec('allure generate tests/_output/allure-results/ -o tests/_output/allure-report/');
+        return $this->_exec('allure generate tests'. DIRECTORY_SEPARATOR .'_output'. DIRECTORY_SEPARATOR .'allure-results'. DIRECTORY_SEPARATOR .' -o tests'. DIRECTORY_SEPARATOR .'_output'. DIRECTORY_SEPARATOR .'allure-report'. DIRECTORY_SEPARATOR .'');
     }
 
     /**
@@ -160,7 +160,7 @@ class RoboFile extends \Robo\Tasks
      */
     function allure2Generate()
     {
-        return $this->_exec('allure generate tests/_output/allure-results/ --output tests/_output/allure-report/ --clean');
+        return $this->_exec('allure generate tests'. DIRECTORY_SEPARATOR .'_output'. DIRECTORY_SEPARATOR .'allure-results'. DIRECTORY_SEPARATOR .' --output tests'. DIRECTORY_SEPARATOR .'_output'. DIRECTORY_SEPARATOR .'allure-report'. DIRECTORY_SEPARATOR .' --clean');
     }
 
     /**
@@ -170,7 +170,7 @@ class RoboFile extends \Robo\Tasks
      */
     function allure1Open()
     {
-        $this->_exec('allure report open --report-dir tests/_output/allure-report/');
+        $this->_exec('allure report open --report-dir tests'. DIRECTORY_SEPARATOR .'_output'. DIRECTORY_SEPARATOR .'allure-report'. DIRECTORY_SEPARATOR .'');
     }
 
     /**
@@ -180,7 +180,7 @@ class RoboFile extends \Robo\Tasks
      */
     function allure2Open()
     {
-        $this->_exec('allure open --port 0 tests/_output/allure-report/');
+        $this->_exec('allure open --port 0 tests'. DIRECTORY_SEPARATOR .'_output'. DIRECTORY_SEPARATOR .'allure-report'. DIRECTORY_SEPARATOR .'');
     }
 
     /**
-- 
GitLab


From df2be125c91df3724f8035bd216ce8fed40ca888 Mon Sep 17 00:00:00 2001
From: John Stennett <john00ivy@gmail.com>
Date: Thu, 7 Dec 2017 17:46:37 +0200
Subject: [PATCH 303/380] MQE-592: Test Case Audit

- Removing PhantomJS from Tests.
- Unskipping the CMS test.
- Skipping the Configurable Product test.
- Skipping all Sample Tests.
---
 .../Backend/Cest/AdminLoginCest.xml               |  1 -
 .../Cms/Cest/AdminCreateCmsPageCest.xml           |  1 -
 .../Cest/AdminCreateConfigurableProductCest.xml   | 15 ++++++---------
 .../Cest/StorefrontPersistedCustomerLoginCest.xml |  1 -
 .../Cest/CreateConfigurableProductByApiCest.xml   |  1 +
 .../SampleTests/Cest/CreateSalesRuleByApiCest.xml |  1 +
 .../SampleTests/Cest/MinimumTestCest.xml          |  1 -
 .../Cest/SetPaymentConfigurationCest.xml          |  3 +++
 .../Cest/UpdateSimpleProductByApiCest.xml         |  6 +-----
 .../Store/Cest/AdminCreateStoreGroupCest.xml      |  1 -
 .../StorefrontDeletePersistedWishlistCest.xml     |  1 -
 11 files changed, 12 insertions(+), 20 deletions(-)

diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/Cest/AdminLoginCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/Cest/AdminLoginCest.xml
index 67605e2dbe5..f503dd0844b 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/Cest/AdminLoginCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/Cest/AdminLoginCest.xml
@@ -23,7 +23,6 @@
                 <group value="login"/>
                 <env value="chrome"/>
                 <env value="firefox"/>
-                <env value="phantomjs"/>
                 <env value="headless"/>
             </annotations>
             <amOnPage url="{{AdminLoginPage.url}}" stepKey="amOnAdminLoginPage"/>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Cest/AdminCreateCmsPageCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Cest/AdminCreateCmsPageCest.xml
index fde1baac0c4..112c57fbb86 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Cest/AdminCreateCmsPageCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Cest/AdminCreateCmsPageCest.xml
@@ -23,7 +23,6 @@
                 <severity value="CRITICAL"/>
                 <testCaseId value="MAGETWO-25580"/>
                 <group value="cms"/>
-                <group value="skip"/>
                 <env value="chrome"/>
                 <env value="firefox"/>
                 <env value="headless"/>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/Cest/AdminCreateConfigurableProductCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/Cest/AdminCreateConfigurableProductCest.xml
index 1e1475e154c..c68f6ed83bc 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/Cest/AdminCreateConfigurableProductCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/Cest/AdminCreateConfigurableProductCest.xml
@@ -25,13 +25,10 @@
                 <description value="You should be able to create a Configurable Product via the Admin."/>
                 <severity value="CRITICAL"/>
                 <testCaseId value="MAGETWO-26041"/>
-                <group value="configurable"/>
-                <group value="product"/>
-                <env value="chrome"/>
+                <group value="skip"/>
             </annotations>
-
             <amOnPage url="{{AdminCategoryPage.url}}" stepKey="amOnCategoryGridPage"/>
-            <waitForPageLoad stepKey="waitForPageLoad1"/>
+            <waitForPageLoad time="30" stepKey="waitForPageLoad1"/>
 
             <click selector="{{AdminCategorySidebarActionSection.AddSubcategoryButton}}" stepKey="clickOnAddSubCategory"/>
             <fillField selector="{{AdminCategoryBasicFieldSection.CategoryNameInput}}" userInput="{{_defaultCategory.name}}" stepKey="enterCategoryName"/>
@@ -41,7 +38,7 @@
             <seeElement selector="{{AdminCategoryMessagesSection.SuccessMessage}}" stepKey="assertSuccessMessage"/>
 
             <amOnPage url="{{AdminProductIndexPage.url}}" stepKey="amOnProductGridPage"/>
-            <waitForPageLoad stepKey="waitForPageLoad2"/>
+            <waitForPageLoad time="30" stepKey="waitForPageLoad2"/>
             <click selector="{{AdminProductGridActionSection.addProductToggle}}" stepKey="clickOnAddProductToggle"/>
             <click selector="{{AdminProductGridActionSection.addConfigurableProduct}}" stepKey="clickOnAddConfigurableProduct"/>
             <fillField userInput="{{_defaultProduct.name}}" selector="{{AdminProductFormSection.productName}}" stepKey="fillName"/>
@@ -110,15 +107,15 @@
             <see selector="{{AdminProductFormConfigurationsSection.currentVariationsQuantityCells}}" userInput="{{colorProductAttribute.attribute_quantity}}" stepKey="seeQuantityInField"/>
 
             <amOnPage url="/" stepKey="amOnStorefront"/>
-            <waitForPageLoad stepKey="waitForPageLoad3"/>
+            <waitForPageLoad time="30" stepKey="waitForPageLoad3"/>
 
             <click userInput="{{_defaultCategory.name}}" stepKey="clickOnCategoryName"/>
-            <waitForPageLoad stepKey="waitForPageLoad4"/>
+            <waitForPageLoad time="30" stepKey="waitForPageLoad4"/>
 
             <see userInput="{{_defaultProduct.name}}" stepKey="assertProductPresent"/>
             <see userInput="{{colorProductAttribute1.price}}" stepKey="assertProductPricePresent"/>
             <click userInput="{{_defaultProduct.name}}" stepKey="clickOnProductName"/>
-            <waitForPageLoad stepKey="waitForPageLoad5"/>
+            <waitForPageLoad time="30" stepKey="waitForPageLoad5"/>
 
             <seeInTitle userInput="{{_defaultProduct.name}}" stepKey="assertProductNameTitle"/>
             <see userInput="{{_defaultProduct.name}}" selector="{{StorefrontProductInfoMainSection.productName}}" stepKey="assertProductName"/>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Cest/StorefrontPersistedCustomerLoginCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Cest/StorefrontPersistedCustomerLoginCest.xml
index 6c79e31478c..2ed55e691a0 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Cest/StorefrontPersistedCustomerLoginCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Cest/StorefrontPersistedCustomerLoginCest.xml
@@ -28,7 +28,6 @@
                 <group value="customer"/>
                 <env value="chrome"/>
                 <env value="firefox"/>
-                <env value="phantomjs"/>
                 <env value="headless"/>
             </annotations>
             <amOnPage stepKey="amOnSignInPage"  url="{{StorefrontCustomerSignInPage.url}}"/>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/CreateConfigurableProductByApiCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/CreateConfigurableProductByApiCest.xml
index 0f13decf740..7daef0fc1ed 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/CreateConfigurableProductByApiCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/CreateConfigurableProductByApiCest.xml
@@ -12,6 +12,7 @@
         <annotations>
             <features value="Create a Configurable Product By API"/>
             <stories value="Create a Configurable Product By API"/>
+            <group value="skip"/>
         </annotations>
         <before>
             <createData stepKey="categoryHandle" entity="SimpleSubCategory" />
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/CreateSalesRuleByApiCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/CreateSalesRuleByApiCest.xml
index b202095bea1..68d7f75a964 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/CreateSalesRuleByApiCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/CreateSalesRuleByApiCest.xml
@@ -12,6 +12,7 @@
         <annotations>
             <features value="Create a Sales Rule By API"/>
             <stories value="Create a Sales Rule By API"/>
+            <group value="skip"/>
         </annotations>
         <before>
             <createData stepKey="saleRule" entity="SimpleSalesRule" />
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/MinimumTestCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/MinimumTestCest.xml
index c571e8694be..350c228bc50 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/MinimumTestCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/MinimumTestCest.xml
@@ -23,7 +23,6 @@
                 <group value="example"/>
                 <env value="chrome"/>
                 <env value="firefox"/>
-                <env value="phantomjs"/>
                 <env value="headless"/>
             </annotations>
             <amOnPage url="{{AdminLoginPage.url}}" stepKey="navigateToAdmin"/>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/SetPaymentConfigurationCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/SetPaymentConfigurationCest.xml
index 005031284b5..9022ae32a33 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/SetPaymentConfigurationCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/SetPaymentConfigurationCest.xml
@@ -9,6 +9,9 @@
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Test/etc/testSchema.xsd">
     <cest name="SetPaymentConfigurationCest">
+        <annotations>
+            <group value="skip"/>
+        </annotations>
         <test name="SetPaypalConfigurationTest">
             <createData entity="SamplePaypalConfig" stepKey="createSamplePaypalConfig"/>
             <createData entity="DefaultPayPalConfig" stepKey="restoreDefaultPaypalConfig"/>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/UpdateSimpleProductByApiCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/UpdateSimpleProductByApiCest.xml
index 48e87294411..9fa215e582e 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/UpdateSimpleProductByApiCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/UpdateSimpleProductByApiCest.xml
@@ -11,11 +11,7 @@
         <annotations>
             <features value="Update simple product by api test."/>
             <stories value="Update simple product by api test."/>
-            <group value="example"/>
-            <env value="chrome"/>
-            <env value="firefox"/>
-            <env value="phantomjs"/>
-            <env value="headless"/>
+            <group value="skip"/>
         </annotations>
         <before>
             <createData stepKey="categoryHandle" entity="SimpleSubCategory"/>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/Cest/AdminCreateStoreGroupCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/Cest/AdminCreateStoreGroupCest.xml
index ef04dfd795a..8cfcd7d29ec 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/Cest/AdminCreateStoreGroupCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/Cest/AdminCreateStoreGroupCest.xml
@@ -13,7 +13,6 @@
             <stories value="Create a store group in admin"/>
             <env value="chrome"/>
             <env value="firefox"/>
-            <env value="phantomjs"/>
             <group value="store"/>
         </annotations>
         <before>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Wishlist/Cest/StorefrontDeletePersistedWishlistCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Wishlist/Cest/StorefrontDeletePersistedWishlistCest.xml
index 80aa26e20a9..9b21337f94d 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Wishlist/Cest/StorefrontDeletePersistedWishlistCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Wishlist/Cest/StorefrontDeletePersistedWishlistCest.xml
@@ -13,7 +13,6 @@
             <stories value="Delete a persist wishlist for a customer"/>
             <env value="chrome"/>
             <env value="firefox"/>
-            <env value="phantomjs"/>
             <group value="wishlist"/>
         </annotations>
         <before>
-- 
GitLab


From 5216335286e684fdaa9cfc0d55144d547318a363 Mon Sep 17 00:00:00 2001
From: John Stennett <john00ivy@gmail.com>
Date: Thu, 7 Dec 2017 18:24:21 +0200
Subject: [PATCH 304/380] MQE-592: Test Case Audit

- Adjusting the waitForPageLoads time values.
---
 .../Catalog/Cest/AdminCreateCategoryCest.xml              | 8 ++------
 1 file changed, 2 insertions(+), 6 deletions(-)

diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Cest/AdminCreateCategoryCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Cest/AdminCreateCategoryCest.xml
index 980eae28b6d..c8ccd3dc261 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Cest/AdminCreateCategoryCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Cest/AdminCreateCategoryCest.xml
@@ -26,12 +26,9 @@
                 <env value="chrome"/>
                 <env value="headless"/>
             </annotations>
-            <amOnPage url="{{AdminLoginPage.url}}" stepKey="amOnAdminLoginPage"/>
-            <fillField selector="{{AdminLoginFormSection.username}}" userInput="{{_ENV.MAGENTO_ADMIN_USERNAME}}" stepKey="fillUsername"/>
-            <fillField selector="{{AdminLoginFormSection.password}}" userInput="{{_ENV.MAGENTO_ADMIN_PASSWORD}}" stepKey="fillPassword"/>
-            <click selector="{{AdminLoginFormSection.signIn}}" stepKey="clickOnSignIn"/>
+            <loginAsAdmin stepKey="loginAsAdmin"/>
             <amOnPage url="{{AdminCategoryPage.url}}" stepKey="navigateToCategoryPage"/>
-            <waitForPageLoad stepKey="waitForPageLoad1"/>
+            <waitForPageLoad time="30" stepKey="waitForPageLoad1"/>
             <click selector="{{AdminCategorySidebarActionSection.AddSubcategoryButton}}" stepKey="clickOnAddSubCategory"/>
             <fillField selector="{{AdminCategoryBasicFieldSection.CategoryNameInput}}" userInput="{{SimpleSubCategory.name}}" stepKey="enterCategoryName"/>
             <click selector="{{AdminCategorySEOSection.SectionHeader}}" stepKey="openSEO"/>
@@ -41,7 +38,6 @@
 
             <!-- Literal URL below, need to refactor line + StorefrontCategoryPage when support for variable URL is implemented-->
             <amOnPage url="/{{SimpleSubCategory.name_lwr}}.html" stepKey="goToCategoryFrontPage"/>
-            <waitForPageLoad stepKey="waitForPageLoad2"/>
             <seeInTitle userInput="{{SimpleSubCategory.name}}" stepKey="assertTitle"/>
             <see selector="{{StorefrontCategoryMainSection.CategoryTitle}}" userInput="{{SimpleSubCategory.name_lwr}}" stepKey="assertInfo1"/>
         </test>
-- 
GitLab


From bc55797620ed8e8e0cf7760789d4db40865dac8d Mon Sep 17 00:00:00 2001
From: John Stennett <john00ivy@gmail.com>
Date: Thu, 7 Dec 2017 19:04:58 +0200
Subject: [PATCH 305/380] MQE-592: Test Case Audit

- Removing the Robo PhantomJS command.
---
 dev/tests/acceptance/RoboFile.php | 10 ----------
 1 file changed, 10 deletions(-)

diff --git a/dev/tests/acceptance/RoboFile.php b/dev/tests/acceptance/RoboFile.php
index 287dce4d38f..60b4d287b7d 100644
--- a/dev/tests/acceptance/RoboFile.php
+++ b/dev/tests/acceptance/RoboFile.php
@@ -91,16 +91,6 @@ class RoboFile extends \Robo\Tasks
         $this->_exec('vendor'. DIRECTORY_SEPARATOR .'bin'. DIRECTORY_SEPARATOR .'codecept run functional --env firefox --skip-group skip');
     }
 
-    /**
-     * Run all Functional tests using the PhantomJS environment.
-     *
-     * @return void
-     */
-    function phantomjs()
-    {
-        $this->_exec('vendor'. DIRECTORY_SEPARATOR .'bin'. DIRECTORY_SEPARATOR .'codecept run functional --env phantomjs --skip-group skip');
-    }
-
     /**
      * Run all Functional tests using the Chrome Headless environment.
      *
-- 
GitLab


From 35d6cf83ebbcafb027bca8a6b6ec8e784ebf4576 Mon Sep 17 00:00:00 2001
From: imeron2433 <imeron@magento.com>
Date: Thu, 7 Dec 2017 21:22:08 +0200
Subject: [PATCH 306/380] MQE-592: Audit Test Cases on Firefox/Chrome on
 Windows/OSX

- strip @env tags from Cest.xml files
- change test flows to be more robust
---
 .../FunctionalTest/Backend/Cest/AdminLoginCest.xml    |  3 ---
 .../Catalog/Cest/AdminCreateCategoryCest.xml          |  2 --
 .../Catalog/Cest/AdminCreateSimpleProductCest.xml     |  2 --
 .../Checkout/Cest/StorefrontCustomerCheckoutCest.xml  |  2 --
 .../Checkout/Cest/StorefrontGuestCheckoutCest.xml     |  7 +++----
 .../Checkout/Section/GuestCheckoutPaymentSection.xml  |  2 ++
 .../Cms/Cest/AdminCreateCmsPageCest.xml               |  4 +---
 .../Cest/AdminCreateConfigurableProductCest.xml       |  3 ++-
 .../Customer/Cest/AdminCreateCustomerCest.xml         |  5 +----
 .../Customer/Cest/StorefrontCreateCustomerCest.xml    |  3 ---
 .../Cest/StorefrontPersistedCustomerLoginCest.xml     |  3 ---
 .../Customer/Section/AdminCustomerFiltersSection.xml  |  1 +
 .../Sales/Cest/AdminCreateInvoiceCest.xml             | 11 +++++------
 .../SampleTemplates/Cest/TemplateCestFile.xml         |  1 -
 .../SampleTests/Cest/MinimumTestCest.xml              |  4 +---
 15 files changed, 16 insertions(+), 37 deletions(-)

diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/Cest/AdminLoginCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/Cest/AdminLoginCest.xml
index f503dd0844b..fbce6aa6388 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/Cest/AdminLoginCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/Cest/AdminLoginCest.xml
@@ -21,9 +21,6 @@
                 <testCaseId value="MAGETWO-71572"/>
                 <group value="example"/>
                 <group value="login"/>
-                <env value="chrome"/>
-                <env value="firefox"/>
-                <env value="headless"/>
             </annotations>
             <amOnPage url="{{AdminLoginPage.url}}" stepKey="amOnAdminLoginPage"/>
             <fillField selector="{{AdminLoginFormSection.username}}" userInput="{{_ENV.MAGENTO_ADMIN_USERNAME}}" stepKey="fillUsername"/>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Cest/AdminCreateCategoryCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Cest/AdminCreateCategoryCest.xml
index c8ccd3dc261..1d127927851 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Cest/AdminCreateCategoryCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Cest/AdminCreateCategoryCest.xml
@@ -23,8 +23,6 @@
                 <severity value="CRITICAL"/>
                 <testCaseId value="MAGETWO-72102"/>
                 <group value="category"/>
-                <env value="chrome"/>
-                <env value="headless"/>
             </annotations>
             <loginAsAdmin stepKey="loginAsAdmin"/>
             <amOnPage url="{{AdminCategoryPage.url}}" stepKey="navigateToCategoryPage"/>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Cest/AdminCreateSimpleProductCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Cest/AdminCreateSimpleProductCest.xml
index c2756445f62..cbf0cdb4d90 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Cest/AdminCreateSimpleProductCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Cest/AdminCreateSimpleProductCest.xml
@@ -23,8 +23,6 @@
                 <severity value="CRITICAL"/>
                 <testCaseId value="MAGETWO-23414"/>
                 <group value="product"/>
-                <env value="chrome"/>
-                <env value="headless"/>
             </annotations>
             <amOnPage url="{{AdminLoginPage.url}}" stepKey="navigateToAdmin"/>
             <fillField userInput="{{_ENV.MAGENTO_ADMIN_USERNAME}}" selector="{{AdminLoginFormSection.username}}" stepKey="fillUsername"/>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Cest/StorefrontCustomerCheckoutCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Cest/StorefrontCustomerCheckoutCest.xml
index 1da632eaae1..4531bfb84dc 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Cest/StorefrontCustomerCheckoutCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Cest/StorefrontCustomerCheckoutCest.xml
@@ -32,8 +32,6 @@
                 <severity value="CRITICAL"/>
                 <testCaseId value="#"/>
                 <group value="checkout"/>
-                <env value="chrome"/>
-                <env value="headless"/>
             </annotations>
 
             <amOnPage stepKey="s1"  url="customer/account/login/"/>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Cest/StorefrontGuestCheckoutCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Cest/StorefrontGuestCheckoutCest.xml
index 2aa0a77b0a0..69c614cd362 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Cest/StorefrontGuestCheckoutCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Cest/StorefrontGuestCheckoutCest.xml
@@ -30,8 +30,6 @@
                 <severity value="CRITICAL"/>
                 <testCaseId value="MAGETWO-72094"/>
                 <group value="checkout"/>
-                <env value="chrome"/>
-                <env value="headless"/>
             </annotations>
             <amOnPage url="{{StorefrontCategoryPage.url($$createCategory.name$$)}}" stepKey="onCategoryPage"/>
             <waitForPageLoad stepKey="waitForPageLoad1"/>
@@ -56,6 +54,7 @@
             <waitForElement selector="{{GuestCheckoutShippingSection.next}}" time="30" stepKey="waitForNextButton"/>
             <click selector="{{GuestCheckoutShippingSection.next}}" stepKey="clickNext"/>
             <waitForElement selector="{{GuestCheckoutPaymentSection.placeOrder}}" time="30" stepKey="waitForPlaceOrderButton"/>
+            <conditionalClick selector="{{GuestCheckoutPaymentSection.cartItemsArea}}" dependentSelector="{{GuestCheckoutPaymentSection.cartItemsAreaActive}}" visible="false" stepKey="exposeMiniCart"/>
             <see selector="{{GuestCheckoutPaymentSection.cartItems}}" userInput="{{_defaultProduct.name}}" stepKey="seeProductInCart"/>
             <see selector="{{GuestCheckoutPaymentSection.billingAddress}}" userInput="{{CustomerAddressSimple.street[0]}}" stepKey="seeAddress"/>
             <click selector="{{GuestCheckoutPaymentSection.placeOrder}}" stepKey="clickPlaceOrder"/>
@@ -67,10 +66,10 @@
             <fillField selector="{{AdminLoginFormSection.password}}" userInput="{{_ENV.MAGENTO_ADMIN_PASSWORD}}" stepKey="fillPassword"/>
             <click selector="{{AdminLoginFormSection.signIn}}" stepKey="clickLogin"/>
             <amOnPage url="{{OrdersPage.url}}" stepKey="onOrdersPage"/>
-            <waitForElementNotVisible selector="{{OrdersGridSection.spinner}}" time="30" stepKey="waitForOrdersPage"/>
+            <waitForLoadingMaskToDisappear stepKey="waitForLoadingMaskToDisappearOnOrdersPage"/>
             <fillField selector="{{OrdersGridSection.search}}" variable="orderNumber" stepKey="fillOrderNum"/>
             <click selector="{{OrdersGridSection.submitSearch}}" stepKey="submitSearchOrderNum"/>
-            <waitForElementNotVisible selector="{{OrdersGridSection.spinner}}" time="30" stepKey="waitForOrdersPage2"/>
+            <waitForLoadingMaskToDisappear stepKey="waitForLoadingMaskToDisappearOnSearch"/>
             <click selector="{{OrdersGridSection.firstRow}}" stepKey="clickOrderRow"/>
             <see selector="{{OrderDetailsInformationSection.orderStatus}}" userInput="Pending" stepKey="seeAdminOrderStatus"/>
             <see selector="{{OrderDetailsInformationSection.accountInformation}}" userInput="Guest" stepKey="seeAdminOrderGuest"/>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Section/GuestCheckoutPaymentSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Section/GuestCheckoutPaymentSection.xml
index 200a699d2bb..cc7c019cc4e 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Section/GuestCheckoutPaymentSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Section/GuestCheckoutPaymentSection.xml
@@ -9,6 +9,8 @@
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
     <section name="GuestCheckoutPaymentSection">
+        <element name="cartItemsArea" type="textarea" selector=".items-in-cart"/>
+        <element name="cartItemsAreaActive" type="textarea" selector="div.block.items-in-cart.active"/>
         <element name="cartItems" type="text" selector=".minicart-items"/>
         <element name="billingAddress" type="text" selector="div.billing-address-details"/>
         <element name="placeOrder" type="button" selector="button.action.primary.checkout" timeout="30"/>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Cest/AdminCreateCmsPageCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Cest/AdminCreateCmsPageCest.xml
index 112c57fbb86..8ac19e41e4b 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Cest/AdminCreateCmsPageCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Cest/AdminCreateCmsPageCest.xml
@@ -23,9 +23,7 @@
                 <severity value="CRITICAL"/>
                 <testCaseId value="MAGETWO-25580"/>
                 <group value="cms"/>
-                <env value="chrome"/>
-                <env value="firefox"/>
-                <env value="headless"/>
+                <group value="skip"/>
             </annotations>
             <amOnPage url="{{AdminLoginPage.url}}" stepKey="navigateToAdmin"/>
             <fillField selector="{{AdminLoginFormSection.username}}" userInput="{{_ENV.MAGENTO_ADMIN_USERNAME}}" stepKey="fillUsername"/>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/Cest/AdminCreateConfigurableProductCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/Cest/AdminCreateConfigurableProductCest.xml
index c68f6ed83bc..a540feba1f5 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/Cest/AdminCreateConfigurableProductCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/Cest/AdminCreateConfigurableProductCest.xml
@@ -25,7 +25,8 @@
                 <description value="You should be able to create a Configurable Product via the Admin."/>
                 <severity value="CRITICAL"/>
                 <testCaseId value="MAGETWO-26041"/>
-                <group value="skip"/>
+                <group value="configurable"/>
+                <group value="product"/>
             </annotations>
             <amOnPage url="{{AdminCategoryPage.url}}" stepKey="amOnCategoryGridPage"/>
             <waitForPageLoad time="30" stepKey="waitForPageLoad1"/>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Cest/AdminCreateCustomerCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Cest/AdminCreateCustomerCest.xml
index da72ffd45ea..b0a4cb06c08 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Cest/AdminCreateCustomerCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Cest/AdminCreateCustomerCest.xml
@@ -21,8 +21,6 @@
                 <testCaseId value="MAGETWO-72095"/>
                 <group value="customer"/>
                 <group value="create"/>
-                <env value="chrome"/>
-                <env value="headless"/>
             </annotations>
             <amOnPage url="{{AdminLoginPage.url}}" stepKey="navigateToAdmin"/>
             <fillField userInput="{{_ENV.MAGENTO_ADMIN_USERNAME}}" selector="{{AdminLoginFormSection.username}}" stepKey="fillUsername"/>
@@ -36,9 +34,8 @@
             <click selector="{{AdminNewCustomerMainActionsSection.saveButton}}" stepKey="saveCustomer"/>
             <waitForElementNotVisible selector="div [data-role='spinner']" time="10" stepKey="waitForSpinner1"/>
             <seeElement selector="{{AdminCustomerMessagesSection.successMessage}}" stepKey="assertSuccessMessage"/>
-
             <click selector="{{AdminCustomerFiltersSection.filtersButton}}" stepKey="openFilter"/>
-            <fillField userInput="{{CustomerEntityOne.firstname}}" selector="{{AdminCustomerFiltersSection.nameInput}}" stepKey="filterFirstName"/>
+            <fillField userInput="{{CustomerEntityOne.email}}" selector="{{AdminCustomerFiltersSection.emailInput}}" stepKey="filterEmail"/>
             <click selector="{{AdminCustomerFiltersSection.apply}}" stepKey="applyFilter"/>
             <waitForElementNotVisible selector="div [data-role='spinner']" time="10" stepKey="waitForSpinner2"/>
             <see userInput="{{CustomerEntityOne.firstname}}" selector="{{AdminCustomerGridSection.customerGrid}}" stepKey="assertFirstName"/>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Cest/StorefrontCreateCustomerCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Cest/StorefrontCreateCustomerCest.xml
index 36c97c56d0f..80ab4ea6d9c 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Cest/StorefrontCreateCustomerCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Cest/StorefrontCreateCustomerCest.xml
@@ -21,9 +21,6 @@
                 <testCaseId value="MAGETWO-23546"/>
                 <group value="customer"/>
                 <group value="create"/>
-                <env value="chrome"/>
-                <env value="firefox"/>
-                <env value="headless"/>
             </annotations>
             <amOnPage stepKey="amOnStorefrontPage"  url="/"/>
             <click stepKey="clickOnCreateAccountLink" selector="{{StorefrontPanelHeaderSection.createAnAccountLink}}"/>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Cest/StorefrontPersistedCustomerLoginCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Cest/StorefrontPersistedCustomerLoginCest.xml
index 2ed55e691a0..2045fd3a97a 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Cest/StorefrontPersistedCustomerLoginCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Cest/StorefrontPersistedCustomerLoginCest.xml
@@ -26,9 +26,6 @@
                 <severity value="CRITICAL"/>
                 <testCaseId value="MAGETWO-72103"/>
                 <group value="customer"/>
-                <env value="chrome"/>
-                <env value="firefox"/>
-                <env value="headless"/>
             </annotations>
             <amOnPage stepKey="amOnSignInPage"  url="{{StorefrontCustomerSignInPage.url}}"/>
             <fillField  stepKey="fillEmail" userInput="$$customer.email$$" selector="{{StorefrontCustomerSignInFormSection.emailField}}"/>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/AdminCustomerFiltersSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/AdminCustomerFiltersSection.xml
index 57449d2b22b..8e21effe98d 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/AdminCustomerFiltersSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/AdminCustomerFiltersSection.xml
@@ -11,6 +11,7 @@
     <section name="AdminCustomerFiltersSection">
         <element name="filtersButton" type="button" selector="#container > div > div.admin__data-grid-header > div:nth-child(1) > div.data-grid-filters-actions-wrap > div > button" timeout="30"/>
         <element name="nameInput" type="input" selector="input[name=name]"/>
+        <element name="emailInput" type="input" selector="input[name=email]"/>
         <element name="apply" type="button" selector="button[data-action=grid-filter-apply]" timeout="30"/>
     </section>
 </config>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Cest/AdminCreateInvoiceCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Cest/AdminCreateInvoiceCest.xml
index f27ac7d37af..e0279c22d96 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Cest/AdminCreateInvoiceCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Cest/AdminCreateInvoiceCest.xml
@@ -27,8 +27,6 @@
                 <severity value="NORMAL"/>
                 <testCaseId value="MAGETWO-72096"/>
                 <group value="sales"/>
-                <env value="chrome"/>
-                <env value="headless"/>
             </annotations>
 
             <!-- todo: Create an order via the api instead of driving the browser  -->
@@ -50,6 +48,7 @@
             <fillField selector="{{CheckoutShippingGuestInfoSection.telephone}}" userInput="{{CustomerAddressSimple.telephone}}" stepKey="enterTelephone"/>
             <waitForLoadingMaskToDisappear stepKey="waitForLoadingMask"/>
             <click selector="{{CheckoutShippingMethodsSection.firstShippingMethod}}" stepKey="selectFirstShippingMethod"/>
+            <waitForLoadingMaskToDisappear stepKey="waitForLoadingMask2"/>
             <waitForElement selector="{{CheckoutShippingMethodsSection.next}}" time="30" stepKey="waitForNextButton"/>
             <click selector="{{CheckoutShippingMethodsSection.next}}" stepKey="clickNext"/>
             <waitForElement selector="{{CheckoutPaymentSection.placeOrder}}" time="30" stepKey="waitForPlaceOrderButton"/>
@@ -64,23 +63,23 @@
             <click selector="{{AdminLoginFormSection.signIn}}" stepKey="clickLogin"/>
 
             <amOnPage url="{{OrdersPage.url}}" stepKey="onOrdersPage"/>
-            <waitForElementNotVisible selector="{{OrdersGridSection.spinner}}" time="10" stepKey="waitSpinner1"/>
+            <waitForLoadingMaskToDisappear stepKey="waitForLoadingMask3"/>
             <fillField selector="{{OrdersGridSection.search}}" variable="orderNumber" stepKey="searchOrderNum"/>
             <click selector="{{OrdersGridSection.submitSearch}}" stepKey="submitSearch"/>
-            <waitForElementNotVisible selector="{{OrdersGridSection.spinner}}" time="10" stepKey="waitSpinner2"/>
+            <waitForLoadingMaskToDisappear stepKey="waitForLoadingMask4"/>
 
             <click selector="{{OrdersGridSection.firstRow}}" stepKey="clickOrderRow"/>
             <click selector="{{OrderDetailsMainActionsSection.invoice}}" stepKey="clickInvoice"/>
             <click selector="{{InvoiceNewSection.submitInvoice}}" stepKey="clickSubmitInvoice"/>
             <see selector="{{OrderDetailsMessagesSection.successMessage}}" userInput="The invoice has been created." stepKey="seeSuccessMessage"/>
             <click selector="{{OrderDetailsOrderViewSection.invoices}}" stepKey="clickInvoices"/>
-            <waitForElementNotVisible selector="{{OrderDetailsInvoicesSection.spinner}}" time="10" stepKey="waitSpinner3"/>
+            <waitForLoadingMaskToDisappear stepKey="waitForLoadingMask5" />
             <see selector="{{OrderDetailsInvoicesSection.content}}" variable="orderNumber" stepKey="seeInvoice1"/>
             <see selector="{{OrderDetailsInvoicesSection.content}}" userInput="John Doe" stepKey="seeInvoice2"/>
             <click selector="{{OrderDetailsOrderViewSection.information}}" stepKey="clickInformation"/>
             <see selector="{{OrderDetailsInformationSection.orderStatus}}" userInput="Processing" stepKey="seeOrderStatus"/>
             <amOnPage url="{{InvoicesPage.url}}" stepKey="goToInvoices"/>
-            <waitForElementNotVisible selector="{{InvoicesGridSection.spinner}}" time="10" stepKey="waitSpinner4"/>
+            <waitForLoadingMaskToDisappear stepKey="waitForLoadingMask6" />
             <click selector="{{InvoicesGridSection.filter}}" stepKey="clickFilters"/>
             <fillField selector="{{InvoicesFiltersSection.orderNum}}" variable="orderNumber" stepKey="searchOrderNum2"/>
             <click selector="{{InvoicesGridSection.firstRow}}" stepKey="clickInvoice2"/>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTemplates/Cest/TemplateCestFile.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTemplates/Cest/TemplateCestFile.xml
index bc29e788f90..18b8a30d441 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTemplates/Cest/TemplateCestFile.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTemplates/Cest/TemplateCestFile.xml
@@ -26,7 +26,6 @@
                 <severity value=""/>
                 <testCaseId value=""/>
                 <group value=""/>
-                <env value=""/>
             </annotations>
             <!-- ADD TEST STEPS HERE -->
         </test>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/MinimumTestCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/MinimumTestCest.xml
index 350c228bc50..440a14c9603 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/MinimumTestCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/MinimumTestCest.xml
@@ -1,3 +1,4 @@
+<<<<<<< Updated upstream
 <?xml version="1.0" encoding="UTF-8"?>
 <!--
  /**
@@ -21,9 +22,6 @@
                 <title value="Minimum Test"/>
                 <description value="Minimum Test"/>
                 <group value="example"/>
-                <env value="chrome"/>
-                <env value="firefox"/>
-                <env value="headless"/>
             </annotations>
             <amOnPage url="{{AdminLoginPage.url}}" stepKey="navigateToAdmin"/>
             <fillField selector="{{AdminLoginFormSection.username}}" userInput="{{_ENV.MAGENTO_ADMIN_USERNAME}}" stepKey="fillUsername"/>
-- 
GitLab


From 0344c718d8aa6896c5845ff327bb37d27d6ead8e Mon Sep 17 00:00:00 2001
From: John Stennett <john00ivy@gmail.com>
Date: Thu, 7 Dec 2017 23:01:38 +0200
Subject: [PATCH 307/380] MQE-592: Test Case Audit

- Removing the Robo environment commands.
- Adding a Functional command to Robo.
- Removing the "skip" group from the CMS test.
- Adding the "skip" group to the Configurable Product test.
---
 dev/tests/acceptance/RoboFile.php             | 38 +++++--------------
 .../Cms/Cest/AdminCreateCmsPageCest.xml       |  1 -
 .../AdminCreateConfigurableProductCest.xml    |  1 +
 3 files changed, 10 insertions(+), 30 deletions(-)

diff --git a/dev/tests/acceptance/RoboFile.php b/dev/tests/acceptance/RoboFile.php
index 60b4d287b7d..8ae973ea81d 100644
--- a/dev/tests/acceptance/RoboFile.php
+++ b/dev/tests/acceptance/RoboFile.php
@@ -72,65 +72,45 @@ class RoboFile extends \Robo\Tasks
     }
 
     /**
-     * Run all Functional tests using the Chrome environment.
+     * Run all Functional tests.
      *
      * @return void
      */
-    function chrome()
+    function functional()
     {
-        $this->_exec('vendor'. DIRECTORY_SEPARATOR .'bin'. DIRECTORY_SEPARATOR .'codecept run functional --env chrome --skip-group skip');
+        $this->_exec('.' . DIRECTORY_SEPARATOR . 'vendor' . DIRECTORY_SEPARATOR . 'bin' . DIRECTORY_SEPARATOR . 'codecept run functional --skip-group skip');
     }
 
     /**
-     * Run all Functional tests using the FireFox environment.
-     *
-     * @return void
-     */
-    function firefox()
-    {
-        $this->_exec('vendor'. DIRECTORY_SEPARATOR .'bin'. DIRECTORY_SEPARATOR .'codecept run functional --env firefox --skip-group skip');
-    }
-
-    /**
-     * Run all Functional tests using the Chrome Headless environment.
-     *
-     * @return void
-     */
-    function headless()
-    {
-        $this->_exec('vendor'. DIRECTORY_SEPARATOR .'bin'. DIRECTORY_SEPARATOR .'codecept run functional --env headless --skip-group skip');
-    }
-
-    /**
-     * Run all Tests with the specified @group tag, excluding @group 'skip', using the Chrome environment.
+     * Run all Tests with the specified @group tag, excluding @group 'skip'.
      *
      * @param string $args
      * @return void
      */
     function group($args = '')
     {
-        $this->taskExec('vendor'. DIRECTORY_SEPARATOR .'bin'. DIRECTORY_SEPARATOR .'codecept run functional --verbose --steps --env chrome --skip-group skip --group')->args($args)->run();
+        $this->taskExec('.' . DIRECTORY_SEPARATOR . 'vendor' . DIRECTORY_SEPARATOR . 'bin' . DIRECTORY_SEPARATOR . 'codecept run functional --verbose --steps --skip-group skip --group')->args($args)->run();
     }
 
     /**
-     * Run all Functional tests located under the Directory Path provided using the Chrome environment.
+     * Run all Functional tests located under the Directory Path provided.
      *
      * @param string $args
      * @return void
      */
     function folder($args = '')
     {
-        $this->taskExec('vendor'. DIRECTORY_SEPARATOR .'bin'. DIRECTORY_SEPARATOR .'codecept run functional --env chrome')->args($args)->run();
+        $this->taskExec('.' . DIRECTORY_SEPARATOR . 'vendor' . DIRECTORY_SEPARATOR . 'bin' . DIRECTORY_SEPARATOR . 'codecept run functional')->args($args)->run();
     }
 
     /**
-     * Run all Tests marked with the @group tag 'example', using the Chrome environment.
+     * Run all Tests marked with the @group tag 'example'.
      *
      * @return void
      */
     function example()
     {
-        $this->_exec('vendor'. DIRECTORY_SEPARATOR .'bin'. DIRECTORY_SEPARATOR .'codecept run --env chrome --group example --skip-group skip');
+        $this->_exec('.' . DIRECTORY_SEPARATOR . 'vendor' . DIRECTORY_SEPARATOR . 'bin' . DIRECTORY_SEPARATOR . 'codecept run --group example --skip-group skip');
     }
 
     /**
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Cest/AdminCreateCmsPageCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Cest/AdminCreateCmsPageCest.xml
index 8ac19e41e4b..0a321690dd5 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Cest/AdminCreateCmsPageCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Cest/AdminCreateCmsPageCest.xml
@@ -23,7 +23,6 @@
                 <severity value="CRITICAL"/>
                 <testCaseId value="MAGETWO-25580"/>
                 <group value="cms"/>
-                <group value="skip"/>
             </annotations>
             <amOnPage url="{{AdminLoginPage.url}}" stepKey="navigateToAdmin"/>
             <fillField selector="{{AdminLoginFormSection.username}}" userInput="{{_ENV.MAGENTO_ADMIN_USERNAME}}" stepKey="fillUsername"/>
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/Cest/AdminCreateConfigurableProductCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/Cest/AdminCreateConfigurableProductCest.xml
index a540feba1f5..f8611679728 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/Cest/AdminCreateConfigurableProductCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/Cest/AdminCreateConfigurableProductCest.xml
@@ -27,6 +27,7 @@
                 <testCaseId value="MAGETWO-26041"/>
                 <group value="configurable"/>
                 <group value="product"/>
+                <group value="skip"/>
             </annotations>
             <amOnPage url="{{AdminCategoryPage.url}}" stepKey="amOnCategoryGridPage"/>
             <waitForPageLoad time="30" stepKey="waitForPageLoad1"/>
-- 
GitLab


From ca831701b2dbc0c1e6a74db394ef4ff7e5ca167f Mon Sep 17 00:00:00 2001
From: John Stennett <john00ivy@gmail.com>
Date: Thu, 7 Dec 2017 23:54:35 +0200
Subject: [PATCH 308/380] MQE-592: Test Case Audit

- Removing git message in the MinimumTestCest XML.
---
 .../Magento/FunctionalTest/SampleTests/Cest/MinimumTestCest.xml  | 1 -
 1 file changed, 1 deletion(-)

diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/MinimumTestCest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/MinimumTestCest.xml
index 440a14c9603..e9c971f7e10 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/MinimumTestCest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Cest/MinimumTestCest.xml
@@ -1,4 +1,3 @@
-<<<<<<< Updated upstream
 <?xml version="1.0" encoding="UTF-8"?>
 <!--
  /**
-- 
GitLab


From 6d7cea4dcadd0888d75cdbb6953259746953c0ff Mon Sep 17 00:00:00 2001
From: Ian Meron <imeron@magento.com>
Date: Fri, 8 Dec 2017 00:49:19 +0200
Subject: [PATCH 309/380] MQE-592: Audit Test Cases on Firefox/Chrome on
 Windows/OSX

- add default chrome config to function.dist.yml file
---
 dev/tests/acceptance/tests/functional.suite.dist.yml | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/dev/tests/acceptance/tests/functional.suite.dist.yml b/dev/tests/acceptance/tests/functional.suite.dist.yml
index 9bae4de6edb..f15d66d983a 100644
--- a/dev/tests/acceptance/tests/functional.suite.dist.yml
+++ b/dev/tests/acceptance/tests/functional.suite.dist.yml
@@ -35,4 +35,7 @@ modules:
             port: %SELENIUM_PORT%
             protocol: %SELENIUM_PROTOCOL%
             path: %SELENIUM_PATH%
+            capabilities:
+              chromeOptions:
+                args: ["--start-maximized", "--disable-extensions", "--enable-automation"]
 
-- 
GitLab


From cb48c655cca143f8dcfeffd74c4a43644d28a0d6 Mon Sep 17 00:00:00 2001
From: Alex Kolesnyk <okolesnyk@magento.com>
Date: Fri, 8 Dec 2017 15:09:17 +0200
Subject: [PATCH 310/380] MQE-599: Move composer.json, README.MD, etc to CE

 - updated compose.json files prepared to MFTF release
---
 dev/tests/acceptance/composer.json            | 12 +---
 .../AdminNotification/composer.json           | 19 +++----
 .../AdvancedPricingImportExport/composer.json | 25 ++++----
 .../FunctionalTest/Analytics/composer.json    | 37 +++++-------
 .../Authorization/composer.json               | 13 ++---
 .../FunctionalTest/Authorizenet/composer.json | 25 ++++----
 .../FunctionalTest/Backend/composer.json      | 43 +++++++-------
 .../FunctionalTest/Backup/composer.json       | 17 ++----
 .../FunctionalTest/Braintree/composer.json    | 37 ++++++------
 .../FunctionalTest/Bundle/composer.json       | 41 ++++++-------
 .../BundleImportExport/composer.json          | 21 +++----
 .../CacheInvalidate/composer.json             | 13 ++---
 .../FunctionalTest/Captcha/composer.json      | 19 +++----
 .../FunctionalTest/Catalog/composer.json      | 57 +++++++++----------
 .../CatalogAnalytics/composer.json            | 31 ++++------
 .../CatalogImportExport/composer.json         | 29 ++++------
 .../CatalogInventory/composer.json            | 25 ++++----
 .../FunctionalTest/CatalogRule/composer.json  | 25 ++++----
 .../CatalogRuleConfigurable/composer.json     | 17 ++----
 .../CatalogSearch/composer.json               | 31 +++++-----
 .../CatalogUrlRewrite/composer.json           | 27 ++++-----
 .../CatalogWidget/composer.json               | 27 ++++-----
 .../FunctionalTest/Checkout/composer.json     | 47 +++++++--------
 .../CheckoutAgreements/composer.json          | 19 +++----
 .../Magento/FunctionalTest/Cms/composer.json  | 29 ++++------
 .../CmsUrlRewrite/composer.json               | 17 ++----
 .../FunctionalTest/Config/composer.json       | 25 ++++----
 .../ConfigurableImportExport/composer.json    | 21 +++----
 .../ConfigurableProduct/composer.json         | 33 +++++------
 .../ConfigurableProductSales/composer.json    | 17 ++----
 .../FunctionalTest/Contact/composer.json      | 19 +++----
 .../FunctionalTest/Cookie/composer.json       | 13 ++---
 .../Magento/FunctionalTest/Cron/composer.json | 13 ++---
 .../CurrencySymbol/composer.json              | 21 +++----
 .../FunctionalTest/Customer/composer.json     | 49 +++++++---------
 .../CustomerAnalytics/composer.json           | 31 ++++------
 .../CustomerImportExport/composer.json        | 23 +++-----
 .../FunctionalTest/Deploy/composer.json       | 19 +++----
 .../FunctionalTest/Developer/composer.json    | 15 ++---
 .../Magento/FunctionalTest/Dhl/composer.json  | 29 ++++------
 .../FunctionalTest/Directory/composer.json    | 17 ++----
 .../FunctionalTest/Downloadable/composer.json | 43 +++++++-------
 .../DownloadableImportExport/composer.json    | 23 +++-----
 .../Magento/FunctionalTest/Eav/composer.json  | 21 +++----
 .../FunctionalTest/Email/composer.json        | 23 +++-----
 .../EncryptionKey/composer.json               | 15 ++---
 .../FunctionalTest/Fedex/composer.json        | 27 ++++-----
 .../FunctionalTest/GiftMessage/composer.json  | 27 ++++-----
 .../GoogleAdwords/composer.json               | 15 ++---
 .../GoogleAnalytics/composer.json             | 17 ++----
 .../GoogleOptimizer/composer.json             | 23 +++-----
 .../FunctionalTest/GraphQl/composer.json      | 17 ++----
 .../GroupedImportExport/composer.json         | 21 +++----
 .../GroupedProduct/composer.json              | 35 +++++-------
 .../FunctionalTest/ImportExport/composer.json | 21 +++----
 .../FunctionalTest/Indexer/composer.json      | 13 ++---
 .../InstantPurchase/composer.json             | 23 +++-----
 .../FunctionalTest/Integration/composer.json  | 23 +++-----
 .../LayeredNavigation/composer.json           | 15 ++---
 .../FunctionalTest/Marketplace/composer.json  | 13 ++---
 .../FunctionalTest/MediaStorage/composer.json | 17 ++----
 .../Magento/FunctionalTest/Msrp/composer.json | 23 +++-----
 .../Multishipping/composer.json               | 27 ++++-----
 .../NewRelicReporting/composer.json           | 23 +++-----
 .../FunctionalTest/Newsletter/composer.json   | 27 ++++-----
 .../OfflinePayments/composer.json             | 15 ++---
 .../OfflineShipping/composer.json             | 29 ++++------
 .../FunctionalTest/PageCache/composer.json    | 17 ++----
 .../FunctionalTest/Payment/composer.json      | 23 +++-----
 .../FunctionalTest/Paypal/composer.json       | 43 +++++++-------
 .../FunctionalTest/Persistent/composer.json   | 23 +++-----
 .../FunctionalTest/ProductAlert/composer.json | 19 +++----
 .../FunctionalTest/ProductVideo/composer.json | 21 +++----
 .../FunctionalTest/Quote/composer.json        | 39 ++++++-------
 .../QuoteAnalytics/composer.json              | 31 ++++------
 .../FunctionalTest/Reports/composer.json      | 43 +++++++-------
 .../FunctionalTest/RequireJs/composer.json    | 14 ++---
 .../FunctionalTest/Review/composer.json       | 27 ++++-----
 .../ReviewAnalytics/composer.json             | 31 ++++------
 .../FunctionalTest/Robots/composer.json       | 13 ++---
 .../Magento/FunctionalTest/Rss/composer.json  | 17 ++----
 .../Magento/FunctionalTest/Rule/composer.json | 19 +++----
 .../FunctionalTest/Sales/composer.json        | 57 +++++++++----------
 .../SalesAnalytics/composer.json              | 31 ++++------
 .../SalesInventory/composer.json              | 19 +++----
 .../FunctionalTest/SalesRule/composer.json    | 43 +++++++-------
 .../SalesSequence/composer.json               | 14 ++---
 .../FunctionalTest/SampleData/composer.json   | 14 ++---
 .../FunctionalTest/Search/composer.json       | 21 +++----
 .../FunctionalTest/Security/composer.json     | 15 ++---
 .../FunctionalTest/SendFriend/composer.json   | 17 ++----
 .../FunctionalTest/Shipping/composer.json     | 37 ++++++------
 .../FunctionalTest/Sitemap/composer.json      | 29 ++++------
 .../FunctionalTest/Store/composer.json        | 21 +++----
 .../FunctionalTest/Swagger/composer.json      | 14 ++---
 .../FunctionalTest/Swatches/composer.json     | 29 ++++------
 .../SwatchesLayeredNavigation/composer.json   | 14 ++---
 .../Magento/FunctionalTest/Tax/composer.json  | 37 ++++++------
 .../TaxImportExport/composer.json             | 19 +++----
 .../FunctionalTest/Theme/composer.json        | 31 +++++-----
 .../FunctionalTest/Translation/composer.json  | 17 ++----
 .../Magento/FunctionalTest/Ui/composer.json   | 19 +++----
 .../Magento/FunctionalTest/Ups/composer.json  | 25 ++++----
 .../FunctionalTest/UrlRewrite/composer.json   | 23 +++-----
 .../Magento/FunctionalTest/User/composer.json | 23 +++-----
 .../Magento/FunctionalTest/Usps/composer.json | 27 ++++-----
 .../FunctionalTest/Variable/composer.json     | 17 ++----
 .../FunctionalTest/Vault/composer.json        | 23 +++-----
 .../FunctionalTest/Version/composer.json      | 14 ++---
 .../FunctionalTest/Webapi/composer.json       | 19 +++----
 .../WebapiSecurity/composer.json              | 13 ++---
 .../Magento/FunctionalTest/Weee/composer.json | 35 +++++-------
 .../FunctionalTest/Widget/composer.json       | 25 ++++----
 .../FunctionalTest/Wishlist/composer.json     | 29 ++++------
 .../WishlistAnalytics/composer.json           | 31 ++++------
 115 files changed, 1097 insertions(+), 1709 deletions(-)

diff --git a/dev/tests/acceptance/composer.json b/dev/tests/acceptance/composer.json
index 4f8abc17b25..c6bdf643db0 100755
--- a/dev/tests/acceptance/composer.json
+++ b/dev/tests/acceptance/composer.json
@@ -1,8 +1,8 @@
 {
     "name": "magento/magento2ce-functional-tests",
-    "description": "Magento 2 Functional Tests",
+    "description": "Magento 2 (Open Source) Functional Tests",
     "type": "project",
-    "version": "1.0.0",
+    "version": "1.0.0-dev",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
@@ -10,12 +10,6 @@
     "config": {
         "sort-packages": true
     },
-    "repositories": [
-        {
-            "type": "git",
-            "url": "git@github.com:magento/magento2-functional-testing-framework.git"
-        }
-    ],
     "require": {
         "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
         "codeception/codeception": "~2.3.4",
@@ -27,7 +21,7 @@
     },
     "autoload": {
         "psr-4": {
-            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
+            "Magento\\": "tests/functional/Magento"
         }
     },
     "prefer-stable": true
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/AdminNotification/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/AdminNotification/composer.json
index 5e4c79075ea..7020a2b9ee9 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/AdminNotification/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/AdminNotification/composer.json
@@ -5,29 +5,24 @@
         "sort-packages": true
     },
     "require": {
-        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
-        "codeception/codeception": "~2.3.4",
-        "consolidation/robo": "^1.0.0",
-        "henrikbjorn/lurker": "^1.2",
         "magento/magento2-functional-testing-framework": "1.0.0",
-        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
-        "vlucas/phpdotenv": "~2.4"
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-backend": "1.0.0",
-        "magento/magento2-functional-test-module-media-storage": "1.0.0",
-        "magento/magento2-functional-test-module-store": "1.0.0",
-        "magento/magento2-functional-test-module-ui": "1.0.0"
+        "magento/magento2-functional-test-module-backend": "1.0.0-dev",
+        "magento/magento2-functional-test-module-media-storage": "1.0.0-dev",
+        "magento/magento2-functional-test-module-store": "1.0.0-dev",
+        "magento/magento2-functional-test-module-ui": "1.0.0-dev"
     },
     "type": "magento2-test-module",
-    "version": "1.0.0",
+    "version": "1.0.0-dev",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
         "psr-4": {
-            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
+            "Magento\\AdminNotification\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/AdvancedPricingImportExport/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/AdvancedPricingImportExport/composer.json
index c104d3f9cf5..9a65ed242d6 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/AdvancedPricingImportExport/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/AdvancedPricingImportExport/composer.json
@@ -5,32 +5,27 @@
         "sort-packages": true
     },
     "require": {
-        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
-        "codeception/codeception": "~2.3.4",
-        "consolidation/robo": "^1.0.0",
-        "henrikbjorn/lurker": "^1.2",
         "magento/magento2-functional-testing-framework": "1.0.0",
-        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
-        "vlucas/phpdotenv": "~2.4"
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-catalog": "1.0.0",
-        "magento/magento2-functional-test-module-catalog-import-export": "1.0.0",
-        "magento/magento2-functional-test-module-catalog-inventory": "1.0.0",
-        "magento/magento2-functional-test-module-customer": "1.0.0",
-        "magento/magento2-functional-test-module-eav": "1.0.0",
-        "magento/magento2-functional-test-module-import-export": "1.0.0",
-        "magento/magento2-functional-test-module-store": "1.0.0"
+        "magento/magento2-functional-test-module-catalog": "1.0.0-dev",
+        "magento/magento2-functional-test-module-catalog-import-export": "1.0.0-dev",
+        "magento/magento2-functional-test-module-catalog-inventory": "1.0.0-dev",
+        "magento/magento2-functional-test-module-customer": "1.0.0-dev",
+        "magento/magento2-functional-test-module-eav": "1.0.0-dev",
+        "magento/magento2-functional-test-module-import-export": "1.0.0-dev",
+        "magento/magento2-functional-test-module-store": "1.0.0-dev"
     },
     "type": "magento2-test-module",
-    "version": "1.0.0",
+    "version": "1.0.0-dev",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
         "psr-4": {
-            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
+            "Magento\\AdvancedPricingImportExport\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Analytics/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Analytics/composer.json
index 21e343f4169..a5f609f1127 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Analytics/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Analytics/composer.json
@@ -3,43 +3,32 @@
     "description": "Magento 2 Acceptance Test Module Analytics",
     "repositories": [
         {
-            "type" : "composer",
-            "url" : "https://repo.magento.com/"
+            "type": "composer",
+            "url": "https://repo.magento.com/"
         }
     ],
+    "config": {
+        "sort-packages": true
+    },
     "require": {
-        "php": "~7.0",
-        "codeception/codeception": "2.2|2.3",
-        "allure-framework/allure-codeception": "dev-master",
-        "consolidation/robo": "^1.0.0",
-        "henrikbjorn/lurker": "^1.2",
-        "vlucas/phpdotenv": "~2.4",
-        "magento/magento2-functional-testing-framework": "dev-develop"
+        "magento/magento2-functional-testing-framework": "1.0.0",
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-backend": "dev-master",
-        "magento/magento2-functional-test-module-config": "dev-master",
-        "magento/magento2-functional-test-module-integration": "dev-master",
-        "magento/magento2-functional-test-module-store": "dev-master"
+        "magento/magento2-functional-test-module-backend": "1.0.0-dev",
+        "magento/magento2-functional-test-module-config": "1.0.0-dev",
+        "magento/magento2-functional-test-module-integration": "1.0.0-dev",
+        "magento/magento2-functional-test-module-store": "1.0.0-dev"
     },
     "type": "magento2-test-module",
-    "version": "dev-master",
+    "version": "1.0.0-dev",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
-        "psr-0": {
-            "Yandex": "vendor/allure-framework/allure-codeception/src/"
-        },
         "psr-4": {
-            "Magento\\FunctionalTestingFramework\\": [
-                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
-            ],
-            "Magento\\FunctionalTest\\": [
-                "tests/functional/Magento/FunctionalTest",
-                "generated/Magento/FunctionalTest"
-            ]
+            "Magento\\Analytics\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Authorization/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Authorization/composer.json
index 05e88d90f10..27b1f27a4c4 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Authorization/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Authorization/composer.json
@@ -5,26 +5,21 @@
         "sort-packages": true
     },
     "require": {
-        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
-        "codeception/codeception": "~2.3.4",
-        "consolidation/robo": "^1.0.0",
-        "henrikbjorn/lurker": "^1.2",
         "magento/magento2-functional-testing-framework": "1.0.0",
-        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
-        "vlucas/phpdotenv": "~2.4"
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-backend": "1.0.0"
+        "magento/magento2-functional-test-module-backend": "1.0.0-dev"
     },
     "type": "magento2-test-module",
-    "version": "1.0.0",
+    "version": "1.0.0-dev",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
         "psr-4": {
-            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
+            "Magento\\Authorization\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Authorizenet/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Authorizenet/composer.json
index 69055e95ddd..cfae2dac571 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Authorizenet/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Authorizenet/composer.json
@@ -5,32 +5,27 @@
         "sort-packages": true
     },
     "require": {
-        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
-        "codeception/codeception": "~2.3.4",
-        "consolidation/robo": "^1.0.0",
-        "henrikbjorn/lurker": "^1.2",
         "magento/magento2-functional-testing-framework": "1.0.0",
-        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
-        "vlucas/phpdotenv": "~2.4"
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-backend": "1.0.0",
-        "magento/magento2-functional-test-module-catalog": "1.0.0",
-        "magento/magento2-functional-test-module-checkout": "1.0.0",
-        "magento/magento2-functional-test-module-payment": "1.0.0",
-        "magento/magento2-functional-test-module-quote": "1.0.0",
-        "magento/magento2-functional-test-module-sales": "1.0.0",
-        "magento/magento2-functional-test-module-store": "1.0.0"
+        "magento/magento2-functional-test-module-backend": "1.0.0-dev",
+        "magento/magento2-functional-test-module-catalog": "1.0.0-dev",
+        "magento/magento2-functional-test-module-checkout": "1.0.0-dev",
+        "magento/magento2-functional-test-module-payment": "1.0.0-dev",
+        "magento/magento2-functional-test-module-quote": "1.0.0-dev",
+        "magento/magento2-functional-test-module-sales": "1.0.0-dev",
+        "magento/magento2-functional-test-module-store": "1.0.0-dev"
     },
     "type": "magento2-test-module",
-    "version": "1.0.0",
+    "version": "1.0.0-dev",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
         "psr-4": {
-            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
+            "Magento\\Authorizenet\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/composer.json
index 771aeb4af1b..680d5ed031e 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/composer.json
@@ -5,41 +5,36 @@
         "sort-packages": true
     },
     "require": {
-        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
-        "codeception/codeception": "~2.3.4",
-        "consolidation/robo": "^1.0.0",
-        "henrikbjorn/lurker": "^1.2",
         "magento/magento2-functional-testing-framework": "1.0.0",
-        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
-        "vlucas/phpdotenv": "~2.4"
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-backup": "1.0.0",
-        "magento/magento2-functional-test-module-catalog": "1.0.0",
-        "magento/magento2-functional-test-module-config": "1.0.0",
-        "magento/magento2-functional-test-module-customer": "1.0.0",
-        "magento/magento2-functional-test-module-developer": "1.0.0",
-        "magento/magento2-functional-test-module-directory": "1.0.0",
-        "magento/magento2-functional-test-module-eav": "1.0.0",
-        "magento/magento2-functional-test-module-quote": "1.0.0",
-        "magento/magento2-functional-test-module-reports": "1.0.0",
-        "magento/magento2-functional-test-module-require-js": "1.0.0",
-        "magento/magento2-functional-test-module-sales": "1.0.0",
-        "magento/magento2-functional-test-module-security": "1.0.0",
-        "magento/magento2-functional-test-module-store": "1.0.0",
-        "magento/magento2-functional-test-module-translation": "1.0.0",
-        "magento/magento2-functional-test-module-ui": "1.0.0",
-        "magento/magento2-functional-test-module-user": "1.0.0"
+        "magento/magento2-functional-test-module-backup": "1.0.0-dev",
+        "magento/magento2-functional-test-module-catalog": "1.0.0-dev",
+        "magento/magento2-functional-test-module-config": "1.0.0-dev",
+        "magento/magento2-functional-test-module-customer": "1.0.0-dev",
+        "magento/magento2-functional-test-module-developer": "1.0.0-dev",
+        "magento/magento2-functional-test-module-directory": "1.0.0-dev",
+        "magento/magento2-functional-test-module-eav": "1.0.0-dev",
+        "magento/magento2-functional-test-module-quote": "1.0.0-dev",
+        "magento/magento2-functional-test-module-reports": "1.0.0-dev",
+        "magento/magento2-functional-test-module-require-js": "1.0.0-dev",
+        "magento/magento2-functional-test-module-sales": "1.0.0-dev",
+        "magento/magento2-functional-test-module-security": "1.0.0-dev",
+        "magento/magento2-functional-test-module-store": "1.0.0-dev",
+        "magento/magento2-functional-test-module-translation": "1.0.0-dev",
+        "magento/magento2-functional-test-module-ui": "1.0.0-dev",
+        "magento/magento2-functional-test-module-user": "1.0.0-dev"
     },
     "type": "magento2-test-module",
-    "version": "1.0.0",
+    "version": "1.0.0-dev",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
         "psr-4": {
-            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
+            "Magento\\Backend\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backup/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backup/composer.json
index 1e1e3e7901e..7f67d4c1002 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backup/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backup/composer.json
@@ -5,28 +5,23 @@
         "sort-packages": true
     },
     "require": {
-        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
-        "codeception/codeception": "~2.3.4",
-        "consolidation/robo": "^1.0.0",
-        "henrikbjorn/lurker": "^1.2",
         "magento/magento2-functional-testing-framework": "1.0.0",
-        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
-        "vlucas/phpdotenv": "~2.4"
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-backend": "1.0.0",
-        "magento/magento2-functional-test-module-cron": "1.0.0",
-        "magento/magento2-functional-test-module-store": "1.0.0"
+        "magento/magento2-functional-test-module-backend": "1.0.0-dev",
+        "magento/magento2-functional-test-module-cron": "1.0.0-dev",
+        "magento/magento2-functional-test-module-store": "1.0.0-dev"
     },
     "type": "magento2-test-module",
-    "version": "1.0.0",
+    "version": "1.0.0-dev",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
         "psr-4": {
-            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
+            "Magento\\Backup\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Braintree/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Braintree/composer.json
index b781cadf8bb..7159b1a4bbf 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Braintree/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Braintree/composer.json
@@ -5,38 +5,33 @@
         "sort-packages": true
     },
     "require": {
-        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
-        "codeception/codeception": "~2.3.4",
-        "consolidation/robo": "^1.0.0",
-        "henrikbjorn/lurker": "^1.2",
         "magento/magento2-functional-testing-framework": "1.0.0",
-        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
-        "vlucas/phpdotenv": "~2.4"
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-catalog": "1.0.0",
-        "magento/magento2-functional-test-module-backend": "1.0.0",
-        "magento/magento2-functional-test-module-checkout": "1.0.0",
-        "magento/magento2-functional-test-module-config": "1.0.0",
-        "magento/magento2-functional-test-module-customer": "1.0.0",
-        "magento/magento2-functional-test-module-directory": "1.0.0",
-        "magento/magento2-functional-test-module-instant-purchase": "1.0.0",
-        "magento/magento2-functional-test-module-payment": "1.0.0",
-        "magento/magento2-functional-test-module-paypal": "1.0.0",
-        "magento/magento2-functional-test-module-quote": "1.0.0",
-        "magento/magento2-functional-test-module-sales": "1.0.0",
-        "magento/magento2-functional-test-module-ui": "1.0.0",
-        "magento/magento2-functional-test-module-vault": "1.0.0"
+        "magento/magento2-functional-test-module-catalog": "1.0.0-dev",
+        "magento/magento2-functional-test-module-backend": "1.0.0-dev",
+        "magento/magento2-functional-test-module-checkout": "1.0.0-dev",
+        "magento/magento2-functional-test-module-config": "1.0.0-dev",
+        "magento/magento2-functional-test-module-customer": "1.0.0-dev",
+        "magento/magento2-functional-test-module-directory": "1.0.0-dev",
+        "magento/magento2-functional-test-module-instant-purchase": "1.0.0-dev",
+        "magento/magento2-functional-test-module-payment": "1.0.0-dev",
+        "magento/magento2-functional-test-module-paypal": "1.0.0-dev",
+        "magento/magento2-functional-test-module-quote": "1.0.0-dev",
+        "magento/magento2-functional-test-module-sales": "1.0.0-dev",
+        "magento/magento2-functional-test-module-ui": "1.0.0-dev",
+        "magento/magento2-functional-test-module-vault": "1.0.0-dev"
     },
     "type": "magento2-test-module",
-    "version": "1.0.0",
+    "version": "1.0.0-dev",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
         "psr-4": {
-            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
+            "Magento\\Braintree\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Bundle/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Bundle/composer.json
index 4613c5df9fe..96dc014d970 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Bundle/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Bundle/composer.json
@@ -5,40 +5,35 @@
         "sort-packages": true
     },
     "require": {
-        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
-        "codeception/codeception": "~2.3.4",
-        "consolidation/robo": "^1.0.0",
-        "henrikbjorn/lurker": "^1.2",
         "magento/magento2-functional-testing-framework": "1.0.0",
-        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
-        "vlucas/phpdotenv": "~2.4"
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-backend": "1.0.0",
-        "magento/magento2-functional-test-module-catalog": "1.0.0",
-        "magento/magento2-functional-test-module-catalog-inventory": "1.0.0",
-        "magento/magento2-functional-test-module-catalog-rule": "1.0.0",
-        "magento/magento2-functional-test-module-checkout": "1.0.0",
-        "magento/magento2-functional-test-module-config": "1.0.0",
-        "magento/magento2-functional-test-module-customer": "1.0.0",
-        "magento/magento2-functional-test-module-eav": "1.0.0",
-        "magento/magento2-functional-test-module-gift-message": "1.0.0",
-        "magento/magento2-functional-test-module-media-storage": "1.0.0",
-        "magento/magento2-functional-test-module-quote": "1.0.0",
-        "magento/magento2-functional-test-module-sales": "1.0.0",
-        "magento/magento2-functional-test-module-store": "1.0.0",
-        "magento/magento2-functional-test-module-tax": "1.0.0",
-        "magento/magento2-functional-test-module-ui": "1.0.0"
+        "magento/magento2-functional-test-module-backend": "1.0.0-dev",
+        "magento/magento2-functional-test-module-catalog": "1.0.0-dev",
+        "magento/magento2-functional-test-module-catalog-inventory": "1.0.0-dev",
+        "magento/magento2-functional-test-module-catalog-rule": "1.0.0-dev",
+        "magento/magento2-functional-test-module-checkout": "1.0.0-dev",
+        "magento/magento2-functional-test-module-config": "1.0.0-dev",
+        "magento/magento2-functional-test-module-customer": "1.0.0-dev",
+        "magento/magento2-functional-test-module-eav": "1.0.0-dev",
+        "magento/magento2-functional-test-module-gift-message": "1.0.0-dev",
+        "magento/magento2-functional-test-module-media-storage": "1.0.0-dev",
+        "magento/magento2-functional-test-module-quote": "1.0.0-dev",
+        "magento/magento2-functional-test-module-sales": "1.0.0-dev",
+        "magento/magento2-functional-test-module-store": "1.0.0-dev",
+        "magento/magento2-functional-test-module-tax": "1.0.0-dev",
+        "magento/magento2-functional-test-module-ui": "1.0.0-dev"
     },
     "type": "magento2-test-module",
-    "version": "1.0.0",
+    "version": "1.0.0-dev",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
         "psr-4": {
-            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
+            "Magento\\Bundle\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/BundleImportExport/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/BundleImportExport/composer.json
index 86eeb63a91b..afc00529ac0 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/BundleImportExport/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/BundleImportExport/composer.json
@@ -5,30 +5,25 @@
         "sort-packages": true
     },
     "require": {
-        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
-        "codeception/codeception": "~2.3.4",
-        "consolidation/robo": "^1.0.0",
-        "henrikbjorn/lurker": "^1.2",
         "magento/magento2-functional-testing-framework": "1.0.0",
-        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
-        "vlucas/phpdotenv": "~2.4"
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-bundle": "1.0.0",
-        "magento/magento2-functional-test-module-catalog": "1.0.0",
-        "magento/magento2-functional-test-module-catalog-import-export": "1.0.0",
-        "magento/magento2-functional-test-module-eav": "1.0.0",
-        "magento/magento2-functional-test-module-import-export": "1.0.0"
+        "magento/magento2-functional-test-module-bundle": "1.0.0-dev",
+        "magento/magento2-functional-test-module-catalog": "1.0.0-dev",
+        "magento/magento2-functional-test-module-catalog-import-export": "1.0.0-dev",
+        "magento/magento2-functional-test-module-eav": "1.0.0-dev",
+        "magento/magento2-functional-test-module-import-export": "1.0.0-dev"
     },
     "type": "magento2-test-module",
-    "version": "1.0.0",
+    "version": "1.0.0-dev",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
         "psr-4": {
-            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
+            "Magento\\BundleImportExport\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CacheInvalidate/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CacheInvalidate/composer.json
index ad7a1575265..f9d8c204be2 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CacheInvalidate/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CacheInvalidate/composer.json
@@ -5,26 +5,21 @@
         "sort-packages": true
     },
     "require": {
-        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
-        "codeception/codeception": "~2.3.4",
-        "consolidation/robo": "^1.0.0",
-        "henrikbjorn/lurker": "^1.2",
         "magento/magento2-functional-testing-framework": "1.0.0",
-        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
-        "vlucas/phpdotenv": "~2.4"
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-page-cache": "1.0.0"
+        "magento/magento2-functional-test-module-page-cache": "1.0.0-dev"
     },
     "type": "magento2-test-module",
-    "version": "1.0.0",
+    "version": "1.0.0-dev",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
         "psr-4": {
-            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
+            "Magento\\CacheInvalidate\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Captcha/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Captcha/composer.json
index 7b68ff5beac..1fcbaeb9f49 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Captcha/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Captcha/composer.json
@@ -5,29 +5,24 @@
         "sort-packages": true
     },
     "require": {
-        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
-        "codeception/codeception": "~2.3.4",
-        "consolidation/robo": "^1.0.0",
-        "henrikbjorn/lurker": "^1.2",
         "magento/magento2-functional-testing-framework": "1.0.0",
-        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
-        "vlucas/phpdotenv": "~2.4"
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-backend": "1.0.0",
-        "magento/magento2-functional-test-module-checkout": "1.0.0",
-        "magento/magento2-functional-test-module-customer": "1.0.0",
-        "magento/magento2-functional-test-module-store": "1.0.0"
+        "magento/magento2-functional-test-module-backend": "1.0.0-dev",
+        "magento/magento2-functional-test-module-checkout": "1.0.0-dev",
+        "magento/magento2-functional-test-module-customer": "1.0.0-dev",
+        "magento/magento2-functional-test-module-store": "1.0.0-dev"
     },
     "type": "magento2-test-module",
-    "version": "1.0.0",
+    "version": "1.0.0-dev",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
         "psr-4": {
-            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
+            "Magento\\Captcha\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/composer.json
index 06739996a4d..ac8272b7ff7 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/composer.json
@@ -5,48 +5,43 @@
         "sort-packages": true
     },
     "require": {
-        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
-        "codeception/codeception": "~2.3.4",
-        "consolidation/robo": "^1.0.0",
-        "henrikbjorn/lurker": "^1.2",
         "magento/magento2-functional-testing-framework": "1.0.0",
-        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
-        "vlucas/phpdotenv": "~2.4"
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-backend": "1.0.0",
-        "magento/magento2-functional-test-module-catalog-inventory": "1.0.0",
-        "magento/magento2-functional-test-module-catalog-rule": "1.0.0",
-        "magento/magento2-functional-test-module-catalog-url-rewrite": "1.0.0",
-        "magento/magento2-functional-test-module-checkout": "1.0.0",
-        "magento/magento2-functional-test-module-cms": "1.0.0",
-        "magento/magento2-functional-test-module-config": "1.0.0",
-        "magento/magento2-functional-test-module-customer": "1.0.0",
-        "magento/magento2-functional-test-module-directory": "1.0.0",
-        "magento/magento2-functional-test-module-eav": "1.0.0",
-        "magento/magento2-functional-test-module-indexer": "1.0.0",
-        "magento/magento2-functional-test-module-media-storage": "1.0.0",
-        "magento/magento2-functional-test-module-msrp": "1.0.0",
-        "magento/magento2-functional-test-module-page-cache": "1.0.0",
-        "magento/magento2-functional-test-module-product-alert": "1.0.0",
-        "magento/magento2-functional-test-module-quote": "1.0.0",
-        "magento/magento2-functional-test-module-store": "1.0.0",
-        "magento/magento2-functional-test-module-tax": "1.0.0",
-        "magento/magento2-functional-test-module-theme": "1.0.0",
-        "magento/magento2-functional-test-module-ui": "1.0.0",
-        "magento/magento2-functional-test-module-url-rewrite": "1.0.0",
-        "magento/magento2-functional-test-module-widget": "1.0.0",
-        "magento/magento2-functional-test-module-wishlist": "1.0.0"
+        "magento/magento2-functional-test-module-backend": "1.0.0-dev",
+        "magento/magento2-functional-test-module-catalog-inventory": "1.0.0-dev",
+        "magento/magento2-functional-test-module-catalog-rule": "1.0.0-dev",
+        "magento/magento2-functional-test-module-catalog-url-rewrite": "1.0.0-dev",
+        "magento/magento2-functional-test-module-checkout": "1.0.0-dev",
+        "magento/magento2-functional-test-module-cms": "1.0.0-dev",
+        "magento/magento2-functional-test-module-config": "1.0.0-dev",
+        "magento/magento2-functional-test-module-customer": "1.0.0-dev",
+        "magento/magento2-functional-test-module-directory": "1.0.0-dev",
+        "magento/magento2-functional-test-module-eav": "1.0.0-dev",
+        "magento/magento2-functional-test-module-indexer": "1.0.0-dev",
+        "magento/magento2-functional-test-module-media-storage": "1.0.0-dev",
+        "magento/magento2-functional-test-module-msrp": "1.0.0-dev",
+        "magento/magento2-functional-test-module-page-cache": "1.0.0-dev",
+        "magento/magento2-functional-test-module-product-alert": "1.0.0-dev",
+        "magento/magento2-functional-test-module-quote": "1.0.0-dev",
+        "magento/magento2-functional-test-module-store": "1.0.0-dev",
+        "magento/magento2-functional-test-module-tax": "1.0.0-dev",
+        "magento/magento2-functional-test-module-theme": "1.0.0-dev",
+        "magento/magento2-functional-test-module-ui": "1.0.0-dev",
+        "magento/magento2-functional-test-module-url-rewrite": "1.0.0-dev",
+        "magento/magento2-functional-test-module-widget": "1.0.0-dev",
+        "magento/magento2-functional-test-module-wishlist": "1.0.0-dev"
     },
     "type": "magento2-test-module",
-    "version": "1.0.0",
+    "version": "1.0.0-dev",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
         "psr-4": {
-            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
+            "Magento\\Catalog\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogAnalytics/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogAnalytics/composer.json
index 3b45c0b6b63..12ebf6e0bef 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogAnalytics/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogAnalytics/composer.json
@@ -3,40 +3,29 @@
     "description": "Magento 2 Acceptance Test Module Catalog Analytics",
     "repositories": [
         {
-            "type" : "composer",
-            "url" : "https://repo.magento.com/"
+            "type": "composer",
+            "url": "https://repo.magento.com/"
         }
     ],
+    "config": {
+        "sort-packages": true
+    },
     "require": {
-        "php": "~7.0",
-        "codeception/codeception": "2.2|2.3",
-        "allure-framework/allure-codeception": "dev-master",
-        "consolidation/robo": "^1.0.0",
-        "henrikbjorn/lurker": "^1.2",
-        "vlucas/phpdotenv": "~2.4",
-        "magento/magento2-functional-testing-framework": "dev-develop"
+        "magento/magento2-functional-testing-framework": "1.0.0",
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-catalog": "dev-master"
+        "magento/magento2-functional-test-module-catalog": "1.0.0-dev"
     },
     "type": "magento2-test-module",
-    "version": "dev-master",
+    "version": "1.0.0-dev",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
-        "psr-0": {
-            "Yandex": "vendor/allure-framework/allure-codeception/src/"
-        },
         "psr-4": {
-            "Magento\\FunctionalTestingFramework\\": [
-                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
-            ],
-            "Magento\\FunctionalTest\\": [
-                "tests/functional/Magento/FunctionalTest",
-                "generated/Magento/FunctionalTest"
-            ]
+            "Magento\\CatalogAnalytics\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogImportExport/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogImportExport/composer.json
index dd230d8e4d9..be97c72452b 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogImportExport/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogImportExport/composer.json
@@ -5,34 +5,29 @@
         "sort-packages": true
     },
     "require": {
-        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
-        "codeception/codeception": "~2.3.4",
-        "consolidation/robo": "^1.0.0",
-        "henrikbjorn/lurker": "^1.2",
         "magento/magento2-functional-testing-framework": "1.0.0",
-        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
-        "vlucas/phpdotenv": "~2.4"
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-catalog": "1.0.0",
-        "magento/magento2-functional-test-module-catalog-inventory": "1.0.0",
-        "magento/magento2-functional-test-module-catalog-url-rewrite": "1.0.0",
-        "magento/magento2-functional-test-module-customer": "1.0.0",
-        "magento/magento2-functional-test-module-eav": "1.0.0",
-        "magento/magento2-functional-test-module-import-export": "1.0.0",
-        "magento/magento2-functional-test-module-media-storage": "1.0.0",
-        "magento/magento2-functional-test-module-store": "1.0.0",
-        "magento/magento2-functional-test-module-tax": "1.0.0"
+        "magento/magento2-functional-test-module-catalog": "1.0.0-dev",
+        "magento/magento2-functional-test-module-catalog-inventory": "1.0.0-dev",
+        "magento/magento2-functional-test-module-catalog-url-rewrite": "1.0.0-dev",
+        "magento/magento2-functional-test-module-customer": "1.0.0-dev",
+        "magento/magento2-functional-test-module-eav": "1.0.0-dev",
+        "magento/magento2-functional-test-module-import-export": "1.0.0-dev",
+        "magento/magento2-functional-test-module-media-storage": "1.0.0-dev",
+        "magento/magento2-functional-test-module-store": "1.0.0-dev",
+        "magento/magento2-functional-test-module-tax": "1.0.0-dev"
     },
     "type": "magento2-test-module",
-    "version": "1.0.0",
+    "version": "1.0.0-dev",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
         "psr-4": {
-            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
+            "Magento\\CatalogImportExport\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogInventory/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogInventory/composer.json
index aec0f3f3c80..cfb006dd9bd 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogInventory/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogInventory/composer.json
@@ -5,32 +5,27 @@
         "sort-packages": true
     },
     "require": {
-        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
-        "codeception/codeception": "~2.3.4",
-        "consolidation/robo": "^1.0.0",
-        "henrikbjorn/lurker": "^1.2",
         "magento/magento2-functional-testing-framework": "1.0.0",
-        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
-        "vlucas/phpdotenv": "~2.4"
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-catalog": "1.0.0",
-        "magento/magento2-functional-test-module-config": "1.0.0",
-        "magento/magento2-functional-test-module-customer": "1.0.0",
-        "magento/magento2-functional-test-module-eav": "1.0.0",
-        "magento/magento2-functional-test-module-quote": "1.0.0",
-        "magento/magento2-functional-test-module-store": "1.0.0",
-        "magento/magento2-functional-test-module-ui": "1.0.0"
+        "magento/magento2-functional-test-module-catalog": "1.0.0-dev",
+        "magento/magento2-functional-test-module-config": "1.0.0-dev",
+        "magento/magento2-functional-test-module-customer": "1.0.0-dev",
+        "magento/magento2-functional-test-module-eav": "1.0.0-dev",
+        "magento/magento2-functional-test-module-quote": "1.0.0-dev",
+        "magento/magento2-functional-test-module-store": "1.0.0-dev",
+        "magento/magento2-functional-test-module-ui": "1.0.0-dev"
     },
     "type": "magento2-test-module",
-    "version": "1.0.0",
+    "version": "1.0.0-dev",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
         "psr-4": {
-            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
+            "Magento\\CatalogInventory\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogRule/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogRule/composer.json
index eaab47bcdc3..5b8703ba975 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogRule/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogRule/composer.json
@@ -5,32 +5,27 @@
         "sort-packages": true
     },
     "require": {
-        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
-        "codeception/codeception": "~2.3.4",
-        "consolidation/robo": "^1.0.0",
-        "henrikbjorn/lurker": "^1.2",
         "magento/magento2-functional-testing-framework": "1.0.0",
-        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
-        "vlucas/phpdotenv": "~2.4"
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-backend": "1.0.0",
-        "magento/magento2-functional-test-module-catalog": "1.0.0",
-        "magento/magento2-functional-test-module-customer": "1.0.0",
-        "magento/magento2-functional-test-module-eav": "1.0.0",
-        "magento/magento2-functional-test-module-rule": "1.0.0",
-        "magento/magento2-functional-test-module-store": "1.0.0",
-        "magento/magento2-functional-test-module-ui": "1.0.0"
+        "magento/magento2-functional-test-module-backend": "1.0.0-dev",
+        "magento/magento2-functional-test-module-catalog": "1.0.0-dev",
+        "magento/magento2-functional-test-module-customer": "1.0.0-dev",
+        "magento/magento2-functional-test-module-eav": "1.0.0-dev",
+        "magento/magento2-functional-test-module-rule": "1.0.0-dev",
+        "magento/magento2-functional-test-module-store": "1.0.0-dev",
+        "magento/magento2-functional-test-module-ui": "1.0.0-dev"
     },
     "type": "magento2-test-module",
-    "version": "1.0.0",
+    "version": "1.0.0-dev",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
         "psr-4": {
-            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
+            "Magento\\CatalogRule\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogRuleConfigurable/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogRuleConfigurable/composer.json
index 2ef15bd6868..e554887f5b7 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogRuleConfigurable/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogRuleConfigurable/composer.json
@@ -5,28 +5,23 @@
         "sort-packages": true
     },
     "require": {
-        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
-        "codeception/codeception": "~2.3.4",
-        "consolidation/robo": "^1.0.0",
-        "henrikbjorn/lurker": "^1.2",
         "magento/magento2-functional-testing-framework": "1.0.0",
-        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
-        "vlucas/phpdotenv": "~2.4"
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-catalog": "1.0.0",
-        "magento/magento2-functional-test-module-catalog-rule": "1.0.0",
-        "magento/magento2-functional-test-module-configurable-product": "1.0.0"
+        "magento/magento2-functional-test-module-catalog": "1.0.0-dev",
+        "magento/magento2-functional-test-module-catalog-rule": "1.0.0-dev",
+        "magento/magento2-functional-test-module-configurable-product": "1.0.0-dev"
     },
     "type": "magento2-test-module",
-    "version": "1.0.0",
+    "version": "1.0.0-dev",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
         "psr-4": {
-            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
+            "Magento\\CatalogRuleConfigurable\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogSearch/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogSearch/composer.json
index 36d21144894..3848ae4829a 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogSearch/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogSearch/composer.json
@@ -5,35 +5,30 @@
         "sort-packages": true
     },
     "require": {
-        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
-        "codeception/codeception": "~2.3.4",
-        "consolidation/robo": "^1.0.0",
-        "henrikbjorn/lurker": "^1.2",
         "magento/magento2-functional-testing-framework": "1.0.0",
-        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
-        "vlucas/phpdotenv": "~2.4"
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-backend": "1.0.0",
-        "magento/magento2-functional-test-module-catalog": "1.0.0",
-        "magento/magento2-functional-test-module-catalog-inventory": "1.0.0",
-        "magento/magento2-functional-test-module-customer": "1.0.0",
-        "magento/magento2-functional-test-module-directory": "1.0.0",
-        "magento/magento2-functional-test-module-eav": "1.0.0",
-        "magento/magento2-functional-test-module-search": "1.0.0",
-        "magento/magento2-functional-test-module-store": "1.0.0",
-        "magento/magento2-functional-test-module-theme": "1.0.0",
-        "magento/magento2-functional-test-module-ui": "1.0.0"
+        "magento/magento2-functional-test-module-backend": "1.0.0-dev",
+        "magento/magento2-functional-test-module-catalog": "1.0.0-dev",
+        "magento/magento2-functional-test-module-catalog-inventory": "1.0.0-dev",
+        "magento/magento2-functional-test-module-customer": "1.0.0-dev",
+        "magento/magento2-functional-test-module-directory": "1.0.0-dev",
+        "magento/magento2-functional-test-module-eav": "1.0.0-dev",
+        "magento/magento2-functional-test-module-search": "1.0.0-dev",
+        "magento/magento2-functional-test-module-store": "1.0.0-dev",
+        "magento/magento2-functional-test-module-theme": "1.0.0-dev",
+        "magento/magento2-functional-test-module-ui": "1.0.0-dev"
     },
     "type": "magento2-test-module",
-    "version": "1.0.0",
+    "version": "1.0.0-dev",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
         "psr-4": {
-            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
+            "Magento\\CatalogSearch\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogUrlRewrite/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogUrlRewrite/composer.json
index 22f9c95f296..971c4173918 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogUrlRewrite/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogUrlRewrite/composer.json
@@ -5,33 +5,28 @@
         "sort-packages": true
     },
     "require": {
-        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
-        "codeception/codeception": "~2.3.4",
-        "consolidation/robo": "^1.0.0",
-        "henrikbjorn/lurker": "^1.2",
         "magento/magento2-functional-testing-framework": "1.0.0",
-        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
-        "vlucas/phpdotenv": "~2.4"
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-backend": "1.0.0",
-        "magento/magento2-functional-test-module-catalog": "1.0.0",
-        "magento/magento2-functional-test-module-catalog-import-export": "1.0.0",
-        "magento/magento2-functional-test-module-eav": "1.0.0",
-        "magento/magento2-functional-test-module-import-export": "1.0.0",
-        "magento/magento2-functional-test-module-store": "1.0.0",
-        "magento/magento2-functional-test-module-ui": "1.0.0",
-        "magento/magento2-functional-test-module-url-rewrite": "1.0.0"
+        "magento/magento2-functional-test-module-backend": "1.0.0-dev",
+        "magento/magento2-functional-test-module-catalog": "1.0.0-dev",
+        "magento/magento2-functional-test-module-catalog-import-export": "1.0.0-dev",
+        "magento/magento2-functional-test-module-eav": "1.0.0-dev",
+        "magento/magento2-functional-test-module-import-export": "1.0.0-dev",
+        "magento/magento2-functional-test-module-store": "1.0.0-dev",
+        "magento/magento2-functional-test-module-ui": "1.0.0-dev",
+        "magento/magento2-functional-test-module-url-rewrite": "1.0.0-dev"
     },
     "type": "magento2-test-module",
-    "version": "1.0.0",
+    "version": "1.0.0-dev",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
         "psr-4": {
-            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
+            "Magento\\CatalogUrlRewrite\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogWidget/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogWidget/composer.json
index b5729ebc9dd..2dc7b905855 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogWidget/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogWidget/composer.json
@@ -5,33 +5,28 @@
         "sort-packages": true
     },
     "require": {
-        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
-        "codeception/codeception": "~2.3.4",
-        "consolidation/robo": "^1.0.0",
-        "henrikbjorn/lurker": "^1.2",
         "magento/magento2-functional-testing-framework": "1.0.0",
-        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
-        "vlucas/phpdotenv": "~2.4"
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-backend": "1.0.0",
-        "magento/magento2-functional-test-module-catalog": "1.0.0",
-        "magento/magento2-functional-test-module-customer": "1.0.0",
-        "magento/magento2-functional-test-module-eav": "1.0.0",
-        "magento/magento2-functional-test-module-rule": "1.0.0",
-        "magento/magento2-functional-test-module-store": "1.0.0",
-        "magento/magento2-functional-test-module-widget": "1.0.0",
-        "magento/magento2-functional-test-module-wishlist": "1.0.0"
+        "magento/magento2-functional-test-module-backend": "1.0.0-dev",
+        "magento/magento2-functional-test-module-catalog": "1.0.0-dev",
+        "magento/magento2-functional-test-module-customer": "1.0.0-dev",
+        "magento/magento2-functional-test-module-eav": "1.0.0-dev",
+        "magento/magento2-functional-test-module-rule": "1.0.0-dev",
+        "magento/magento2-functional-test-module-store": "1.0.0-dev",
+        "magento/magento2-functional-test-module-widget": "1.0.0-dev",
+        "magento/magento2-functional-test-module-wishlist": "1.0.0-dev"
     },
     "type": "magento2-test-module",
-    "version": "1.0.0",
+    "version": "1.0.0-dev",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
         "psr-4": {
-            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
+            "Magento\\CatalogWidget\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/composer.json
index e8f08e57088..4c6fd9c49da 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/composer.json
@@ -5,43 +5,38 @@
         "sort-packages": true
     },
     "require": {
-        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
-        "codeception/codeception": "~2.3.4",
-        "consolidation/robo": "^1.0.0",
-        "henrikbjorn/lurker": "^1.2",
         "magento/magento2-functional-testing-framework": "1.0.0",
-        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
-        "vlucas/phpdotenv": "~2.4"
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-backend": "1.0.0",
-        "magento/magento2-functional-test-module-catalog": "1.0.0",
-        "magento/magento2-functional-test-module-catalog-inventory": "1.0.0",
-        "magento/magento2-functional-test-module-config": "1.0.0",
-        "magento/magento2-functional-test-module-customer": "1.0.0",
-        "magento/magento2-functional-test-module-directory": "1.0.0",
-        "magento/magento2-functional-test-module-eav": "1.0.0",
-        "magento/magento2-functional-test-module-msrp": "1.0.0",
-        "magento/magento2-functional-test-module-page-cache": "1.0.0",
-        "magento/magento2-functional-test-module-payment": "1.0.0",
-        "magento/magento2-functional-test-module-quote": "1.0.0",
-        "magento/magento2-functional-test-module-sales": "1.0.0",
-        "magento/magento2-functional-test-module-sales-rule": "1.0.0",
-        "magento/magento2-functional-test-module-shipping": "1.0.0",
-        "magento/magento2-functional-test-module-store": "1.0.0",
-        "magento/magento2-functional-test-module-tax": "1.0.0",
-        "magento/magento2-functional-test-module-theme": "1.0.0",
-        "magento/magento2-functional-test-module-ui": "1.0.0"
+        "magento/magento2-functional-test-module-backend": "1.0.0-dev",
+        "magento/magento2-functional-test-module-catalog": "1.0.0-dev",
+        "magento/magento2-functional-test-module-catalog-inventory": "1.0.0-dev",
+        "magento/magento2-functional-test-module-config": "1.0.0-dev",
+        "magento/magento2-functional-test-module-customer": "1.0.0-dev",
+        "magento/magento2-functional-test-module-directory": "1.0.0-dev",
+        "magento/magento2-functional-test-module-eav": "1.0.0-dev",
+        "magento/magento2-functional-test-module-msrp": "1.0.0-dev",
+        "magento/magento2-functional-test-module-page-cache": "1.0.0-dev",
+        "magento/magento2-functional-test-module-payment": "1.0.0-dev",
+        "magento/magento2-functional-test-module-quote": "1.0.0-dev",
+        "magento/magento2-functional-test-module-sales": "1.0.0-dev",
+        "magento/magento2-functional-test-module-sales-rule": "1.0.0-dev",
+        "magento/magento2-functional-test-module-shipping": "1.0.0-dev",
+        "magento/magento2-functional-test-module-store": "1.0.0-dev",
+        "magento/magento2-functional-test-module-tax": "1.0.0-dev",
+        "magento/magento2-functional-test-module-theme": "1.0.0-dev",
+        "magento/magento2-functional-test-module-ui": "1.0.0-dev"
     },
     "type": "magento2-test-module",
-    "version": "1.0.0",
+    "version": "1.0.0-dev",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
         "psr-4": {
-            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
+            "Magento\\Checkout\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CheckoutAgreements/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CheckoutAgreements/composer.json
index fd86cdd03ac..f852f4ca458 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CheckoutAgreements/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CheckoutAgreements/composer.json
@@ -5,29 +5,24 @@
         "sort-packages": true
     },
     "require": {
-        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
-        "codeception/codeception": "~2.3.4",
-        "consolidation/robo": "^1.0.0",
-        "henrikbjorn/lurker": "^1.2",
         "magento/magento2-functional-testing-framework": "1.0.0",
-        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
-        "vlucas/phpdotenv": "~2.4"
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-backend": "1.0.0",
-        "magento/magento2-functional-test-module-checkout": "1.0.0",
-        "magento/magento2-functional-test-module-quote": "1.0.0",
-        "magento/magento2-functional-test-module-store": "1.0.0"
+        "magento/magento2-functional-test-module-backend": "1.0.0-dev",
+        "magento/magento2-functional-test-module-checkout": "1.0.0-dev",
+        "magento/magento2-functional-test-module-quote": "1.0.0-dev",
+        "magento/magento2-functional-test-module-store": "1.0.0-dev"
     },
     "type": "magento2-test-module",
-    "version": "1.0.0",
+    "version": "1.0.0-dev",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
         "psr-4": {
-            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
+            "Magento\\CheckoutAgreements\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/composer.json
index 9a2b9f19946..9420585a31a 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/composer.json
@@ -5,34 +5,29 @@
         "sort-packages": true
     },
     "require": {
-        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
-        "codeception/codeception": "~2.3.4",
-        "consolidation/robo": "^1.0.0",
-        "henrikbjorn/lurker": "^1.2",
         "magento/magento2-functional-testing-framework": "1.0.0",
-        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
-        "vlucas/phpdotenv": "~2.4"
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-backend": "1.0.0",
-        "magento/magento2-functional-test-module-catalog": "1.0.0",
-        "magento/magento2-functional-test-module-email": "1.0.0",
-        "magento/magento2-functional-test-module-media-storage": "1.0.0",
-        "magento/magento2-functional-test-module-store": "1.0.0",
-        "magento/magento2-functional-test-module-theme": "1.0.0",
-        "magento/magento2-functional-test-module-ui": "1.0.0",
-        "magento/magento2-functional-test-module-variable": "1.0.0",
-        "magento/magento2-functional-test-module-widget": "1.0.0"
+        "magento/magento2-functional-test-module-backend": "1.0.0-dev",
+        "magento/magento2-functional-test-module-catalog": "1.0.0-dev",
+        "magento/magento2-functional-test-module-email": "1.0.0-dev",
+        "magento/magento2-functional-test-module-media-storage": "1.0.0-dev",
+        "magento/magento2-functional-test-module-store": "1.0.0-dev",
+        "magento/magento2-functional-test-module-theme": "1.0.0-dev",
+        "magento/magento2-functional-test-module-ui": "1.0.0-dev",
+        "magento/magento2-functional-test-module-variable": "1.0.0-dev",
+        "magento/magento2-functional-test-module-widget": "1.0.0-dev"
     },
     "type": "magento2-test-module",
-    "version": "1.0.0",
+    "version": "1.0.0-dev",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
         "psr-4": {
-            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
+            "Magento\\Cms\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CmsUrlRewrite/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CmsUrlRewrite/composer.json
index 7036bbdcdb3..6e7dbf3d4e7 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CmsUrlRewrite/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CmsUrlRewrite/composer.json
@@ -5,28 +5,23 @@
         "sort-packages": true
     },
     "require": {
-        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
-        "codeception/codeception": "~2.3.4",
-        "consolidation/robo": "^1.0.0",
-        "henrikbjorn/lurker": "^1.2",
         "magento/magento2-functional-testing-framework": "1.0.0",
-        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
-        "vlucas/phpdotenv": "~2.4"
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-cms": "1.0.0",
-        "magento/magento2-functional-test-module-store": "1.0.0",
-        "magento/magento2-functional-test-module-url-rewrite": "1.0.0"
+        "magento/magento2-functional-test-module-cms": "1.0.0-dev",
+        "magento/magento2-functional-test-module-store": "1.0.0-dev",
+        "magento/magento2-functional-test-module-url-rewrite": "1.0.0-dev"
     },
     "type": "magento2-test-module",
-    "version": "1.0.0",
+    "version": "1.0.0-dev",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
         "psr-4": {
-            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
+            "Magento\\CmsUrlRewrite\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Config/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Config/composer.json
index 46ee6cfad90..2c1965c6a41 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Config/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Config/composer.json
@@ -5,32 +5,27 @@
         "sort-packages": true
     },
     "require": {
-        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
-        "codeception/codeception": "~2.3.4",
-        "consolidation/robo": "^1.0.0",
-        "henrikbjorn/lurker": "^1.2",
         "magento/magento2-functional-testing-framework": "1.0.0",
-        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
-        "vlucas/phpdotenv": "~2.4"
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-backend": "1.0.0",
-        "magento/magento2-functional-test-module-cron": "1.0.0",
-        "magento/magento2-functional-test-module-deploy": "1.0.0",
-        "magento/magento2-functional-test-module-directory": "1.0.0",
-        "magento/magento2-functional-test-module-email": "1.0.0",
-        "magento/magento2-functional-test-module-media-storage": "1.0.0",
-        "magento/magento2-functional-test-module-store": "1.0.0"
+        "magento/magento2-functional-test-module-backend": "1.0.0-dev",
+        "magento/magento2-functional-test-module-cron": "1.0.0-dev",
+        "magento/magento2-functional-test-module-deploy": "1.0.0-dev",
+        "magento/magento2-functional-test-module-directory": "1.0.0-dev",
+        "magento/magento2-functional-test-module-email": "1.0.0-dev",
+        "magento/magento2-functional-test-module-media-storage": "1.0.0-dev",
+        "magento/magento2-functional-test-module-store": "1.0.0-dev"
     },
     "type": "magento2-test-module",
-    "version": "1.0.0",
+    "version": "1.0.0-dev",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
         "psr-4": {
-            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
+            "Magento\\Config\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableImportExport/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableImportExport/composer.json
index 8b956bab819..2a05a5c46b8 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableImportExport/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableImportExport/composer.json
@@ -5,30 +5,25 @@
         "sort-packages": true
     },
     "require": {
-        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
-        "codeception/codeception": "~2.3.4",
-        "consolidation/robo": "^1.0.0",
-        "henrikbjorn/lurker": "^1.2",
         "magento/magento2-functional-testing-framework": "1.0.0",
-        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
-        "vlucas/phpdotenv": "~2.4"
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-catalog": "1.0.0",
-        "magento/magento2-functional-test-module-catalog-import-export": "1.0.0",
-        "magento/magento2-functional-test-module-configurable-product": "1.0.0",
-        "magento/magento2-functional-test-module-eav": "1.0.0",
-        "magento/magento2-functional-test-module-import-export": "1.0.0"
+        "magento/magento2-functional-test-module-catalog": "1.0.0-dev",
+        "magento/magento2-functional-test-module-catalog-import-export": "1.0.0-dev",
+        "magento/magento2-functional-test-module-configurable-product": "1.0.0-dev",
+        "magento/magento2-functional-test-module-eav": "1.0.0-dev",
+        "magento/magento2-functional-test-module-import-export": "1.0.0-dev"
     },
     "type": "magento2-test-module",
-    "version": "1.0.0",
+    "version": "1.0.0-dev",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
         "psr-4": {
-            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
+            "Magento\\ConfigurableImportExport\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/composer.json
index 77b33a9fc4c..9aa7e86c8c9 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/composer.json
@@ -5,36 +5,31 @@
         "sort-packages": true
     },
     "require": {
-        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
-        "codeception/codeception": "~2.3.4",
-        "consolidation/robo": "^1.0.0",
-        "henrikbjorn/lurker": "^1.2",
         "magento/magento2-functional-testing-framework": "1.0.0",
-        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
-        "vlucas/phpdotenv": "~2.4"
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-backend": "1.0.0",
-        "magento/magento2-functional-test-module-catalog": "1.0.0",
-        "magento/magento2-functional-test-module-catalog-inventory": "1.0.0",
-        "magento/magento2-functional-test-module-checkout": "1.0.0",
-        "magento/magento2-functional-test-module-customer": "1.0.0",
-        "magento/magento2-functional-test-module-eav": "1.0.0",
-        "magento/magento2-functional-test-module-media-storage": "1.0.0",
-        "magento/magento2-functional-test-module-msrp": "1.0.0",
-        "magento/magento2-functional-test-module-quote": "1.0.0",
-        "magento/magento2-functional-test-module-store": "1.0.0",
-        "magento/magento2-functional-test-module-ui": "1.0.0"
+        "magento/magento2-functional-test-module-backend": "1.0.0-dev",
+        "magento/magento2-functional-test-module-catalog": "1.0.0-dev",
+        "magento/magento2-functional-test-module-catalog-inventory": "1.0.0-dev",
+        "magento/magento2-functional-test-module-checkout": "1.0.0-dev",
+        "magento/magento2-functional-test-module-customer": "1.0.0-dev",
+        "magento/magento2-functional-test-module-eav": "1.0.0-dev",
+        "magento/magento2-functional-test-module-media-storage": "1.0.0-dev",
+        "magento/magento2-functional-test-module-msrp": "1.0.0-dev",
+        "magento/magento2-functional-test-module-quote": "1.0.0-dev",
+        "magento/magento2-functional-test-module-store": "1.0.0-dev",
+        "magento/magento2-functional-test-module-ui": "1.0.0-dev"
     },
     "type": "magento2-test-module",
-    "version": "1.0.0",
+    "version": "1.0.0-dev",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
         "psr-4": {
-            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
+            "Magento\\ConfigurableProduct\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProductSales/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProductSales/composer.json
index 65749fe4fd2..ba94b03134b 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProductSales/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProductSales/composer.json
@@ -5,28 +5,23 @@
         "sort-packages": true
     },
     "require": {
-        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
-        "codeception/codeception": "~2.3.4",
-        "consolidation/robo": "^1.0.0",
-        "henrikbjorn/lurker": "^1.2",
         "magento/magento2-functional-testing-framework": "1.0.0",
-        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
-        "vlucas/phpdotenv": "~2.4"
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-catalog": "1.0.0",
-        "magento/magento2-functional-test-module-sales": "1.0.0",
-        "magento/magento2-functional-test-module-store": "1.0.0"
+        "magento/magento2-functional-test-module-catalog": "1.0.0-dev",
+        "magento/magento2-functional-test-module-sales": "1.0.0-dev",
+        "magento/magento2-functional-test-module-store": "1.0.0-dev"
     },
     "type": "magento2-test-module",
-    "version": "1.0.0",
+    "version": "1.0.0-dev",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
         "psr-4": {
-            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
+            "Magento\\ConfigurableProductSales\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Contact/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Contact/composer.json
index 642fec7ae82..d2fa2c68db6 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Contact/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Contact/composer.json
@@ -5,29 +5,24 @@
         "sort-packages": true
     },
     "require": {
-        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
-        "codeception/codeception": "~2.3.4",
-        "consolidation/robo": "^1.0.0",
-        "henrikbjorn/lurker": "^1.2",
         "magento/magento2-functional-testing-framework": "1.0.0",
-        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
-        "vlucas/phpdotenv": "~2.4"
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-cms": "1.0.0",
-        "magento/magento2-functional-test-module-config": "1.0.0",
-        "magento/magento2-functional-test-module-customer": "1.0.0",
-        "magento/magento2-functional-test-module-store": "1.0.0"
+        "magento/magento2-functional-test-module-cms": "1.0.0-dev",
+        "magento/magento2-functional-test-module-config": "1.0.0-dev",
+        "magento/magento2-functional-test-module-customer": "1.0.0-dev",
+        "magento/magento2-functional-test-module-store": "1.0.0-dev"
     },
     "type": "magento2-test-module",
-    "version": "1.0.0",
+    "version": "1.0.0-dev",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
         "psr-4": {
-            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
+            "Magento\\Contact\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cookie/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cookie/composer.json
index f120fbf3de4..100c82d5111 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cookie/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cookie/composer.json
@@ -5,26 +5,21 @@
         "sort-packages": true
     },
     "require": {
-        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
-        "codeception/codeception": "~2.3.4",
-        "consolidation/robo": "^1.0.0",
-        "henrikbjorn/lurker": "^1.2",
         "magento/magento2-functional-testing-framework": "1.0.0",
-        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
-        "vlucas/phpdotenv": "~2.4"
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-store": "1.0.0"
+        "magento/magento2-functional-test-module-store": "1.0.0-dev"
     },
     "type": "magento2-test-module",
-    "version": "1.0.0",
+    "version": "1.0.0-dev",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
         "psr-4": {
-            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
+            "Magento\\Cookie\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cron/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cron/composer.json
index 7ca41f02625..cfe9b151565 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cron/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cron/composer.json
@@ -5,26 +5,21 @@
         "sort-packages": true
     },
     "require": {
-        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
-        "codeception/codeception": "~2.3.4",
-        "consolidation/robo": "^1.0.0",
-        "henrikbjorn/lurker": "^1.2",
         "magento/magento2-functional-testing-framework": "1.0.0",
-        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
-        "vlucas/phpdotenv": "~2.4"
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-store": "1.0.0"
+        "magento/magento2-functional-test-module-store": "1.0.0-dev"
     },
     "type": "magento2-test-module",
-    "version": "1.0.0",
+    "version": "1.0.0-dev",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
         "psr-4": {
-            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
+            "Magento\\Cron\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CurrencySymbol/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CurrencySymbol/composer.json
index 1127d3ea32f..ae53c529bcc 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CurrencySymbol/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CurrencySymbol/composer.json
@@ -5,30 +5,25 @@
         "sort-packages": true
     },
     "require": {
-        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
-        "codeception/codeception": "~2.3.4",
-        "consolidation/robo": "^1.0.0",
-        "henrikbjorn/lurker": "^1.2",
         "magento/magento2-functional-testing-framework": "1.0.0",
-        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
-        "vlucas/phpdotenv": "~2.4"
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-backend": "1.0.0",
-        "magento/magento2-functional-test-module-config": "1.0.0",
-        "magento/magento2-functional-test-module-directory": "1.0.0",
-        "magento/magento2-functional-test-module-page-cache": "1.0.0",
-        "magento/magento2-functional-test-module-store": "1.0.0"
+        "magento/magento2-functional-test-module-backend": "1.0.0-dev",
+        "magento/magento2-functional-test-module-config": "1.0.0-dev",
+        "magento/magento2-functional-test-module-directory": "1.0.0-dev",
+        "magento/magento2-functional-test-module-page-cache": "1.0.0-dev",
+        "magento/magento2-functional-test-module-store": "1.0.0-dev"
     },
     "type": "magento2-test-module",
-    "version": "1.0.0",
+    "version": "1.0.0-dev",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
         "psr-4": {
-            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
+            "Magento\\CurrencySymbol\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/composer.json
index 009472f57d6..6d4462eae7a 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/composer.json
@@ -5,44 +5,39 @@
         "sort-packages": true
     },
     "require": {
-        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
-        "codeception/codeception": "~2.3.4",
-        "consolidation/robo": "^1.0.0",
-        "henrikbjorn/lurker": "^1.2",
         "magento/magento2-functional-testing-framework": "1.0.0",
-        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
-        "vlucas/phpdotenv": "~2.4"
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-authorization": "1.0.0",
-        "magento/magento2-functional-test-module-backend": "1.0.0",
-        "magento/magento2-functional-test-module-catalog": "1.0.0",
-        "magento/magento2-functional-test-module-checkout": "1.0.0",
-        "magento/magento2-functional-test-module-config": "1.0.0",
-        "magento/magento2-functional-test-module-directory": "1.0.0",
-        "magento/magento2-functional-test-module-eav": "1.0.0",
-        "magento/magento2-functional-test-module-integration": "1.0.0",
-        "magento/magento2-functional-test-module-media-storage": "1.0.0",
-        "magento/magento2-functional-test-module-newsletter": "1.0.0",
-        "magento/magento2-functional-test-module-page-cache": "1.0.0",
-        "magento/magento2-functional-test-module-quote": "1.0.0",
-        "magento/magento2-functional-test-module-review": "1.0.0",
-        "magento/magento2-functional-test-module-sales": "1.0.0",
-        "magento/magento2-functional-test-module-store": "1.0.0",
-        "magento/magento2-functional-test-module-tax": "1.0.0",
-        "magento/magento2-functional-test-module-theme": "1.0.0",
-        "magento/magento2-functional-test-module-ui": "1.0.0",
-        "magento/magento2-functional-test-module-wishlist": "1.0.0"
+        "magento/magento2-functional-test-module-authorization": "1.0.0-dev",
+        "magento/magento2-functional-test-module-backend": "1.0.0-dev",
+        "magento/magento2-functional-test-module-catalog": "1.0.0-dev",
+        "magento/magento2-functional-test-module-checkout": "1.0.0-dev",
+        "magento/magento2-functional-test-module-config": "1.0.0-dev",
+        "magento/magento2-functional-test-module-directory": "1.0.0-dev",
+        "magento/magento2-functional-test-module-eav": "1.0.0-dev",
+        "magento/magento2-functional-test-module-integration": "1.0.0-dev",
+        "magento/magento2-functional-test-module-media-storage": "1.0.0-dev",
+        "magento/magento2-functional-test-module-newsletter": "1.0.0-dev",
+        "magento/magento2-functional-test-module-page-cache": "1.0.0-dev",
+        "magento/magento2-functional-test-module-quote": "1.0.0-dev",
+        "magento/magento2-functional-test-module-review": "1.0.0-dev",
+        "magento/magento2-functional-test-module-sales": "1.0.0-dev",
+        "magento/magento2-functional-test-module-store": "1.0.0-dev",
+        "magento/magento2-functional-test-module-tax": "1.0.0-dev",
+        "magento/magento2-functional-test-module-theme": "1.0.0-dev",
+        "magento/magento2-functional-test-module-ui": "1.0.0-dev",
+        "magento/magento2-functional-test-module-wishlist": "1.0.0-dev"
     },
     "type": "magento2-test-module",
-    "version": "1.0.0",
+    "version": "1.0.0-dev",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
         "psr-4": {
-            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
+            "Magento\\Customer\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CustomerAnalytics/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CustomerAnalytics/composer.json
index 2f6c9d54e2b..24e5dfbe31c 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CustomerAnalytics/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CustomerAnalytics/composer.json
@@ -3,40 +3,29 @@
     "description": "Magento 2 Acceptance Test Module Customer Analytics",
     "repositories": [
         {
-            "type" : "composer",
-            "url" : "https://repo.magento.com/"
+            "type": "composer",
+            "url": "https://repo.magento.com/"
         }
     ],
+    "config": {
+        "sort-packages": true
+    },
     "require": {
-        "php": "~7.0",
-        "codeception/codeception": "2.2|2.3",
-        "allure-framework/allure-codeception": "dev-master",
-        "consolidation/robo": "^1.0.0",
-        "henrikbjorn/lurker": "^1.2",
-        "vlucas/phpdotenv": "~2.4",
-        "magento/magento2-functional-testing-framework": "dev-develop"
+        "magento/magento2-functional-testing-framework": "1.0.0",
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-customer": "dev-master"
+        "magento/magento2-functional-test-module-customer": "1.0.0-dev"
     },
     "type": "magento2-test-module",
-    "version": "dev-master",
+    "version": "1.0.0-dev",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
-        "psr-0": {
-            "Yandex": "vendor/allure-framework/allure-codeception/src/"
-        },
         "psr-4": {
-            "Magento\\FunctionalTestingFramework\\": [
-                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
-            ],
-            "Magento\\FunctionalTest\\": [
-                "tests/functional/Magento/FunctionalTest",
-                "generated/Magento/FunctionalTest"
-            ]
+            "Magento\\CustomerAnalytics\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CustomerImportExport/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CustomerImportExport/composer.json
index d3f21cfc5ae..096f94ddcd5 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CustomerImportExport/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CustomerImportExport/composer.json
@@ -5,31 +5,26 @@
         "sort-packages": true
     },
     "require": {
-        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
-        "codeception/codeception": "~2.3.4",
-        "consolidation/robo": "^1.0.0",
-        "henrikbjorn/lurker": "^1.2",
         "magento/magento2-functional-testing-framework": "1.0.0",
-        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
-        "vlucas/phpdotenv": "~2.4"
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-backend": "1.0.0",
-        "magento/magento2-functional-test-module-customer": "1.0.0",
-        "magento/magento2-functional-test-module-directory": "1.0.0",
-        "magento/magento2-functional-test-module-eav": "1.0.0",
-        "magento/magento2-functional-test-module-import-export": "1.0.0",
-        "magento/magento2-functional-test-module-store": "1.0.0"
+        "magento/magento2-functional-test-module-backend": "1.0.0-dev",
+        "magento/magento2-functional-test-module-customer": "1.0.0-dev",
+        "magento/magento2-functional-test-module-directory": "1.0.0-dev",
+        "magento/magento2-functional-test-module-eav": "1.0.0-dev",
+        "magento/magento2-functional-test-module-import-export": "1.0.0-dev",
+        "magento/magento2-functional-test-module-store": "1.0.0-dev"
     },
     "type": "magento2-test-module",
-    "version": "1.0.0",
+    "version": "1.0.0-dev",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
         "psr-4": {
-            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
+            "Magento\\CustomerImportExport\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Deploy/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Deploy/composer.json
index ebdbc83e2c5..390a3891762 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Deploy/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Deploy/composer.json
@@ -5,29 +5,24 @@
         "sort-packages": true
     },
     "require": {
-        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
-        "codeception/codeception": "~2.3.4",
-        "consolidation/robo": "^1.0.0",
-        "henrikbjorn/lurker": "^1.2",
         "magento/magento2-functional-testing-framework": "1.0.0",
-        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
-        "vlucas/phpdotenv": "~2.4"
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-config": "1.0.0",
-        "magento/magento2-functional-test-module-require-js": "1.0.0",
-        "magento/magento2-functional-test-module-store": "1.0.0",
-        "magento/magento2-functional-test-module-user": "1.0.0"
+        "magento/magento2-functional-test-module-config": "1.0.0-dev",
+        "magento/magento2-functional-test-module-require-js": "1.0.0-dev",
+        "magento/magento2-functional-test-module-store": "1.0.0-dev",
+        "magento/magento2-functional-test-module-user": "1.0.0-dev"
     },
     "type": "magento2-test-module",
-    "version": "1.0.0",
+    "version": "1.0.0-dev",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
         "psr-4": {
-            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
+            "Magento\\Deploy\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Developer/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Developer/composer.json
index 1075a5415f0..94ad9956618 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Developer/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Developer/composer.json
@@ -5,27 +5,22 @@
         "sort-packages": true
     },
     "require": {
-        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
-        "codeception/codeception": "~2.3.4",
-        "consolidation/robo": "^1.0.0",
-        "henrikbjorn/lurker": "^1.2",
         "magento/magento2-functional-testing-framework": "1.0.0",
-        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
-        "vlucas/phpdotenv": "~2.4"
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-config": "1.0.0",
-        "magento/magento2-functional-test-module-store": "1.0.0"
+        "magento/magento2-functional-test-module-config": "1.0.0-dev",
+        "magento/magento2-functional-test-module-store": "1.0.0-dev"
     },
     "type": "magento2-test-module",
-    "version": "1.0.0",
+    "version": "1.0.0-dev",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
         "psr-4": {
-            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
+            "Magento\\Developer\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Dhl/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Dhl/composer.json
index 9933fd63717..d3004456843 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Dhl/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Dhl/composer.json
@@ -5,34 +5,29 @@
         "sort-packages": true
     },
     "require": {
-        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
-        "codeception/codeception": "~2.3.4",
-        "consolidation/robo": "^1.0.0",
-        "henrikbjorn/lurker": "^1.2",
         "magento/magento2-functional-testing-framework": "1.0.0",
-        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
-        "vlucas/phpdotenv": "~2.4"
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-backend": "1.0.0",
-        "magento/magento2-functional-test-module-catalog": "1.0.0",
-        "magento/magento2-functional-test-module-catalog-inventory": "1.0.0",
-        "magento/magento2-functional-test-module-config": "1.0.0",
-        "magento/magento2-functional-test-module-directory": "1.0.0",
-        "magento/magento2-functional-test-module-quote": "1.0.0",
-        "magento/magento2-functional-test-module-sales": "1.0.0",
-        "magento/magento2-functional-test-module-shipping": "1.0.0",
-        "magento/magento2-functional-test-module-store": "1.0.0"
+        "magento/magento2-functional-test-module-backend": "1.0.0-dev",
+        "magento/magento2-functional-test-module-catalog": "1.0.0-dev",
+        "magento/magento2-functional-test-module-catalog-inventory": "1.0.0-dev",
+        "magento/magento2-functional-test-module-config": "1.0.0-dev",
+        "magento/magento2-functional-test-module-directory": "1.0.0-dev",
+        "magento/magento2-functional-test-module-quote": "1.0.0-dev",
+        "magento/magento2-functional-test-module-sales": "1.0.0-dev",
+        "magento/magento2-functional-test-module-shipping": "1.0.0-dev",
+        "magento/magento2-functional-test-module-store": "1.0.0-dev"
     },
     "type": "magento2-test-module",
-    "version": "1.0.0",
+    "version": "1.0.0-dev",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
         "psr-4": {
-            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
+            "Magento\\Dhl\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Directory/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Directory/composer.json
index 1485278162d..eca5738cc5c 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Directory/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Directory/composer.json
@@ -5,28 +5,23 @@
         "sort-packages": true
     },
     "require": {
-        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
-        "codeception/codeception": "~2.3.4",
-        "consolidation/robo": "^1.0.0",
-        "henrikbjorn/lurker": "^1.2",
         "magento/magento2-functional-testing-framework": "1.0.0",
-        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
-        "vlucas/phpdotenv": "~2.4"
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-backend": "1.0.0",
-        "magento/magento2-functional-test-module-config": "1.0.0",
-        "magento/magento2-functional-test-module-store": "1.0.0"
+        "magento/magento2-functional-test-module-backend": "1.0.0-dev",
+        "magento/magento2-functional-test-module-config": "1.0.0-dev",
+        "magento/magento2-functional-test-module-store": "1.0.0-dev"
     },
     "type": "magento2-test-module",
-    "version": "1.0.0",
+    "version": "1.0.0-dev",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
         "psr-4": {
-            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
+            "Magento\\Directory\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Downloadable/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Downloadable/composer.json
index 5622b5246c2..da969015270 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Downloadable/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Downloadable/composer.json
@@ -5,41 +5,36 @@
         "sort-packages": true
     },
     "require": {
-        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
-        "codeception/codeception": "~2.3.4",
-        "consolidation/robo": "^1.0.0",
-        "henrikbjorn/lurker": "^1.2",
         "magento/magento2-functional-testing-framework": "1.0.0",
-        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
-        "vlucas/phpdotenv": "~2.4"
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-backend": "1.0.0",
-        "magento/magento2-functional-test-module-catalog": "1.0.0",
-        "magento/magento2-functional-test-module-catalog-inventory": "1.0.0",
-        "magento/magento2-functional-test-module-checkout": "1.0.0",
-        "magento/magento2-functional-test-module-config": "1.0.0",
-        "magento/magento2-functional-test-module-customer": "1.0.0",
-        "magento/magento2-functional-test-module-directory": "1.0.0",
-        "magento/magento2-functional-test-module-eav": "1.0.0",
-        "magento/magento2-functional-test-module-gift-message": "1.0.0",
-        "magento/magento2-functional-test-module-media-storage": "1.0.0",
-        "magento/magento2-functional-test-module-quote": "1.0.0",
-        "magento/magento2-functional-test-module-sales": "1.0.0",
-        "magento/magento2-functional-test-module-store": "1.0.0",
-        "magento/magento2-functional-test-module-tax": "1.0.0",
-        "magento/magento2-functional-test-module-theme": "1.0.0",
-        "magento/magento2-functional-test-module-ui": "1.0.0"
+        "magento/magento2-functional-test-module-backend": "1.0.0-dev",
+        "magento/magento2-functional-test-module-catalog": "1.0.0-dev",
+        "magento/magento2-functional-test-module-catalog-inventory": "1.0.0-dev",
+        "magento/magento2-functional-test-module-checkout": "1.0.0-dev",
+        "magento/magento2-functional-test-module-config": "1.0.0-dev",
+        "magento/magento2-functional-test-module-customer": "1.0.0-dev",
+        "magento/magento2-functional-test-module-directory": "1.0.0-dev",
+        "magento/magento2-functional-test-module-eav": "1.0.0-dev",
+        "magento/magento2-functional-test-module-gift-message": "1.0.0-dev",
+        "magento/magento2-functional-test-module-media-storage": "1.0.0-dev",
+        "magento/magento2-functional-test-module-quote": "1.0.0-dev",
+        "magento/magento2-functional-test-module-sales": "1.0.0-dev",
+        "magento/magento2-functional-test-module-store": "1.0.0-dev",
+        "magento/magento2-functional-test-module-tax": "1.0.0-dev",
+        "magento/magento2-functional-test-module-theme": "1.0.0-dev",
+        "magento/magento2-functional-test-module-ui": "1.0.0-dev"
     },
     "type": "magento2-test-module",
-    "version": "1.0.0",
+    "version": "1.0.0-dev",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
         "psr-4": {
-            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
+            "Magento\\Downloadable\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/DownloadableImportExport/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/DownloadableImportExport/composer.json
index 1be41e6ddcf..1c2511d9b9d 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/DownloadableImportExport/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/DownloadableImportExport/composer.json
@@ -5,31 +5,26 @@
         "sort-packages": true
     },
     "require": {
-        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
-        "codeception/codeception": "~2.3.4",
-        "consolidation/robo": "^1.0.0",
-        "henrikbjorn/lurker": "^1.2",
         "magento/magento2-functional-testing-framework": "1.0.0",
-        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
-        "vlucas/phpdotenv": "~2.4"
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-catalog": "1.0.0",
-        "magento/magento2-functional-test-module-catalog-import-export": "1.0.0",
-        "magento/magento2-functional-test-module-downloadable": "1.0.0",
-        "magento/magento2-functional-test-module-eav": "1.0.0",
-        "magento/magento2-functional-test-module-import-export": "1.0.0",
-        "magento/magento2-functional-test-module-store": "1.0.0"
+        "magento/magento2-functional-test-module-catalog": "1.0.0-dev",
+        "magento/magento2-functional-test-module-catalog-import-export": "1.0.0-dev",
+        "magento/magento2-functional-test-module-downloadable": "1.0.0-dev",
+        "magento/magento2-functional-test-module-eav": "1.0.0-dev",
+        "magento/magento2-functional-test-module-import-export": "1.0.0-dev",
+        "magento/magento2-functional-test-module-store": "1.0.0-dev"
     },
     "type": "magento2-test-module",
-    "version": "1.0.0",
+    "version": "1.0.0-dev",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
         "psr-4": {
-            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
+            "Magento\\DownloadableImportExport\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Eav/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Eav/composer.json
index c5f4aeabe23..8865b797d08 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Eav/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Eav/composer.json
@@ -5,30 +5,25 @@
         "sort-packages": true
     },
     "require": {
-        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
-        "codeception/codeception": "~2.3.4",
-        "consolidation/robo": "^1.0.0",
-        "henrikbjorn/lurker": "^1.2",
         "magento/magento2-functional-testing-framework": "1.0.0",
-        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
-        "vlucas/phpdotenv": "~2.4"
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-backend": "1.0.0",
-        "magento/magento2-functional-test-module-catalog": "1.0.0",
-        "magento/magento2-functional-test-module-config": "1.0.0",
-        "magento/magento2-functional-test-module-media-storage": "1.0.0",
-        "magento/magento2-functional-test-module-store": "1.0.0"
+        "magento/magento2-functional-test-module-backend": "1.0.0-dev",
+        "magento/magento2-functional-test-module-catalog": "1.0.0-dev",
+        "magento/magento2-functional-test-module-config": "1.0.0-dev",
+        "magento/magento2-functional-test-module-media-storage": "1.0.0-dev",
+        "magento/magento2-functional-test-module-store": "1.0.0-dev"
     },
     "type": "magento2-test-module",
-    "version": "1.0.0",
+    "version": "1.0.0-dev",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
         "psr-4": {
-            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
+            "Magento\\Eav\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Email/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Email/composer.json
index 0d13e60cb0e..bd6d0699d5d 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Email/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Email/composer.json
@@ -5,31 +5,26 @@
         "sort-packages": true
     },
     "require": {
-        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
-        "codeception/codeception": "~2.3.4",
-        "consolidation/robo": "^1.0.0",
-        "henrikbjorn/lurker": "^1.2",
         "magento/magento2-functional-testing-framework": "1.0.0",
-        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
-        "vlucas/phpdotenv": "~2.4"
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-backend": "1.0.0",
-        "magento/magento2-functional-test-module-cms": "1.0.0",
-        "magento/magento2-functional-test-module-config": "1.0.0",
-        "magento/magento2-functional-test-module-store": "1.0.0",
-        "magento/magento2-functional-test-module-theme": "1.0.0",
-        "magento/magento2-functional-test-module-variable": "1.0.0"
+        "magento/magento2-functional-test-module-backend": "1.0.0-dev",
+        "magento/magento2-functional-test-module-cms": "1.0.0-dev",
+        "magento/magento2-functional-test-module-config": "1.0.0-dev",
+        "magento/magento2-functional-test-module-store": "1.0.0-dev",
+        "magento/magento2-functional-test-module-theme": "1.0.0-dev",
+        "magento/magento2-functional-test-module-variable": "1.0.0-dev"
     },
     "type": "magento2-test-module",
-    "version": "1.0.0",
+    "version": "1.0.0-dev",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
         "psr-4": {
-            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
+            "Magento\\Email\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/EncryptionKey/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/EncryptionKey/composer.json
index 3718de923da..347d3e07c5d 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/EncryptionKey/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/EncryptionKey/composer.json
@@ -5,27 +5,22 @@
         "sort-packages": true
     },
     "require": {
-        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
-        "codeception/codeception": "~2.3.4",
-        "consolidation/robo": "^1.0.0",
-        "henrikbjorn/lurker": "^1.2",
         "magento/magento2-functional-testing-framework": "1.0.0",
-        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
-        "vlucas/phpdotenv": "~2.4"
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-backend": "1.0.0",
-        "magento/magento2-functional-test-module-config": "1.0.0"
+        "magento/magento2-functional-test-module-backend": "1.0.0-dev",
+        "magento/magento2-functional-test-module-config": "1.0.0-dev"
     },
     "type": "magento2-test-module",
-    "version": "1.0.0",
+    "version": "1.0.0-dev",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
         "psr-4": {
-            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
+            "Magento\\EncryptionKey\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Fedex/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Fedex/composer.json
index b55a5d5efad..bfe94e834c3 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Fedex/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Fedex/composer.json
@@ -5,33 +5,28 @@
         "sort-packages": true
     },
     "require": {
-        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
-        "codeception/codeception": "~2.3.4",
-        "consolidation/robo": "^1.0.0",
-        "henrikbjorn/lurker": "^1.2",
         "magento/magento2-functional-testing-framework": "1.0.0",
-        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
-        "vlucas/phpdotenv": "~2.4"
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-catalog": "1.0.0",
-        "magento/magento2-functional-test-module-catalog-inventory": "1.0.0",
-        "magento/magento2-functional-test-module-config": "1.0.0",
-        "magento/magento2-functional-test-module-directory": "1.0.0",
-        "magento/magento2-functional-test-module-quote": "1.0.0",
-        "magento/magento2-functional-test-module-sales": "1.0.0",
-        "magento/magento2-functional-test-module-shipping": "1.0.0",
-        "magento/magento2-functional-test-module-store": "1.0.0"
+        "magento/magento2-functional-test-module-catalog": "1.0.0-dev",
+        "magento/magento2-functional-test-module-catalog-inventory": "1.0.0-dev",
+        "magento/magento2-functional-test-module-config": "1.0.0-dev",
+        "magento/magento2-functional-test-module-directory": "1.0.0-dev",
+        "magento/magento2-functional-test-module-quote": "1.0.0-dev",
+        "magento/magento2-functional-test-module-sales": "1.0.0-dev",
+        "magento/magento2-functional-test-module-shipping": "1.0.0-dev",
+        "magento/magento2-functional-test-module-store": "1.0.0-dev"
     },
     "type": "magento2-test-module",
-    "version": "1.0.0",
+    "version": "1.0.0-dev",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
         "psr-4": {
-            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
+            "Magento\\Fedex\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GiftMessage/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GiftMessage/composer.json
index 8a65032c600..97fdfe9ca40 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GiftMessage/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GiftMessage/composer.json
@@ -5,33 +5,28 @@
         "sort-packages": true
     },
     "require": {
-        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
-        "codeception/codeception": "~2.3.4",
-        "consolidation/robo": "^1.0.0",
-        "henrikbjorn/lurker": "^1.2",
         "magento/magento2-functional-testing-framework": "1.0.0",
-        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
-        "vlucas/phpdotenv": "~2.4"
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-backend": "1.0.0",
-        "magento/magento2-functional-test-module-catalog": "1.0.0",
-        "magento/magento2-functional-test-module-checkout": "1.0.0",
-        "magento/magento2-functional-test-module-customer": "1.0.0",
-        "magento/magento2-functional-test-module-quote": "1.0.0",
-        "magento/magento2-functional-test-module-sales": "1.0.0",
-        "magento/magento2-functional-test-module-store": "1.0.0",
-        "magento/magento2-functional-test-module-ui": "1.0.0"
+        "magento/magento2-functional-test-module-backend": "1.0.0-dev",
+        "magento/magento2-functional-test-module-catalog": "1.0.0-dev",
+        "magento/magento2-functional-test-module-checkout": "1.0.0-dev",
+        "magento/magento2-functional-test-module-customer": "1.0.0-dev",
+        "magento/magento2-functional-test-module-quote": "1.0.0-dev",
+        "magento/magento2-functional-test-module-sales": "1.0.0-dev",
+        "magento/magento2-functional-test-module-store": "1.0.0-dev",
+        "magento/magento2-functional-test-module-ui": "1.0.0-dev"
     },
     "type": "magento2-test-module",
-    "version": "1.0.0",
+    "version": "1.0.0-dev",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
         "psr-4": {
-            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
+            "Magento\\GiftMessage\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GoogleAdwords/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GoogleAdwords/composer.json
index e95d81c5168..265dad69246 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GoogleAdwords/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GoogleAdwords/composer.json
@@ -5,27 +5,22 @@
         "sort-packages": true
     },
     "require": {
-        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
-        "codeception/codeception": "~2.3.4",
-        "consolidation/robo": "^1.0.0",
-        "henrikbjorn/lurker": "^1.2",
         "magento/magento2-functional-testing-framework": "1.0.0",
-        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
-        "vlucas/phpdotenv": "~2.4"
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-sales": "1.0.0",
-        "magento/magento2-functional-test-module-store": "1.0.0"
+        "magento/magento2-functional-test-module-sales": "1.0.0-dev",
+        "magento/magento2-functional-test-module-store": "1.0.0-dev"
     },
     "type": "magento2-test-module",
-    "version": "1.0.0",
+    "version": "1.0.0-dev",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
         "psr-4": {
-            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
+            "Magento\\GoogleAdwords\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GoogleAnalytics/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GoogleAnalytics/composer.json
index 46a8d634b7e..9fc3d17c75d 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GoogleAnalytics/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GoogleAnalytics/composer.json
@@ -5,28 +5,23 @@
         "sort-packages": true
     },
     "require": {
-        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
-        "codeception/codeception": "~2.3.4",
-        "consolidation/robo": "^1.0.0",
-        "henrikbjorn/lurker": "^1.2",
         "magento/magento2-functional-testing-framework": "1.0.0",
-        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
-        "vlucas/phpdotenv": "~2.4"
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-cookie": "1.0.0",
-        "magento/magento2-functional-test-module-sales": "1.0.0",
-        "magento/magento2-functional-test-module-store": "1.0.0"
+        "magento/magento2-functional-test-module-cookie": "1.0.0-dev",
+        "magento/magento2-functional-test-module-sales": "1.0.0-dev",
+        "magento/magento2-functional-test-module-store": "1.0.0-dev"
     },
     "type": "magento2-test-module",
-    "version": "1.0.0",
+    "version": "1.0.0-dev",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
         "psr-4": {
-            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
+            "Magento\\GoogleAnalytics\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GoogleOptimizer/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GoogleOptimizer/composer.json
index 820a7ae8b10..5a5542539aa 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GoogleOptimizer/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GoogleOptimizer/composer.json
@@ -5,31 +5,26 @@
         "sort-packages": true
     },
     "require": {
-        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
-        "codeception/codeception": "~2.3.4",
-        "consolidation/robo": "^1.0.0",
-        "henrikbjorn/lurker": "^1.2",
         "magento/magento2-functional-testing-framework": "1.0.0",
-        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
-        "vlucas/phpdotenv": "~2.4"
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-backend": "1.0.0",
-        "magento/magento2-functional-test-module-catalog": "1.0.0",
-        "magento/magento2-functional-test-module-cms": "1.0.0",
-        "magento/magento2-functional-test-module-google-analytics": "1.0.0",
-        "magento/magento2-functional-test-module-store": "1.0.0",
-        "magento/magento2-functional-test-module-ui": "1.0.0"
+        "magento/magento2-functional-test-module-backend": "1.0.0-dev",
+        "magento/magento2-functional-test-module-catalog": "1.0.0-dev",
+        "magento/magento2-functional-test-module-cms": "1.0.0-dev",
+        "magento/magento2-functional-test-module-google-analytics": "1.0.0-dev",
+        "magento/magento2-functional-test-module-store": "1.0.0-dev",
+        "magento/magento2-functional-test-module-ui": "1.0.0-dev"
     },
     "type": "magento2-test-module",
-    "version": "1.0.0",
+    "version": "1.0.0-dev",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
         "psr-4": {
-            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
+            "Magento\\GoogleOptimizer\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GraphQl/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GraphQl/composer.json
index ff338103d9d..b2ddecd987d 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GraphQl/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GraphQl/composer.json
@@ -5,28 +5,23 @@
         "sort-packages": true
     },
     "require": {
-        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
-        "codeception/codeception": "~2.3.4",
-        "consolidation/robo": "^1.0.0",
-        "henrikbjorn/lurker": "^1.2",
         "magento/magento2-functional-testing-framework": "1.0.0",
-        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
-        "vlucas/phpdotenv": "~2.4"
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-webapi": "1.0.0",
-        "magento/magento2-functional-test-module-eav": "1.0.0",
-        "magento/magento2-functional-test-module-catalog": "1.0.0"
+        "magento/magento2-functional-test-module-webapi": "1.0.0-dev",
+        "magento/magento2-functional-test-module-eav": "1.0.0-dev",
+        "magento/magento2-functional-test-module-catalog": "1.0.0-dev"
     },
     "type": "magento2-test-module",
-    "version": "1.0.0",
+    "version": "1.0.0-dev",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
         "psr-4": {
-            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
+            "Magento\\GraphQl\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GroupedImportExport/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GroupedImportExport/composer.json
index cd96b7a0efe..0a0c3364faa 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GroupedImportExport/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GroupedImportExport/composer.json
@@ -5,30 +5,25 @@
         "sort-packages": true
     },
     "require": {
-        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
-        "codeception/codeception": "~2.3.4",
-        "consolidation/robo": "^1.0.0",
-        "henrikbjorn/lurker": "^1.2",
         "magento/magento2-functional-testing-framework": "1.0.0",
-        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
-        "vlucas/phpdotenv": "~2.4"
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-catalog": "1.0.0",
-        "magento/magento2-functional-test-module-catalog-import-export": "1.0.0",
-        "magento/magento2-functional-test-module-eav": "1.0.0",
-        "magento/magento2-functional-test-module-grouped-product": "1.0.0",
-        "magento/magento2-functional-test-module-import-export": "1.0.0"
+        "magento/magento2-functional-test-module-catalog": "1.0.0-dev",
+        "magento/magento2-functional-test-module-catalog-import-export": "1.0.0-dev",
+        "magento/magento2-functional-test-module-eav": "1.0.0-dev",
+        "magento/magento2-functional-test-module-grouped-product": "1.0.0-dev",
+        "magento/magento2-functional-test-module-import-export": "1.0.0-dev"
     },
     "type": "magento2-test-module",
-    "version": "1.0.0",
+    "version": "1.0.0-dev",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
         "psr-4": {
-            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
+            "Magento\\GroupedImportExport\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GroupedProduct/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GroupedProduct/composer.json
index 4305a6bdb52..7254d77ba42 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GroupedProduct/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GroupedProduct/composer.json
@@ -5,37 +5,32 @@
         "sort-packages": true
     },
     "require": {
-        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
-        "codeception/codeception": "~2.3.4",
-        "consolidation/robo": "^1.0.0",
-        "henrikbjorn/lurker": "^1.2",
         "magento/magento2-functional-testing-framework": "1.0.0",
-        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
-        "vlucas/phpdotenv": "~2.4"
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-backend": "1.0.0",
-        "magento/magento2-functional-test-module-catalog": "1.0.0",
-        "magento/magento2-functional-test-module-catalog-inventory": "1.0.0",
-        "magento/magento2-functional-test-module-checkout": "1.0.0",
-        "magento/magento2-functional-test-module-customer": "1.0.0",
-        "magento/magento2-functional-test-module-eav": "1.0.0",
-        "magento/magento2-functional-test-module-media-storage": "1.0.0",
-        "magento/magento2-functional-test-module-msrp": "1.0.0",
-        "magento/magento2-functional-test-module-quote": "1.0.0",
-        "magento/magento2-functional-test-module-sales": "1.0.0",
-        "magento/magento2-functional-test-module-store": "1.0.0",
-        "magento/magento2-functional-test-module-ui": "1.0.0"
+        "magento/magento2-functional-test-module-backend": "1.0.0-dev",
+        "magento/magento2-functional-test-module-catalog": "1.0.0-dev",
+        "magento/magento2-functional-test-module-catalog-inventory": "1.0.0-dev",
+        "magento/magento2-functional-test-module-checkout": "1.0.0-dev",
+        "magento/magento2-functional-test-module-customer": "1.0.0-dev",
+        "magento/magento2-functional-test-module-eav": "1.0.0-dev",
+        "magento/magento2-functional-test-module-media-storage": "1.0.0-dev",
+        "magento/magento2-functional-test-module-msrp": "1.0.0-dev",
+        "magento/magento2-functional-test-module-quote": "1.0.0-dev",
+        "magento/magento2-functional-test-module-sales": "1.0.0-dev",
+        "magento/magento2-functional-test-module-store": "1.0.0-dev",
+        "magento/magento2-functional-test-module-ui": "1.0.0-dev"
     },
     "type": "magento2-test-module",
-    "version": "1.0.0",
+    "version": "1.0.0-dev",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
         "psr-4": {
-            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
+            "Magento\\GroupedProduct\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ImportExport/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ImportExport/composer.json
index 20662b4f76d..61b4747da1c 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ImportExport/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ImportExport/composer.json
@@ -5,30 +5,25 @@
         "sort-packages": true
     },
     "require": {
-        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
-        "codeception/codeception": "~2.3.4",
-        "consolidation/robo": "^1.0.0",
-        "henrikbjorn/lurker": "^1.2",
         "magento/magento2-functional-testing-framework": "1.0.0",
-        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
-        "vlucas/phpdotenv": "~2.4"
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-backend": "1.0.0",
-        "magento/magento2-functional-test-module-catalog": "1.0.0",
-        "magento/magento2-functional-test-module-eav": "1.0.0",
-        "magento/magento2-functional-test-module-media-storage": "1.0.0",
-        "magento/magento2-functional-test-module-store": "1.0.0"
+        "magento/magento2-functional-test-module-backend": "1.0.0-dev",
+        "magento/magento2-functional-test-module-catalog": "1.0.0-dev",
+        "magento/magento2-functional-test-module-eav": "1.0.0-dev",
+        "magento/magento2-functional-test-module-media-storage": "1.0.0-dev",
+        "magento/magento2-functional-test-module-store": "1.0.0-dev"
     },
     "type": "magento2-test-module",
-    "version": "1.0.0",
+    "version": "1.0.0-dev",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
         "psr-4": {
-            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
+            "Magento\\ImportExport\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Indexer/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Indexer/composer.json
index e8372f1d9be..3077c217198 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Indexer/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Indexer/composer.json
@@ -5,26 +5,21 @@
         "sort-packages": true
     },
     "require": {
-        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
-        "codeception/codeception": "~2.3.4",
-        "consolidation/robo": "^1.0.0",
-        "henrikbjorn/lurker": "^1.2",
         "magento/magento2-functional-testing-framework": "1.0.0",
-        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
-        "vlucas/phpdotenv": "~2.4"
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-backend": "1.0.0"
+        "magento/magento2-functional-test-module-backend": "1.0.0-dev"
     },
     "type": "magento2-test-module",
-    "version": "1.0.0",
+    "version": "1.0.0-dev",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
         "psr-4": {
-            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
+            "Magento\\Indexer\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/InstantPurchase/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/InstantPurchase/composer.json
index d525694a3ae..0ffaf50c912 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/InstantPurchase/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/InstantPurchase/composer.json
@@ -5,31 +5,26 @@
         "sort-packages": true
     },
     "require": {
-        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
-        "codeception/codeception": "~2.3.4",
-        "consolidation/robo": "^1.0.0",
-        "henrikbjorn/lurker": "^1.2",
         "magento/magento2-functional-testing-framework": "1.0.0",
-        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
-        "vlucas/phpdotenv": "~2.4"
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-store": "1.0.0",
-        "magento/magento2-functional-test-module-catalog": "1.0.0",
-        "magento/magento2-functional-test-module-customer": "1.0.0",
-        "magento/magento2-functional-test-module-sales": "1.0.0",
-        "magento/magento2-functional-test-module-quote": "1.0.0",
-        "magento/magento2-functional-test-module-vault": "1.0.0"
+        "magento/magento2-functional-test-module-store": "1.0.0-dev",
+        "magento/magento2-functional-test-module-catalog": "1.0.0-dev",
+        "magento/magento2-functional-test-module-customer": "1.0.0-dev",
+        "magento/magento2-functional-test-module-sales": "1.0.0-dev",
+        "magento/magento2-functional-test-module-quote": "1.0.0-dev",
+        "magento/magento2-functional-test-module-vault": "1.0.0-dev"
     },
     "type": "magento2-test-module",
-    "version": "1.0.0",
+    "version": "1.0.0-dev",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
         "psr-4": {
-            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
+            "Magento\\InstantPurchase\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Integration/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Integration/composer.json
index 3e95a348991..8e9d51bc67f 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Integration/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Integration/composer.json
@@ -5,31 +5,26 @@
         "sort-packages": true
     },
     "require": {
-        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
-        "codeception/codeception": "~2.3.4",
-        "consolidation/robo": "^1.0.0",
-        "henrikbjorn/lurker": "^1.2",
         "magento/magento2-functional-testing-framework": "1.0.0",
-        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
-        "vlucas/phpdotenv": "~2.4"
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-authorization": "1.0.0",
-        "magento/magento2-functional-test-module-backend": "1.0.0",
-        "magento/magento2-functional-test-module-customer": "1.0.0",
-        "magento/magento2-functional-test-module-security": "1.0.0",
-        "magento/magento2-functional-test-module-store": "1.0.0",
-        "magento/magento2-functional-test-module-user": "1.0.0"
+        "magento/magento2-functional-test-module-authorization": "1.0.0-dev",
+        "magento/magento2-functional-test-module-backend": "1.0.0-dev",
+        "magento/magento2-functional-test-module-customer": "1.0.0-dev",
+        "magento/magento2-functional-test-module-security": "1.0.0-dev",
+        "magento/magento2-functional-test-module-store": "1.0.0-dev",
+        "magento/magento2-functional-test-module-user": "1.0.0-dev"
     },
     "type": "magento2-test-module",
-    "version": "1.0.0",
+    "version": "1.0.0-dev",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
         "psr-4": {
-            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
+            "Magento\\Integration\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/LayeredNavigation/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/LayeredNavigation/composer.json
index 7aa8b370aec..31e6ee720a4 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/LayeredNavigation/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/LayeredNavigation/composer.json
@@ -5,27 +5,22 @@
         "sort-packages": true
     },
     "require": {
-        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
-        "codeception/codeception": "~2.3.4",
-        "consolidation/robo": "^1.0.0",
-        "henrikbjorn/lurker": "^1.2",
         "magento/magento2-functional-testing-framework": "1.0.0",
-        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
-        "vlucas/phpdotenv": "~2.4"
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-catalog": "1.0.0",
-        "magento/magento2-functional-test-module-config": "1.0.0"
+        "magento/magento2-functional-test-module-catalog": "1.0.0-dev",
+        "magento/magento2-functional-test-module-config": "1.0.0-dev"
     },
     "type": "magento2-test-module",
-    "version": "1.0.0",
+    "version": "1.0.0-dev",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
         "psr-4": {
-            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
+            "Magento\\LayeredNavigation\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Marketplace/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Marketplace/composer.json
index 35c4720ce34..3c46a479567 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Marketplace/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Marketplace/composer.json
@@ -5,26 +5,21 @@
         "sort-packages": true
     },
     "require": {
-        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
-        "codeception/codeception": "~2.3.4",
-        "consolidation/robo": "^1.0.0",
-        "henrikbjorn/lurker": "^1.2",
         "magento/magento2-functional-testing-framework": "1.0.0",
-        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
-        "vlucas/phpdotenv": "~2.4"
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-backend": "1.0.0"
+        "magento/magento2-functional-test-module-backend": "1.0.0-dev"
     },
     "type": "magento2-test-module",
-    "version": "1.0.0",
+    "version": "1.0.0-dev",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
         "psr-4": {
-            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
+            "Magento\\Marketplace\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/MediaStorage/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/MediaStorage/composer.json
index c853fdef3e3..7367ba3cc52 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/MediaStorage/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/MediaStorage/composer.json
@@ -5,28 +5,23 @@
         "sort-packages": true
     },
     "require": {
-        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
-        "codeception/codeception": "~2.3.4",
-        "consolidation/robo": "^1.0.0",
-        "henrikbjorn/lurker": "^1.2",
         "magento/magento2-functional-testing-framework": "1.0.0",
-        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
-        "vlucas/phpdotenv": "~2.4"
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-backend": "1.0.0",
-        "magento/magento2-functional-test-module-config": "1.0.0",
-        "magento/magento2-functional-test-module-store": "1.0.0"
+        "magento/magento2-functional-test-module-backend": "1.0.0-dev",
+        "magento/magento2-functional-test-module-config": "1.0.0-dev",
+        "magento/magento2-functional-test-module-store": "1.0.0-dev"
     },
     "type": "magento2-test-module",
-    "version": "1.0.0",
+    "version": "1.0.0-dev",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
         "psr-4": {
-            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
+            "Magento\\MediaStorage\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Msrp/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Msrp/composer.json
index 97eaf57c60e..7941442a770 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Msrp/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Msrp/composer.json
@@ -5,31 +5,26 @@
         "sort-packages": true
     },
     "require": {
-        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
-        "codeception/codeception": "~2.3.4",
-        "consolidation/robo": "^1.0.0",
-        "henrikbjorn/lurker": "^1.2",
         "magento/magento2-functional-testing-framework": "1.0.0",
-        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
-        "vlucas/phpdotenv": "~2.4"
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-catalog": "1.0.0",
-        "magento/magento2-functional-test-module-downloadable": "1.0.0",
-        "magento/magento2-functional-test-module-eav": "1.0.0",
-        "magento/magento2-functional-test-module-grouped-product": "1.0.0",
-        "magento/magento2-functional-test-module-store": "1.0.0",
-        "magento/magento2-functional-test-module-tax": "1.0.0"
+        "magento/magento2-functional-test-module-catalog": "1.0.0-dev",
+        "magento/magento2-functional-test-module-downloadable": "1.0.0-dev",
+        "magento/magento2-functional-test-module-eav": "1.0.0-dev",
+        "magento/magento2-functional-test-module-grouped-product": "1.0.0-dev",
+        "magento/magento2-functional-test-module-store": "1.0.0-dev",
+        "magento/magento2-functional-test-module-tax": "1.0.0-dev"
     },
     "type": "magento2-test-module",
-    "version": "1.0.0",
+    "version": "1.0.0-dev",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
         "psr-4": {
-            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
+            "Magento\\Msrp\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Multishipping/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Multishipping/composer.json
index e9841884b99..7173e96e9a7 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Multishipping/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Multishipping/composer.json
@@ -5,33 +5,28 @@
         "sort-packages": true
     },
     "require": {
-        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
-        "codeception/codeception": "~2.3.4",
-        "consolidation/robo": "^1.0.0",
-        "henrikbjorn/lurker": "^1.2",
         "magento/magento2-functional-testing-framework": "1.0.0",
-        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
-        "vlucas/phpdotenv": "~2.4"
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-checkout": "1.0.0",
-        "magento/magento2-functional-test-module-customer": "1.0.0",
-        "magento/magento2-functional-test-module-directory": "1.0.0",
-        "magento/magento2-functional-test-module-payment": "1.0.0",
-        "magento/magento2-functional-test-module-quote": "1.0.0",
-        "magento/magento2-functional-test-module-sales": "1.0.0",
-        "magento/magento2-functional-test-module-store": "1.0.0",
-        "magento/magento2-functional-test-module-tax": "1.0.0"
+        "magento/magento2-functional-test-module-checkout": "1.0.0-dev",
+        "magento/magento2-functional-test-module-customer": "1.0.0-dev",
+        "magento/magento2-functional-test-module-directory": "1.0.0-dev",
+        "magento/magento2-functional-test-module-payment": "1.0.0-dev",
+        "magento/magento2-functional-test-module-quote": "1.0.0-dev",
+        "magento/magento2-functional-test-module-sales": "1.0.0-dev",
+        "magento/magento2-functional-test-module-store": "1.0.0-dev",
+        "magento/magento2-functional-test-module-tax": "1.0.0-dev"
     },
     "type": "magento2-test-module",
-    "version": "1.0.0",
+    "version": "1.0.0-dev",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
         "psr-4": {
-            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
+            "Magento\\Multishipping\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/NewRelicReporting/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/NewRelicReporting/composer.json
index b7c0fdd7f43..0f663c82dcc 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/NewRelicReporting/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/NewRelicReporting/composer.json
@@ -5,31 +5,26 @@
         "sort-packages": true
     },
     "require": {
-        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
-        "codeception/codeception": "~2.3.4",
-        "consolidation/robo": "^1.0.0",
-        "henrikbjorn/lurker": "^1.2",
         "magento/magento2-functional-testing-framework": "1.0.0",
-        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
-        "vlucas/phpdotenv": "~2.4"
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-backend": "1.0.0",
-        "magento/magento2-functional-test-module-catalog": "1.0.0",
-        "magento/magento2-functional-test-module-config": "1.0.0",
-        "magento/magento2-functional-test-module-configurable-product": "1.0.0",
-        "magento/magento2-functional-test-module-customer": "1.0.0",
-        "magento/magento2-functional-test-module-store": "1.0.0"
+        "magento/magento2-functional-test-module-backend": "1.0.0-dev",
+        "magento/magento2-functional-test-module-catalog": "1.0.0-dev",
+        "magento/magento2-functional-test-module-config": "1.0.0-dev",
+        "magento/magento2-functional-test-module-configurable-product": "1.0.0-dev",
+        "magento/magento2-functional-test-module-customer": "1.0.0-dev",
+        "magento/magento2-functional-test-module-store": "1.0.0-dev"
     },
     "type": "magento2-test-module",
-    "version": "1.0.0",
+    "version": "1.0.0-dev",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
         "psr-4": {
-            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
+            "Magento\\NewRelicReporting\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Newsletter/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Newsletter/composer.json
index 189fa347b45..9085ac604e2 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Newsletter/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Newsletter/composer.json
@@ -5,33 +5,28 @@
         "sort-packages": true
     },
     "require": {
-        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
-        "codeception/codeception": "~2.3.4",
-        "consolidation/robo": "^1.0.0",
-        "henrikbjorn/lurker": "^1.2",
         "magento/magento2-functional-testing-framework": "1.0.0",
-        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
-        "vlucas/phpdotenv": "~2.4"
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-backend": "1.0.0",
-        "magento/magento2-functional-test-module-cms": "1.0.0",
-        "magento/magento2-functional-test-module-customer": "1.0.0",
-        "magento/magento2-functional-test-module-eav": "1.0.0",
-        "magento/magento2-functional-test-module-email": "1.0.0",
-        "magento/magento2-functional-test-module-require-js": "1.0.0",
-        "magento/magento2-functional-test-module-store": "1.0.0",
-        "magento/magento2-functional-test-module-widget": "1.0.0"
+        "magento/magento2-functional-test-module-backend": "1.0.0-dev",
+        "magento/magento2-functional-test-module-cms": "1.0.0-dev",
+        "magento/magento2-functional-test-module-customer": "1.0.0-dev",
+        "magento/magento2-functional-test-module-eav": "1.0.0-dev",
+        "magento/magento2-functional-test-module-email": "1.0.0-dev",
+        "magento/magento2-functional-test-module-require-js": "1.0.0-dev",
+        "magento/magento2-functional-test-module-store": "1.0.0-dev",
+        "magento/magento2-functional-test-module-widget": "1.0.0-dev"
     },
     "type": "magento2-test-module",
-    "version": "1.0.0",
+    "version": "1.0.0-dev",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
         "psr-4": {
-            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
+            "Magento\\Newsletter\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/OfflinePayments/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/OfflinePayments/composer.json
index f3a5da39e2a..0631ae3f7f0 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/OfflinePayments/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/OfflinePayments/composer.json
@@ -5,27 +5,22 @@
         "sort-packages": true
     },
     "require": {
-        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
-        "codeception/codeception": "~2.3.4",
-        "consolidation/robo": "^1.0.0",
-        "henrikbjorn/lurker": "^1.2",
         "magento/magento2-functional-testing-framework": "1.0.0",
-        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
-        "vlucas/phpdotenv": "~2.4"
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-checkout": "1.0.0",
-        "magento/magento2-functional-test-module-payment": "1.0.0"
+        "magento/magento2-functional-test-module-checkout": "1.0.0-dev",
+        "magento/magento2-functional-test-module-payment": "1.0.0-dev"
     },
     "type": "magento2-test-module",
-    "version": "1.0.0",
+    "version": "1.0.0-dev",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
         "psr-4": {
-            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
+            "Magento\\OfflinePayments\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/OfflineShipping/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/OfflineShipping/composer.json
index a3b3a786899..d3d3ef506a6 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/OfflineShipping/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/OfflineShipping/composer.json
@@ -5,34 +5,29 @@
         "sort-packages": true
     },
     "require": {
-        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
-        "codeception/codeception": "~2.3.4",
-        "consolidation/robo": "^1.0.0",
-        "henrikbjorn/lurker": "^1.2",
         "magento/magento2-functional-testing-framework": "1.0.0",
-        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
-        "vlucas/phpdotenv": "~2.4"
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-backend": "1.0.0",
-        "magento/magento2-functional-test-module-catalog": "1.0.0",
-        "magento/magento2-functional-test-module-config": "1.0.0",
-        "magento/magento2-functional-test-module-directory": "1.0.0",
-        "magento/magento2-functional-test-module-quote": "1.0.0",
-        "magento/magento2-functional-test-module-sales": "1.0.0",
-        "magento/magento2-functional-test-module-sales-rule": "1.0.0",
-        "magento/magento2-functional-test-module-shipping": "1.0.0",
-        "magento/magento2-functional-test-module-store": "1.0.0"
+        "magento/magento2-functional-test-module-backend": "1.0.0-dev",
+        "magento/magento2-functional-test-module-catalog": "1.0.0-dev",
+        "magento/magento2-functional-test-module-config": "1.0.0-dev",
+        "magento/magento2-functional-test-module-directory": "1.0.0-dev",
+        "magento/magento2-functional-test-module-quote": "1.0.0-dev",
+        "magento/magento2-functional-test-module-sales": "1.0.0-dev",
+        "magento/magento2-functional-test-module-sales-rule": "1.0.0-dev",
+        "magento/magento2-functional-test-module-shipping": "1.0.0-dev",
+        "magento/magento2-functional-test-module-store": "1.0.0-dev"
     },
     "type": "magento2-test-module",
-    "version": "1.0.0",
+    "version": "1.0.0-dev",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
         "psr-4": {
-            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
+            "Magento\\OfflineShipping\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/PageCache/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/PageCache/composer.json
index 47d5f78e378..4eed53f7def 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/PageCache/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/PageCache/composer.json
@@ -5,28 +5,23 @@
         "sort-packages": true
     },
     "require": {
-        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
-        "codeception/codeception": "~2.3.4",
-        "consolidation/robo": "^1.0.0",
-        "henrikbjorn/lurker": "^1.2",
         "magento/magento2-functional-testing-framework": "1.0.0",
-        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
-        "vlucas/phpdotenv": "~2.4"
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-backend": "1.0.0",
-        "magento/magento2-functional-test-module-config": "1.0.0",
-        "magento/magento2-functional-test-module-store": "1.0.0"
+        "magento/magento2-functional-test-module-backend": "1.0.0-dev",
+        "magento/magento2-functional-test-module-config": "1.0.0-dev",
+        "magento/magento2-functional-test-module-store": "1.0.0-dev"
     },
     "type": "magento2-test-module",
-    "version": "1.0.0",
+    "version": "1.0.0-dev",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
         "psr-4": {
-            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
+            "Magento\\PageCache\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Payment/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Payment/composer.json
index 575fde56a84..c275682aef4 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Payment/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Payment/composer.json
@@ -5,31 +5,26 @@
         "sort-packages": true
     },
     "require": {
-        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
-        "codeception/codeception": "~2.3.4",
-        "consolidation/robo": "^1.0.0",
-        "henrikbjorn/lurker": "^1.2",
         "magento/magento2-functional-testing-framework": "1.0.0",
-        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
-        "vlucas/phpdotenv": "~2.4"
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-checkout": "1.0.0",
-        "magento/magento2-functional-test-module-config": "1.0.0",
-        "magento/magento2-functional-test-module-directory": "1.0.0",
-        "magento/magento2-functional-test-module-quote": "1.0.0",
-        "magento/magento2-functional-test-module-sales": "1.0.0",
-        "magento/magento2-functional-test-module-store": "1.0.0"
+        "magento/magento2-functional-test-module-checkout": "1.0.0-dev",
+        "magento/magento2-functional-test-module-config": "1.0.0-dev",
+        "magento/magento2-functional-test-module-directory": "1.0.0-dev",
+        "magento/magento2-functional-test-module-quote": "1.0.0-dev",
+        "magento/magento2-functional-test-module-sales": "1.0.0-dev",
+        "magento/magento2-functional-test-module-store": "1.0.0-dev"
     },
     "type": "magento2-test-module",
-    "version": "1.0.0",
+    "version": "1.0.0-dev",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
         "psr-4": {
-            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
+            "Magento\\Payment\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Paypal/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Paypal/composer.json
index ad62287e584..6de5394fe90 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Paypal/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Paypal/composer.json
@@ -5,41 +5,36 @@
         "sort-packages": true
     },
     "require": {
-        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
-        "codeception/codeception": "~2.3.4",
-        "consolidation/robo": "^1.0.0",
-        "henrikbjorn/lurker": "^1.2",
         "magento/magento2-functional-testing-framework": "1.0.0",
-        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
-        "vlucas/phpdotenv": "~2.4"
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-backend": "1.0.0",
-        "magento/magento2-functional-test-module-catalog": "1.0.0",
-        "magento/magento2-functional-test-module-checkout": "1.0.0",
-        "magento/magento2-functional-test-module-config": "1.0.0",
-        "magento/magento2-functional-test-module-customer": "1.0.0",
-        "magento/magento2-functional-test-module-directory": "1.0.0",
-        "magento/magento2-functional-test-module-eav": "1.0.0",
-        "magento/magento2-functional-test-module-instant-purchase": "1.0.0",
-        "magento/magento2-functional-test-module-payment": "1.0.0",
-        "magento/magento2-functional-test-module-quote": "1.0.0",
-        "magento/magento2-functional-test-module-sales": "1.0.0",
-        "magento/magento2-functional-test-module-store": "1.0.0",
-        "magento/magento2-functional-test-module-tax": "1.0.0",
-        "magento/magento2-functional-test-module-theme": "1.0.0",
-        "magento/magento2-functional-test-module-ui": "1.0.0",
-        "magento/magento2-functional-test-module-vault": "1.0.0"
+        "magento/magento2-functional-test-module-backend": "1.0.0-dev",
+        "magento/magento2-functional-test-module-catalog": "1.0.0-dev",
+        "magento/magento2-functional-test-module-checkout": "1.0.0-dev",
+        "magento/magento2-functional-test-module-config": "1.0.0-dev",
+        "magento/magento2-functional-test-module-customer": "1.0.0-dev",
+        "magento/magento2-functional-test-module-directory": "1.0.0-dev",
+        "magento/magento2-functional-test-module-eav": "1.0.0-dev",
+        "magento/magento2-functional-test-module-instant-purchase": "1.0.0-dev",
+        "magento/magento2-functional-test-module-payment": "1.0.0-dev",
+        "magento/magento2-functional-test-module-quote": "1.0.0-dev",
+        "magento/magento2-functional-test-module-sales": "1.0.0-dev",
+        "magento/magento2-functional-test-module-store": "1.0.0-dev",
+        "magento/magento2-functional-test-module-tax": "1.0.0-dev",
+        "magento/magento2-functional-test-module-theme": "1.0.0-dev",
+        "magento/magento2-functional-test-module-ui": "1.0.0-dev",
+        "magento/magento2-functional-test-module-vault": "1.0.0-dev"
     },
     "type": "magento2-test-module",
-    "version": "1.0.0",
+    "version": "1.0.0-dev",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
         "psr-4": {
-            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
+            "Magento\\Paypal\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Persistent/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Persistent/composer.json
index 790578527bf..ac984fed220 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Persistent/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Persistent/composer.json
@@ -5,31 +5,26 @@
         "sort-packages": true
     },
     "require": {
-        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
-        "codeception/codeception": "~2.3.4",
-        "consolidation/robo": "^1.0.0",
-        "henrikbjorn/lurker": "^1.2",
         "magento/magento2-functional-testing-framework": "1.0.0",
-        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
-        "vlucas/phpdotenv": "~2.4"
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-checkout": "1.0.0",
-        "magento/magento2-functional-test-module-cron": "1.0.0",
-        "magento/magento2-functional-test-module-customer": "1.0.0",
-        "magento/magento2-functional-test-module-page-cache": "1.0.0",
-        "magento/magento2-functional-test-module-quote": "1.0.0",
-        "magento/magento2-functional-test-module-store": "1.0.0"
+        "magento/magento2-functional-test-module-checkout": "1.0.0-dev",
+        "magento/magento2-functional-test-module-cron": "1.0.0-dev",
+        "magento/magento2-functional-test-module-customer": "1.0.0-dev",
+        "magento/magento2-functional-test-module-page-cache": "1.0.0-dev",
+        "magento/magento2-functional-test-module-quote": "1.0.0-dev",
+        "magento/magento2-functional-test-module-store": "1.0.0-dev"
     },
     "type": "magento2-test-module",
-    "version": "1.0.0",
+    "version": "1.0.0-dev",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
         "psr-4": {
-            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
+            "Magento\\Persistent\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ProductAlert/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ProductAlert/composer.json
index 8eba5c0e098..cbc9c7f6b8f 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ProductAlert/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ProductAlert/composer.json
@@ -5,29 +5,24 @@
         "sort-packages": true
     },
     "require": {
-        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
-        "codeception/codeception": "~2.3.4",
-        "consolidation/robo": "^1.0.0",
-        "henrikbjorn/lurker": "^1.2",
         "magento/magento2-functional-testing-framework": "1.0.0",
-        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
-        "vlucas/phpdotenv": "~2.4"
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-backend": "1.0.0",
-        "magento/magento2-functional-test-module-catalog": "1.0.0",
-        "magento/magento2-functional-test-module-customer": "1.0.0",
-        "magento/magento2-functional-test-module-store": "1.0.0"
+        "magento/magento2-functional-test-module-backend": "1.0.0-dev",
+        "magento/magento2-functional-test-module-catalog": "1.0.0-dev",
+        "magento/magento2-functional-test-module-customer": "1.0.0-dev",
+        "magento/magento2-functional-test-module-store": "1.0.0-dev"
     },
     "type": "magento2-test-module",
-    "version": "1.0.0",
+    "version": "1.0.0-dev",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
         "psr-4": {
-            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
+            "Magento\\ProductAlert\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ProductVideo/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ProductVideo/composer.json
index f06f59c18ab..62efdd81835 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ProductVideo/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ProductVideo/composer.json
@@ -5,30 +5,25 @@
         "sort-packages": true
     },
     "require": {
-        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
-        "codeception/codeception": "~2.3.4",
-        "consolidation/robo": "^1.0.0",
-        "henrikbjorn/lurker": "^1.2",
         "magento/magento2-functional-testing-framework": "1.0.0",
-        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
-        "vlucas/phpdotenv": "~2.4"
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-backend": "1.0.0",
-        "magento/magento2-functional-test-module-catalog": "1.0.0",
-        "magento/magento2-functional-test-module-eav": "1.0.0",
-        "magento/magento2-functional-test-module-media-storage": "1.0.0",
-        "magento/magento2-functional-test-module-store": "1.0.0"
+        "magento/magento2-functional-test-module-backend": "1.0.0-dev",
+        "magento/magento2-functional-test-module-catalog": "1.0.0-dev",
+        "magento/magento2-functional-test-module-eav": "1.0.0-dev",
+        "magento/magento2-functional-test-module-media-storage": "1.0.0-dev",
+        "magento/magento2-functional-test-module-store": "1.0.0-dev"
     },
     "type": "magento2-test-module",
-    "version": "1.0.0",
+    "version": "1.0.0-dev",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
         "psr-4": {
-            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
+            "Magento\\ProductVideo\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Quote/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Quote/composer.json
index 0b114e03a36..a5d5c9553d3 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Quote/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Quote/composer.json
@@ -5,39 +5,34 @@
         "sort-packages": true
     },
     "require": {
-        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
-        "codeception/codeception": "~2.3.4",
-        "consolidation/robo": "^1.0.0",
-        "henrikbjorn/lurker": "^1.2",
         "magento/magento2-functional-testing-framework": "1.0.0",
-        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
-        "vlucas/phpdotenv": "~2.4"
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-authorization": "1.0.0",
-        "magento/magento2-functional-test-module-backend": "1.0.0",
-        "magento/magento2-functional-test-module-catalog": "1.0.0",
-        "magento/magento2-functional-test-module-catalog-inventory": "1.0.0",
-        "magento/magento2-functional-test-module-checkout": "1.0.0",
-        "magento/magento2-functional-test-module-customer": "1.0.0",
-        "magento/magento2-functional-test-module-directory": "1.0.0",
-        "magento/magento2-functional-test-module-eav": "1.0.0",
-        "magento/magento2-functional-test-module-payment": "1.0.0",
-        "magento/magento2-functional-test-module-sales": "1.0.0",
-        "magento/magento2-functional-test-module-sales-sequence": "1.0.0",
-        "magento/magento2-functional-test-module-shipping": "1.0.0",
-        "magento/magento2-functional-test-module-store": "1.0.0",
-        "magento/magento2-functional-test-module-tax": "1.0.0"
+        "magento/magento2-functional-test-module-authorization": "1.0.0-dev",
+        "magento/magento2-functional-test-module-backend": "1.0.0-dev",
+        "magento/magento2-functional-test-module-catalog": "1.0.0-dev",
+        "magento/magento2-functional-test-module-catalog-inventory": "1.0.0-dev",
+        "magento/magento2-functional-test-module-checkout": "1.0.0-dev",
+        "magento/magento2-functional-test-module-customer": "1.0.0-dev",
+        "magento/magento2-functional-test-module-directory": "1.0.0-dev",
+        "magento/magento2-functional-test-module-eav": "1.0.0-dev",
+        "magento/magento2-functional-test-module-payment": "1.0.0-dev",
+        "magento/magento2-functional-test-module-sales": "1.0.0-dev",
+        "magento/magento2-functional-test-module-sales-sequence": "1.0.0-dev",
+        "magento/magento2-functional-test-module-shipping": "1.0.0-dev",
+        "magento/magento2-functional-test-module-store": "1.0.0-dev",
+        "magento/magento2-functional-test-module-tax": "1.0.0-dev"
     },
     "type": "magento2-test-module",
-    "version": "1.0.0",
+    "version": "1.0.0-dev",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
         "psr-4": {
-            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
+            "Magento\\Quote\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/QuoteAnalytics/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/QuoteAnalytics/composer.json
index b86c40e02fe..560dd1838ef 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/QuoteAnalytics/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/QuoteAnalytics/composer.json
@@ -3,40 +3,29 @@
     "description": "Magento 2 Acceptance Test Module Quote Analytics",
     "repositories": [
         {
-            "type" : "composer",
-            "url" : "https://repo.magento.com/"
+            "type": "composer",
+            "url": "https://repo.magento.com/"
         }
     ],
+    "config": {
+        "sort-packages": true
+    },
     "require": {
-        "php": "~7.0",
-        "codeception/codeception": "2.2|2.3",
-        "allure-framework/allure-codeception": "dev-master",
-        "consolidation/robo": "^1.0.0",
-        "henrikbjorn/lurker": "^1.2",
-        "vlucas/phpdotenv": "~2.4",
-        "magento/magento2-functional-testing-framework": "dev-develop"
+        "magento/magento2-functional-testing-framework": "1.0.0",
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-quote": "dev-master"
+        "magento/magento2-functional-test-module-quote": "1.0.0-dev"
     },
     "type": "magento2-test-module",
-    "version": "dev-master",
+    "version": "1.0.0-dev",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
-        "psr-0": {
-            "Yandex": "vendor/allure-framework/allure-codeception/src/"
-        },
         "psr-4": {
-            "Magento\\FunctionalTestingFramework\\": [
-                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
-            ],
-            "Magento\\FunctionalTest\\": [
-                "tests/functional/Magento/FunctionalTest",
-                "generated/Magento/FunctionalTest"
-            ]
+            "Magento\\QuoteAnalytics\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Reports/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Reports/composer.json
index 8c2b3d0b174..d2b61833ece 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Reports/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Reports/composer.json
@@ -5,41 +5,36 @@
         "sort-packages": true
     },
     "require": {
-        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
-        "codeception/codeception": "~2.3.4",
-        "consolidation/robo": "^1.0.0",
-        "henrikbjorn/lurker": "^1.2",
         "magento/magento2-functional-testing-framework": "1.0.0",
-        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
-        "vlucas/phpdotenv": "~2.4"
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-backend": "1.0.0",
-        "magento/magento2-functional-test-module-catalog": "1.0.0",
-        "magento/magento2-functional-test-module-catalog-inventory": "1.0.0",
-        "magento/magento2-functional-test-module-cms": "1.0.0",
-        "magento/magento2-functional-test-module-config": "1.0.0",
-        "magento/magento2-functional-test-module-customer": "1.0.0",
-        "magento/magento2-functional-test-module-downloadable": "1.0.0",
-        "magento/magento2-functional-test-module-eav": "1.0.0",
-        "magento/magento2-functional-test-module-quote": "1.0.0",
-        "magento/magento2-functional-test-module-review": "1.0.0",
-        "magento/magento2-functional-test-module-sales": "1.0.0",
-        "magento/magento2-functional-test-module-sales-rule": "1.0.0",
-        "magento/magento2-functional-test-module-store": "1.0.0",
-        "magento/magento2-functional-test-module-tax": "1.0.0",
-        "magento/magento2-functional-test-module-widget": "1.0.0",
-        "magento/magento2-functional-test-module-wishlist": "1.0.0"
+        "magento/magento2-functional-test-module-backend": "1.0.0-dev",
+        "magento/magento2-functional-test-module-catalog": "1.0.0-dev",
+        "magento/magento2-functional-test-module-catalog-inventory": "1.0.0-dev",
+        "magento/magento2-functional-test-module-cms": "1.0.0-dev",
+        "magento/magento2-functional-test-module-config": "1.0.0-dev",
+        "magento/magento2-functional-test-module-customer": "1.0.0-dev",
+        "magento/magento2-functional-test-module-downloadable": "1.0.0-dev",
+        "magento/magento2-functional-test-module-eav": "1.0.0-dev",
+        "magento/magento2-functional-test-module-quote": "1.0.0-dev",
+        "magento/magento2-functional-test-module-review": "1.0.0-dev",
+        "magento/magento2-functional-test-module-sales": "1.0.0-dev",
+        "magento/magento2-functional-test-module-sales-rule": "1.0.0-dev",
+        "magento/magento2-functional-test-module-store": "1.0.0-dev",
+        "magento/magento2-functional-test-module-tax": "1.0.0-dev",
+        "magento/magento2-functional-test-module-widget": "1.0.0-dev",
+        "magento/magento2-functional-test-module-wishlist": "1.0.0-dev"
     },
     "type": "magento2-test-module",
-    "version": "1.0.0",
+    "version": "1.0.0-dev",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
         "psr-4": {
-            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
+            "Magento\\Reports\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/RequireJs/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/RequireJs/composer.json
index 7b15bff6f93..ef0b6c466e6 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/RequireJs/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/RequireJs/composer.json
@@ -5,23 +5,18 @@
         "sort-packages": true
     },
     "require": {
-        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
-        "codeception/codeception": "~2.3.4",
-        "consolidation/robo": "^1.0.0",
-        "henrikbjorn/lurker": "^1.2",
         "magento/magento2-functional-testing-framework": "1.0.0",
-        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
-        "vlucas/phpdotenv": "~2.4"
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "type": "magento2-test-module",
-    "version": "1.0.0",
+    "version": "1.0.0-dev",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
         "psr-4": {
-            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
+            "Magento\\RequireJs\\": ""
         }
     },
     "extra": {
@@ -31,5 +26,6 @@
                 "dev/tests/acceptance/tests/functional/Magento/FunctionalTest/RequireJs"
             ]
         ]
-    }
+    },
+    "suggest": null
 }
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Review/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Review/composer.json
index f63800abaf8..987d5159bca 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Review/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Review/composer.json
@@ -5,33 +5,28 @@
         "sort-packages": true
     },
     "require": {
-        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
-        "codeception/codeception": "~2.3.4",
-        "consolidation/robo": "^1.0.0",
-        "henrikbjorn/lurker": "^1.2",
         "magento/magento2-functional-testing-framework": "1.0.0",
-        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
-        "vlucas/phpdotenv": "~2.4"
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-backend": "1.0.0",
-        "magento/magento2-functional-test-module-catalog": "1.0.0",
-        "magento/magento2-functional-test-module-customer": "1.0.0",
-        "magento/magento2-functional-test-module-eav": "1.0.0",
-        "magento/magento2-functional-test-module-newsletter": "1.0.0",
-        "magento/magento2-functional-test-module-store": "1.0.0",
-        "magento/magento2-functional-test-module-theme": "1.0.0",
-        "magento/magento2-functional-test-module-ui": "1.0.0"
+        "magento/magento2-functional-test-module-backend": "1.0.0-dev",
+        "magento/magento2-functional-test-module-catalog": "1.0.0-dev",
+        "magento/magento2-functional-test-module-customer": "1.0.0-dev",
+        "magento/magento2-functional-test-module-eav": "1.0.0-dev",
+        "magento/magento2-functional-test-module-newsletter": "1.0.0-dev",
+        "magento/magento2-functional-test-module-store": "1.0.0-dev",
+        "magento/magento2-functional-test-module-theme": "1.0.0-dev",
+        "magento/magento2-functional-test-module-ui": "1.0.0-dev"
     },
     "type": "magento2-test-module",
-    "version": "1.0.0",
+    "version": "1.0.0-dev",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
         "psr-4": {
-            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
+            "Magento\\Review\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ReviewAnalytics/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ReviewAnalytics/composer.json
index 01772112b17..f6cbbd17193 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ReviewAnalytics/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ReviewAnalytics/composer.json
@@ -3,40 +3,29 @@
     "description": "Magento 2 Acceptance Test Module Review Analytics",
     "repositories": [
         {
-            "type" : "composer",
-            "url" : "https://repo.magento.com/"
+            "type": "composer",
+            "url": "https://repo.magento.com/"
         }
     ],
+    "config": {
+        "sort-packages": true
+    },
     "require": {
-        "php": "~7.0",
-        "codeception/codeception": "2.2|2.3",
-        "allure-framework/allure-codeception": "dev-master",
-        "consolidation/robo": "^1.0.0",
-        "henrikbjorn/lurker": "^1.2",
-        "vlucas/phpdotenv": "~2.4",
-        "magento/magento2-functional-testing-framework": "dev-develop"
+        "magento/magento2-functional-testing-framework": "1.0.0",
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-review": "dev-master"
+        "magento/magento2-functional-test-module-review": "1.0.0-dev"
     },
     "type": "magento2-test-module",
-    "version": "dev-master",
+    "version": "1.0.0-dev",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
-        "psr-0": {
-            "Yandex": "vendor/allure-framework/allure-codeception/src/"
-        },
         "psr-4": {
-            "Magento\\FunctionalTestingFramework\\": [
-                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
-            ],
-            "Magento\\FunctionalTest\\": [
-                "tests/functional/Magento/FunctionalTest",
-                "generated/Magento/FunctionalTest"
-            ]
+            "Magento\\ReviewAnalytics\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Robots/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Robots/composer.json
index 77f360571a4..bbf0fc5edde 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Robots/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Robots/composer.json
@@ -5,26 +5,21 @@
         "sort-packages": true
     },
     "require": {
-        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
-        "codeception/codeception": "~2.3.4",
-        "consolidation/robo": "^1.0.0",
-        "henrikbjorn/lurker": "^1.2",
         "magento/magento2-functional-testing-framework": "1.0.0",
-        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
-        "vlucas/phpdotenv": "~2.4"
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-store": "1.0.0"
+        "magento/magento2-functional-test-module-store": "1.0.0-dev"
     },
     "type": "magento2-test-module",
-    "version": "1.0.0",
+    "version": "1.0.0-dev",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
         "psr-4": {
-            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
+            "Magento\\Robots\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Rss/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Rss/composer.json
index 2b166f4b048..1eb7d17a8a6 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Rss/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Rss/composer.json
@@ -5,28 +5,23 @@
         "sort-packages": true
     },
     "require": {
-        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
-        "codeception/codeception": "~2.3.4",
-        "consolidation/robo": "^1.0.0",
-        "henrikbjorn/lurker": "^1.2",
         "magento/magento2-functional-testing-framework": "1.0.0",
-        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
-        "vlucas/phpdotenv": "~2.4"
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-backend": "1.0.0",
-        "magento/magento2-functional-test-module-customer": "1.0.0",
-        "magento/magento2-functional-test-module-store": "1.0.0"
+        "magento/magento2-functional-test-module-backend": "1.0.0-dev",
+        "magento/magento2-functional-test-module-customer": "1.0.0-dev",
+        "magento/magento2-functional-test-module-store": "1.0.0-dev"
     },
     "type": "magento2-test-module",
-    "version": "1.0.0",
+    "version": "1.0.0-dev",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
         "psr-4": {
-            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
+            "Magento\\Rss\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Rule/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Rule/composer.json
index d6d98a82234..cc33ad7c9fa 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Rule/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Rule/composer.json
@@ -5,29 +5,24 @@
         "sort-packages": true
     },
     "require": {
-        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
-        "codeception/codeception": "~2.3.4",
-        "consolidation/robo": "^1.0.0",
-        "henrikbjorn/lurker": "^1.2",
         "magento/magento2-functional-testing-framework": "1.0.0",
-        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
-        "vlucas/phpdotenv": "~2.4"
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-backend": "1.0.0",
-        "magento/magento2-functional-test-module-catalog": "1.0.0",
-        "magento/magento2-functional-test-module-eav": "1.0.0",
-        "magento/magento2-functional-test-module-store": "1.0.0"
+        "magento/magento2-functional-test-module-backend": "1.0.0-dev",
+        "magento/magento2-functional-test-module-catalog": "1.0.0-dev",
+        "magento/magento2-functional-test-module-eav": "1.0.0-dev",
+        "magento/magento2-functional-test-module-store": "1.0.0-dev"
     },
     "type": "magento2-test-module",
-    "version": "1.0.0",
+    "version": "1.0.0-dev",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
         "psr-4": {
-            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
+            "Magento\\Rule\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/composer.json
index e082d00d109..a33c0c8171e 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/composer.json
@@ -5,48 +5,43 @@
         "sort-packages": true
     },
     "require": {
-        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
-        "codeception/codeception": "~2.3.4",
-        "consolidation/robo": "^1.0.0",
-        "henrikbjorn/lurker": "^1.2",
         "magento/magento2-functional-testing-framework": "1.0.0",
-        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
-        "vlucas/phpdotenv": "~2.4"
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-authorization": "1.0.0",
-        "magento/magento2-functional-test-module-backend": "1.0.0",
-        "magento/magento2-functional-test-module-catalog": "1.0.0",
-        "magento/magento2-functional-test-module-catalog-inventory": "1.0.0",
-        "magento/magento2-functional-test-module-checkout": "1.0.0",
-        "magento/magento2-functional-test-module-config": "1.0.0",
-        "magento/magento2-functional-test-module-customer": "1.0.0",
-        "magento/magento2-functional-test-module-directory": "1.0.0",
-        "magento/magento2-functional-test-module-eav": "1.0.0",
-        "magento/magento2-functional-test-module-gift-message": "1.0.0",
-        "magento/magento2-functional-test-module-media-storage": "1.0.0",
-        "magento/magento2-functional-test-module-payment": "1.0.0",
-        "magento/magento2-functional-test-module-quote": "1.0.0",
-        "magento/magento2-functional-test-module-reports": "1.0.0",
-        "magento/magento2-functional-test-module-sales-rule": "1.0.0",
-        "magento/magento2-functional-test-module-sales-sequence": "1.0.0",
-        "magento/magento2-functional-test-module-shipping": "1.0.0",
-        "magento/magento2-functional-test-module-store": "1.0.0",
-        "magento/magento2-functional-test-module-tax": "1.0.0",
-        "magento/magento2-functional-test-module-theme": "1.0.0",
-        "magento/magento2-functional-test-module-ui": "1.0.0",
-        "magento/magento2-functional-test-module-widget": "1.0.0",
-        "magento/magento2-functional-test-module-wishlist": "1.0.0"
+        "magento/magento2-functional-test-module-authorization": "1.0.0-dev",
+        "magento/magento2-functional-test-module-backend": "1.0.0-dev",
+        "magento/magento2-functional-test-module-catalog": "1.0.0-dev",
+        "magento/magento2-functional-test-module-catalog-inventory": "1.0.0-dev",
+        "magento/magento2-functional-test-module-checkout": "1.0.0-dev",
+        "magento/magento2-functional-test-module-config": "1.0.0-dev",
+        "magento/magento2-functional-test-module-customer": "1.0.0-dev",
+        "magento/magento2-functional-test-module-directory": "1.0.0-dev",
+        "magento/magento2-functional-test-module-eav": "1.0.0-dev",
+        "magento/magento2-functional-test-module-gift-message": "1.0.0-dev",
+        "magento/magento2-functional-test-module-media-storage": "1.0.0-dev",
+        "magento/magento2-functional-test-module-payment": "1.0.0-dev",
+        "magento/magento2-functional-test-module-quote": "1.0.0-dev",
+        "magento/magento2-functional-test-module-reports": "1.0.0-dev",
+        "magento/magento2-functional-test-module-sales-rule": "1.0.0-dev",
+        "magento/magento2-functional-test-module-sales-sequence": "1.0.0-dev",
+        "magento/magento2-functional-test-module-shipping": "1.0.0-dev",
+        "magento/magento2-functional-test-module-store": "1.0.0-dev",
+        "magento/magento2-functional-test-module-tax": "1.0.0-dev",
+        "magento/magento2-functional-test-module-theme": "1.0.0-dev",
+        "magento/magento2-functional-test-module-ui": "1.0.0-dev",
+        "magento/magento2-functional-test-module-widget": "1.0.0-dev",
+        "magento/magento2-functional-test-module-wishlist": "1.0.0-dev"
     },
     "type": "magento2-test-module",
-    "version": "1.0.0",
+    "version": "1.0.0-dev",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
         "psr-4": {
-            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
+            "Magento\\Sales\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesAnalytics/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesAnalytics/composer.json
index afba02c119a..1b92df693dc 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesAnalytics/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesAnalytics/composer.json
@@ -3,40 +3,29 @@
     "description": "Magento 2 Acceptance Test Module Sales Analytics",
     "repositories": [
         {
-            "type" : "composer",
-            "url" : "https://repo.magento.com/"
+            "type": "composer",
+            "url": "https://repo.magento.com/"
         }
     ],
+    "config": {
+        "sort-packages": true
+    },
     "require": {
-        "php": "~7.0",
-        "codeception/codeception": "2.2|2.3",
-        "allure-framework/allure-codeception": "dev-master",
-        "consolidation/robo": "^1.0.0",
-        "henrikbjorn/lurker": "^1.2",
-        "vlucas/phpdotenv": "~2.4",
-        "magento/magento2-functional-testing-framework": "dev-develop"
+        "magento/magento2-functional-testing-framework": "1.0.0",
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-sales": "dev-master"
+        "magento/magento2-functional-test-module-sales": "1.0.0-dev"
     },
     "type": "magento2-test-module",
-    "version": "dev-master",
+    "version": "1.0.0-dev",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
-        "psr-0": {
-            "Yandex": "vendor/allure-framework/allure-codeception/src/"
-        },
         "psr-4": {
-            "Magento\\FunctionalTestingFramework\\": [
-                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
-            ],
-            "Magento\\FunctionalTest\\": [
-                "tests/functional/Magento/FunctionalTest",
-                "generated/Magento/FunctionalTest"
-            ]
+            "Magento\\SalesAnalytics\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesInventory/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesInventory/composer.json
index 90cb8ae45ff..dadb08dac12 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesInventory/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesInventory/composer.json
@@ -5,29 +5,24 @@
         "sort-packages": true
     },
     "require": {
-        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
-        "codeception/codeception": "~2.3.4",
-        "consolidation/robo": "^1.0.0",
-        "henrikbjorn/lurker": "^1.2",
         "magento/magento2-functional-testing-framework": "1.0.0",
-        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
-        "vlucas/phpdotenv": "~2.4"
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-catalog": "1.0.0",
-        "magento/magento2-functional-test-module-catalog-inventory": "1.0.0",
-        "magento/magento2-functional-test-module-sales": "1.0.0",
-        "magento/magento2-functional-test-module-store": "1.0.0"
+        "magento/magento2-functional-test-module-catalog": "1.0.0-dev",
+        "magento/magento2-functional-test-module-catalog-inventory": "1.0.0-dev",
+        "magento/magento2-functional-test-module-sales": "1.0.0-dev",
+        "magento/magento2-functional-test-module-store": "1.0.0-dev"
     },
     "type": "magento2-test-module",
-    "version": "1.0.0",
+    "version": "1.0.0-dev",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
         "psr-4": {
-            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
+            "Magento\\SalesInventory\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesRule/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesRule/composer.json
index b721a3694b1..c6591bd79be 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesRule/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesRule/composer.json
@@ -5,41 +5,36 @@
         "sort-packages": true
     },
     "require": {
-        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
-        "codeception/codeception": "~2.3.4",
-        "consolidation/robo": "^1.0.0",
-        "henrikbjorn/lurker": "^1.2",
         "magento/magento2-functional-testing-framework": "1.0.0",
-        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
-        "vlucas/phpdotenv": "~2.4"
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-backend": "1.0.0",
-        "magento/magento2-functional-test-module-catalog": "1.0.0",
-        "magento/magento2-functional-test-module-catalog-rule": "1.0.0",
-        "magento/magento2-functional-test-module-config": "1.0.0",
-        "magento/magento2-functional-test-module-customer": "1.0.0",
-        "magento/magento2-functional-test-module-directory": "1.0.0",
-        "magento/magento2-functional-test-module-eav": "1.0.0",
-        "magento/magento2-functional-test-module-payment": "1.0.0",
-        "magento/magento2-functional-test-module-quote": "1.0.0",
-        "magento/magento2-functional-test-module-reports": "1.0.0",
-        "magento/magento2-functional-test-module-rule": "1.0.0",
-        "magento/magento2-functional-test-module-sales": "1.0.0",
-        "magento/magento2-functional-test-module-shipping": "1.0.0",
-        "magento/magento2-functional-test-module-store": "1.0.0",
-        "magento/magento2-functional-test-module-ui": "1.0.0",
-        "magento/magento2-functional-test-module-widget": "1.0.0"
+        "magento/magento2-functional-test-module-backend": "1.0.0-dev",
+        "magento/magento2-functional-test-module-catalog": "1.0.0-dev",
+        "magento/magento2-functional-test-module-catalog-rule": "1.0.0-dev",
+        "magento/magento2-functional-test-module-config": "1.0.0-dev",
+        "magento/magento2-functional-test-module-customer": "1.0.0-dev",
+        "magento/magento2-functional-test-module-directory": "1.0.0-dev",
+        "magento/magento2-functional-test-module-eav": "1.0.0-dev",
+        "magento/magento2-functional-test-module-payment": "1.0.0-dev",
+        "magento/magento2-functional-test-module-quote": "1.0.0-dev",
+        "magento/magento2-functional-test-module-reports": "1.0.0-dev",
+        "magento/magento2-functional-test-module-rule": "1.0.0-dev",
+        "magento/magento2-functional-test-module-sales": "1.0.0-dev",
+        "magento/magento2-functional-test-module-shipping": "1.0.0-dev",
+        "magento/magento2-functional-test-module-store": "1.0.0-dev",
+        "magento/magento2-functional-test-module-ui": "1.0.0-dev",
+        "magento/magento2-functional-test-module-widget": "1.0.0-dev"
     },
     "type": "magento2-test-module",
-    "version": "1.0.0",
+    "version": "1.0.0-dev",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
         "psr-4": {
-            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
+            "Magento\\SalesRule\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesSequence/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesSequence/composer.json
index 3d5819045d2..81c2f16f344 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesSequence/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesSequence/composer.json
@@ -5,23 +5,18 @@
         "sort-packages": true
     },
     "require": {
-        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
-        "codeception/codeception": "~2.3.4",
-        "consolidation/robo": "^1.0.0",
-        "henrikbjorn/lurker": "^1.2",
         "magento/magento2-functional-testing-framework": "1.0.0",
-        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
-        "vlucas/phpdotenv": "~2.4"
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "type": "magento2-test-module",
-    "version": "1.0.0",
+    "version": "1.0.0-dev",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
         "psr-4": {
-            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
+            "Magento\\SalesSequence\\": ""
         }
     },
     "extra": {
@@ -31,5 +26,6 @@
                 "dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesSequence"
             ]
         ]
-    }
+    },
+    "suggest": null
 }
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleData/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleData/composer.json
index 4b3c2ca9c4e..80426872ef6 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleData/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleData/composer.json
@@ -5,23 +5,18 @@
         "sort-packages": true
     },
     "require": {
-        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
-        "codeception/codeception": "~2.3.4",
-        "consolidation/robo": "^1.0.0",
-        "henrikbjorn/lurker": "^1.2",
         "magento/magento2-functional-testing-framework": "1.0.0",
-        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
-        "vlucas/phpdotenv": "~2.4"
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "type": "magento2-test-module",
-    "version": "1.0.0",
+    "version": "1.0.0-dev",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
         "psr-4": {
-            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
+            "Magento\\SampleData\\": ""
         }
     },
     "extra": {
@@ -31,5 +26,6 @@
                 "dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleData"
             ]
         ]
-    }
+    },
+    "suggest": null
 }
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Search/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Search/composer.json
index fdaefcc362b..446f4303e76 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Search/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Search/composer.json
@@ -5,30 +5,25 @@
         "sort-packages": true
     },
     "require": {
-        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
-        "codeception/codeception": "~2.3.4",
-        "consolidation/robo": "^1.0.0",
-        "henrikbjorn/lurker": "^1.2",
         "magento/magento2-functional-testing-framework": "1.0.0",
-        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
-        "vlucas/phpdotenv": "~2.4"
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-backend": "1.0.0",
-        "magento/magento2-functional-test-module-catalog-search": "1.0.0",
-        "magento/magento2-functional-test-module-reports": "1.0.0",
-        "magento/magento2-functional-test-module-store": "1.0.0",
-        "magento/magento2-functional-test-module-ui": "1.0.0"
+        "magento/magento2-functional-test-module-backend": "1.0.0-dev",
+        "magento/magento2-functional-test-module-catalog-search": "1.0.0-dev",
+        "magento/magento2-functional-test-module-reports": "1.0.0-dev",
+        "magento/magento2-functional-test-module-store": "1.0.0-dev",
+        "magento/magento2-functional-test-module-ui": "1.0.0-dev"
     },
     "type": "magento2-test-module",
-    "version": "1.0.0",
+    "version": "1.0.0-dev",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
         "psr-4": {
-            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
+            "Magento\\Search\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Security/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Security/composer.json
index 17380dda334..4350ca6810b 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Security/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Security/composer.json
@@ -5,27 +5,22 @@
         "sort-packages": true
     },
     "require": {
-        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
-        "codeception/codeception": "~2.3.4",
-        "consolidation/robo": "^1.0.0",
-        "henrikbjorn/lurker": "^1.2",
         "magento/magento2-functional-testing-framework": "1.0.0",
-        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
-        "vlucas/phpdotenv": "~2.4"
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-backend": "1.0.0",
-        "magento/magento2-functional-test-module-store": "1.0.0"
+        "magento/magento2-functional-test-module-backend": "1.0.0-dev",
+        "magento/magento2-functional-test-module-store": "1.0.0-dev"
     },
     "type": "magento2-test-module",
-    "version": "1.0.0",
+    "version": "1.0.0-dev",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
         "psr-4": {
-            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
+            "Magento\\Security\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SendFriend/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SendFriend/composer.json
index caea753b1a2..c93c457816d 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SendFriend/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SendFriend/composer.json
@@ -5,28 +5,23 @@
         "sort-packages": true
     },
     "require": {
-        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
-        "codeception/codeception": "~2.3.4",
-        "consolidation/robo": "^1.0.0",
-        "henrikbjorn/lurker": "^1.2",
         "magento/magento2-functional-testing-framework": "1.0.0",
-        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
-        "vlucas/phpdotenv": "~2.4"
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-catalog": "1.0.0",
-        "magento/magento2-functional-test-module-customer": "1.0.0",
-        "magento/magento2-functional-test-module-store": "1.0.0"
+        "magento/magento2-functional-test-module-catalog": "1.0.0-dev",
+        "magento/magento2-functional-test-module-customer": "1.0.0-dev",
+        "magento/magento2-functional-test-module-store": "1.0.0-dev"
     },
     "type": "magento2-test-module",
-    "version": "1.0.0",
+    "version": "1.0.0-dev",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
         "psr-4": {
-            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
+            "Magento\\SendFriend\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Shipping/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Shipping/composer.json
index 18a2ba3d285..cd82c92da19 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Shipping/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Shipping/composer.json
@@ -5,38 +5,33 @@
         "sort-packages": true
     },
     "require": {
-        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
-        "codeception/codeception": "~2.3.4",
-        "consolidation/robo": "^1.0.0",
-        "henrikbjorn/lurker": "^1.2",
         "magento/magento2-functional-testing-framework": "1.0.0",
-        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
-        "vlucas/phpdotenv": "~2.4"
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-backend": "1.0.0",
-        "magento/magento2-functional-test-module-catalog": "1.0.0",
-        "magento/magento2-functional-test-module-catalog-inventory": "1.0.0",
-        "magento/magento2-functional-test-module-contact": "1.0.0",
-        "magento/magento2-functional-test-module-customer": "1.0.0",
-        "magento/magento2-functional-test-module-directory": "1.0.0",
-        "magento/magento2-functional-test-module-payment": "1.0.0",
-        "magento/magento2-functional-test-module-quote": "1.0.0",
-        "magento/magento2-functional-test-module-sales": "1.0.0",
-        "magento/magento2-functional-test-module-store": "1.0.0",
-        "magento/magento2-functional-test-module-tax": "1.0.0",
-        "magento/magento2-functional-test-module-ui": "1.0.0",
-        "magento/magento2-functional-test-module-user": "1.0.0"
+        "magento/magento2-functional-test-module-backend": "1.0.0-dev",
+        "magento/magento2-functional-test-module-catalog": "1.0.0-dev",
+        "magento/magento2-functional-test-module-catalog-inventory": "1.0.0-dev",
+        "magento/magento2-functional-test-module-contact": "1.0.0-dev",
+        "magento/magento2-functional-test-module-customer": "1.0.0-dev",
+        "magento/magento2-functional-test-module-directory": "1.0.0-dev",
+        "magento/magento2-functional-test-module-payment": "1.0.0-dev",
+        "magento/magento2-functional-test-module-quote": "1.0.0-dev",
+        "magento/magento2-functional-test-module-sales": "1.0.0-dev",
+        "magento/magento2-functional-test-module-store": "1.0.0-dev",
+        "magento/magento2-functional-test-module-tax": "1.0.0-dev",
+        "magento/magento2-functional-test-module-ui": "1.0.0-dev",
+        "magento/magento2-functional-test-module-user": "1.0.0-dev"
     },
     "type": "magento2-test-module",
-    "version": "1.0.0",
+    "version": "1.0.0-dev",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
         "psr-4": {
-            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
+            "Magento\\Shipping\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sitemap/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sitemap/composer.json
index d5453bdecfe..ef33b62ac5e 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sitemap/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sitemap/composer.json
@@ -5,34 +5,29 @@
         "sort-packages": true
     },
     "require": {
-        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
-        "codeception/codeception": "~2.3.4",
-        "consolidation/robo": "^1.0.0",
-        "henrikbjorn/lurker": "^1.2",
         "magento/magento2-functional-testing-framework": "1.0.0",
-        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
-        "vlucas/phpdotenv": "~2.4"
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-backend": "1.0.0",
-        "magento/magento2-functional-test-module-catalog": "1.0.0",
-        "magento/magento2-functional-test-module-catalog-url-rewrite": "1.0.0",
-        "magento/magento2-functional-test-module-cms": "1.0.0",
-        "magento/magento2-functional-test-module-config": "1.0.0",
-        "magento/magento2-functional-test-module-eav": "1.0.0",
-        "magento/magento2-functional-test-module-media-storage": "1.0.0",
-        "magento/magento2-functional-test-module-robots": "1.0.0",
-        "magento/magento2-functional-test-module-store": "1.0.0"
+        "magento/magento2-functional-test-module-backend": "1.0.0-dev",
+        "magento/magento2-functional-test-module-catalog": "1.0.0-dev",
+        "magento/magento2-functional-test-module-catalog-url-rewrite": "1.0.0-dev",
+        "magento/magento2-functional-test-module-cms": "1.0.0-dev",
+        "magento/magento2-functional-test-module-config": "1.0.0-dev",
+        "magento/magento2-functional-test-module-eav": "1.0.0-dev",
+        "magento/magento2-functional-test-module-media-storage": "1.0.0-dev",
+        "magento/magento2-functional-test-module-robots": "1.0.0-dev",
+        "magento/magento2-functional-test-module-store": "1.0.0-dev"
     },
     "type": "magento2-test-module",
-    "version": "1.0.0",
+    "version": "1.0.0-dev",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
         "psr-4": {
-            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
+            "Magento\\Sitemap\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/composer.json
index 39d3cb9d583..7e768c4b90e 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/composer.json
@@ -5,30 +5,25 @@
         "sort-packages": true
     },
     "require": {
-        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
-        "codeception/codeception": "~2.3.4",
-        "consolidation/robo": "^1.0.0",
-        "henrikbjorn/lurker": "^1.2",
         "magento/magento2-functional-testing-framework": "1.0.0",
-        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
-        "vlucas/phpdotenv": "~2.4"
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-catalog": "1.0.0",
-        "magento/magento2-functional-test-module-config": "1.0.0",
-        "magento/magento2-functional-test-module-directory": "1.0.0",
-        "magento/magento2-functional-test-module-media-storage": "1.0.0",
-        "magento/magento2-functional-test-module-ui": "1.0.0"
+        "magento/magento2-functional-test-module-catalog": "1.0.0-dev",
+        "magento/magento2-functional-test-module-config": "1.0.0-dev",
+        "magento/magento2-functional-test-module-directory": "1.0.0-dev",
+        "magento/magento2-functional-test-module-media-storage": "1.0.0-dev",
+        "magento/magento2-functional-test-module-ui": "1.0.0-dev"
     },
     "type": "magento2-test-module",
-    "version": "1.0.0",
+    "version": "1.0.0-dev",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
         "psr-4": {
-            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
+            "Magento\\Store\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Swagger/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Swagger/composer.json
index 8dc3c358c46..213b3d1bdff 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Swagger/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Swagger/composer.json
@@ -5,23 +5,18 @@
         "sort-packages": true
     },
     "require": {
-        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
-        "codeception/codeception": "~2.3.4",
-        "consolidation/robo": "^1.0.0",
-        "henrikbjorn/lurker": "^1.2",
         "magento/magento2-functional-testing-framework": "1.0.0",
-        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
-        "vlucas/phpdotenv": "~2.4"
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "type": "magento2-test-module",
-    "version": "1.0.0",
+    "version": "1.0.0-dev",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
         "psr-4": {
-            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
+            "Magento\\Swagger\\": ""
         }
     },
     "extra": {
@@ -31,5 +26,6 @@
                 "dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Swagger"
             ]
         ]
-    }
+    },
+    "suggest": null
 }
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Swatches/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Swatches/composer.json
index 79689cd586a..3cfab737aa4 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Swatches/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Swatches/composer.json
@@ -5,34 +5,29 @@
         "sort-packages": true
     },
     "require": {
-        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
-        "codeception/codeception": "~2.3.4",
-        "consolidation/robo": "^1.0.0",
-        "henrikbjorn/lurker": "^1.2",
         "magento/magento2-functional-testing-framework": "1.0.0",
-        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
-        "vlucas/phpdotenv": "~2.4"
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-backend": "1.0.0",
-        "magento/magento2-functional-test-module-catalog": "1.0.0",
-        "magento/magento2-functional-test-module-config": "1.0.0",
-        "magento/magento2-functional-test-module-configurable-product": "1.0.0",
-        "magento/magento2-functional-test-module-customer": "1.0.0",
-        "magento/magento2-functional-test-module-eav": "1.0.0",
-        "magento/magento2-functional-test-module-media-storage": "1.0.0",
-        "magento/magento2-functional-test-module-store": "1.0.0",
-        "magento/magento2-functional-test-module-theme": "1.0.0"
+        "magento/magento2-functional-test-module-backend": "1.0.0-dev",
+        "magento/magento2-functional-test-module-catalog": "1.0.0-dev",
+        "magento/magento2-functional-test-module-config": "1.0.0-dev",
+        "magento/magento2-functional-test-module-configurable-product": "1.0.0-dev",
+        "magento/magento2-functional-test-module-customer": "1.0.0-dev",
+        "magento/magento2-functional-test-module-eav": "1.0.0-dev",
+        "magento/magento2-functional-test-module-media-storage": "1.0.0-dev",
+        "magento/magento2-functional-test-module-store": "1.0.0-dev",
+        "magento/magento2-functional-test-module-theme": "1.0.0-dev"
     },
     "type": "magento2-test-module",
-    "version": "1.0.0",
+    "version": "1.0.0-dev",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
         "psr-4": {
-            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
+            "Magento\\Swatches\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SwatchesLayeredNavigation/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SwatchesLayeredNavigation/composer.json
index 16c1ef4eab8..bb7df9b687e 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SwatchesLayeredNavigation/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SwatchesLayeredNavigation/composer.json
@@ -5,23 +5,18 @@
         "sort-packages": true
     },
     "require": {
-        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
-        "codeception/codeception": "~2.3.4",
-        "consolidation/robo": "^1.0.0",
-        "henrikbjorn/lurker": "^1.2",
         "magento/magento2-functional-testing-framework": "1.0.0",
-        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
-        "vlucas/phpdotenv": "~2.4"
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "type": "magento2-test-module",
-    "version": "1.0.0",
+    "version": "1.0.0-dev",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
         "psr-4": {
-            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
+            "Magento\\SwatchesLayeredNavigation\\": ""
         }
     },
     "extra": {
@@ -31,5 +26,6 @@
                 "dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SwatchesLayeredNavigation"
             ]
         ]
-    }
+    },
+    "suggest": null
 }
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Tax/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Tax/composer.json
index 29578354bc9..cbcbbea1f25 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Tax/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Tax/composer.json
@@ -5,38 +5,33 @@
         "sort-packages": true
     },
     "require": {
-        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
-        "codeception/codeception": "~2.3.4",
-        "consolidation/robo": "^1.0.0",
-        "henrikbjorn/lurker": "^1.2",
         "magento/magento2-functional-testing-framework": "1.0.0",
-        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
-        "vlucas/phpdotenv": "~2.4"
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-backend": "1.0.0",
-        "magento/magento2-functional-test-module-catalog": "1.0.0",
-        "magento/magento2-functional-test-module-checkout": "1.0.0",
-        "magento/magento2-functional-test-module-config": "1.0.0",
-        "magento/magento2-functional-test-module-customer": "1.0.0",
-        "magento/magento2-functional-test-module-directory": "1.0.0",
-        "magento/magento2-functional-test-module-eav": "1.0.0",
-        "magento/magento2-functional-test-module-page-cache": "1.0.0",
-        "magento/magento2-functional-test-module-quote": "1.0.0",
-        "magento/magento2-functional-test-module-reports": "1.0.0",
-        "magento/magento2-functional-test-module-sales": "1.0.0",
-        "magento/magento2-functional-test-module-shipping": "1.0.0",
-        "magento/magento2-functional-test-module-store": "1.0.0"
+        "magento/magento2-functional-test-module-backend": "1.0.0-dev",
+        "magento/magento2-functional-test-module-catalog": "1.0.0-dev",
+        "magento/magento2-functional-test-module-checkout": "1.0.0-dev",
+        "magento/magento2-functional-test-module-config": "1.0.0-dev",
+        "magento/magento2-functional-test-module-customer": "1.0.0-dev",
+        "magento/magento2-functional-test-module-directory": "1.0.0-dev",
+        "magento/magento2-functional-test-module-eav": "1.0.0-dev",
+        "magento/magento2-functional-test-module-page-cache": "1.0.0-dev",
+        "magento/magento2-functional-test-module-quote": "1.0.0-dev",
+        "magento/magento2-functional-test-module-reports": "1.0.0-dev",
+        "magento/magento2-functional-test-module-sales": "1.0.0-dev",
+        "magento/magento2-functional-test-module-shipping": "1.0.0-dev",
+        "magento/magento2-functional-test-module-store": "1.0.0-dev"
     },
     "type": "magento2-test-module",
-    "version": "1.0.0",
+    "version": "1.0.0-dev",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
         "psr-4": {
-            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
+            "Magento\\Tax\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/TaxImportExport/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/TaxImportExport/composer.json
index ee998afdc6e..b9c550fda24 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/TaxImportExport/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/TaxImportExport/composer.json
@@ -5,29 +5,24 @@
         "sort-packages": true
     },
     "require": {
-        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
-        "codeception/codeception": "~2.3.4",
-        "consolidation/robo": "^1.0.0",
-        "henrikbjorn/lurker": "^1.2",
         "magento/magento2-functional-testing-framework": "1.0.0",
-        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
-        "vlucas/phpdotenv": "~2.4"
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-backend": "1.0.0",
-        "magento/magento2-functional-test-module-directory": "1.0.0",
-        "magento/magento2-functional-test-module-store": "1.0.0",
-        "magento/magento2-functional-test-module-tax": "1.0.0"
+        "magento/magento2-functional-test-module-backend": "1.0.0-dev",
+        "magento/magento2-functional-test-module-directory": "1.0.0-dev",
+        "magento/magento2-functional-test-module-store": "1.0.0-dev",
+        "magento/magento2-functional-test-module-tax": "1.0.0-dev"
     },
     "type": "magento2-test-module",
-    "version": "1.0.0",
+    "version": "1.0.0-dev",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
         "psr-4": {
-            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
+            "Magento\\TaxImportExport\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Theme/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Theme/composer.json
index 2a05bb1be1e..4fcba7e8bab 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Theme/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Theme/composer.json
@@ -5,35 +5,30 @@
         "sort-packages": true
     },
     "require": {
-        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
-        "codeception/codeception": "~2.3.4",
-        "consolidation/robo": "^1.0.0",
-        "henrikbjorn/lurker": "^1.2",
         "magento/magento2-functional-testing-framework": "1.0.0",
-        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
-        "vlucas/phpdotenv": "~2.4"
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-backend": "1.0.0",
-        "magento/magento2-functional-test-module-cms": "1.0.0",
-        "magento/magento2-functional-test-module-config": "1.0.0",
-        "magento/magento2-functional-test-module-customer": "1.0.0",
-        "magento/magento2-functional-test-module-eav": "1.0.0",
-        "magento/magento2-functional-test-module-media-storage": "1.0.0",
-        "magento/magento2-functional-test-module-require-js": "1.0.0",
-        "magento/magento2-functional-test-module-store": "1.0.0",
-        "magento/magento2-functional-test-module-ui": "1.0.0",
-        "magento/magento2-functional-test-module-widget": "1.0.0"
+        "magento/magento2-functional-test-module-backend": "1.0.0-dev",
+        "magento/magento2-functional-test-module-cms": "1.0.0-dev",
+        "magento/magento2-functional-test-module-config": "1.0.0-dev",
+        "magento/magento2-functional-test-module-customer": "1.0.0-dev",
+        "magento/magento2-functional-test-module-eav": "1.0.0-dev",
+        "magento/magento2-functional-test-module-media-storage": "1.0.0-dev",
+        "magento/magento2-functional-test-module-require-js": "1.0.0-dev",
+        "magento/magento2-functional-test-module-store": "1.0.0-dev",
+        "magento/magento2-functional-test-module-ui": "1.0.0-dev",
+        "magento/magento2-functional-test-module-widget": "1.0.0-dev"
     },
     "type": "magento2-test-module",
-    "version": "1.0.0",
+    "version": "1.0.0-dev",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
         "psr-4": {
-            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
+            "Magento\\Theme\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Translation/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Translation/composer.json
index 8a9e1d516cd..9f1ff7470fe 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Translation/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Translation/composer.json
@@ -5,28 +5,23 @@
         "sort-packages": true
     },
     "require": {
-        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
-        "codeception/codeception": "~2.3.4",
-        "consolidation/robo": "^1.0.0",
-        "henrikbjorn/lurker": "^1.2",
         "magento/magento2-functional-testing-framework": "1.0.0",
-        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
-        "vlucas/phpdotenv": "~2.4"
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-backend": "1.0.0",
-        "magento/magento2-functional-test-module-developer": "1.0.0",
-        "magento/magento2-functional-test-module-store": "1.0.0"
+        "magento/magento2-functional-test-module-backend": "1.0.0-dev",
+        "magento/magento2-functional-test-module-developer": "1.0.0-dev",
+        "magento/magento2-functional-test-module-store": "1.0.0-dev"
     },
     "type": "magento2-test-module",
-    "version": "1.0.0",
+    "version": "1.0.0-dev",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
         "psr-4": {
-            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
+            "Magento\\Translation\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Ui/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Ui/composer.json
index 5144284192f..3411d25cdb8 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Ui/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Ui/composer.json
@@ -5,29 +5,24 @@
         "sort-packages": true
     },
     "require": {
-        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
-        "codeception/codeception": "~2.3.4",
-        "consolidation/robo": "^1.0.0",
-        "henrikbjorn/lurker": "^1.2",
         "magento/magento2-functional-testing-framework": "1.0.0",
-        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
-        "vlucas/phpdotenv": "~2.4"
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-authorization": "1.0.0",
-        "magento/magento2-functional-test-module-backend": "1.0.0",
-        "magento/magento2-functional-test-module-eav": "1.0.0",
-        "magento/magento2-functional-test-module-user": "1.0.0"
+        "magento/magento2-functional-test-module-authorization": "1.0.0-dev",
+        "magento/magento2-functional-test-module-backend": "1.0.0-dev",
+        "magento/magento2-functional-test-module-eav": "1.0.0-dev",
+        "magento/magento2-functional-test-module-user": "1.0.0-dev"
     },
     "type": "magento2-test-module",
-    "version": "1.0.0",
+    "version": "1.0.0-dev",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
         "psr-4": {
-            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
+            "Magento\\Ui\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Ups/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Ups/composer.json
index 86e2ccf62f3..e3100ca49bc 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Ups/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Ups/composer.json
@@ -5,32 +5,27 @@
         "sort-packages": true
     },
     "require": {
-        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
-        "codeception/codeception": "~2.3.4",
-        "consolidation/robo": "^1.0.0",
-        "henrikbjorn/lurker": "^1.2",
         "magento/magento2-functional-testing-framework": "1.0.0",
-        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
-        "vlucas/phpdotenv": "~2.4"
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-backend": "1.0.0",
-        "magento/magento2-functional-test-module-catalog-inventory": "1.0.0",
-        "magento/magento2-functional-test-module-directory": "1.0.0",
-        "magento/magento2-functional-test-module-quote": "1.0.0",
-        "magento/magento2-functional-test-module-sales": "1.0.0",
-        "magento/magento2-functional-test-module-shipping": "1.0.0",
-        "magento/magento2-functional-test-module-store": "1.0.0"
+        "magento/magento2-functional-test-module-backend": "1.0.0-dev",
+        "magento/magento2-functional-test-module-catalog-inventory": "1.0.0-dev",
+        "magento/magento2-functional-test-module-directory": "1.0.0-dev",
+        "magento/magento2-functional-test-module-quote": "1.0.0-dev",
+        "magento/magento2-functional-test-module-sales": "1.0.0-dev",
+        "magento/magento2-functional-test-module-shipping": "1.0.0-dev",
+        "magento/magento2-functional-test-module-store": "1.0.0-dev"
     },
     "type": "magento2-test-module",
-    "version": "1.0.0",
+    "version": "1.0.0-dev",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
         "psr-4": {
-            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
+            "Magento\\Ups\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/UrlRewrite/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/UrlRewrite/composer.json
index 9343f1a448c..4ecae5ca480 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/UrlRewrite/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/UrlRewrite/composer.json
@@ -5,31 +5,26 @@
         "sort-packages": true
     },
     "require": {
-        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
-        "codeception/codeception": "~2.3.4",
-        "consolidation/robo": "^1.0.0",
-        "henrikbjorn/lurker": "^1.2",
         "magento/magento2-functional-testing-framework": "1.0.0",
-        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
-        "vlucas/phpdotenv": "~2.4"
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-backend": "1.0.0",
-        "magento/magento2-functional-test-module-catalog": "1.0.0",
-        "magento/magento2-functional-test-module-catalog-url-rewrite": "1.0.0",
-        "magento/magento2-functional-test-module-cms": "1.0.0",
-        "magento/magento2-functional-test-module-cms-url-rewrite": "1.0.0",
-        "magento/magento2-functional-test-module-store": "1.0.0"
+        "magento/magento2-functional-test-module-backend": "1.0.0-dev",
+        "magento/magento2-functional-test-module-catalog": "1.0.0-dev",
+        "magento/magento2-functional-test-module-catalog-url-rewrite": "1.0.0-dev",
+        "magento/magento2-functional-test-module-cms": "1.0.0-dev",
+        "magento/magento2-functional-test-module-cms-url-rewrite": "1.0.0-dev",
+        "magento/magento2-functional-test-module-store": "1.0.0-dev"
     },
     "type": "magento2-test-module",
-    "version": "1.0.0",
+    "version": "1.0.0-dev",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
         "psr-4": {
-            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
+            "Magento\\UrlRewrite\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/User/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/User/composer.json
index b9fc97cbccb..945e3383a94 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/User/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/User/composer.json
@@ -5,31 +5,26 @@
         "sort-packages": true
     },
     "require": {
-        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
-        "codeception/codeception": "~2.3.4",
-        "consolidation/robo": "^1.0.0",
-        "henrikbjorn/lurker": "^1.2",
         "magento/magento2-functional-testing-framework": "1.0.0",
-        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
-        "vlucas/phpdotenv": "~2.4"
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-authorization": "1.0.0",
-        "magento/magento2-functional-test-module-backend": "1.0.0",
-        "magento/magento2-functional-test-module-email": "1.0.0",
-        "magento/magento2-functional-test-module-integration": "1.0.0",
-        "magento/magento2-functional-test-module-security": "1.0.0",
-        "magento/magento2-functional-test-module-store": "1.0.0"
+        "magento/magento2-functional-test-module-authorization": "1.0.0-dev",
+        "magento/magento2-functional-test-module-backend": "1.0.0-dev",
+        "magento/magento2-functional-test-module-email": "1.0.0-dev",
+        "magento/magento2-functional-test-module-integration": "1.0.0-dev",
+        "magento/magento2-functional-test-module-security": "1.0.0-dev",
+        "magento/magento2-functional-test-module-store": "1.0.0-dev"
     },
     "type": "magento2-test-module",
-    "version": "1.0.0",
+    "version": "1.0.0-dev",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
         "psr-4": {
-            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
+            "Magento\\User\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Usps/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Usps/composer.json
index d34034b84d4..c8815b5d490 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Usps/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Usps/composer.json
@@ -5,33 +5,28 @@
         "sort-packages": true
     },
     "require": {
-        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
-        "codeception/codeception": "~2.3.4",
-        "consolidation/robo": "^1.0.0",
-        "henrikbjorn/lurker": "^1.2",
         "magento/magento2-functional-testing-framework": "1.0.0",
-        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
-        "vlucas/phpdotenv": "~2.4"
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-catalog": "1.0.0",
-        "magento/magento2-functional-test-module-catalog-inventory": "1.0.0",
-        "magento/magento2-functional-test-module-config": "1.0.0",
-        "magento/magento2-functional-test-module-directory": "1.0.0",
-        "magento/magento2-functional-test-module-quote": "1.0.0",
-        "magento/magento2-functional-test-module-sales": "1.0.0",
-        "magento/magento2-functional-test-module-shipping": "1.0.0",
-        "magento/magento2-functional-test-module-store": "1.0.0"
+        "magento/magento2-functional-test-module-catalog": "1.0.0-dev",
+        "magento/magento2-functional-test-module-catalog-inventory": "1.0.0-dev",
+        "magento/magento2-functional-test-module-config": "1.0.0-dev",
+        "magento/magento2-functional-test-module-directory": "1.0.0-dev",
+        "magento/magento2-functional-test-module-quote": "1.0.0-dev",
+        "magento/magento2-functional-test-module-sales": "1.0.0-dev",
+        "magento/magento2-functional-test-module-shipping": "1.0.0-dev",
+        "magento/magento2-functional-test-module-store": "1.0.0-dev"
     },
     "type": "magento2-test-module",
-    "version": "1.0.0",
+    "version": "1.0.0-dev",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
         "psr-4": {
-            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
+            "Magento\\Usps\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Variable/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Variable/composer.json
index 772dfd4cac6..4886a968b11 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Variable/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Variable/composer.json
@@ -5,28 +5,23 @@
         "sort-packages": true
     },
     "require": {
-        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
-        "codeception/codeception": "~2.3.4",
-        "consolidation/robo": "^1.0.0",
-        "henrikbjorn/lurker": "^1.2",
         "magento/magento2-functional-testing-framework": "1.0.0",
-        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
-        "vlucas/phpdotenv": "~2.4"
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-backend": "1.0.0",
-        "magento/magento2-functional-test-module-email": "1.0.0",
-        "magento/magento2-functional-test-module-store": "1.0.0"
+        "magento/magento2-functional-test-module-backend": "1.0.0-dev",
+        "magento/magento2-functional-test-module-email": "1.0.0-dev",
+        "magento/magento2-functional-test-module-store": "1.0.0-dev"
     },
     "type": "magento2-test-module",
-    "version": "1.0.0",
+    "version": "1.0.0-dev",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
         "psr-4": {
-            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
+            "Magento\\Variable\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Vault/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Vault/composer.json
index 72f78e07e54..51bbeb652ab 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Vault/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Vault/composer.json
@@ -5,31 +5,26 @@
         "sort-packages": true
     },
     "require": {
-        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
-        "codeception/codeception": "~2.3.4",
-        "consolidation/robo": "^1.0.0",
-        "henrikbjorn/lurker": "^1.2",
         "magento/magento2-functional-testing-framework": "1.0.0",
-        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
-        "vlucas/phpdotenv": "~2.4"
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-checkout": "1.0.0",
-        "magento/magento2-functional-test-module-customer": "1.0.0",
-        "magento/magento2-functional-test-module-payment": "1.0.0",
-        "magento/magento2-functional-test-module-quote": "1.0.0",
-        "magento/magento2-functional-test-module-sales": "1.0.0",
-        "magento/magento2-functional-test-module-store": "1.0.0"
+        "magento/magento2-functional-test-module-checkout": "1.0.0-dev",
+        "magento/magento2-functional-test-module-customer": "1.0.0-dev",
+        "magento/magento2-functional-test-module-payment": "1.0.0-dev",
+        "magento/magento2-functional-test-module-quote": "1.0.0-dev",
+        "magento/magento2-functional-test-module-sales": "1.0.0-dev",
+        "magento/magento2-functional-test-module-store": "1.0.0-dev"
     },
     "type": "magento2-test-module",
-    "version": "1.0.0",
+    "version": "1.0.0-dev",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
         "psr-4": {
-            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
+            "Magento\\Vault\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Version/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Version/composer.json
index 622210dd194..119aa2fca54 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Version/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Version/composer.json
@@ -5,23 +5,18 @@
         "sort-packages": true
     },
     "require": {
-        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
-        "codeception/codeception": "~2.3.4",
-        "consolidation/robo": "^1.0.0",
-        "henrikbjorn/lurker": "^1.2",
         "magento/magento2-functional-testing-framework": "1.0.0",
-        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
-        "vlucas/phpdotenv": "~2.4"
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "type": "magento2-test-module",
-    "version": "1.0.0",
+    "version": "1.0.0-dev",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
         "psr-4": {
-            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
+            "Magento\\Version\\": ""
         }
     },
     "extra": {
@@ -31,5 +26,6 @@
                 "dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Version"
             ]
         ]
-    }
+    },
+    "suggest": null
 }
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Webapi/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Webapi/composer.json
index 727fba2cf16..e9a12a1c055 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Webapi/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Webapi/composer.json
@@ -5,29 +5,24 @@
         "sort-packages": true
     },
     "require": {
-        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
-        "codeception/codeception": "~2.3.4",
-        "consolidation/robo": "^1.0.0",
-        "henrikbjorn/lurker": "^1.2",
         "magento/magento2-functional-testing-framework": "1.0.0",
-        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
-        "vlucas/phpdotenv": "~2.4"
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-authorization": "1.0.0",
-        "magento/magento2-functional-test-module-backend": "1.0.0",
-        "magento/magento2-functional-test-module-integration": "1.0.0",
-        "magento/magento2-functional-test-module-store": "1.0.0"
+        "magento/magento2-functional-test-module-authorization": "1.0.0-dev",
+        "magento/magento2-functional-test-module-backend": "1.0.0-dev",
+        "magento/magento2-functional-test-module-integration": "1.0.0-dev",
+        "magento/magento2-functional-test-module-store": "1.0.0-dev"
     },
     "type": "magento2-test-module",
-    "version": "1.0.0",
+    "version": "1.0.0-dev",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
         "psr-4": {
-            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
+            "Magento\\Webapi\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/WebapiSecurity/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/WebapiSecurity/composer.json
index f5de750e36d..bda7e23dacb 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/WebapiSecurity/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/WebapiSecurity/composer.json
@@ -5,26 +5,21 @@
         "sort-packages": true
     },
     "require": {
-        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
-        "codeception/codeception": "~2.3.4",
-        "consolidation/robo": "^1.0.0",
-        "henrikbjorn/lurker": "^1.2",
         "magento/magento2-functional-testing-framework": "1.0.0",
-        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
-        "vlucas/phpdotenv": "~2.4"
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-webapi": "1.0.0"
+        "magento/magento2-functional-test-module-webapi": "1.0.0-dev"
     },
     "type": "magento2-test-module",
-    "version": "1.0.0",
+    "version": "1.0.0-dev",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
         "psr-4": {
-            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
+            "Magento\\WebapiSecurity\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Weee/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Weee/composer.json
index 29cff64dff5..1698a517349 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Weee/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Weee/composer.json
@@ -5,37 +5,32 @@
         "sort-packages": true
     },
     "require": {
-        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
-        "codeception/codeception": "~2.3.4",
-        "consolidation/robo": "^1.0.0",
-        "henrikbjorn/lurker": "^1.2",
         "magento/magento2-functional-testing-framework": "1.0.0",
-        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
-        "vlucas/phpdotenv": "~2.4"
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-backend": "1.0.0",
-        "magento/magento2-functional-test-module-catalog": "1.0.0",
-        "magento/magento2-functional-test-module-checkout": "1.0.0",
-        "magento/magento2-functional-test-module-customer": "1.0.0",
-        "magento/magento2-functional-test-module-directory": "1.0.0",
-        "magento/magento2-functional-test-module-eav": "1.0.0",
-        "magento/magento2-functional-test-module-page-cache": "1.0.0",
-        "magento/magento2-functional-test-module-quote": "1.0.0",
-        "magento/magento2-functional-test-module-sales": "1.0.0",
-        "magento/magento2-functional-test-module-store": "1.0.0",
-        "magento/magento2-functional-test-module-tax": "1.0.0",
-        "magento/magento2-functional-test-module-ui": "1.0.0"
+        "magento/magento2-functional-test-module-backend": "1.0.0-dev",
+        "magento/magento2-functional-test-module-catalog": "1.0.0-dev",
+        "magento/magento2-functional-test-module-checkout": "1.0.0-dev",
+        "magento/magento2-functional-test-module-customer": "1.0.0-dev",
+        "magento/magento2-functional-test-module-directory": "1.0.0-dev",
+        "magento/magento2-functional-test-module-eav": "1.0.0-dev",
+        "magento/magento2-functional-test-module-page-cache": "1.0.0-dev",
+        "magento/magento2-functional-test-module-quote": "1.0.0-dev",
+        "magento/magento2-functional-test-module-sales": "1.0.0-dev",
+        "magento/magento2-functional-test-module-store": "1.0.0-dev",
+        "magento/magento2-functional-test-module-tax": "1.0.0-dev",
+        "magento/magento2-functional-test-module-ui": "1.0.0-dev"
     },
     "type": "magento2-test-module",
-    "version": "1.0.0",
+    "version": "1.0.0-dev",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
         "psr-4": {
-            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
+            "Magento\\Weee\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Widget/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Widget/composer.json
index aed96d0056e..0fdf707a3be 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Widget/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Widget/composer.json
@@ -5,32 +5,27 @@
         "sort-packages": true
     },
     "require": {
-        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
-        "codeception/codeception": "~2.3.4",
-        "consolidation/robo": "^1.0.0",
-        "henrikbjorn/lurker": "^1.2",
         "magento/magento2-functional-testing-framework": "1.0.0",
-        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
-        "vlucas/phpdotenv": "~2.4"
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-backend": "1.0.0",
-        "magento/magento2-functional-test-module-catalog": "1.0.0",
-        "magento/magento2-functional-test-module-cms": "1.0.0",
-        "magento/magento2-functional-test-module-email": "1.0.0",
-        "magento/magento2-functional-test-module-store": "1.0.0",
-        "magento/magento2-functional-test-module-theme": "1.0.0",
-        "magento/magento2-functional-test-module-variable": "1.0.0"
+        "magento/magento2-functional-test-module-backend": "1.0.0-dev",
+        "magento/magento2-functional-test-module-catalog": "1.0.0-dev",
+        "magento/magento2-functional-test-module-cms": "1.0.0-dev",
+        "magento/magento2-functional-test-module-email": "1.0.0-dev",
+        "magento/magento2-functional-test-module-store": "1.0.0-dev",
+        "magento/magento2-functional-test-module-theme": "1.0.0-dev",
+        "magento/magento2-functional-test-module-variable": "1.0.0-dev"
     },
     "type": "magento2-test-module",
-    "version": "1.0.0",
+    "version": "1.0.0-dev",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
         "psr-4": {
-            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
+            "Magento\\Widget\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Wishlist/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Wishlist/composer.json
index 496419cea22..1c8dcf9dbde 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Wishlist/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Wishlist/composer.json
@@ -5,34 +5,29 @@
         "sort-packages": true
     },
     "require": {
-        "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
-        "codeception/codeception": "~2.3.4",
-        "consolidation/robo": "^1.0.0",
-        "henrikbjorn/lurker": "^1.2",
         "magento/magento2-functional-testing-framework": "1.0.0",
-        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
-        "vlucas/phpdotenv": "~2.4"
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-backend": "1.0.0",
-        "magento/magento2-functional-test-module-catalog": "1.0.0",
-        "magento/magento2-functional-test-module-catalog-inventory": "1.0.0",
-        "magento/magento2-functional-test-module-checkout": "1.0.0",
-        "magento/magento2-functional-test-module-customer": "1.0.0",
-        "magento/magento2-functional-test-module-rss": "1.0.0",
-        "magento/magento2-functional-test-module-sales": "1.0.0",
-        "magento/magento2-functional-test-module-store": "1.0.0",
-        "magento/magento2-functional-test-module-ui": "1.0.0"
+        "magento/magento2-functional-test-module-backend": "1.0.0-dev",
+        "magento/magento2-functional-test-module-catalog": "1.0.0-dev",
+        "magento/magento2-functional-test-module-catalog-inventory": "1.0.0-dev",
+        "magento/magento2-functional-test-module-checkout": "1.0.0-dev",
+        "magento/magento2-functional-test-module-customer": "1.0.0-dev",
+        "magento/magento2-functional-test-module-rss": "1.0.0-dev",
+        "magento/magento2-functional-test-module-sales": "1.0.0-dev",
+        "magento/magento2-functional-test-module-store": "1.0.0-dev",
+        "magento/magento2-functional-test-module-ui": "1.0.0-dev"
     },
     "type": "magento2-test-module",
-    "version": "1.0.0",
+    "version": "1.0.0-dev",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
         "psr-4": {
-            "Magento\\": ["tests/functional/Magento", "generated/Magento"]
+            "Magento\\Wishlist\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/WishlistAnalytics/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/WishlistAnalytics/composer.json
index 19dba845461..0c09eacb90d 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/WishlistAnalytics/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/WishlistAnalytics/composer.json
@@ -3,40 +3,29 @@
     "description": "Magento 2 Acceptance Test Module WishlistAnalytics",
     "repositories": [
         {
-            "type" : "composer",
-            "url" : "https://repo.magento.com/"
+            "type": "composer",
+            "url": "https://repo.magento.com/"
         }
     ],
+    "config": {
+        "sort-packages": true
+    },
     "require": {
-        "php": "~7.0",
-        "codeception/codeception": "2.2|2.3",
-        "allure-framework/allure-codeception": "dev-master",
-        "consolidation/robo": "^1.0.0",
-        "henrikbjorn/lurker": "^1.2",
-        "vlucas/phpdotenv": "~2.4",
-        "magento/magento2-functional-testing-framework": "dev-develop"
+        "magento/magento2-functional-testing-framework": "1.0.0",
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-wishlist": "dev-master"
+        "magento/magento2-functional-test-module-wishlist": "1.0.0-dev"
     },
     "type": "magento2-test-module",
-    "version": "dev-master",
+    "version": "1.0.0-dev",
     "license": [
         "OSL-3.0",
         "AFL-3.0"
     ],
     "autoload": {
-        "psr-0": {
-            "Yandex": "vendor/allure-framework/allure-codeception/src/"
-        },
         "psr-4": {
-            "Magento\\FunctionalTestingFramework\\": [
-                "vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework"
-            ],
-            "Magento\\FunctionalTest\\": [
-                "tests/functional/Magento/FunctionalTest",
-                "generated/Magento/FunctionalTest"
-            ]
+            "Magento\\WishlistAnalytics\\": ""
         }
     },
     "extra": {
-- 
GitLab


From 5573e174e9fb8e9d8a4cb7274bb35ed4bfa2bfab Mon Sep 17 00:00:00 2001
From: Alex Kolesnyk <okolesnyk@magento.com>
Date: Fri, 8 Dec 2017 16:29:34 +0200
Subject: [PATCH 311/380] MQE-599: Move composer.json, README.MD, etc to CE

 - updated compose.json files prepared to MFTF release
---
 .../AdminNotification/composer.json           | 22 +++----
 .../AdvancedPricingImportExport/composer.json | 28 ++++-----
 .../FunctionalTest/Analytics/composer.json    | 26 ++++----
 .../Authorization/composer.json               | 16 ++---
 .../FunctionalTest/Authorizenet/composer.json | 28 ++++-----
 .../FunctionalTest/Backend/composer.json      | 46 +++++++-------
 .../FunctionalTest/Backup/composer.json       | 20 +++----
 .../FunctionalTest/Braintree/composer.json    | 40 ++++++-------
 .../FunctionalTest/Bundle/composer.json       | 44 +++++++-------
 .../BundleImportExport/composer.json          | 24 ++++----
 .../CacheInvalidate/composer.json             | 16 ++---
 .../FunctionalTest/Captcha/composer.json      | 22 +++----
 .../FunctionalTest/Catalog/composer.json      | 60 +++++++++----------
 .../CatalogAnalytics/composer.json            | 20 +++----
 .../CatalogImportExport/composer.json         | 32 +++++-----
 .../CatalogInventory/composer.json            | 28 ++++-----
 .../FunctionalTest/CatalogRule/composer.json  | 28 ++++-----
 .../CatalogRuleConfigurable/composer.json     | 20 +++----
 .../CatalogSearch/composer.json               | 34 +++++------
 .../CatalogUrlRewrite/composer.json           | 30 +++++-----
 .../CatalogWidget/composer.json               | 30 +++++-----
 .../FunctionalTest/Checkout/composer.json     | 50 ++++++++--------
 .../CheckoutAgreements/composer.json          | 22 +++----
 .../Magento/FunctionalTest/Cms/composer.json  | 32 +++++-----
 .../CmsUrlRewrite/composer.json               | 20 +++----
 .../FunctionalTest/Config/composer.json       | 28 ++++-----
 .../ConfigurableImportExport/README.md        |  3 +
 .../ConfigurableImportExport/composer.json    | 24 ++++----
 .../ConfigurableProduct/composer.json         | 36 +++++------
 .../ConfigurableProductSales/composer.json    | 20 +++----
 .../FunctionalTest/Contact/composer.json      | 22 +++----
 .../FunctionalTest/Cookie/composer.json       | 16 ++---
 .../Magento/FunctionalTest/Cron/composer.json | 16 ++---
 .../CurrencySymbol/composer.json              | 24 ++++----
 .../FunctionalTest/Customer/composer.json     | 52 ++++++++--------
 .../CustomerAnalytics/composer.json           | 20 +++----
 .../CustomerImportExport/composer.json        | 26 ++++----
 .../FunctionalTest/Deploy/composer.json       | 22 +++----
 .../FunctionalTest/Developer/composer.json    | 18 +++---
 .../Magento/FunctionalTest/Dhl/composer.json  | 32 +++++-----
 .../FunctionalTest/Directory/composer.json    | 20 +++----
 .../FunctionalTest/Downloadable/composer.json | 46 +++++++-------
 .../DownloadableImportExport/composer.json    | 26 ++++----
 .../Magento/FunctionalTest/Eav/composer.json  | 24 ++++----
 .../FunctionalTest/Email/composer.json        | 26 ++++----
 .../EncryptionKey/composer.json               | 18 +++---
 .../FunctionalTest/Fedex/composer.json        | 30 +++++-----
 .../FunctionalTest/GiftMessage/composer.json  | 30 +++++-----
 .../GoogleAdwords/composer.json               | 18 +++---
 .../GoogleAnalytics/composer.json             | 20 +++----
 .../GoogleOptimizer/composer.json             | 26 ++++----
 .../FunctionalTest/GraphQl/composer.json      | 20 +++----
 .../GroupedImportExport/composer.json         | 24 ++++----
 .../GroupedProduct/composer.json              | 38 ++++++------
 .../FunctionalTest/ImportExport/composer.json | 24 ++++----
 .../FunctionalTest/Indexer/composer.json      | 16 ++---
 .../InstantPurchase/composer.json             | 26 ++++----
 .../FunctionalTest/Integration/composer.json  | 26 ++++----
 .../LayeredNavigation/composer.json           | 18 +++---
 .../FunctionalTest/Marketplace/composer.json  | 16 ++---
 .../FunctionalTest/MediaStorage/composer.json | 20 +++----
 .../Magento/FunctionalTest/Msrp/composer.json | 26 ++++----
 .../Multishipping/composer.json               | 30 +++++-----
 .../NewRelicReporting/composer.json           | 26 ++++----
 .../FunctionalTest/Newsletter/composer.json   | 30 +++++-----
 .../OfflinePayments/composer.json             | 18 +++---
 .../OfflineShipping/composer.json             | 32 +++++-----
 .../FunctionalTest/PageCache/composer.json    | 20 +++----
 .../FunctionalTest/Payment/composer.json      | 26 ++++----
 .../FunctionalTest/Paypal/composer.json       | 46 +++++++-------
 .../FunctionalTest/Persistent/composer.json   | 26 ++++----
 .../FunctionalTest/ProductAlert/composer.json | 22 +++----
 .../FunctionalTest/ProductVideo/composer.json | 24 ++++----
 .../FunctionalTest/Quote/composer.json        | 42 ++++++-------
 .../QuoteAnalytics/composer.json              | 20 +++----
 .../FunctionalTest/Reports/composer.json      | 46 +++++++-------
 .../FunctionalTest/RequireJs/composer.json    | 17 +++---
 .../FunctionalTest/Review/composer.json       | 30 +++++-----
 .../ReviewAnalytics/composer.json             | 20 +++----
 .../FunctionalTest/Robots/composer.json       | 16 ++---
 .../Magento/FunctionalTest/Rss/composer.json  | 20 +++----
 .../Magento/FunctionalTest/Rule/composer.json | 22 +++----
 .../FunctionalTest/Sales/composer.json        | 60 +++++++++----------
 .../SalesAnalytics/composer.json              | 20 +++----
 .../SalesInventory/composer.json              | 22 +++----
 .../FunctionalTest/SalesRule/composer.json    | 46 +++++++-------
 .../SalesSequence/composer.json               | 17 +++---
 .../FunctionalTest/SampleData/composer.json   | 17 +++---
 .../SampleTemplates/LICENSE.txt               | 48 +++++++++++++++
 .../SampleTemplates/LICENSE_AFL.txt           | 48 +++++++++++++++
 .../FunctionalTest/SampleTemplates/README.md  |  3 +
 .../SampleTemplates/composer.json             | 30 ++++++++++
 .../FunctionalTest/SampleTests/LICENSE.txt    | 48 +++++++++++++++
 .../SampleTests/LICENSE_AFL.txt               | 48 +++++++++++++++
 .../FunctionalTest/SampleTests/README.md      |  3 +
 .../FunctionalTest/SampleTests/composer.json  | 30 ++++++++++
 .../FunctionalTest/Search/composer.json       | 24 ++++----
 .../FunctionalTest/Security/composer.json     | 18 +++---
 .../FunctionalTest/SendFriend/composer.json   | 20 +++----
 .../FunctionalTest/Shipping/composer.json     | 40 ++++++-------
 .../FunctionalTest/Sitemap/composer.json      | 32 +++++-----
 .../FunctionalTest/Store/composer.json        | 24 ++++----
 .../FunctionalTest/Swagger/composer.json      | 17 +++---
 .../FunctionalTest/Swatches/composer.json     | 32 +++++-----
 .../SwatchesLayeredNavigation/composer.json   | 17 +++---
 .../Magento/FunctionalTest/Tax/composer.json  | 40 ++++++-------
 .../TaxImportExport/composer.json             | 22 +++----
 .../FunctionalTest/Theme/composer.json        | 34 +++++------
 .../FunctionalTest/Translation/composer.json  | 20 +++----
 .../Magento/FunctionalTest/Ui/composer.json   | 22 +++----
 .../Magento/FunctionalTest/Ups/composer.json  | 28 ++++-----
 .../FunctionalTest/UrlRewrite/composer.json   | 26 ++++----
 .../Magento/FunctionalTest/User/composer.json | 26 ++++----
 .../Magento/FunctionalTest/Usps/composer.json | 30 +++++-----
 .../FunctionalTest/Variable/composer.json     | 20 +++----
 .../FunctionalTest/Vault/composer.json        | 26 ++++----
 .../FunctionalTest/Version/composer.json      | 17 +++---
 .../FunctionalTest/Webapi/composer.json       | 22 +++----
 .../WebapiSecurity/composer.json              | 16 ++---
 .../Magento/FunctionalTest/Weee/composer.json | 38 ++++++------
 .../FunctionalTest/Widget/composer.json       | 28 ++++-----
 .../FunctionalTest/Wishlist/composer.json     | 32 +++++-----
 .../WishlistAnalytics/composer.json           | 20 +++----
 123 files changed, 1756 insertions(+), 1543 deletions(-)
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableImportExport/README.md
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTemplates/LICENSE.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTemplates/LICENSE_AFL.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTemplates/README.md
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTemplates/composer.json
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/LICENSE.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/LICENSE_AFL.txt
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/README.md
 create mode 100644 dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/composer.json

diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/AdminNotification/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/AdminNotification/composer.json
index 7020a2b9ee9..31ce654f6c7 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/AdminNotification/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/AdminNotification/composer.json
@@ -1,6 +1,12 @@
 {
     "name": "magento/magento2-functional-test-module-admin-notification",
     "description": "Magento 2 Functional Test Module Admin Notification",
+    "type": "magento2-test-module",
+    "version": "100.0.0-dev",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
     "config": {
         "sort-packages": true
     },
@@ -9,20 +15,14 @@
         "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-backend": "1.0.0-dev",
-        "magento/magento2-functional-test-module-media-storage": "1.0.0-dev",
-        "magento/magento2-functional-test-module-store": "1.0.0-dev",
-        "magento/magento2-functional-test-module-ui": "1.0.0-dev"
+        "magento/magento2-functional-test-module-backend": "100.0.0-dev",
+        "magento/magento2-functional-test-module-media-storage": "100.0.0-dev",
+        "magento/magento2-functional-test-module-store": "100.0.0-dev",
+        "magento/magento2-functional-test-module-ui": "100.0.0-dev"
     },
-    "type": "magento2-test-module",
-    "version": "1.0.0-dev",
-    "license": [
-        "OSL-3.0",
-        "AFL-3.0"
-    ],
     "autoload": {
         "psr-4": {
-            "Magento\\AdminNotification\\": ""
+            "Magento\\FunctionalTest\\AdminNotification\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/AdvancedPricingImportExport/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/AdvancedPricingImportExport/composer.json
index 9a65ed242d6..7cba5e091bc 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/AdvancedPricingImportExport/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/AdvancedPricingImportExport/composer.json
@@ -1,6 +1,12 @@
 {
     "name": "magento/magento2-functional-test-module-advanced-pricing-import-export",
     "description": "Magento 2 Functional Test Module Advanced Pricing Import Export",
+    "type": "magento2-test-module",
+    "version": "100.0.0-dev",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
     "config": {
         "sort-packages": true
     },
@@ -9,23 +15,17 @@
         "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-catalog": "1.0.0-dev",
-        "magento/magento2-functional-test-module-catalog-import-export": "1.0.0-dev",
-        "magento/magento2-functional-test-module-catalog-inventory": "1.0.0-dev",
-        "magento/magento2-functional-test-module-customer": "1.0.0-dev",
-        "magento/magento2-functional-test-module-eav": "1.0.0-dev",
-        "magento/magento2-functional-test-module-import-export": "1.0.0-dev",
-        "magento/magento2-functional-test-module-store": "1.0.0-dev"
+        "magento/magento2-functional-test-module-catalog": "100.0.0-dev",
+        "magento/magento2-functional-test-module-catalog-import-export": "100.0.0-dev",
+        "magento/magento2-functional-test-module-catalog-inventory": "100.0.0-dev",
+        "magento/magento2-functional-test-module-customer": "100.0.0-dev",
+        "magento/magento2-functional-test-module-eav": "100.0.0-dev",
+        "magento/magento2-functional-test-module-import-export": "100.0.0-dev",
+        "magento/magento2-functional-test-module-store": "100.0.0-dev"
     },
-    "type": "magento2-test-module",
-    "version": "1.0.0-dev",
-    "license": [
-        "OSL-3.0",
-        "AFL-3.0"
-    ],
     "autoload": {
         "psr-4": {
-            "Magento\\AdvancedPricingImportExport\\": ""
+            "Magento\\FunctionalTest\\AdvancedPricingImportExport\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Analytics/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Analytics/composer.json
index a5f609f1127..9245dc6e407 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Analytics/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Analytics/composer.json
@@ -1,11 +1,11 @@
 {
     "name": "magento/magento2-functional-test-module-analytics",
     "description": "Magento 2 Acceptance Test Module Analytics",
-    "repositories": [
-        {
-            "type": "composer",
-            "url": "https://repo.magento.com/"
-        }
+    "type": "magento2-test-module",
+    "version": "100.0.0-dev",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
     ],
     "config": {
         "sort-packages": true
@@ -15,20 +15,14 @@
         "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-backend": "1.0.0-dev",
-        "magento/magento2-functional-test-module-config": "1.0.0-dev",
-        "magento/magento2-functional-test-module-integration": "1.0.0-dev",
-        "magento/magento2-functional-test-module-store": "1.0.0-dev"
+        "magento/magento2-functional-test-module-backend": "100.0.0-dev",
+        "magento/magento2-functional-test-module-config": "100.0.0-dev",
+        "magento/magento2-functional-test-module-integration": "100.0.0-dev",
+        "magento/magento2-functional-test-module-store": "100.0.0-dev"
     },
-    "type": "magento2-test-module",
-    "version": "1.0.0-dev",
-    "license": [
-        "OSL-3.0",
-        "AFL-3.0"
-    ],
     "autoload": {
         "psr-4": {
-            "Magento\\Analytics\\": ""
+            "Magento\\FunctionalTest\\Analytics\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Authorization/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Authorization/composer.json
index 27b1f27a4c4..e69220b9ca4 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Authorization/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Authorization/composer.json
@@ -1,6 +1,12 @@
 {
     "name": "magento/magento2-functional-test-module-authorization",
     "description": "Magento 2 Functional Test Module Authorization",
+    "type": "magento2-test-module",
+    "version": "100.0.0-dev",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
     "config": {
         "sort-packages": true
     },
@@ -9,17 +15,11 @@
         "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-backend": "1.0.0-dev"
+        "magento/magento2-functional-test-module-backend": "100.0.0-dev"
     },
-    "type": "magento2-test-module",
-    "version": "1.0.0-dev",
-    "license": [
-        "OSL-3.0",
-        "AFL-3.0"
-    ],
     "autoload": {
         "psr-4": {
-            "Magento\\Authorization\\": ""
+            "Magento\\FunctionalTest\\Authorization\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Authorizenet/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Authorizenet/composer.json
index cfae2dac571..9b67e3ea371 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Authorizenet/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Authorizenet/composer.json
@@ -1,6 +1,12 @@
 {
     "name": "magento/magento2-functional-test-module-authorizenet",
     "description": "Magento 2 Functional Test Module Authorizenet",
+    "type": "magento2-test-module",
+    "version": "100.0.0-dev",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
     "config": {
         "sort-packages": true
     },
@@ -9,23 +15,17 @@
         "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-backend": "1.0.0-dev",
-        "magento/magento2-functional-test-module-catalog": "1.0.0-dev",
-        "magento/magento2-functional-test-module-checkout": "1.0.0-dev",
-        "magento/magento2-functional-test-module-payment": "1.0.0-dev",
-        "magento/magento2-functional-test-module-quote": "1.0.0-dev",
-        "magento/magento2-functional-test-module-sales": "1.0.0-dev",
-        "magento/magento2-functional-test-module-store": "1.0.0-dev"
+        "magento/magento2-functional-test-module-backend": "100.0.0-dev",
+        "magento/magento2-functional-test-module-catalog": "100.0.0-dev",
+        "magento/magento2-functional-test-module-checkout": "100.0.0-dev",
+        "magento/magento2-functional-test-module-payment": "100.0.0-dev",
+        "magento/magento2-functional-test-module-quote": "100.0.0-dev",
+        "magento/magento2-functional-test-module-sales": "100.0.0-dev",
+        "magento/magento2-functional-test-module-store": "100.0.0-dev"
     },
-    "type": "magento2-test-module",
-    "version": "1.0.0-dev",
-    "license": [
-        "OSL-3.0",
-        "AFL-3.0"
-    ],
     "autoload": {
         "psr-4": {
-            "Magento\\Authorizenet\\": ""
+            "Magento\\FunctionalTest\\Authorizenet\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/composer.json
index 680d5ed031e..ffebc321c4d 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/composer.json
@@ -1,6 +1,12 @@
 {
     "name": "magento/magento2-functional-test-module-backend",
     "description": "Magento 2 Functional Test Module Backend",
+    "type": "magento2-test-module",
+    "version": "100.0.0-dev",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
     "config": {
         "sort-packages": true
     },
@@ -9,32 +15,26 @@
         "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-backup": "1.0.0-dev",
-        "magento/magento2-functional-test-module-catalog": "1.0.0-dev",
-        "magento/magento2-functional-test-module-config": "1.0.0-dev",
-        "magento/magento2-functional-test-module-customer": "1.0.0-dev",
-        "magento/magento2-functional-test-module-developer": "1.0.0-dev",
-        "magento/magento2-functional-test-module-directory": "1.0.0-dev",
-        "magento/magento2-functional-test-module-eav": "1.0.0-dev",
-        "magento/magento2-functional-test-module-quote": "1.0.0-dev",
-        "magento/magento2-functional-test-module-reports": "1.0.0-dev",
-        "magento/magento2-functional-test-module-require-js": "1.0.0-dev",
-        "magento/magento2-functional-test-module-sales": "1.0.0-dev",
-        "magento/magento2-functional-test-module-security": "1.0.0-dev",
-        "magento/magento2-functional-test-module-store": "1.0.0-dev",
-        "magento/magento2-functional-test-module-translation": "1.0.0-dev",
-        "magento/magento2-functional-test-module-ui": "1.0.0-dev",
-        "magento/magento2-functional-test-module-user": "1.0.0-dev"
+        "magento/magento2-functional-test-module-backup": "100.0.0-dev",
+        "magento/magento2-functional-test-module-catalog": "100.0.0-dev",
+        "magento/magento2-functional-test-module-config": "100.0.0-dev",
+        "magento/magento2-functional-test-module-customer": "100.0.0-dev",
+        "magento/magento2-functional-test-module-developer": "100.0.0-dev",
+        "magento/magento2-functional-test-module-directory": "100.0.0-dev",
+        "magento/magento2-functional-test-module-eav": "100.0.0-dev",
+        "magento/magento2-functional-test-module-quote": "100.0.0-dev",
+        "magento/magento2-functional-test-module-reports": "100.0.0-dev",
+        "magento/magento2-functional-test-module-require-js": "100.0.0-dev",
+        "magento/magento2-functional-test-module-sales": "100.0.0-dev",
+        "magento/magento2-functional-test-module-security": "100.0.0-dev",
+        "magento/magento2-functional-test-module-store": "100.0.0-dev",
+        "magento/magento2-functional-test-module-translation": "100.0.0-dev",
+        "magento/magento2-functional-test-module-ui": "100.0.0-dev",
+        "magento/magento2-functional-test-module-user": "100.0.0-dev"
     },
-    "type": "magento2-test-module",
-    "version": "1.0.0-dev",
-    "license": [
-        "OSL-3.0",
-        "AFL-3.0"
-    ],
     "autoload": {
         "psr-4": {
-            "Magento\\Backend\\": ""
+            "Magento\\FunctionalTest\\Backend\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backup/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backup/composer.json
index 7f67d4c1002..d4f0c49d2b1 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backup/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backup/composer.json
@@ -1,6 +1,12 @@
 {
     "name": "magento/magento2-functional-test-module-backup",
     "description": "Magento 2 Functional Test Module Backup",
+    "type": "magento2-test-module",
+    "version": "100.0.0-dev",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
     "config": {
         "sort-packages": true
     },
@@ -9,19 +15,13 @@
         "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-backend": "1.0.0-dev",
-        "magento/magento2-functional-test-module-cron": "1.0.0-dev",
-        "magento/magento2-functional-test-module-store": "1.0.0-dev"
+        "magento/magento2-functional-test-module-backend": "100.0.0-dev",
+        "magento/magento2-functional-test-module-cron": "100.0.0-dev",
+        "magento/magento2-functional-test-module-store": "100.0.0-dev"
     },
-    "type": "magento2-test-module",
-    "version": "1.0.0-dev",
-    "license": [
-        "OSL-3.0",
-        "AFL-3.0"
-    ],
     "autoload": {
         "psr-4": {
-            "Magento\\Backup\\": ""
+            "Magento\\FunctionalTest\\Backup\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Braintree/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Braintree/composer.json
index 7159b1a4bbf..e66481c501f 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Braintree/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Braintree/composer.json
@@ -1,6 +1,12 @@
 {
     "name": "magento/magento2-functional-test-module-braintree",
     "description": "Magento 2 Functional Test Module Braintree",
+    "type": "magento2-test-module",
+    "version": "100.0.0-dev",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
     "config": {
         "sort-packages": true
     },
@@ -9,29 +15,23 @@
         "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-catalog": "1.0.0-dev",
-        "magento/magento2-functional-test-module-backend": "1.0.0-dev",
-        "magento/magento2-functional-test-module-checkout": "1.0.0-dev",
-        "magento/magento2-functional-test-module-config": "1.0.0-dev",
-        "magento/magento2-functional-test-module-customer": "1.0.0-dev",
-        "magento/magento2-functional-test-module-directory": "1.0.0-dev",
-        "magento/magento2-functional-test-module-instant-purchase": "1.0.0-dev",
-        "magento/magento2-functional-test-module-payment": "1.0.0-dev",
-        "magento/magento2-functional-test-module-paypal": "1.0.0-dev",
-        "magento/magento2-functional-test-module-quote": "1.0.0-dev",
-        "magento/magento2-functional-test-module-sales": "1.0.0-dev",
-        "magento/magento2-functional-test-module-ui": "1.0.0-dev",
-        "magento/magento2-functional-test-module-vault": "1.0.0-dev"
+        "magento/magento2-functional-test-module-catalog": "100.0.0-dev",
+        "magento/magento2-functional-test-module-backend": "100.0.0-dev",
+        "magento/magento2-functional-test-module-checkout": "100.0.0-dev",
+        "magento/magento2-functional-test-module-config": "100.0.0-dev",
+        "magento/magento2-functional-test-module-customer": "100.0.0-dev",
+        "magento/magento2-functional-test-module-directory": "100.0.0-dev",
+        "magento/magento2-functional-test-module-instant-purchase": "100.0.0-dev",
+        "magento/magento2-functional-test-module-payment": "100.0.0-dev",
+        "magento/magento2-functional-test-module-paypal": "100.0.0-dev",
+        "magento/magento2-functional-test-module-quote": "100.0.0-dev",
+        "magento/magento2-functional-test-module-sales": "100.0.0-dev",
+        "magento/magento2-functional-test-module-ui": "100.0.0-dev",
+        "magento/magento2-functional-test-module-vault": "100.0.0-dev"
     },
-    "type": "magento2-test-module",
-    "version": "1.0.0-dev",
-    "license": [
-        "OSL-3.0",
-        "AFL-3.0"
-    ],
     "autoload": {
         "psr-4": {
-            "Magento\\Braintree\\": ""
+            "Magento\\FunctionalTest\\Braintree\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Bundle/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Bundle/composer.json
index 96dc014d970..cab7dce6a95 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Bundle/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Bundle/composer.json
@@ -1,6 +1,12 @@
 {
     "name": "magento/magento2-functional-test-module-bundle",
     "description": "Magento 2 Functional Test Module Bundle",
+    "type": "magento2-test-module",
+    "version": "100.0.0-dev",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
     "config": {
         "sort-packages": true
     },
@@ -9,31 +15,25 @@
         "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-backend": "1.0.0-dev",
-        "magento/magento2-functional-test-module-catalog": "1.0.0-dev",
-        "magento/magento2-functional-test-module-catalog-inventory": "1.0.0-dev",
-        "magento/magento2-functional-test-module-catalog-rule": "1.0.0-dev",
-        "magento/magento2-functional-test-module-checkout": "1.0.0-dev",
-        "magento/magento2-functional-test-module-config": "1.0.0-dev",
-        "magento/magento2-functional-test-module-customer": "1.0.0-dev",
-        "magento/magento2-functional-test-module-eav": "1.0.0-dev",
-        "magento/magento2-functional-test-module-gift-message": "1.0.0-dev",
-        "magento/magento2-functional-test-module-media-storage": "1.0.0-dev",
-        "magento/magento2-functional-test-module-quote": "1.0.0-dev",
-        "magento/magento2-functional-test-module-sales": "1.0.0-dev",
-        "magento/magento2-functional-test-module-store": "1.0.0-dev",
-        "magento/magento2-functional-test-module-tax": "1.0.0-dev",
-        "magento/magento2-functional-test-module-ui": "1.0.0-dev"
+        "magento/magento2-functional-test-module-backend": "100.0.0-dev",
+        "magento/magento2-functional-test-module-catalog": "100.0.0-dev",
+        "magento/magento2-functional-test-module-catalog-inventory": "100.0.0-dev",
+        "magento/magento2-functional-test-module-catalog-rule": "100.0.0-dev",
+        "magento/magento2-functional-test-module-checkout": "100.0.0-dev",
+        "magento/magento2-functional-test-module-config": "100.0.0-dev",
+        "magento/magento2-functional-test-module-customer": "100.0.0-dev",
+        "magento/magento2-functional-test-module-eav": "100.0.0-dev",
+        "magento/magento2-functional-test-module-gift-message": "100.0.0-dev",
+        "magento/magento2-functional-test-module-media-storage": "100.0.0-dev",
+        "magento/magento2-functional-test-module-quote": "100.0.0-dev",
+        "magento/magento2-functional-test-module-sales": "100.0.0-dev",
+        "magento/magento2-functional-test-module-store": "100.0.0-dev",
+        "magento/magento2-functional-test-module-tax": "100.0.0-dev",
+        "magento/magento2-functional-test-module-ui": "100.0.0-dev"
     },
-    "type": "magento2-test-module",
-    "version": "1.0.0-dev",
-    "license": [
-        "OSL-3.0",
-        "AFL-3.0"
-    ],
     "autoload": {
         "psr-4": {
-            "Magento\\Bundle\\": ""
+            "Magento\\FunctionalTest\\Bundle\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/BundleImportExport/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/BundleImportExport/composer.json
index afc00529ac0..9fd81822a18 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/BundleImportExport/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/BundleImportExport/composer.json
@@ -1,6 +1,12 @@
 {
     "name": "magento/magento2-functional-test-module-bundle-import-export",
     "description": "Magento 2 Functional Test Module Bundle Import Export",
+    "type": "magento2-test-module",
+    "version": "100.0.0-dev",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
     "config": {
         "sort-packages": true
     },
@@ -9,21 +15,15 @@
         "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-bundle": "1.0.0-dev",
-        "magento/magento2-functional-test-module-catalog": "1.0.0-dev",
-        "magento/magento2-functional-test-module-catalog-import-export": "1.0.0-dev",
-        "magento/magento2-functional-test-module-eav": "1.0.0-dev",
-        "magento/magento2-functional-test-module-import-export": "1.0.0-dev"
+        "magento/magento2-functional-test-module-bundle": "100.0.0-dev",
+        "magento/magento2-functional-test-module-catalog": "100.0.0-dev",
+        "magento/magento2-functional-test-module-catalog-import-export": "100.0.0-dev",
+        "magento/magento2-functional-test-module-eav": "100.0.0-dev",
+        "magento/magento2-functional-test-module-import-export": "100.0.0-dev"
     },
-    "type": "magento2-test-module",
-    "version": "1.0.0-dev",
-    "license": [
-        "OSL-3.0",
-        "AFL-3.0"
-    ],
     "autoload": {
         "psr-4": {
-            "Magento\\BundleImportExport\\": ""
+            "Magento\\FunctionalTest\\BundleImportExport\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CacheInvalidate/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CacheInvalidate/composer.json
index f9d8c204be2..e8c58ac7a2d 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CacheInvalidate/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CacheInvalidate/composer.json
@@ -1,6 +1,12 @@
 {
     "name": "magento/magento2-functional-test-module-cache-invalidate",
     "description": "Magento 2 Functional Test Module Cache Invalidate",
+    "type": "magento2-test-module",
+    "version": "100.0.0-dev",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
     "config": {
         "sort-packages": true
     },
@@ -9,17 +15,11 @@
         "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-page-cache": "1.0.0-dev"
+        "magento/magento2-functional-test-module-page-cache": "100.0.0-dev"
     },
-    "type": "magento2-test-module",
-    "version": "1.0.0-dev",
-    "license": [
-        "OSL-3.0",
-        "AFL-3.0"
-    ],
     "autoload": {
         "psr-4": {
-            "Magento\\CacheInvalidate\\": ""
+            "Magento\\FunctionalTest\\CacheInvalidate\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Captcha/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Captcha/composer.json
index 1fcbaeb9f49..5c3f0acfc8f 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Captcha/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Captcha/composer.json
@@ -1,6 +1,12 @@
 {
     "name": "magento/magento2-functional-test-module-captcha",
     "description": "Magento 2 Functional Test Module Captcha",
+    "type": "magento2-test-module",
+    "version": "100.0.0-dev",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
     "config": {
         "sort-packages": true
     },
@@ -9,20 +15,14 @@
         "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-backend": "1.0.0-dev",
-        "magento/magento2-functional-test-module-checkout": "1.0.0-dev",
-        "magento/magento2-functional-test-module-customer": "1.0.0-dev",
-        "magento/magento2-functional-test-module-store": "1.0.0-dev"
+        "magento/magento2-functional-test-module-backend": "100.0.0-dev",
+        "magento/magento2-functional-test-module-checkout": "100.0.0-dev",
+        "magento/magento2-functional-test-module-customer": "100.0.0-dev",
+        "magento/magento2-functional-test-module-store": "100.0.0-dev"
     },
-    "type": "magento2-test-module",
-    "version": "1.0.0-dev",
-    "license": [
-        "OSL-3.0",
-        "AFL-3.0"
-    ],
     "autoload": {
         "psr-4": {
-            "Magento\\Captcha\\": ""
+            "Magento\\FunctionalTest\\Captcha\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/composer.json
index ac8272b7ff7..a1dc628f04c 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/composer.json
@@ -1,6 +1,12 @@
 {
     "name": "magento/magento2-functional-test-module-catalog",
     "description": "Magento 2 Functional Test Module Catalog",
+    "type": "magento2-test-module",
+    "version": "100.0.0-dev",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
     "config": {
         "sort-packages": true
     },
@@ -9,39 +15,33 @@
         "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-backend": "1.0.0-dev",
-        "magento/magento2-functional-test-module-catalog-inventory": "1.0.0-dev",
-        "magento/magento2-functional-test-module-catalog-rule": "1.0.0-dev",
-        "magento/magento2-functional-test-module-catalog-url-rewrite": "1.0.0-dev",
-        "magento/magento2-functional-test-module-checkout": "1.0.0-dev",
-        "magento/magento2-functional-test-module-cms": "1.0.0-dev",
-        "magento/magento2-functional-test-module-config": "1.0.0-dev",
-        "magento/magento2-functional-test-module-customer": "1.0.0-dev",
-        "magento/magento2-functional-test-module-directory": "1.0.0-dev",
-        "magento/magento2-functional-test-module-eav": "1.0.0-dev",
-        "magento/magento2-functional-test-module-indexer": "1.0.0-dev",
-        "magento/magento2-functional-test-module-media-storage": "1.0.0-dev",
-        "magento/magento2-functional-test-module-msrp": "1.0.0-dev",
-        "magento/magento2-functional-test-module-page-cache": "1.0.0-dev",
-        "magento/magento2-functional-test-module-product-alert": "1.0.0-dev",
-        "magento/magento2-functional-test-module-quote": "1.0.0-dev",
-        "magento/magento2-functional-test-module-store": "1.0.0-dev",
-        "magento/magento2-functional-test-module-tax": "1.0.0-dev",
-        "magento/magento2-functional-test-module-theme": "1.0.0-dev",
-        "magento/magento2-functional-test-module-ui": "1.0.0-dev",
-        "magento/magento2-functional-test-module-url-rewrite": "1.0.0-dev",
-        "magento/magento2-functional-test-module-widget": "1.0.0-dev",
-        "magento/magento2-functional-test-module-wishlist": "1.0.0-dev"
+        "magento/magento2-functional-test-module-backend": "100.0.0-dev",
+        "magento/magento2-functional-test-module-catalog-inventory": "100.0.0-dev",
+        "magento/magento2-functional-test-module-catalog-rule": "100.0.0-dev",
+        "magento/magento2-functional-test-module-catalog-url-rewrite": "100.0.0-dev",
+        "magento/magento2-functional-test-module-checkout": "100.0.0-dev",
+        "magento/magento2-functional-test-module-cms": "100.0.0-dev",
+        "magento/magento2-functional-test-module-config": "100.0.0-dev",
+        "magento/magento2-functional-test-module-customer": "100.0.0-dev",
+        "magento/magento2-functional-test-module-directory": "100.0.0-dev",
+        "magento/magento2-functional-test-module-eav": "100.0.0-dev",
+        "magento/magento2-functional-test-module-indexer": "100.0.0-dev",
+        "magento/magento2-functional-test-module-media-storage": "100.0.0-dev",
+        "magento/magento2-functional-test-module-msrp": "100.0.0-dev",
+        "magento/magento2-functional-test-module-page-cache": "100.0.0-dev",
+        "magento/magento2-functional-test-module-product-alert": "100.0.0-dev",
+        "magento/magento2-functional-test-module-quote": "100.0.0-dev",
+        "magento/magento2-functional-test-module-store": "100.0.0-dev",
+        "magento/magento2-functional-test-module-tax": "100.0.0-dev",
+        "magento/magento2-functional-test-module-theme": "100.0.0-dev",
+        "magento/magento2-functional-test-module-ui": "100.0.0-dev",
+        "magento/magento2-functional-test-module-url-rewrite": "100.0.0-dev",
+        "magento/magento2-functional-test-module-widget": "100.0.0-dev",
+        "magento/magento2-functional-test-module-wishlist": "100.0.0-dev"
     },
-    "type": "magento2-test-module",
-    "version": "1.0.0-dev",
-    "license": [
-        "OSL-3.0",
-        "AFL-3.0"
-    ],
     "autoload": {
         "psr-4": {
-            "Magento\\Catalog\\": ""
+            "Magento\\FunctionalTest\\Catalog\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogAnalytics/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogAnalytics/composer.json
index 12ebf6e0bef..b742218731f 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogAnalytics/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogAnalytics/composer.json
@@ -1,11 +1,11 @@
 {
     "name": "magento/magento2-functional-test-module-catalog-analytics",
     "description": "Magento 2 Acceptance Test Module Catalog Analytics",
-    "repositories": [
-        {
-            "type": "composer",
-            "url": "https://repo.magento.com/"
-        }
+    "type": "magento2-test-module",
+    "version": "100.0.0-dev",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
     ],
     "config": {
         "sort-packages": true
@@ -15,17 +15,11 @@
         "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-catalog": "1.0.0-dev"
+        "magento/magento2-functional-test-module-catalog": "100.0.0-dev"
     },
-    "type": "magento2-test-module",
-    "version": "1.0.0-dev",
-    "license": [
-        "OSL-3.0",
-        "AFL-3.0"
-    ],
     "autoload": {
         "psr-4": {
-            "Magento\\CatalogAnalytics\\": ""
+            "Magento\\FunctionalTest\\CatalogAnalytics\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogImportExport/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogImportExport/composer.json
index be97c72452b..3f1d805ca27 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogImportExport/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogImportExport/composer.json
@@ -1,6 +1,12 @@
 {
     "name": "magento/magento2-functional-test-module-catalog-import-export",
     "description": "Magento 2 Functional Test Module Catalog Import Export",
+    "type": "magento2-test-module",
+    "version": "100.0.0-dev",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
     "config": {
         "sort-packages": true
     },
@@ -9,25 +15,19 @@
         "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-catalog": "1.0.0-dev",
-        "magento/magento2-functional-test-module-catalog-inventory": "1.0.0-dev",
-        "magento/magento2-functional-test-module-catalog-url-rewrite": "1.0.0-dev",
-        "magento/magento2-functional-test-module-customer": "1.0.0-dev",
-        "magento/magento2-functional-test-module-eav": "1.0.0-dev",
-        "magento/magento2-functional-test-module-import-export": "1.0.0-dev",
-        "magento/magento2-functional-test-module-media-storage": "1.0.0-dev",
-        "magento/magento2-functional-test-module-store": "1.0.0-dev",
-        "magento/magento2-functional-test-module-tax": "1.0.0-dev"
+        "magento/magento2-functional-test-module-catalog": "100.0.0-dev",
+        "magento/magento2-functional-test-module-catalog-inventory": "100.0.0-dev",
+        "magento/magento2-functional-test-module-catalog-url-rewrite": "100.0.0-dev",
+        "magento/magento2-functional-test-module-customer": "100.0.0-dev",
+        "magento/magento2-functional-test-module-eav": "100.0.0-dev",
+        "magento/magento2-functional-test-module-import-export": "100.0.0-dev",
+        "magento/magento2-functional-test-module-media-storage": "100.0.0-dev",
+        "magento/magento2-functional-test-module-store": "100.0.0-dev",
+        "magento/magento2-functional-test-module-tax": "100.0.0-dev"
     },
-    "type": "magento2-test-module",
-    "version": "1.0.0-dev",
-    "license": [
-        "OSL-3.0",
-        "AFL-3.0"
-    ],
     "autoload": {
         "psr-4": {
-            "Magento\\CatalogImportExport\\": ""
+            "Magento\\FunctionalTest\\CatalogImportExport\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogInventory/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogInventory/composer.json
index cfb006dd9bd..4060f8906ef 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogInventory/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogInventory/composer.json
@@ -1,6 +1,12 @@
 {
     "name": "magento/magento2-functional-test-module-catalog-inventory",
     "description": "Magento 2 Functional Test Module Catalog Inventory",
+    "type": "magento2-test-module",
+    "version": "100.0.0-dev",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
     "config": {
         "sort-packages": true
     },
@@ -9,23 +15,17 @@
         "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-catalog": "1.0.0-dev",
-        "magento/magento2-functional-test-module-config": "1.0.0-dev",
-        "magento/magento2-functional-test-module-customer": "1.0.0-dev",
-        "magento/magento2-functional-test-module-eav": "1.0.0-dev",
-        "magento/magento2-functional-test-module-quote": "1.0.0-dev",
-        "magento/magento2-functional-test-module-store": "1.0.0-dev",
-        "magento/magento2-functional-test-module-ui": "1.0.0-dev"
+        "magento/magento2-functional-test-module-catalog": "100.0.0-dev",
+        "magento/magento2-functional-test-module-config": "100.0.0-dev",
+        "magento/magento2-functional-test-module-customer": "100.0.0-dev",
+        "magento/magento2-functional-test-module-eav": "100.0.0-dev",
+        "magento/magento2-functional-test-module-quote": "100.0.0-dev",
+        "magento/magento2-functional-test-module-store": "100.0.0-dev",
+        "magento/magento2-functional-test-module-ui": "100.0.0-dev"
     },
-    "type": "magento2-test-module",
-    "version": "1.0.0-dev",
-    "license": [
-        "OSL-3.0",
-        "AFL-3.0"
-    ],
     "autoload": {
         "psr-4": {
-            "Magento\\CatalogInventory\\": ""
+            "Magento\\FunctionalTest\\CatalogInventory\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogRule/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogRule/composer.json
index 5b8703ba975..3d0fb94a4df 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogRule/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogRule/composer.json
@@ -1,6 +1,12 @@
 {
     "name": "magento/magento2-functional-test-module-catalog-rule",
     "description": "Magento 2 Functional Test Module Catalog Rule",
+    "type": "magento2-test-module",
+    "version": "100.0.0-dev",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
     "config": {
         "sort-packages": true
     },
@@ -9,23 +15,17 @@
         "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-backend": "1.0.0-dev",
-        "magento/magento2-functional-test-module-catalog": "1.0.0-dev",
-        "magento/magento2-functional-test-module-customer": "1.0.0-dev",
-        "magento/magento2-functional-test-module-eav": "1.0.0-dev",
-        "magento/magento2-functional-test-module-rule": "1.0.0-dev",
-        "magento/magento2-functional-test-module-store": "1.0.0-dev",
-        "magento/magento2-functional-test-module-ui": "1.0.0-dev"
+        "magento/magento2-functional-test-module-backend": "100.0.0-dev",
+        "magento/magento2-functional-test-module-catalog": "100.0.0-dev",
+        "magento/magento2-functional-test-module-customer": "100.0.0-dev",
+        "magento/magento2-functional-test-module-eav": "100.0.0-dev",
+        "magento/magento2-functional-test-module-rule": "100.0.0-dev",
+        "magento/magento2-functional-test-module-store": "100.0.0-dev",
+        "magento/magento2-functional-test-module-ui": "100.0.0-dev"
     },
-    "type": "magento2-test-module",
-    "version": "1.0.0-dev",
-    "license": [
-        "OSL-3.0",
-        "AFL-3.0"
-    ],
     "autoload": {
         "psr-4": {
-            "Magento\\CatalogRule\\": ""
+            "Magento\\FunctionalTest\\CatalogRule\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogRuleConfigurable/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogRuleConfigurable/composer.json
index e554887f5b7..0bee96876c8 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogRuleConfigurable/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogRuleConfigurable/composer.json
@@ -1,6 +1,12 @@
 {
     "name": "magento/magento2-functional-test-module-catalog-rule-configurable",
     "description": "Magento 2 Functional Test Module Catalog Rule Configurable",
+    "type": "magento2-test-module",
+    "version": "100.0.0-dev",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
     "config": {
         "sort-packages": true
     },
@@ -9,19 +15,13 @@
         "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-catalog": "1.0.0-dev",
-        "magento/magento2-functional-test-module-catalog-rule": "1.0.0-dev",
-        "magento/magento2-functional-test-module-configurable-product": "1.0.0-dev"
+        "magento/magento2-functional-test-module-catalog": "100.0.0-dev",
+        "magento/magento2-functional-test-module-catalog-rule": "100.0.0-dev",
+        "magento/magento2-functional-test-module-configurable-product": "100.0.0-dev"
     },
-    "type": "magento2-test-module",
-    "version": "1.0.0-dev",
-    "license": [
-        "OSL-3.0",
-        "AFL-3.0"
-    ],
     "autoload": {
         "psr-4": {
-            "Magento\\CatalogRuleConfigurable\\": ""
+            "Magento\\FunctionalTest\\CatalogRuleConfigurable\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogSearch/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogSearch/composer.json
index 3848ae4829a..0115d362d3b 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogSearch/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogSearch/composer.json
@@ -1,6 +1,12 @@
 {
     "name": "magento/magento2-functional-test-module-catalog-search",
     "description": "Magento 2 Functional Test Module Catalog Search",
+    "type": "magento2-test-module",
+    "version": "100.0.0-dev",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
     "config": {
         "sort-packages": true
     },
@@ -9,26 +15,20 @@
         "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-backend": "1.0.0-dev",
-        "magento/magento2-functional-test-module-catalog": "1.0.0-dev",
-        "magento/magento2-functional-test-module-catalog-inventory": "1.0.0-dev",
-        "magento/magento2-functional-test-module-customer": "1.0.0-dev",
-        "magento/magento2-functional-test-module-directory": "1.0.0-dev",
-        "magento/magento2-functional-test-module-eav": "1.0.0-dev",
-        "magento/magento2-functional-test-module-search": "1.0.0-dev",
-        "magento/magento2-functional-test-module-store": "1.0.0-dev",
-        "magento/magento2-functional-test-module-theme": "1.0.0-dev",
-        "magento/magento2-functional-test-module-ui": "1.0.0-dev"
+        "magento/magento2-functional-test-module-backend": "100.0.0-dev",
+        "magento/magento2-functional-test-module-catalog": "100.0.0-dev",
+        "magento/magento2-functional-test-module-catalog-inventory": "100.0.0-dev",
+        "magento/magento2-functional-test-module-customer": "100.0.0-dev",
+        "magento/magento2-functional-test-module-directory": "100.0.0-dev",
+        "magento/magento2-functional-test-module-eav": "100.0.0-dev",
+        "magento/magento2-functional-test-module-search": "100.0.0-dev",
+        "magento/magento2-functional-test-module-store": "100.0.0-dev",
+        "magento/magento2-functional-test-module-theme": "100.0.0-dev",
+        "magento/magento2-functional-test-module-ui": "100.0.0-dev"
     },
-    "type": "magento2-test-module",
-    "version": "1.0.0-dev",
-    "license": [
-        "OSL-3.0",
-        "AFL-3.0"
-    ],
     "autoload": {
         "psr-4": {
-            "Magento\\CatalogSearch\\": ""
+            "Magento\\FunctionalTest\\CatalogSearch\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogUrlRewrite/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogUrlRewrite/composer.json
index 971c4173918..a51be94ebaf 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogUrlRewrite/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogUrlRewrite/composer.json
@@ -1,6 +1,12 @@
 {
     "name": "magento/magento2-functional-test-module-catalog-url-rewrite",
     "description": "Magento 2 Functional Test Module Catalog Url Rewrite",
+    "type": "magento2-test-module",
+    "version": "100.0.0-dev",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
     "config": {
         "sort-packages": true
     },
@@ -9,24 +15,18 @@
         "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-backend": "1.0.0-dev",
-        "magento/magento2-functional-test-module-catalog": "1.0.0-dev",
-        "magento/magento2-functional-test-module-catalog-import-export": "1.0.0-dev",
-        "magento/magento2-functional-test-module-eav": "1.0.0-dev",
-        "magento/magento2-functional-test-module-import-export": "1.0.0-dev",
-        "magento/magento2-functional-test-module-store": "1.0.0-dev",
-        "magento/magento2-functional-test-module-ui": "1.0.0-dev",
-        "magento/magento2-functional-test-module-url-rewrite": "1.0.0-dev"
+        "magento/magento2-functional-test-module-backend": "100.0.0-dev",
+        "magento/magento2-functional-test-module-catalog": "100.0.0-dev",
+        "magento/magento2-functional-test-module-catalog-import-export": "100.0.0-dev",
+        "magento/magento2-functional-test-module-eav": "100.0.0-dev",
+        "magento/magento2-functional-test-module-import-export": "100.0.0-dev",
+        "magento/magento2-functional-test-module-store": "100.0.0-dev",
+        "magento/magento2-functional-test-module-ui": "100.0.0-dev",
+        "magento/magento2-functional-test-module-url-rewrite": "100.0.0-dev"
     },
-    "type": "magento2-test-module",
-    "version": "1.0.0-dev",
-    "license": [
-        "OSL-3.0",
-        "AFL-3.0"
-    ],
     "autoload": {
         "psr-4": {
-            "Magento\\CatalogUrlRewrite\\": ""
+            "Magento\\FunctionalTest\\CatalogUrlRewrite\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogWidget/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogWidget/composer.json
index 2dc7b905855..8ff933bd50a 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogWidget/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogWidget/composer.json
@@ -1,6 +1,12 @@
 {
     "name": "magento/magento2-functional-test-module-catalog-widget",
     "description": "Magento 2 Functional Test Module Catalog Widget",
+    "type": "magento2-test-module",
+    "version": "100.0.0-dev",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
     "config": {
         "sort-packages": true
     },
@@ -9,24 +15,18 @@
         "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-backend": "1.0.0-dev",
-        "magento/magento2-functional-test-module-catalog": "1.0.0-dev",
-        "magento/magento2-functional-test-module-customer": "1.0.0-dev",
-        "magento/magento2-functional-test-module-eav": "1.0.0-dev",
-        "magento/magento2-functional-test-module-rule": "1.0.0-dev",
-        "magento/magento2-functional-test-module-store": "1.0.0-dev",
-        "magento/magento2-functional-test-module-widget": "1.0.0-dev",
-        "magento/magento2-functional-test-module-wishlist": "1.0.0-dev"
+        "magento/magento2-functional-test-module-backend": "100.0.0-dev",
+        "magento/magento2-functional-test-module-catalog": "100.0.0-dev",
+        "magento/magento2-functional-test-module-customer": "100.0.0-dev",
+        "magento/magento2-functional-test-module-eav": "100.0.0-dev",
+        "magento/magento2-functional-test-module-rule": "100.0.0-dev",
+        "magento/magento2-functional-test-module-store": "100.0.0-dev",
+        "magento/magento2-functional-test-module-widget": "100.0.0-dev",
+        "magento/magento2-functional-test-module-wishlist": "100.0.0-dev"
     },
-    "type": "magento2-test-module",
-    "version": "1.0.0-dev",
-    "license": [
-        "OSL-3.0",
-        "AFL-3.0"
-    ],
     "autoload": {
         "psr-4": {
-            "Magento\\CatalogWidget\\": ""
+            "Magento\\FunctionalTest\\CatalogWidget\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/composer.json
index 4c6fd9c49da..f84ed60ac92 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/composer.json
@@ -1,6 +1,12 @@
 {
     "name": "magento/magento2-functional-test-module-checkout",
     "description": "Magento 2 Functional Test Module Checkout",
+    "type": "magento2-test-module",
+    "version": "100.0.0-dev",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
     "config": {
         "sort-packages": true
     },
@@ -9,34 +15,28 @@
         "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-backend": "1.0.0-dev",
-        "magento/magento2-functional-test-module-catalog": "1.0.0-dev",
-        "magento/magento2-functional-test-module-catalog-inventory": "1.0.0-dev",
-        "magento/magento2-functional-test-module-config": "1.0.0-dev",
-        "magento/magento2-functional-test-module-customer": "1.0.0-dev",
-        "magento/magento2-functional-test-module-directory": "1.0.0-dev",
-        "magento/magento2-functional-test-module-eav": "1.0.0-dev",
-        "magento/magento2-functional-test-module-msrp": "1.0.0-dev",
-        "magento/magento2-functional-test-module-page-cache": "1.0.0-dev",
-        "magento/magento2-functional-test-module-payment": "1.0.0-dev",
-        "magento/magento2-functional-test-module-quote": "1.0.0-dev",
-        "magento/magento2-functional-test-module-sales": "1.0.0-dev",
-        "magento/magento2-functional-test-module-sales-rule": "1.0.0-dev",
-        "magento/magento2-functional-test-module-shipping": "1.0.0-dev",
-        "magento/magento2-functional-test-module-store": "1.0.0-dev",
-        "magento/magento2-functional-test-module-tax": "1.0.0-dev",
-        "magento/magento2-functional-test-module-theme": "1.0.0-dev",
-        "magento/magento2-functional-test-module-ui": "1.0.0-dev"
+        "magento/magento2-functional-test-module-backend": "100.0.0-dev",
+        "magento/magento2-functional-test-module-catalog": "100.0.0-dev",
+        "magento/magento2-functional-test-module-catalog-inventory": "100.0.0-dev",
+        "magento/magento2-functional-test-module-config": "100.0.0-dev",
+        "magento/magento2-functional-test-module-customer": "100.0.0-dev",
+        "magento/magento2-functional-test-module-directory": "100.0.0-dev",
+        "magento/magento2-functional-test-module-eav": "100.0.0-dev",
+        "magento/magento2-functional-test-module-msrp": "100.0.0-dev",
+        "magento/magento2-functional-test-module-page-cache": "100.0.0-dev",
+        "magento/magento2-functional-test-module-payment": "100.0.0-dev",
+        "magento/magento2-functional-test-module-quote": "100.0.0-dev",
+        "magento/magento2-functional-test-module-sales": "100.0.0-dev",
+        "magento/magento2-functional-test-module-sales-rule": "100.0.0-dev",
+        "magento/magento2-functional-test-module-shipping": "100.0.0-dev",
+        "magento/magento2-functional-test-module-store": "100.0.0-dev",
+        "magento/magento2-functional-test-module-tax": "100.0.0-dev",
+        "magento/magento2-functional-test-module-theme": "100.0.0-dev",
+        "magento/magento2-functional-test-module-ui": "100.0.0-dev"
     },
-    "type": "magento2-test-module",
-    "version": "1.0.0-dev",
-    "license": [
-        "OSL-3.0",
-        "AFL-3.0"
-    ],
     "autoload": {
         "psr-4": {
-            "Magento\\Checkout\\": ""
+            "Magento\\FunctionalTest\\Checkout\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CheckoutAgreements/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CheckoutAgreements/composer.json
index f852f4ca458..54f8e269d39 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CheckoutAgreements/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CheckoutAgreements/composer.json
@@ -1,6 +1,12 @@
 {
     "name": "magento/magento2-functional-test-module-checkout-agreements",
     "description": "Magento 2 Functional Test Module Checkout Agreements",
+    "type": "magento2-test-module",
+    "version": "100.0.0-dev",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
     "config": {
         "sort-packages": true
     },
@@ -9,20 +15,14 @@
         "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-backend": "1.0.0-dev",
-        "magento/magento2-functional-test-module-checkout": "1.0.0-dev",
-        "magento/magento2-functional-test-module-quote": "1.0.0-dev",
-        "magento/magento2-functional-test-module-store": "1.0.0-dev"
+        "magento/magento2-functional-test-module-backend": "100.0.0-dev",
+        "magento/magento2-functional-test-module-checkout": "100.0.0-dev",
+        "magento/magento2-functional-test-module-quote": "100.0.0-dev",
+        "magento/magento2-functional-test-module-store": "100.0.0-dev"
     },
-    "type": "magento2-test-module",
-    "version": "1.0.0-dev",
-    "license": [
-        "OSL-3.0",
-        "AFL-3.0"
-    ],
     "autoload": {
         "psr-4": {
-            "Magento\\CheckoutAgreements\\": ""
+            "Magento\\FunctionalTest\\CheckoutAgreements\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/composer.json
index 9420585a31a..5f55a2cabb3 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/composer.json
@@ -1,6 +1,12 @@
 {
     "name": "magento/magento2-functional-test-module-cms",
     "description": "Magento 2 Functional Test Module Cms",
+    "type": "magento2-test-module",
+    "version": "100.0.0-dev",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
     "config": {
         "sort-packages": true
     },
@@ -9,25 +15,19 @@
         "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-backend": "1.0.0-dev",
-        "magento/magento2-functional-test-module-catalog": "1.0.0-dev",
-        "magento/magento2-functional-test-module-email": "1.0.0-dev",
-        "magento/magento2-functional-test-module-media-storage": "1.0.0-dev",
-        "magento/magento2-functional-test-module-store": "1.0.0-dev",
-        "magento/magento2-functional-test-module-theme": "1.0.0-dev",
-        "magento/magento2-functional-test-module-ui": "1.0.0-dev",
-        "magento/magento2-functional-test-module-variable": "1.0.0-dev",
-        "magento/magento2-functional-test-module-widget": "1.0.0-dev"
+        "magento/magento2-functional-test-module-backend": "100.0.0-dev",
+        "magento/magento2-functional-test-module-catalog": "100.0.0-dev",
+        "magento/magento2-functional-test-module-email": "100.0.0-dev",
+        "magento/magento2-functional-test-module-media-storage": "100.0.0-dev",
+        "magento/magento2-functional-test-module-store": "100.0.0-dev",
+        "magento/magento2-functional-test-module-theme": "100.0.0-dev",
+        "magento/magento2-functional-test-module-ui": "100.0.0-dev",
+        "magento/magento2-functional-test-module-variable": "100.0.0-dev",
+        "magento/magento2-functional-test-module-widget": "100.0.0-dev"
     },
-    "type": "magento2-test-module",
-    "version": "1.0.0-dev",
-    "license": [
-        "OSL-3.0",
-        "AFL-3.0"
-    ],
     "autoload": {
         "psr-4": {
-            "Magento\\Cms\\": ""
+            "Magento\\FunctionalTest\\Cms\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CmsUrlRewrite/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CmsUrlRewrite/composer.json
index 6e7dbf3d4e7..764444c8e72 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CmsUrlRewrite/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CmsUrlRewrite/composer.json
@@ -1,6 +1,12 @@
 {
     "name": "magento/magento2-functional-test-module-cms-url-rewrite",
     "description": "Magento 2 Functional Test Module Cms Url Rewrite",
+    "type": "magento2-test-module",
+    "version": "100.0.0-dev",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
     "config": {
         "sort-packages": true
     },
@@ -9,19 +15,13 @@
         "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-cms": "1.0.0-dev",
-        "magento/magento2-functional-test-module-store": "1.0.0-dev",
-        "magento/magento2-functional-test-module-url-rewrite": "1.0.0-dev"
+        "magento/magento2-functional-test-module-cms": "100.0.0-dev",
+        "magento/magento2-functional-test-module-store": "100.0.0-dev",
+        "magento/magento2-functional-test-module-url-rewrite": "100.0.0-dev"
     },
-    "type": "magento2-test-module",
-    "version": "1.0.0-dev",
-    "license": [
-        "OSL-3.0",
-        "AFL-3.0"
-    ],
     "autoload": {
         "psr-4": {
-            "Magento\\CmsUrlRewrite\\": ""
+            "Magento\\FunctionalTest\\CmsUrlRewrite\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Config/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Config/composer.json
index 2c1965c6a41..c6aa7ca8ab4 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Config/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Config/composer.json
@@ -1,6 +1,12 @@
 {
     "name": "magento/magento2-functional-test-module-config",
     "description": "Magento 2 Functional Test Module Config",
+    "type": "magento2-test-module",
+    "version": "100.0.0-dev",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
     "config": {
         "sort-packages": true
     },
@@ -9,23 +15,17 @@
         "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-backend": "1.0.0-dev",
-        "magento/magento2-functional-test-module-cron": "1.0.0-dev",
-        "magento/magento2-functional-test-module-deploy": "1.0.0-dev",
-        "magento/magento2-functional-test-module-directory": "1.0.0-dev",
-        "magento/magento2-functional-test-module-email": "1.0.0-dev",
-        "magento/magento2-functional-test-module-media-storage": "1.0.0-dev",
-        "magento/magento2-functional-test-module-store": "1.0.0-dev"
+        "magento/magento2-functional-test-module-backend": "100.0.0-dev",
+        "magento/magento2-functional-test-module-cron": "100.0.0-dev",
+        "magento/magento2-functional-test-module-deploy": "100.0.0-dev",
+        "magento/magento2-functional-test-module-directory": "100.0.0-dev",
+        "magento/magento2-functional-test-module-email": "100.0.0-dev",
+        "magento/magento2-functional-test-module-media-storage": "100.0.0-dev",
+        "magento/magento2-functional-test-module-store": "100.0.0-dev"
     },
-    "type": "magento2-test-module",
-    "version": "1.0.0-dev",
-    "license": [
-        "OSL-3.0",
-        "AFL-3.0"
-    ],
     "autoload": {
         "psr-4": {
-            "Magento\\Config\\": ""
+            "Magento\\FunctionalTest\\Config\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableImportExport/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableImportExport/README.md
new file mode 100644
index 00000000000..1cf979955a3
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableImportExport/README.md
@@ -0,0 +1,3 @@
+# Magento 2 Functional Tests
+
+The Functional Tests Module for **Magento_ConfigurableImportExport** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableImportExport/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableImportExport/composer.json
index 2a05a5c46b8..1b2fb5e35ae 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableImportExport/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableImportExport/composer.json
@@ -1,6 +1,12 @@
 {
     "name": "magento/magento2-functional-test-module-configurable-import-export",
     "description": "Magento 2 Functional Test Module Configurable Import Export",
+    "type": "magento2-test-module",
+    "version": "100.0.0-dev",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
     "config": {
         "sort-packages": true
     },
@@ -9,21 +15,15 @@
         "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-catalog": "1.0.0-dev",
-        "magento/magento2-functional-test-module-catalog-import-export": "1.0.0-dev",
-        "magento/magento2-functional-test-module-configurable-product": "1.0.0-dev",
-        "magento/magento2-functional-test-module-eav": "1.0.0-dev",
-        "magento/magento2-functional-test-module-import-export": "1.0.0-dev"
+        "magento/magento2-functional-test-module-catalog": "100.0.0-dev",
+        "magento/magento2-functional-test-module-catalog-import-export": "100.0.0-dev",
+        "magento/magento2-functional-test-module-configurable-product": "100.0.0-dev",
+        "magento/magento2-functional-test-module-eav": "100.0.0-dev",
+        "magento/magento2-functional-test-module-import-export": "100.0.0-dev"
     },
-    "type": "magento2-test-module",
-    "version": "1.0.0-dev",
-    "license": [
-        "OSL-3.0",
-        "AFL-3.0"
-    ],
     "autoload": {
         "psr-4": {
-            "Magento\\ConfigurableImportExport\\": ""
+            "Magento\\FunctionalTest\\ConfigurableImportExport\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/composer.json
index 9aa7e86c8c9..580578d805f 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/composer.json
@@ -1,6 +1,12 @@
 {
     "name": "magento/magento2-functional-test-module-configurable-product",
     "description": "Magento 2 Functional Test Module Configurable Product",
+    "type": "magento2-test-module",
+    "version": "100.0.0-dev",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
     "config": {
         "sort-packages": true
     },
@@ -9,27 +15,21 @@
         "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-backend": "1.0.0-dev",
-        "magento/magento2-functional-test-module-catalog": "1.0.0-dev",
-        "magento/magento2-functional-test-module-catalog-inventory": "1.0.0-dev",
-        "magento/magento2-functional-test-module-checkout": "1.0.0-dev",
-        "magento/magento2-functional-test-module-customer": "1.0.0-dev",
-        "magento/magento2-functional-test-module-eav": "1.0.0-dev",
-        "magento/magento2-functional-test-module-media-storage": "1.0.0-dev",
-        "magento/magento2-functional-test-module-msrp": "1.0.0-dev",
-        "magento/magento2-functional-test-module-quote": "1.0.0-dev",
-        "magento/magento2-functional-test-module-store": "1.0.0-dev",
-        "magento/magento2-functional-test-module-ui": "1.0.0-dev"
+        "magento/magento2-functional-test-module-backend": "100.0.0-dev",
+        "magento/magento2-functional-test-module-catalog": "100.0.0-dev",
+        "magento/magento2-functional-test-module-catalog-inventory": "100.0.0-dev",
+        "magento/magento2-functional-test-module-checkout": "100.0.0-dev",
+        "magento/magento2-functional-test-module-customer": "100.0.0-dev",
+        "magento/magento2-functional-test-module-eav": "100.0.0-dev",
+        "magento/magento2-functional-test-module-media-storage": "100.0.0-dev",
+        "magento/magento2-functional-test-module-msrp": "100.0.0-dev",
+        "magento/magento2-functional-test-module-quote": "100.0.0-dev",
+        "magento/magento2-functional-test-module-store": "100.0.0-dev",
+        "magento/magento2-functional-test-module-ui": "100.0.0-dev"
     },
-    "type": "magento2-test-module",
-    "version": "1.0.0-dev",
-    "license": [
-        "OSL-3.0",
-        "AFL-3.0"
-    ],
     "autoload": {
         "psr-4": {
-            "Magento\\ConfigurableProduct\\": ""
+            "Magento\\FunctionalTest\\ConfigurableProduct\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProductSales/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProductSales/composer.json
index ba94b03134b..eb1f9891fa0 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProductSales/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProductSales/composer.json
@@ -1,6 +1,12 @@
 {
     "name": "magento/magento2-functional-test-module-configurable-product-sales",
     "description": "Magento 2 Functional Test Module Configurable Product Sales",
+    "type": "magento2-test-module",
+    "version": "100.0.0-dev",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
     "config": {
         "sort-packages": true
     },
@@ -9,19 +15,13 @@
         "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-catalog": "1.0.0-dev",
-        "magento/magento2-functional-test-module-sales": "1.0.0-dev",
-        "magento/magento2-functional-test-module-store": "1.0.0-dev"
+        "magento/magento2-functional-test-module-catalog": "100.0.0-dev",
+        "magento/magento2-functional-test-module-sales": "100.0.0-dev",
+        "magento/magento2-functional-test-module-store": "100.0.0-dev"
     },
-    "type": "magento2-test-module",
-    "version": "1.0.0-dev",
-    "license": [
-        "OSL-3.0",
-        "AFL-3.0"
-    ],
     "autoload": {
         "psr-4": {
-            "Magento\\ConfigurableProductSales\\": ""
+            "Magento\\FunctionalTest\\ConfigurableProductSales\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Contact/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Contact/composer.json
index d2fa2c68db6..55311d1c6fc 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Contact/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Contact/composer.json
@@ -1,6 +1,12 @@
 {
     "name": "magento/magento2-functional-test-module-contact",
     "description": "Magento 2 Functional Test Module Contact",
+    "type": "magento2-test-module",
+    "version": "100.0.0-dev",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
     "config": {
         "sort-packages": true
     },
@@ -9,20 +15,14 @@
         "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-cms": "1.0.0-dev",
-        "magento/magento2-functional-test-module-config": "1.0.0-dev",
-        "magento/magento2-functional-test-module-customer": "1.0.0-dev",
-        "magento/magento2-functional-test-module-store": "1.0.0-dev"
+        "magento/magento2-functional-test-module-cms": "100.0.0-dev",
+        "magento/magento2-functional-test-module-config": "100.0.0-dev",
+        "magento/magento2-functional-test-module-customer": "100.0.0-dev",
+        "magento/magento2-functional-test-module-store": "100.0.0-dev"
     },
-    "type": "magento2-test-module",
-    "version": "1.0.0-dev",
-    "license": [
-        "OSL-3.0",
-        "AFL-3.0"
-    ],
     "autoload": {
         "psr-4": {
-            "Magento\\Contact\\": ""
+            "Magento\\FunctionalTest\\Contact\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cookie/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cookie/composer.json
index 100c82d5111..2fd3ec251ae 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cookie/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cookie/composer.json
@@ -1,6 +1,12 @@
 {
     "name": "magento/magento2-functional-test-module-cookie",
     "description": "Magento 2 Functional Test Module Cookie",
+    "type": "magento2-test-module",
+    "version": "100.0.0-dev",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
     "config": {
         "sort-packages": true
     },
@@ -9,17 +15,11 @@
         "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-store": "1.0.0-dev"
+        "magento/magento2-functional-test-module-store": "100.0.0-dev"
     },
-    "type": "magento2-test-module",
-    "version": "1.0.0-dev",
-    "license": [
-        "OSL-3.0",
-        "AFL-3.0"
-    ],
     "autoload": {
         "psr-4": {
-            "Magento\\Cookie\\": ""
+            "Magento\\FunctionalTest\\Cookie\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cron/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cron/composer.json
index cfe9b151565..7982a6dd9c4 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cron/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cron/composer.json
@@ -1,6 +1,12 @@
 {
     "name": "magento/magento2-functional-test-module-cron",
     "description": "Magento 2 Functional Test Module Cron",
+    "type": "magento2-test-module",
+    "version": "100.0.0-dev",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
     "config": {
         "sort-packages": true
     },
@@ -9,17 +15,11 @@
         "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-store": "1.0.0-dev"
+        "magento/magento2-functional-test-module-store": "100.0.0-dev"
     },
-    "type": "magento2-test-module",
-    "version": "1.0.0-dev",
-    "license": [
-        "OSL-3.0",
-        "AFL-3.0"
-    ],
     "autoload": {
         "psr-4": {
-            "Magento\\Cron\\": ""
+            "Magento\\FunctionalTest\\Cron\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CurrencySymbol/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CurrencySymbol/composer.json
index ae53c529bcc..abd3fe78abd 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CurrencySymbol/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CurrencySymbol/composer.json
@@ -1,6 +1,12 @@
 {
     "name": "magento/magento2-functional-test-module-currency-symbol",
     "description": "Magento 2 Functional Test Module Currency Symbol",
+    "type": "magento2-test-module",
+    "version": "100.0.0-dev",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
     "config": {
         "sort-packages": true
     },
@@ -9,21 +15,15 @@
         "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-backend": "1.0.0-dev",
-        "magento/magento2-functional-test-module-config": "1.0.0-dev",
-        "magento/magento2-functional-test-module-directory": "1.0.0-dev",
-        "magento/magento2-functional-test-module-page-cache": "1.0.0-dev",
-        "magento/magento2-functional-test-module-store": "1.0.0-dev"
+        "magento/magento2-functional-test-module-backend": "100.0.0-dev",
+        "magento/magento2-functional-test-module-config": "100.0.0-dev",
+        "magento/magento2-functional-test-module-directory": "100.0.0-dev",
+        "magento/magento2-functional-test-module-page-cache": "100.0.0-dev",
+        "magento/magento2-functional-test-module-store": "100.0.0-dev"
     },
-    "type": "magento2-test-module",
-    "version": "1.0.0-dev",
-    "license": [
-        "OSL-3.0",
-        "AFL-3.0"
-    ],
     "autoload": {
         "psr-4": {
-            "Magento\\CurrencySymbol\\": ""
+            "Magento\\FunctionalTest\\CurrencySymbol\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/composer.json
index 6d4462eae7a..619e4f89537 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/composer.json
@@ -1,6 +1,12 @@
 {
     "name": "magento/magento2-functional-test-module-customer",
     "description": "Magento 2 Functional Test Module Customer",
+    "type": "magento2-test-module",
+    "version": "100.0.0-dev",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
     "config": {
         "sort-packages": true
     },
@@ -9,35 +15,29 @@
         "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-authorization": "1.0.0-dev",
-        "magento/magento2-functional-test-module-backend": "1.0.0-dev",
-        "magento/magento2-functional-test-module-catalog": "1.0.0-dev",
-        "magento/magento2-functional-test-module-checkout": "1.0.0-dev",
-        "magento/magento2-functional-test-module-config": "1.0.0-dev",
-        "magento/magento2-functional-test-module-directory": "1.0.0-dev",
-        "magento/magento2-functional-test-module-eav": "1.0.0-dev",
-        "magento/magento2-functional-test-module-integration": "1.0.0-dev",
-        "magento/magento2-functional-test-module-media-storage": "1.0.0-dev",
-        "magento/magento2-functional-test-module-newsletter": "1.0.0-dev",
-        "magento/magento2-functional-test-module-page-cache": "1.0.0-dev",
-        "magento/magento2-functional-test-module-quote": "1.0.0-dev",
-        "magento/magento2-functional-test-module-review": "1.0.0-dev",
-        "magento/magento2-functional-test-module-sales": "1.0.0-dev",
-        "magento/magento2-functional-test-module-store": "1.0.0-dev",
-        "magento/magento2-functional-test-module-tax": "1.0.0-dev",
-        "magento/magento2-functional-test-module-theme": "1.0.0-dev",
-        "magento/magento2-functional-test-module-ui": "1.0.0-dev",
-        "magento/magento2-functional-test-module-wishlist": "1.0.0-dev"
+        "magento/magento2-functional-test-module-authorization": "100.0.0-dev",
+        "magento/magento2-functional-test-module-backend": "100.0.0-dev",
+        "magento/magento2-functional-test-module-catalog": "100.0.0-dev",
+        "magento/magento2-functional-test-module-checkout": "100.0.0-dev",
+        "magento/magento2-functional-test-module-config": "100.0.0-dev",
+        "magento/magento2-functional-test-module-directory": "100.0.0-dev",
+        "magento/magento2-functional-test-module-eav": "100.0.0-dev",
+        "magento/magento2-functional-test-module-integration": "100.0.0-dev",
+        "magento/magento2-functional-test-module-media-storage": "100.0.0-dev",
+        "magento/magento2-functional-test-module-newsletter": "100.0.0-dev",
+        "magento/magento2-functional-test-module-page-cache": "100.0.0-dev",
+        "magento/magento2-functional-test-module-quote": "100.0.0-dev",
+        "magento/magento2-functional-test-module-review": "100.0.0-dev",
+        "magento/magento2-functional-test-module-sales": "100.0.0-dev",
+        "magento/magento2-functional-test-module-store": "100.0.0-dev",
+        "magento/magento2-functional-test-module-tax": "100.0.0-dev",
+        "magento/magento2-functional-test-module-theme": "100.0.0-dev",
+        "magento/magento2-functional-test-module-ui": "100.0.0-dev",
+        "magento/magento2-functional-test-module-wishlist": "100.0.0-dev"
     },
-    "type": "magento2-test-module",
-    "version": "1.0.0-dev",
-    "license": [
-        "OSL-3.0",
-        "AFL-3.0"
-    ],
     "autoload": {
         "psr-4": {
-            "Magento\\Customer\\": ""
+            "Magento\\FunctionalTest\\Customer\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CustomerAnalytics/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CustomerAnalytics/composer.json
index 24e5dfbe31c..84a73e12eb4 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CustomerAnalytics/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CustomerAnalytics/composer.json
@@ -1,11 +1,11 @@
 {
     "name": "magento/magento2-functional-test-module-customer-analytics",
     "description": "Magento 2 Acceptance Test Module Customer Analytics",
-    "repositories": [
-        {
-            "type": "composer",
-            "url": "https://repo.magento.com/"
-        }
+    "type": "magento2-test-module",
+    "version": "100.0.0-dev",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
     ],
     "config": {
         "sort-packages": true
@@ -15,17 +15,11 @@
         "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-customer": "1.0.0-dev"
+        "magento/magento2-functional-test-module-customer": "100.0.0-dev"
     },
-    "type": "magento2-test-module",
-    "version": "1.0.0-dev",
-    "license": [
-        "OSL-3.0",
-        "AFL-3.0"
-    ],
     "autoload": {
         "psr-4": {
-            "Magento\\CustomerAnalytics\\": ""
+            "Magento\\FunctionalTest\\CustomerAnalytics\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CustomerImportExport/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CustomerImportExport/composer.json
index 096f94ddcd5..dfa5a2761e5 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CustomerImportExport/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CustomerImportExport/composer.json
@@ -1,6 +1,12 @@
 {
     "name": "magento/magento2-functional-test-module-customer-import-export",
     "description": "Magento 2 Functional Test Module Customer Import Export",
+    "type": "magento2-test-module",
+    "version": "100.0.0-dev",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
     "config": {
         "sort-packages": true
     },
@@ -9,22 +15,16 @@
         "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-backend": "1.0.0-dev",
-        "magento/magento2-functional-test-module-customer": "1.0.0-dev",
-        "magento/magento2-functional-test-module-directory": "1.0.0-dev",
-        "magento/magento2-functional-test-module-eav": "1.0.0-dev",
-        "magento/magento2-functional-test-module-import-export": "1.0.0-dev",
-        "magento/magento2-functional-test-module-store": "1.0.0-dev"
+        "magento/magento2-functional-test-module-backend": "100.0.0-dev",
+        "magento/magento2-functional-test-module-customer": "100.0.0-dev",
+        "magento/magento2-functional-test-module-directory": "100.0.0-dev",
+        "magento/magento2-functional-test-module-eav": "100.0.0-dev",
+        "magento/magento2-functional-test-module-import-export": "100.0.0-dev",
+        "magento/magento2-functional-test-module-store": "100.0.0-dev"
     },
-    "type": "magento2-test-module",
-    "version": "1.0.0-dev",
-    "license": [
-        "OSL-3.0",
-        "AFL-3.0"
-    ],
     "autoload": {
         "psr-4": {
-            "Magento\\CustomerImportExport\\": ""
+            "Magento\\FunctionalTest\\CustomerImportExport\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Deploy/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Deploy/composer.json
index 390a3891762..8f5f42b11e8 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Deploy/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Deploy/composer.json
@@ -1,6 +1,12 @@
 {
     "name": "magento/magento2-functional-test-module-deploy",
     "description": "Magento 2 Functional Test Module Deploy",
+    "type": "magento2-test-module",
+    "version": "100.0.0-dev",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
     "config": {
         "sort-packages": true
     },
@@ -9,20 +15,14 @@
         "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-config": "1.0.0-dev",
-        "magento/magento2-functional-test-module-require-js": "1.0.0-dev",
-        "magento/magento2-functional-test-module-store": "1.0.0-dev",
-        "magento/magento2-functional-test-module-user": "1.0.0-dev"
+        "magento/magento2-functional-test-module-config": "100.0.0-dev",
+        "magento/magento2-functional-test-module-require-js": "100.0.0-dev",
+        "magento/magento2-functional-test-module-store": "100.0.0-dev",
+        "magento/magento2-functional-test-module-user": "100.0.0-dev"
     },
-    "type": "magento2-test-module",
-    "version": "1.0.0-dev",
-    "license": [
-        "OSL-3.0",
-        "AFL-3.0"
-    ],
     "autoload": {
         "psr-4": {
-            "Magento\\Deploy\\": ""
+            "Magento\\FunctionalTest\\Deploy\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Developer/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Developer/composer.json
index 94ad9956618..ed52481f544 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Developer/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Developer/composer.json
@@ -1,6 +1,12 @@
 {
     "name": "magento/magento2-functional-test-module-developer",
     "description": "Magento 2 Functional Test Module Developer",
+    "type": "magento2-test-module",
+    "version": "100.0.0-dev",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
     "config": {
         "sort-packages": true
     },
@@ -9,18 +15,12 @@
         "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-config": "1.0.0-dev",
-        "magento/magento2-functional-test-module-store": "1.0.0-dev"
+        "magento/magento2-functional-test-module-config": "100.0.0-dev",
+        "magento/magento2-functional-test-module-store": "100.0.0-dev"
     },
-    "type": "magento2-test-module",
-    "version": "1.0.0-dev",
-    "license": [
-        "OSL-3.0",
-        "AFL-3.0"
-    ],
     "autoload": {
         "psr-4": {
-            "Magento\\Developer\\": ""
+            "Magento\\FunctionalTest\\Developer\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Dhl/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Dhl/composer.json
index d3004456843..a7c5fd0f6cf 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Dhl/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Dhl/composer.json
@@ -1,6 +1,12 @@
 {
     "name": "magento/magento2-functional-test-module-dhl",
     "description": "Magento 2 Functional Test Module Dhl",
+    "type": "magento2-test-module",
+    "version": "100.0.0-dev",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
     "config": {
         "sort-packages": true
     },
@@ -9,25 +15,19 @@
         "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-backend": "1.0.0-dev",
-        "magento/magento2-functional-test-module-catalog": "1.0.0-dev",
-        "magento/magento2-functional-test-module-catalog-inventory": "1.0.0-dev",
-        "magento/magento2-functional-test-module-config": "1.0.0-dev",
-        "magento/magento2-functional-test-module-directory": "1.0.0-dev",
-        "magento/magento2-functional-test-module-quote": "1.0.0-dev",
-        "magento/magento2-functional-test-module-sales": "1.0.0-dev",
-        "magento/magento2-functional-test-module-shipping": "1.0.0-dev",
-        "magento/magento2-functional-test-module-store": "1.0.0-dev"
+        "magento/magento2-functional-test-module-backend": "100.0.0-dev",
+        "magento/magento2-functional-test-module-catalog": "100.0.0-dev",
+        "magento/magento2-functional-test-module-catalog-inventory": "100.0.0-dev",
+        "magento/magento2-functional-test-module-config": "100.0.0-dev",
+        "magento/magento2-functional-test-module-directory": "100.0.0-dev",
+        "magento/magento2-functional-test-module-quote": "100.0.0-dev",
+        "magento/magento2-functional-test-module-sales": "100.0.0-dev",
+        "magento/magento2-functional-test-module-shipping": "100.0.0-dev",
+        "magento/magento2-functional-test-module-store": "100.0.0-dev"
     },
-    "type": "magento2-test-module",
-    "version": "1.0.0-dev",
-    "license": [
-        "OSL-3.0",
-        "AFL-3.0"
-    ],
     "autoload": {
         "psr-4": {
-            "Magento\\Dhl\\": ""
+            "Magento\\FunctionalTest\\Dhl\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Directory/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Directory/composer.json
index eca5738cc5c..9efba5d2592 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Directory/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Directory/composer.json
@@ -1,6 +1,12 @@
 {
     "name": "magento/magento2-functional-test-module-directory",
     "description": "Magento 2 Functional Test Module Directory",
+    "type": "magento2-test-module",
+    "version": "100.0.0-dev",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
     "config": {
         "sort-packages": true
     },
@@ -9,19 +15,13 @@
         "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-backend": "1.0.0-dev",
-        "magento/magento2-functional-test-module-config": "1.0.0-dev",
-        "magento/magento2-functional-test-module-store": "1.0.0-dev"
+        "magento/magento2-functional-test-module-backend": "100.0.0-dev",
+        "magento/magento2-functional-test-module-config": "100.0.0-dev",
+        "magento/magento2-functional-test-module-store": "100.0.0-dev"
     },
-    "type": "magento2-test-module",
-    "version": "1.0.0-dev",
-    "license": [
-        "OSL-3.0",
-        "AFL-3.0"
-    ],
     "autoload": {
         "psr-4": {
-            "Magento\\Directory\\": ""
+            "Magento\\FunctionalTest\\Directory\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Downloadable/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Downloadable/composer.json
index da969015270..242492bc7e0 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Downloadable/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Downloadable/composer.json
@@ -1,6 +1,12 @@
 {
     "name": "magento/magento2-functional-test-module-downloadable",
     "description": "Magento 2 Functional Test Module Downloadable",
+    "type": "magento2-test-module",
+    "version": "100.0.0-dev",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
     "config": {
         "sort-packages": true
     },
@@ -9,32 +15,26 @@
         "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-backend": "1.0.0-dev",
-        "magento/magento2-functional-test-module-catalog": "1.0.0-dev",
-        "magento/magento2-functional-test-module-catalog-inventory": "1.0.0-dev",
-        "magento/magento2-functional-test-module-checkout": "1.0.0-dev",
-        "magento/magento2-functional-test-module-config": "1.0.0-dev",
-        "magento/magento2-functional-test-module-customer": "1.0.0-dev",
-        "magento/magento2-functional-test-module-directory": "1.0.0-dev",
-        "magento/magento2-functional-test-module-eav": "1.0.0-dev",
-        "magento/magento2-functional-test-module-gift-message": "1.0.0-dev",
-        "magento/magento2-functional-test-module-media-storage": "1.0.0-dev",
-        "magento/magento2-functional-test-module-quote": "1.0.0-dev",
-        "magento/magento2-functional-test-module-sales": "1.0.0-dev",
-        "magento/magento2-functional-test-module-store": "1.0.0-dev",
-        "magento/magento2-functional-test-module-tax": "1.0.0-dev",
-        "magento/magento2-functional-test-module-theme": "1.0.0-dev",
-        "magento/magento2-functional-test-module-ui": "1.0.0-dev"
+        "magento/magento2-functional-test-module-backend": "100.0.0-dev",
+        "magento/magento2-functional-test-module-catalog": "100.0.0-dev",
+        "magento/magento2-functional-test-module-catalog-inventory": "100.0.0-dev",
+        "magento/magento2-functional-test-module-checkout": "100.0.0-dev",
+        "magento/magento2-functional-test-module-config": "100.0.0-dev",
+        "magento/magento2-functional-test-module-customer": "100.0.0-dev",
+        "magento/magento2-functional-test-module-directory": "100.0.0-dev",
+        "magento/magento2-functional-test-module-eav": "100.0.0-dev",
+        "magento/magento2-functional-test-module-gift-message": "100.0.0-dev",
+        "magento/magento2-functional-test-module-media-storage": "100.0.0-dev",
+        "magento/magento2-functional-test-module-quote": "100.0.0-dev",
+        "magento/magento2-functional-test-module-sales": "100.0.0-dev",
+        "magento/magento2-functional-test-module-store": "100.0.0-dev",
+        "magento/magento2-functional-test-module-tax": "100.0.0-dev",
+        "magento/magento2-functional-test-module-theme": "100.0.0-dev",
+        "magento/magento2-functional-test-module-ui": "100.0.0-dev"
     },
-    "type": "magento2-test-module",
-    "version": "1.0.0-dev",
-    "license": [
-        "OSL-3.0",
-        "AFL-3.0"
-    ],
     "autoload": {
         "psr-4": {
-            "Magento\\Downloadable\\": ""
+            "Magento\\FunctionalTest\\Downloadable\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/DownloadableImportExport/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/DownloadableImportExport/composer.json
index 1c2511d9b9d..1d45efe751c 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/DownloadableImportExport/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/DownloadableImportExport/composer.json
@@ -1,6 +1,12 @@
 {
     "name": "magento/magento2-functional-test-module-downloadable-import-export",
     "description": "Magento 2 Functional Test Module Downloadable Import Export",
+    "type": "magento2-test-module",
+    "version": "100.0.0-dev",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
     "config": {
         "sort-packages": true
     },
@@ -9,22 +15,16 @@
         "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-catalog": "1.0.0-dev",
-        "magento/magento2-functional-test-module-catalog-import-export": "1.0.0-dev",
-        "magento/magento2-functional-test-module-downloadable": "1.0.0-dev",
-        "magento/magento2-functional-test-module-eav": "1.0.0-dev",
-        "magento/magento2-functional-test-module-import-export": "1.0.0-dev",
-        "magento/magento2-functional-test-module-store": "1.0.0-dev"
+        "magento/magento2-functional-test-module-catalog": "100.0.0-dev",
+        "magento/magento2-functional-test-module-catalog-import-export": "100.0.0-dev",
+        "magento/magento2-functional-test-module-downloadable": "100.0.0-dev",
+        "magento/magento2-functional-test-module-eav": "100.0.0-dev",
+        "magento/magento2-functional-test-module-import-export": "100.0.0-dev",
+        "magento/magento2-functional-test-module-store": "100.0.0-dev"
     },
-    "type": "magento2-test-module",
-    "version": "1.0.0-dev",
-    "license": [
-        "OSL-3.0",
-        "AFL-3.0"
-    ],
     "autoload": {
         "psr-4": {
-            "Magento\\DownloadableImportExport\\": ""
+            "Magento\\FunctionalTest\\DownloadableImportExport\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Eav/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Eav/composer.json
index 8865b797d08..457543c13e0 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Eav/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Eav/composer.json
@@ -1,6 +1,12 @@
 {
     "name": "magento/magento2-functional-test-module-eav",
     "description": "Magento 2 Functional Test Module Eav",
+    "type": "magento2-test-module",
+    "version": "100.0.0-dev",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
     "config": {
         "sort-packages": true
     },
@@ -9,21 +15,15 @@
         "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-backend": "1.0.0-dev",
-        "magento/magento2-functional-test-module-catalog": "1.0.0-dev",
-        "magento/magento2-functional-test-module-config": "1.0.0-dev",
-        "magento/magento2-functional-test-module-media-storage": "1.0.0-dev",
-        "magento/magento2-functional-test-module-store": "1.0.0-dev"
+        "magento/magento2-functional-test-module-backend": "100.0.0-dev",
+        "magento/magento2-functional-test-module-catalog": "100.0.0-dev",
+        "magento/magento2-functional-test-module-config": "100.0.0-dev",
+        "magento/magento2-functional-test-module-media-storage": "100.0.0-dev",
+        "magento/magento2-functional-test-module-store": "100.0.0-dev"
     },
-    "type": "magento2-test-module",
-    "version": "1.0.0-dev",
-    "license": [
-        "OSL-3.0",
-        "AFL-3.0"
-    ],
     "autoload": {
         "psr-4": {
-            "Magento\\Eav\\": ""
+            "Magento\\FunctionalTest\\Eav\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Email/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Email/composer.json
index bd6d0699d5d..0f8d5b27a3e 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Email/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Email/composer.json
@@ -1,6 +1,12 @@
 {
     "name": "magento/magento2-functional-test-module-email",
     "description": "Magento 2 Functional Test Module Email",
+    "type": "magento2-test-module",
+    "version": "100.0.0-dev",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
     "config": {
         "sort-packages": true
     },
@@ -9,22 +15,16 @@
         "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-backend": "1.0.0-dev",
-        "magento/magento2-functional-test-module-cms": "1.0.0-dev",
-        "magento/magento2-functional-test-module-config": "1.0.0-dev",
-        "magento/magento2-functional-test-module-store": "1.0.0-dev",
-        "magento/magento2-functional-test-module-theme": "1.0.0-dev",
-        "magento/magento2-functional-test-module-variable": "1.0.0-dev"
+        "magento/magento2-functional-test-module-backend": "100.0.0-dev",
+        "magento/magento2-functional-test-module-cms": "100.0.0-dev",
+        "magento/magento2-functional-test-module-config": "100.0.0-dev",
+        "magento/magento2-functional-test-module-store": "100.0.0-dev",
+        "magento/magento2-functional-test-module-theme": "100.0.0-dev",
+        "magento/magento2-functional-test-module-variable": "100.0.0-dev"
     },
-    "type": "magento2-test-module",
-    "version": "1.0.0-dev",
-    "license": [
-        "OSL-3.0",
-        "AFL-3.0"
-    ],
     "autoload": {
         "psr-4": {
-            "Magento\\Email\\": ""
+            "Magento\\FunctionalTest\\Email\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/EncryptionKey/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/EncryptionKey/composer.json
index 347d3e07c5d..4e8debbc897 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/EncryptionKey/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/EncryptionKey/composer.json
@@ -1,6 +1,12 @@
 {
     "name": "magento/magento2-functional-test-module-encryption-key",
     "description": "Magento 2 Functional Test Module Encryption Key",
+    "type": "magento2-test-module",
+    "version": "100.0.0-dev",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
     "config": {
         "sort-packages": true
     },
@@ -9,18 +15,12 @@
         "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-backend": "1.0.0-dev",
-        "magento/magento2-functional-test-module-config": "1.0.0-dev"
+        "magento/magento2-functional-test-module-backend": "100.0.0-dev",
+        "magento/magento2-functional-test-module-config": "100.0.0-dev"
     },
-    "type": "magento2-test-module",
-    "version": "1.0.0-dev",
-    "license": [
-        "OSL-3.0",
-        "AFL-3.0"
-    ],
     "autoload": {
         "psr-4": {
-            "Magento\\EncryptionKey\\": ""
+            "Magento\\FunctionalTest\\EncryptionKey\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Fedex/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Fedex/composer.json
index bfe94e834c3..ecc4a6e3886 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Fedex/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Fedex/composer.json
@@ -1,6 +1,12 @@
 {
     "name": "magento/magento2-functional-test-module-fedex",
     "description": "Magento 2 Functional Test Module Fedex",
+    "type": "magento2-test-module",
+    "version": "100.0.0-dev",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
     "config": {
         "sort-packages": true
     },
@@ -9,24 +15,18 @@
         "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-catalog": "1.0.0-dev",
-        "magento/magento2-functional-test-module-catalog-inventory": "1.0.0-dev",
-        "magento/magento2-functional-test-module-config": "1.0.0-dev",
-        "magento/magento2-functional-test-module-directory": "1.0.0-dev",
-        "magento/magento2-functional-test-module-quote": "1.0.0-dev",
-        "magento/magento2-functional-test-module-sales": "1.0.0-dev",
-        "magento/magento2-functional-test-module-shipping": "1.0.0-dev",
-        "magento/magento2-functional-test-module-store": "1.0.0-dev"
+        "magento/magento2-functional-test-module-catalog": "100.0.0-dev",
+        "magento/magento2-functional-test-module-catalog-inventory": "100.0.0-dev",
+        "magento/magento2-functional-test-module-config": "100.0.0-dev",
+        "magento/magento2-functional-test-module-directory": "100.0.0-dev",
+        "magento/magento2-functional-test-module-quote": "100.0.0-dev",
+        "magento/magento2-functional-test-module-sales": "100.0.0-dev",
+        "magento/magento2-functional-test-module-shipping": "100.0.0-dev",
+        "magento/magento2-functional-test-module-store": "100.0.0-dev"
     },
-    "type": "magento2-test-module",
-    "version": "1.0.0-dev",
-    "license": [
-        "OSL-3.0",
-        "AFL-3.0"
-    ],
     "autoload": {
         "psr-4": {
-            "Magento\\Fedex\\": ""
+            "Magento\\FunctionalTest\\Fedex\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GiftMessage/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GiftMessage/composer.json
index 97fdfe9ca40..15bc979a7e7 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GiftMessage/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GiftMessage/composer.json
@@ -1,6 +1,12 @@
 {
     "name": "magento/magento2-functional-test-module-gift-message",
     "description": "Magento 2 Functional Test Module Gift Message",
+    "type": "magento2-test-module",
+    "version": "100.0.0-dev",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
     "config": {
         "sort-packages": true
     },
@@ -9,24 +15,18 @@
         "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-backend": "1.0.0-dev",
-        "magento/magento2-functional-test-module-catalog": "1.0.0-dev",
-        "magento/magento2-functional-test-module-checkout": "1.0.0-dev",
-        "magento/magento2-functional-test-module-customer": "1.0.0-dev",
-        "magento/magento2-functional-test-module-quote": "1.0.0-dev",
-        "magento/magento2-functional-test-module-sales": "1.0.0-dev",
-        "magento/magento2-functional-test-module-store": "1.0.0-dev",
-        "magento/magento2-functional-test-module-ui": "1.0.0-dev"
+        "magento/magento2-functional-test-module-backend": "100.0.0-dev",
+        "magento/magento2-functional-test-module-catalog": "100.0.0-dev",
+        "magento/magento2-functional-test-module-checkout": "100.0.0-dev",
+        "magento/magento2-functional-test-module-customer": "100.0.0-dev",
+        "magento/magento2-functional-test-module-quote": "100.0.0-dev",
+        "magento/magento2-functional-test-module-sales": "100.0.0-dev",
+        "magento/magento2-functional-test-module-store": "100.0.0-dev",
+        "magento/magento2-functional-test-module-ui": "100.0.0-dev"
     },
-    "type": "magento2-test-module",
-    "version": "1.0.0-dev",
-    "license": [
-        "OSL-3.0",
-        "AFL-3.0"
-    ],
     "autoload": {
         "psr-4": {
-            "Magento\\GiftMessage\\": ""
+            "Magento\\FunctionalTest\\GiftMessage\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GoogleAdwords/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GoogleAdwords/composer.json
index 265dad69246..b91c49343d1 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GoogleAdwords/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GoogleAdwords/composer.json
@@ -1,6 +1,12 @@
 {
     "name": "magento/magento2-functional-test-module-google-adwords",
     "description": "Magento 2 Functional Test Module Google Adwords",
+    "type": "magento2-test-module",
+    "version": "100.0.0-dev",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
     "config": {
         "sort-packages": true
     },
@@ -9,18 +15,12 @@
         "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-sales": "1.0.0-dev",
-        "magento/magento2-functional-test-module-store": "1.0.0-dev"
+        "magento/magento2-functional-test-module-sales": "100.0.0-dev",
+        "magento/magento2-functional-test-module-store": "100.0.0-dev"
     },
-    "type": "magento2-test-module",
-    "version": "1.0.0-dev",
-    "license": [
-        "OSL-3.0",
-        "AFL-3.0"
-    ],
     "autoload": {
         "psr-4": {
-            "Magento\\GoogleAdwords\\": ""
+            "Magento\\FunctionalTest\\GoogleAdwords\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GoogleAnalytics/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GoogleAnalytics/composer.json
index 9fc3d17c75d..d020e266ca9 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GoogleAnalytics/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GoogleAnalytics/composer.json
@@ -1,6 +1,12 @@
 {
     "name": "magento/magento2-functional-test-module-google-analytics",
     "description": "Magento 2 Functional Test Module Google Analytics",
+    "type": "magento2-test-module",
+    "version": "100.0.0-dev",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
     "config": {
         "sort-packages": true
     },
@@ -9,19 +15,13 @@
         "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-cookie": "1.0.0-dev",
-        "magento/magento2-functional-test-module-sales": "1.0.0-dev",
-        "magento/magento2-functional-test-module-store": "1.0.0-dev"
+        "magento/magento2-functional-test-module-cookie": "100.0.0-dev",
+        "magento/magento2-functional-test-module-sales": "100.0.0-dev",
+        "magento/magento2-functional-test-module-store": "100.0.0-dev"
     },
-    "type": "magento2-test-module",
-    "version": "1.0.0-dev",
-    "license": [
-        "OSL-3.0",
-        "AFL-3.0"
-    ],
     "autoload": {
         "psr-4": {
-            "Magento\\GoogleAnalytics\\": ""
+            "Magento\\FunctionalTest\\GoogleAnalytics\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GoogleOptimizer/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GoogleOptimizer/composer.json
index 5a5542539aa..8dc7207d42b 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GoogleOptimizer/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GoogleOptimizer/composer.json
@@ -1,6 +1,12 @@
 {
     "name": "magento/magento2-functional-test-module-google-optimizer",
     "description": "Magento 2 Functional Test Module Google Optimizer",
+    "type": "magento2-test-module",
+    "version": "100.0.0-dev",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
     "config": {
         "sort-packages": true
     },
@@ -9,22 +15,16 @@
         "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-backend": "1.0.0-dev",
-        "magento/magento2-functional-test-module-catalog": "1.0.0-dev",
-        "magento/magento2-functional-test-module-cms": "1.0.0-dev",
-        "magento/magento2-functional-test-module-google-analytics": "1.0.0-dev",
-        "magento/magento2-functional-test-module-store": "1.0.0-dev",
-        "magento/magento2-functional-test-module-ui": "1.0.0-dev"
+        "magento/magento2-functional-test-module-backend": "100.0.0-dev",
+        "magento/magento2-functional-test-module-catalog": "100.0.0-dev",
+        "magento/magento2-functional-test-module-cms": "100.0.0-dev",
+        "magento/magento2-functional-test-module-google-analytics": "100.0.0-dev",
+        "magento/magento2-functional-test-module-store": "100.0.0-dev",
+        "magento/magento2-functional-test-module-ui": "100.0.0-dev"
     },
-    "type": "magento2-test-module",
-    "version": "1.0.0-dev",
-    "license": [
-        "OSL-3.0",
-        "AFL-3.0"
-    ],
     "autoload": {
         "psr-4": {
-            "Magento\\GoogleOptimizer\\": ""
+            "Magento\\FunctionalTest\\GoogleOptimizer\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GraphQl/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GraphQl/composer.json
index b2ddecd987d..296a254a4d2 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GraphQl/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GraphQl/composer.json
@@ -1,6 +1,12 @@
 {
     "name": "magento/magento2-functional-test-module-graph-ql",
     "description": "Magento 2 Functional Test Module Graph Ql",
+    "type": "magento2-test-module",
+    "version": "100.0.0-dev",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
     "config": {
         "sort-packages": true
     },
@@ -9,19 +15,13 @@
         "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-webapi": "1.0.0-dev",
-        "magento/magento2-functional-test-module-eav": "1.0.0-dev",
-        "magento/magento2-functional-test-module-catalog": "1.0.0-dev"
+        "magento/magento2-functional-test-module-webapi": "100.0.0-dev",
+        "magento/magento2-functional-test-module-eav": "100.0.0-dev",
+        "magento/magento2-functional-test-module-catalog": "100.0.0-dev"
     },
-    "type": "magento2-test-module",
-    "version": "1.0.0-dev",
-    "license": [
-        "OSL-3.0",
-        "AFL-3.0"
-    ],
     "autoload": {
         "psr-4": {
-            "Magento\\GraphQl\\": ""
+            "Magento\\FunctionalTest\\GraphQl\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GroupedImportExport/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GroupedImportExport/composer.json
index 0a0c3364faa..05f0d72d0e7 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GroupedImportExport/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GroupedImportExport/composer.json
@@ -1,6 +1,12 @@
 {
     "name": "magento/magento2-functional-test-module-grouped-import-export",
     "description": "Magento 2 Functional Test Module Grouped Import Export",
+    "type": "magento2-test-module",
+    "version": "100.0.0-dev",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
     "config": {
         "sort-packages": true
     },
@@ -9,21 +15,15 @@
         "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-catalog": "1.0.0-dev",
-        "magento/magento2-functional-test-module-catalog-import-export": "1.0.0-dev",
-        "magento/magento2-functional-test-module-eav": "1.0.0-dev",
-        "magento/magento2-functional-test-module-grouped-product": "1.0.0-dev",
-        "magento/magento2-functional-test-module-import-export": "1.0.0-dev"
+        "magento/magento2-functional-test-module-catalog": "100.0.0-dev",
+        "magento/magento2-functional-test-module-catalog-import-export": "100.0.0-dev",
+        "magento/magento2-functional-test-module-eav": "100.0.0-dev",
+        "magento/magento2-functional-test-module-grouped-product": "100.0.0-dev",
+        "magento/magento2-functional-test-module-import-export": "100.0.0-dev"
     },
-    "type": "magento2-test-module",
-    "version": "1.0.0-dev",
-    "license": [
-        "OSL-3.0",
-        "AFL-3.0"
-    ],
     "autoload": {
         "psr-4": {
-            "Magento\\GroupedImportExport\\": ""
+            "Magento\\FunctionalTest\\GroupedImportExport\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GroupedProduct/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GroupedProduct/composer.json
index 7254d77ba42..036d0130867 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GroupedProduct/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GroupedProduct/composer.json
@@ -1,6 +1,12 @@
 {
     "name": "magento/magento2-functional-test-module-grouped-product",
     "description": "Magento 2 Functional Test Module Grouped Product",
+    "type": "magento2-test-module",
+    "version": "100.0.0-dev",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
     "config": {
         "sort-packages": true
     },
@@ -9,28 +15,22 @@
         "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-backend": "1.0.0-dev",
-        "magento/magento2-functional-test-module-catalog": "1.0.0-dev",
-        "magento/magento2-functional-test-module-catalog-inventory": "1.0.0-dev",
-        "magento/magento2-functional-test-module-checkout": "1.0.0-dev",
-        "magento/magento2-functional-test-module-customer": "1.0.0-dev",
-        "magento/magento2-functional-test-module-eav": "1.0.0-dev",
-        "magento/magento2-functional-test-module-media-storage": "1.0.0-dev",
-        "magento/magento2-functional-test-module-msrp": "1.0.0-dev",
-        "magento/magento2-functional-test-module-quote": "1.0.0-dev",
-        "magento/magento2-functional-test-module-sales": "1.0.0-dev",
-        "magento/magento2-functional-test-module-store": "1.0.0-dev",
-        "magento/magento2-functional-test-module-ui": "1.0.0-dev"
+        "magento/magento2-functional-test-module-backend": "100.0.0-dev",
+        "magento/magento2-functional-test-module-catalog": "100.0.0-dev",
+        "magento/magento2-functional-test-module-catalog-inventory": "100.0.0-dev",
+        "magento/magento2-functional-test-module-checkout": "100.0.0-dev",
+        "magento/magento2-functional-test-module-customer": "100.0.0-dev",
+        "magento/magento2-functional-test-module-eav": "100.0.0-dev",
+        "magento/magento2-functional-test-module-media-storage": "100.0.0-dev",
+        "magento/magento2-functional-test-module-msrp": "100.0.0-dev",
+        "magento/magento2-functional-test-module-quote": "100.0.0-dev",
+        "magento/magento2-functional-test-module-sales": "100.0.0-dev",
+        "magento/magento2-functional-test-module-store": "100.0.0-dev",
+        "magento/magento2-functional-test-module-ui": "100.0.0-dev"
     },
-    "type": "magento2-test-module",
-    "version": "1.0.0-dev",
-    "license": [
-        "OSL-3.0",
-        "AFL-3.0"
-    ],
     "autoload": {
         "psr-4": {
-            "Magento\\GroupedProduct\\": ""
+            "Magento\\FunctionalTest\\GroupedProduct\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ImportExport/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ImportExport/composer.json
index 61b4747da1c..ccd2b010ff7 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ImportExport/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ImportExport/composer.json
@@ -1,6 +1,12 @@
 {
     "name": "magento/magento2-functional-test-module-import-export",
     "description": "Magento 2 Functional Test Module Import Export",
+    "type": "magento2-test-module",
+    "version": "100.0.0-dev",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
     "config": {
         "sort-packages": true
     },
@@ -9,21 +15,15 @@
         "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-backend": "1.0.0-dev",
-        "magento/magento2-functional-test-module-catalog": "1.0.0-dev",
-        "magento/magento2-functional-test-module-eav": "1.0.0-dev",
-        "magento/magento2-functional-test-module-media-storage": "1.0.0-dev",
-        "magento/magento2-functional-test-module-store": "1.0.0-dev"
+        "magento/magento2-functional-test-module-backend": "100.0.0-dev",
+        "magento/magento2-functional-test-module-catalog": "100.0.0-dev",
+        "magento/magento2-functional-test-module-eav": "100.0.0-dev",
+        "magento/magento2-functional-test-module-media-storage": "100.0.0-dev",
+        "magento/magento2-functional-test-module-store": "100.0.0-dev"
     },
-    "type": "magento2-test-module",
-    "version": "1.0.0-dev",
-    "license": [
-        "OSL-3.0",
-        "AFL-3.0"
-    ],
     "autoload": {
         "psr-4": {
-            "Magento\\ImportExport\\": ""
+            "Magento\\FunctionalTest\\ImportExport\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Indexer/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Indexer/composer.json
index 3077c217198..7f118d8d4e0 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Indexer/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Indexer/composer.json
@@ -1,6 +1,12 @@
 {
     "name": "magento/magento2-functional-test-module-indexer",
     "description": "Magento 2 Functional Test Module Indexer",
+    "type": "magento2-test-module",
+    "version": "100.0.0-dev",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
     "config": {
         "sort-packages": true
     },
@@ -9,17 +15,11 @@
         "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-backend": "1.0.0-dev"
+        "magento/magento2-functional-test-module-backend": "100.0.0-dev"
     },
-    "type": "magento2-test-module",
-    "version": "1.0.0-dev",
-    "license": [
-        "OSL-3.0",
-        "AFL-3.0"
-    ],
     "autoload": {
         "psr-4": {
-            "Magento\\Indexer\\": ""
+            "Magento\\FunctionalTest\\Indexer\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/InstantPurchase/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/InstantPurchase/composer.json
index 0ffaf50c912..2004570a0ca 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/InstantPurchase/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/InstantPurchase/composer.json
@@ -1,6 +1,12 @@
 {
     "name": "magento/magento2-functional-test-module-instant-purchase",
     "description": "Magento 2 Functional Test Module Instant Purchase",
+    "type": "magento2-test-module",
+    "version": "100.0.0-dev",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
     "config": {
         "sort-packages": true
     },
@@ -9,22 +15,16 @@
         "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-store": "1.0.0-dev",
-        "magento/magento2-functional-test-module-catalog": "1.0.0-dev",
-        "magento/magento2-functional-test-module-customer": "1.0.0-dev",
-        "magento/magento2-functional-test-module-sales": "1.0.0-dev",
-        "magento/magento2-functional-test-module-quote": "1.0.0-dev",
-        "magento/magento2-functional-test-module-vault": "1.0.0-dev"
+        "magento/magento2-functional-test-module-store": "100.0.0-dev",
+        "magento/magento2-functional-test-module-catalog": "100.0.0-dev",
+        "magento/magento2-functional-test-module-customer": "100.0.0-dev",
+        "magento/magento2-functional-test-module-sales": "100.0.0-dev",
+        "magento/magento2-functional-test-module-quote": "100.0.0-dev",
+        "magento/magento2-functional-test-module-vault": "100.0.0-dev"
     },
-    "type": "magento2-test-module",
-    "version": "1.0.0-dev",
-    "license": [
-        "OSL-3.0",
-        "AFL-3.0"
-    ],
     "autoload": {
         "psr-4": {
-            "Magento\\InstantPurchase\\": ""
+            "Magento\\FunctionalTest\\InstantPurchase\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Integration/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Integration/composer.json
index 8e9d51bc67f..8ff747736c9 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Integration/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Integration/composer.json
@@ -1,6 +1,12 @@
 {
     "name": "magento/magento2-functional-test-module-integration",
     "description": "Magento 2 Functional Test Module Integration",
+    "type": "magento2-test-module",
+    "version": "100.0.0-dev",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
     "config": {
         "sort-packages": true
     },
@@ -9,22 +15,16 @@
         "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-authorization": "1.0.0-dev",
-        "magento/magento2-functional-test-module-backend": "1.0.0-dev",
-        "magento/magento2-functional-test-module-customer": "1.0.0-dev",
-        "magento/magento2-functional-test-module-security": "1.0.0-dev",
-        "magento/magento2-functional-test-module-store": "1.0.0-dev",
-        "magento/magento2-functional-test-module-user": "1.0.0-dev"
+        "magento/magento2-functional-test-module-authorization": "100.0.0-dev",
+        "magento/magento2-functional-test-module-backend": "100.0.0-dev",
+        "magento/magento2-functional-test-module-customer": "100.0.0-dev",
+        "magento/magento2-functional-test-module-security": "100.0.0-dev",
+        "magento/magento2-functional-test-module-store": "100.0.0-dev",
+        "magento/magento2-functional-test-module-user": "100.0.0-dev"
     },
-    "type": "magento2-test-module",
-    "version": "1.0.0-dev",
-    "license": [
-        "OSL-3.0",
-        "AFL-3.0"
-    ],
     "autoload": {
         "psr-4": {
-            "Magento\\Integration\\": ""
+            "Magento\\FunctionalTest\\Integration\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/LayeredNavigation/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/LayeredNavigation/composer.json
index 31e6ee720a4..4579bbc1cbb 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/LayeredNavigation/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/LayeredNavigation/composer.json
@@ -1,6 +1,12 @@
 {
     "name": "magento/magento2-functional-test-module-layered-navigation",
     "description": "Magento 2 Functional Test Module Layered Navigation",
+    "type": "magento2-test-module",
+    "version": "100.0.0-dev",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
     "config": {
         "sort-packages": true
     },
@@ -9,18 +15,12 @@
         "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-catalog": "1.0.0-dev",
-        "magento/magento2-functional-test-module-config": "1.0.0-dev"
+        "magento/magento2-functional-test-module-catalog": "100.0.0-dev",
+        "magento/magento2-functional-test-module-config": "100.0.0-dev"
     },
-    "type": "magento2-test-module",
-    "version": "1.0.0-dev",
-    "license": [
-        "OSL-3.0",
-        "AFL-3.0"
-    ],
     "autoload": {
         "psr-4": {
-            "Magento\\LayeredNavigation\\": ""
+            "Magento\\FunctionalTest\\LayeredNavigation\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Marketplace/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Marketplace/composer.json
index 3c46a479567..b1249f0ef9c 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Marketplace/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Marketplace/composer.json
@@ -1,6 +1,12 @@
 {
     "name": "magento/magento2-functional-test-module-marketplace",
     "description": "Magento 2 Functional Test Module Marketplace",
+    "type": "magento2-test-module",
+    "version": "100.0.0-dev",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
     "config": {
         "sort-packages": true
     },
@@ -9,17 +15,11 @@
         "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-backend": "1.0.0-dev"
+        "magento/magento2-functional-test-module-backend": "100.0.0-dev"
     },
-    "type": "magento2-test-module",
-    "version": "1.0.0-dev",
-    "license": [
-        "OSL-3.0",
-        "AFL-3.0"
-    ],
     "autoload": {
         "psr-4": {
-            "Magento\\Marketplace\\": ""
+            "Magento\\FunctionalTest\\Marketplace\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/MediaStorage/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/MediaStorage/composer.json
index 7367ba3cc52..6326c8e7af7 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/MediaStorage/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/MediaStorage/composer.json
@@ -1,6 +1,12 @@
 {
     "name": "magento/magento2-functional-test-module-media-storage",
     "description": "Magento 2 Functional Test Module Media Storage",
+    "type": "magento2-test-module",
+    "version": "100.0.0-dev",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
     "config": {
         "sort-packages": true
     },
@@ -9,19 +15,13 @@
         "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-backend": "1.0.0-dev",
-        "magento/magento2-functional-test-module-config": "1.0.0-dev",
-        "magento/magento2-functional-test-module-store": "1.0.0-dev"
+        "magento/magento2-functional-test-module-backend": "100.0.0-dev",
+        "magento/magento2-functional-test-module-config": "100.0.0-dev",
+        "magento/magento2-functional-test-module-store": "100.0.0-dev"
     },
-    "type": "magento2-test-module",
-    "version": "1.0.0-dev",
-    "license": [
-        "OSL-3.0",
-        "AFL-3.0"
-    ],
     "autoload": {
         "psr-4": {
-            "Magento\\MediaStorage\\": ""
+            "Magento\\FunctionalTest\\MediaStorage\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Msrp/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Msrp/composer.json
index 7941442a770..fe8ddd6d3b5 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Msrp/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Msrp/composer.json
@@ -1,6 +1,12 @@
 {
     "name": "magento/magento2-functional-test-module-msrp",
     "description": "Magento 2 Functional Test Module Msrp",
+    "type": "magento2-test-module",
+    "version": "100.0.0-dev",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
     "config": {
         "sort-packages": true
     },
@@ -9,22 +15,16 @@
         "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-catalog": "1.0.0-dev",
-        "magento/magento2-functional-test-module-downloadable": "1.0.0-dev",
-        "magento/magento2-functional-test-module-eav": "1.0.0-dev",
-        "magento/magento2-functional-test-module-grouped-product": "1.0.0-dev",
-        "magento/magento2-functional-test-module-store": "1.0.0-dev",
-        "magento/magento2-functional-test-module-tax": "1.0.0-dev"
+        "magento/magento2-functional-test-module-catalog": "100.0.0-dev",
+        "magento/magento2-functional-test-module-downloadable": "100.0.0-dev",
+        "magento/magento2-functional-test-module-eav": "100.0.0-dev",
+        "magento/magento2-functional-test-module-grouped-product": "100.0.0-dev",
+        "magento/magento2-functional-test-module-store": "100.0.0-dev",
+        "magento/magento2-functional-test-module-tax": "100.0.0-dev"
     },
-    "type": "magento2-test-module",
-    "version": "1.0.0-dev",
-    "license": [
-        "OSL-3.0",
-        "AFL-3.0"
-    ],
     "autoload": {
         "psr-4": {
-            "Magento\\Msrp\\": ""
+            "Magento\\FunctionalTest\\Msrp\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Multishipping/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Multishipping/composer.json
index 7173e96e9a7..177fc24b9d0 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Multishipping/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Multishipping/composer.json
@@ -1,6 +1,12 @@
 {
     "name": "magento/magento2-functional-test-module-multishipping",
     "description": "Magento 2 Functional Test Module Multishipping",
+    "type": "magento2-test-module",
+    "version": "100.0.0-dev",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
     "config": {
         "sort-packages": true
     },
@@ -9,24 +15,18 @@
         "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-checkout": "1.0.0-dev",
-        "magento/magento2-functional-test-module-customer": "1.0.0-dev",
-        "magento/magento2-functional-test-module-directory": "1.0.0-dev",
-        "magento/magento2-functional-test-module-payment": "1.0.0-dev",
-        "magento/magento2-functional-test-module-quote": "1.0.0-dev",
-        "magento/magento2-functional-test-module-sales": "1.0.0-dev",
-        "magento/magento2-functional-test-module-store": "1.0.0-dev",
-        "magento/magento2-functional-test-module-tax": "1.0.0-dev"
+        "magento/magento2-functional-test-module-checkout": "100.0.0-dev",
+        "magento/magento2-functional-test-module-customer": "100.0.0-dev",
+        "magento/magento2-functional-test-module-directory": "100.0.0-dev",
+        "magento/magento2-functional-test-module-payment": "100.0.0-dev",
+        "magento/magento2-functional-test-module-quote": "100.0.0-dev",
+        "magento/magento2-functional-test-module-sales": "100.0.0-dev",
+        "magento/magento2-functional-test-module-store": "100.0.0-dev",
+        "magento/magento2-functional-test-module-tax": "100.0.0-dev"
     },
-    "type": "magento2-test-module",
-    "version": "1.0.0-dev",
-    "license": [
-        "OSL-3.0",
-        "AFL-3.0"
-    ],
     "autoload": {
         "psr-4": {
-            "Magento\\Multishipping\\": ""
+            "Magento\\FunctionalTest\\Multishipping\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/NewRelicReporting/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/NewRelicReporting/composer.json
index 0f663c82dcc..2a2cda0f85f 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/NewRelicReporting/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/NewRelicReporting/composer.json
@@ -1,6 +1,12 @@
 {
     "name": "magento/magento2-functional-test-module-new-relic-reporting",
     "description": "Magento 2 Functional Test Module New Relic Reporting",
+    "type": "magento2-test-module",
+    "version": "100.0.0-dev",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
     "config": {
         "sort-packages": true
     },
@@ -9,22 +15,16 @@
         "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-backend": "1.0.0-dev",
-        "magento/magento2-functional-test-module-catalog": "1.0.0-dev",
-        "magento/magento2-functional-test-module-config": "1.0.0-dev",
-        "magento/magento2-functional-test-module-configurable-product": "1.0.0-dev",
-        "magento/magento2-functional-test-module-customer": "1.0.0-dev",
-        "magento/magento2-functional-test-module-store": "1.0.0-dev"
+        "magento/magento2-functional-test-module-backend": "100.0.0-dev",
+        "magento/magento2-functional-test-module-catalog": "100.0.0-dev",
+        "magento/magento2-functional-test-module-config": "100.0.0-dev",
+        "magento/magento2-functional-test-module-configurable-product": "100.0.0-dev",
+        "magento/magento2-functional-test-module-customer": "100.0.0-dev",
+        "magento/magento2-functional-test-module-store": "100.0.0-dev"
     },
-    "type": "magento2-test-module",
-    "version": "1.0.0-dev",
-    "license": [
-        "OSL-3.0",
-        "AFL-3.0"
-    ],
     "autoload": {
         "psr-4": {
-            "Magento\\NewRelicReporting\\": ""
+            "Magento\\FunctionalTest\\NewRelicReporting\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Newsletter/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Newsletter/composer.json
index 9085ac604e2..eb952a34a04 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Newsletter/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Newsletter/composer.json
@@ -1,6 +1,12 @@
 {
     "name": "magento/magento2-functional-test-module-newsletter",
     "description": "Magento 2 Functional Test Module Newsletter",
+    "type": "magento2-test-module",
+    "version": "100.0.0-dev",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
     "config": {
         "sort-packages": true
     },
@@ -9,24 +15,18 @@
         "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-backend": "1.0.0-dev",
-        "magento/magento2-functional-test-module-cms": "1.0.0-dev",
-        "magento/magento2-functional-test-module-customer": "1.0.0-dev",
-        "magento/magento2-functional-test-module-eav": "1.0.0-dev",
-        "magento/magento2-functional-test-module-email": "1.0.0-dev",
-        "magento/magento2-functional-test-module-require-js": "1.0.0-dev",
-        "magento/magento2-functional-test-module-store": "1.0.0-dev",
-        "magento/magento2-functional-test-module-widget": "1.0.0-dev"
+        "magento/magento2-functional-test-module-backend": "100.0.0-dev",
+        "magento/magento2-functional-test-module-cms": "100.0.0-dev",
+        "magento/magento2-functional-test-module-customer": "100.0.0-dev",
+        "magento/magento2-functional-test-module-eav": "100.0.0-dev",
+        "magento/magento2-functional-test-module-email": "100.0.0-dev",
+        "magento/magento2-functional-test-module-require-js": "100.0.0-dev",
+        "magento/magento2-functional-test-module-store": "100.0.0-dev",
+        "magento/magento2-functional-test-module-widget": "100.0.0-dev"
     },
-    "type": "magento2-test-module",
-    "version": "1.0.0-dev",
-    "license": [
-        "OSL-3.0",
-        "AFL-3.0"
-    ],
     "autoload": {
         "psr-4": {
-            "Magento\\Newsletter\\": ""
+            "Magento\\FunctionalTest\\Newsletter\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/OfflinePayments/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/OfflinePayments/composer.json
index 0631ae3f7f0..30c236974bc 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/OfflinePayments/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/OfflinePayments/composer.json
@@ -1,6 +1,12 @@
 {
     "name": "magento/magento2-functional-test-module-offline-payments",
     "description": "Magento 2 Functional Test Module Offline Payments",
+    "type": "magento2-test-module",
+    "version": "100.0.0-dev",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
     "config": {
         "sort-packages": true
     },
@@ -9,18 +15,12 @@
         "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-checkout": "1.0.0-dev",
-        "magento/magento2-functional-test-module-payment": "1.0.0-dev"
+        "magento/magento2-functional-test-module-checkout": "100.0.0-dev",
+        "magento/magento2-functional-test-module-payment": "100.0.0-dev"
     },
-    "type": "magento2-test-module",
-    "version": "1.0.0-dev",
-    "license": [
-        "OSL-3.0",
-        "AFL-3.0"
-    ],
     "autoload": {
         "psr-4": {
-            "Magento\\OfflinePayments\\": ""
+            "Magento\\FunctionalTest\\OfflinePayments\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/OfflineShipping/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/OfflineShipping/composer.json
index d3d3ef506a6..4decb42f0c1 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/OfflineShipping/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/OfflineShipping/composer.json
@@ -1,6 +1,12 @@
 {
     "name": "magento/magento2-functional-test-module-offline-shipping",
     "description": "Magento 2 Functional Test Module Offline Shipping",
+    "type": "magento2-test-module",
+    "version": "100.0.0-dev",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
     "config": {
         "sort-packages": true
     },
@@ -9,25 +15,19 @@
         "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-backend": "1.0.0-dev",
-        "magento/magento2-functional-test-module-catalog": "1.0.0-dev",
-        "magento/magento2-functional-test-module-config": "1.0.0-dev",
-        "magento/magento2-functional-test-module-directory": "1.0.0-dev",
-        "magento/magento2-functional-test-module-quote": "1.0.0-dev",
-        "magento/magento2-functional-test-module-sales": "1.0.0-dev",
-        "magento/magento2-functional-test-module-sales-rule": "1.0.0-dev",
-        "magento/magento2-functional-test-module-shipping": "1.0.0-dev",
-        "magento/magento2-functional-test-module-store": "1.0.0-dev"
+        "magento/magento2-functional-test-module-backend": "100.0.0-dev",
+        "magento/magento2-functional-test-module-catalog": "100.0.0-dev",
+        "magento/magento2-functional-test-module-config": "100.0.0-dev",
+        "magento/magento2-functional-test-module-directory": "100.0.0-dev",
+        "magento/magento2-functional-test-module-quote": "100.0.0-dev",
+        "magento/magento2-functional-test-module-sales": "100.0.0-dev",
+        "magento/magento2-functional-test-module-sales-rule": "100.0.0-dev",
+        "magento/magento2-functional-test-module-shipping": "100.0.0-dev",
+        "magento/magento2-functional-test-module-store": "100.0.0-dev"
     },
-    "type": "magento2-test-module",
-    "version": "1.0.0-dev",
-    "license": [
-        "OSL-3.0",
-        "AFL-3.0"
-    ],
     "autoload": {
         "psr-4": {
-            "Magento\\OfflineShipping\\": ""
+            "Magento\\FunctionalTest\\OfflineShipping\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/PageCache/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/PageCache/composer.json
index 4eed53f7def..496108b6f68 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/PageCache/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/PageCache/composer.json
@@ -1,6 +1,12 @@
 {
     "name": "magento/magento2-functional-test-module-page-cache",
     "description": "Magento 2 Functional Test Module Page Cache",
+    "type": "magento2-test-module",
+    "version": "100.0.0-dev",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
     "config": {
         "sort-packages": true
     },
@@ -9,19 +15,13 @@
         "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-backend": "1.0.0-dev",
-        "magento/magento2-functional-test-module-config": "1.0.0-dev",
-        "magento/magento2-functional-test-module-store": "1.0.0-dev"
+        "magento/magento2-functional-test-module-backend": "100.0.0-dev",
+        "magento/magento2-functional-test-module-config": "100.0.0-dev",
+        "magento/magento2-functional-test-module-store": "100.0.0-dev"
     },
-    "type": "magento2-test-module",
-    "version": "1.0.0-dev",
-    "license": [
-        "OSL-3.0",
-        "AFL-3.0"
-    ],
     "autoload": {
         "psr-4": {
-            "Magento\\PageCache\\": ""
+            "Magento\\FunctionalTest\\PageCache\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Payment/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Payment/composer.json
index c275682aef4..354652c1436 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Payment/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Payment/composer.json
@@ -1,6 +1,12 @@
 {
     "name": "magento/magento2-functional-test-module-payment",
     "description": "Magento 2 Functional Test Module Payment",
+    "type": "magento2-test-module",
+    "version": "100.0.0-dev",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
     "config": {
         "sort-packages": true
     },
@@ -9,22 +15,16 @@
         "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-checkout": "1.0.0-dev",
-        "magento/magento2-functional-test-module-config": "1.0.0-dev",
-        "magento/magento2-functional-test-module-directory": "1.0.0-dev",
-        "magento/magento2-functional-test-module-quote": "1.0.0-dev",
-        "magento/magento2-functional-test-module-sales": "1.0.0-dev",
-        "magento/magento2-functional-test-module-store": "1.0.0-dev"
+        "magento/magento2-functional-test-module-checkout": "100.0.0-dev",
+        "magento/magento2-functional-test-module-config": "100.0.0-dev",
+        "magento/magento2-functional-test-module-directory": "100.0.0-dev",
+        "magento/magento2-functional-test-module-quote": "100.0.0-dev",
+        "magento/magento2-functional-test-module-sales": "100.0.0-dev",
+        "magento/magento2-functional-test-module-store": "100.0.0-dev"
     },
-    "type": "magento2-test-module",
-    "version": "1.0.0-dev",
-    "license": [
-        "OSL-3.0",
-        "AFL-3.0"
-    ],
     "autoload": {
         "psr-4": {
-            "Magento\\Payment\\": ""
+            "Magento\\FunctionalTest\\Payment\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Paypal/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Paypal/composer.json
index 6de5394fe90..b6df1314b0e 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Paypal/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Paypal/composer.json
@@ -1,6 +1,12 @@
 {
     "name": "magento/magento2-functional-test-module-paypal",
     "description": "Magento 2 Functional Test Module Paypal",
+    "type": "magento2-test-module",
+    "version": "100.0.0-dev",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
     "config": {
         "sort-packages": true
     },
@@ -9,32 +15,26 @@
         "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-backend": "1.0.0-dev",
-        "magento/magento2-functional-test-module-catalog": "1.0.0-dev",
-        "magento/magento2-functional-test-module-checkout": "1.0.0-dev",
-        "magento/magento2-functional-test-module-config": "1.0.0-dev",
-        "magento/magento2-functional-test-module-customer": "1.0.0-dev",
-        "magento/magento2-functional-test-module-directory": "1.0.0-dev",
-        "magento/magento2-functional-test-module-eav": "1.0.0-dev",
-        "magento/magento2-functional-test-module-instant-purchase": "1.0.0-dev",
-        "magento/magento2-functional-test-module-payment": "1.0.0-dev",
-        "magento/magento2-functional-test-module-quote": "1.0.0-dev",
-        "magento/magento2-functional-test-module-sales": "1.0.0-dev",
-        "magento/magento2-functional-test-module-store": "1.0.0-dev",
-        "magento/magento2-functional-test-module-tax": "1.0.0-dev",
-        "magento/magento2-functional-test-module-theme": "1.0.0-dev",
-        "magento/magento2-functional-test-module-ui": "1.0.0-dev",
-        "magento/magento2-functional-test-module-vault": "1.0.0-dev"
+        "magento/magento2-functional-test-module-backend": "100.0.0-dev",
+        "magento/magento2-functional-test-module-catalog": "100.0.0-dev",
+        "magento/magento2-functional-test-module-checkout": "100.0.0-dev",
+        "magento/magento2-functional-test-module-config": "100.0.0-dev",
+        "magento/magento2-functional-test-module-customer": "100.0.0-dev",
+        "magento/magento2-functional-test-module-directory": "100.0.0-dev",
+        "magento/magento2-functional-test-module-eav": "100.0.0-dev",
+        "magento/magento2-functional-test-module-instant-purchase": "100.0.0-dev",
+        "magento/magento2-functional-test-module-payment": "100.0.0-dev",
+        "magento/magento2-functional-test-module-quote": "100.0.0-dev",
+        "magento/magento2-functional-test-module-sales": "100.0.0-dev",
+        "magento/magento2-functional-test-module-store": "100.0.0-dev",
+        "magento/magento2-functional-test-module-tax": "100.0.0-dev",
+        "magento/magento2-functional-test-module-theme": "100.0.0-dev",
+        "magento/magento2-functional-test-module-ui": "100.0.0-dev",
+        "magento/magento2-functional-test-module-vault": "100.0.0-dev"
     },
-    "type": "magento2-test-module",
-    "version": "1.0.0-dev",
-    "license": [
-        "OSL-3.0",
-        "AFL-3.0"
-    ],
     "autoload": {
         "psr-4": {
-            "Magento\\Paypal\\": ""
+            "Magento\\FunctionalTest\\Paypal\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Persistent/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Persistent/composer.json
index ac984fed220..bd7db62c886 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Persistent/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Persistent/composer.json
@@ -1,6 +1,12 @@
 {
     "name": "magento/magento2-functional-test-module-persistent",
     "description": "Magento 2 Functional Test Module Persistent",
+    "type": "magento2-test-module",
+    "version": "100.0.0-dev",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
     "config": {
         "sort-packages": true
     },
@@ -9,22 +15,16 @@
         "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-checkout": "1.0.0-dev",
-        "magento/magento2-functional-test-module-cron": "1.0.0-dev",
-        "magento/magento2-functional-test-module-customer": "1.0.0-dev",
-        "magento/magento2-functional-test-module-page-cache": "1.0.0-dev",
-        "magento/magento2-functional-test-module-quote": "1.0.0-dev",
-        "magento/magento2-functional-test-module-store": "1.0.0-dev"
+        "magento/magento2-functional-test-module-checkout": "100.0.0-dev",
+        "magento/magento2-functional-test-module-cron": "100.0.0-dev",
+        "magento/magento2-functional-test-module-customer": "100.0.0-dev",
+        "magento/magento2-functional-test-module-page-cache": "100.0.0-dev",
+        "magento/magento2-functional-test-module-quote": "100.0.0-dev",
+        "magento/magento2-functional-test-module-store": "100.0.0-dev"
     },
-    "type": "magento2-test-module",
-    "version": "1.0.0-dev",
-    "license": [
-        "OSL-3.0",
-        "AFL-3.0"
-    ],
     "autoload": {
         "psr-4": {
-            "Magento\\Persistent\\": ""
+            "Magento\\FunctionalTest\\Persistent\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ProductAlert/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ProductAlert/composer.json
index cbc9c7f6b8f..7ef8a4a3da7 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ProductAlert/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ProductAlert/composer.json
@@ -1,6 +1,12 @@
 {
     "name": "magento/magento2-functional-test-module-product-alert",
     "description": "Magento 2 Functional Test Module Product Alert",
+    "type": "magento2-test-module",
+    "version": "100.0.0-dev",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
     "config": {
         "sort-packages": true
     },
@@ -9,20 +15,14 @@
         "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-backend": "1.0.0-dev",
-        "magento/magento2-functional-test-module-catalog": "1.0.0-dev",
-        "magento/magento2-functional-test-module-customer": "1.0.0-dev",
-        "magento/magento2-functional-test-module-store": "1.0.0-dev"
+        "magento/magento2-functional-test-module-backend": "100.0.0-dev",
+        "magento/magento2-functional-test-module-catalog": "100.0.0-dev",
+        "magento/magento2-functional-test-module-customer": "100.0.0-dev",
+        "magento/magento2-functional-test-module-store": "100.0.0-dev"
     },
-    "type": "magento2-test-module",
-    "version": "1.0.0-dev",
-    "license": [
-        "OSL-3.0",
-        "AFL-3.0"
-    ],
     "autoload": {
         "psr-4": {
-            "Magento\\ProductAlert\\": ""
+            "Magento\\FunctionalTest\\ProductAlert\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ProductVideo/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ProductVideo/composer.json
index 62efdd81835..daa23cb4d48 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ProductVideo/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ProductVideo/composer.json
@@ -1,6 +1,12 @@
 {
     "name": "magento/magento2-functional-test-module-product-video",
     "description": "Magento 2 Functional Test Module Product Video",
+    "type": "magento2-test-module",
+    "version": "100.0.0-dev",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
     "config": {
         "sort-packages": true
     },
@@ -9,21 +15,15 @@
         "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-backend": "1.0.0-dev",
-        "magento/magento2-functional-test-module-catalog": "1.0.0-dev",
-        "magento/magento2-functional-test-module-eav": "1.0.0-dev",
-        "magento/magento2-functional-test-module-media-storage": "1.0.0-dev",
-        "magento/magento2-functional-test-module-store": "1.0.0-dev"
+        "magento/magento2-functional-test-module-backend": "100.0.0-dev",
+        "magento/magento2-functional-test-module-catalog": "100.0.0-dev",
+        "magento/magento2-functional-test-module-eav": "100.0.0-dev",
+        "magento/magento2-functional-test-module-media-storage": "100.0.0-dev",
+        "magento/magento2-functional-test-module-store": "100.0.0-dev"
     },
-    "type": "magento2-test-module",
-    "version": "1.0.0-dev",
-    "license": [
-        "OSL-3.0",
-        "AFL-3.0"
-    ],
     "autoload": {
         "psr-4": {
-            "Magento\\ProductVideo\\": ""
+            "Magento\\FunctionalTest\\ProductVideo\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Quote/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Quote/composer.json
index a5d5c9553d3..9468fdf072e 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Quote/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Quote/composer.json
@@ -1,6 +1,12 @@
 {
     "name": "magento/magento2-functional-test-module-quote",
     "description": "Magento 2 Functional Test Module Quote",
+    "type": "magento2-test-module",
+    "version": "100.0.0-dev",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
     "config": {
         "sort-packages": true
     },
@@ -9,30 +15,24 @@
         "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-authorization": "1.0.0-dev",
-        "magento/magento2-functional-test-module-backend": "1.0.0-dev",
-        "magento/magento2-functional-test-module-catalog": "1.0.0-dev",
-        "magento/magento2-functional-test-module-catalog-inventory": "1.0.0-dev",
-        "magento/magento2-functional-test-module-checkout": "1.0.0-dev",
-        "magento/magento2-functional-test-module-customer": "1.0.0-dev",
-        "magento/magento2-functional-test-module-directory": "1.0.0-dev",
-        "magento/magento2-functional-test-module-eav": "1.0.0-dev",
-        "magento/magento2-functional-test-module-payment": "1.0.0-dev",
-        "magento/magento2-functional-test-module-sales": "1.0.0-dev",
-        "magento/magento2-functional-test-module-sales-sequence": "1.0.0-dev",
-        "magento/magento2-functional-test-module-shipping": "1.0.0-dev",
-        "magento/magento2-functional-test-module-store": "1.0.0-dev",
-        "magento/magento2-functional-test-module-tax": "1.0.0-dev"
+        "magento/magento2-functional-test-module-authorization": "100.0.0-dev",
+        "magento/magento2-functional-test-module-backend": "100.0.0-dev",
+        "magento/magento2-functional-test-module-catalog": "100.0.0-dev",
+        "magento/magento2-functional-test-module-catalog-inventory": "100.0.0-dev",
+        "magento/magento2-functional-test-module-checkout": "100.0.0-dev",
+        "magento/magento2-functional-test-module-customer": "100.0.0-dev",
+        "magento/magento2-functional-test-module-directory": "100.0.0-dev",
+        "magento/magento2-functional-test-module-eav": "100.0.0-dev",
+        "magento/magento2-functional-test-module-payment": "100.0.0-dev",
+        "magento/magento2-functional-test-module-sales": "100.0.0-dev",
+        "magento/magento2-functional-test-module-sales-sequence": "100.0.0-dev",
+        "magento/magento2-functional-test-module-shipping": "100.0.0-dev",
+        "magento/magento2-functional-test-module-store": "100.0.0-dev",
+        "magento/magento2-functional-test-module-tax": "100.0.0-dev"
     },
-    "type": "magento2-test-module",
-    "version": "1.0.0-dev",
-    "license": [
-        "OSL-3.0",
-        "AFL-3.0"
-    ],
     "autoload": {
         "psr-4": {
-            "Magento\\Quote\\": ""
+            "Magento\\FunctionalTest\\Quote\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/QuoteAnalytics/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/QuoteAnalytics/composer.json
index 560dd1838ef..4bd28d1b3c9 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/QuoteAnalytics/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/QuoteAnalytics/composer.json
@@ -1,11 +1,11 @@
 {
     "name": "magento/magento2-functional-test-module-quote-analytics",
     "description": "Magento 2 Acceptance Test Module Quote Analytics",
-    "repositories": [
-        {
-            "type": "composer",
-            "url": "https://repo.magento.com/"
-        }
+    "type": "magento2-test-module",
+    "version": "100.0.0-dev",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
     ],
     "config": {
         "sort-packages": true
@@ -15,17 +15,11 @@
         "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-quote": "1.0.0-dev"
+        "magento/magento2-functional-test-module-quote": "100.0.0-dev"
     },
-    "type": "magento2-test-module",
-    "version": "1.0.0-dev",
-    "license": [
-        "OSL-3.0",
-        "AFL-3.0"
-    ],
     "autoload": {
         "psr-4": {
-            "Magento\\QuoteAnalytics\\": ""
+            "Magento\\FunctionalTest\\QuoteAnalytics\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Reports/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Reports/composer.json
index d2b61833ece..0ed17588895 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Reports/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Reports/composer.json
@@ -1,6 +1,12 @@
 {
     "name": "magento/magento2-functional-test-module-reports",
     "description": "Magento 2 Functional Test Module Reports",
+    "type": "magento2-test-module",
+    "version": "100.0.0-dev",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
     "config": {
         "sort-packages": true
     },
@@ -9,32 +15,26 @@
         "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-backend": "1.0.0-dev",
-        "magento/magento2-functional-test-module-catalog": "1.0.0-dev",
-        "magento/magento2-functional-test-module-catalog-inventory": "1.0.0-dev",
-        "magento/magento2-functional-test-module-cms": "1.0.0-dev",
-        "magento/magento2-functional-test-module-config": "1.0.0-dev",
-        "magento/magento2-functional-test-module-customer": "1.0.0-dev",
-        "magento/magento2-functional-test-module-downloadable": "1.0.0-dev",
-        "magento/magento2-functional-test-module-eav": "1.0.0-dev",
-        "magento/magento2-functional-test-module-quote": "1.0.0-dev",
-        "magento/magento2-functional-test-module-review": "1.0.0-dev",
-        "magento/magento2-functional-test-module-sales": "1.0.0-dev",
-        "magento/magento2-functional-test-module-sales-rule": "1.0.0-dev",
-        "magento/magento2-functional-test-module-store": "1.0.0-dev",
-        "magento/magento2-functional-test-module-tax": "1.0.0-dev",
-        "magento/magento2-functional-test-module-widget": "1.0.0-dev",
-        "magento/magento2-functional-test-module-wishlist": "1.0.0-dev"
+        "magento/magento2-functional-test-module-backend": "100.0.0-dev",
+        "magento/magento2-functional-test-module-catalog": "100.0.0-dev",
+        "magento/magento2-functional-test-module-catalog-inventory": "100.0.0-dev",
+        "magento/magento2-functional-test-module-cms": "100.0.0-dev",
+        "magento/magento2-functional-test-module-config": "100.0.0-dev",
+        "magento/magento2-functional-test-module-customer": "100.0.0-dev",
+        "magento/magento2-functional-test-module-downloadable": "100.0.0-dev",
+        "magento/magento2-functional-test-module-eav": "100.0.0-dev",
+        "magento/magento2-functional-test-module-quote": "100.0.0-dev",
+        "magento/magento2-functional-test-module-review": "100.0.0-dev",
+        "magento/magento2-functional-test-module-sales": "100.0.0-dev",
+        "magento/magento2-functional-test-module-sales-rule": "100.0.0-dev",
+        "magento/magento2-functional-test-module-store": "100.0.0-dev",
+        "magento/magento2-functional-test-module-tax": "100.0.0-dev",
+        "magento/magento2-functional-test-module-widget": "100.0.0-dev",
+        "magento/magento2-functional-test-module-wishlist": "100.0.0-dev"
     },
-    "type": "magento2-test-module",
-    "version": "1.0.0-dev",
-    "license": [
-        "OSL-3.0",
-        "AFL-3.0"
-    ],
     "autoload": {
         "psr-4": {
-            "Magento\\Reports\\": ""
+            "Magento\\FunctionalTest\\Reports\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/RequireJs/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/RequireJs/composer.json
index ef0b6c466e6..91ad289e042 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/RequireJs/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/RequireJs/composer.json
@@ -1,6 +1,12 @@
 {
     "name": "magento/magento2-functional-test-module-require-js",
     "description": "Magento 2 Functional Test Module Require Js",
+    "type": "magento2-test-module",
+    "version": "100.0.0-dev",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
     "config": {
         "sort-packages": true
     },
@@ -8,15 +14,9 @@
         "magento/magento2-functional-testing-framework": "1.0.0",
         "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
-    "type": "magento2-test-module",
-    "version": "1.0.0-dev",
-    "license": [
-        "OSL-3.0",
-        "AFL-3.0"
-    ],
     "autoload": {
         "psr-4": {
-            "Magento\\RequireJs\\": ""
+            "Magento\\FunctionalTest\\RequireJs\\": ""
         }
     },
     "extra": {
@@ -26,6 +26,5 @@
                 "dev/tests/acceptance/tests/functional/Magento/FunctionalTest/RequireJs"
             ]
         ]
-    },
-    "suggest": null
+    }
 }
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Review/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Review/composer.json
index 987d5159bca..6b68bb0edc7 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Review/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Review/composer.json
@@ -1,6 +1,12 @@
 {
     "name": "magento/magento2-functional-test-module-review",
     "description": "Magento 2 Functional Test Module Review",
+    "type": "magento2-test-module",
+    "version": "100.0.0-dev",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
     "config": {
         "sort-packages": true
     },
@@ -9,24 +15,18 @@
         "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-backend": "1.0.0-dev",
-        "magento/magento2-functional-test-module-catalog": "1.0.0-dev",
-        "magento/magento2-functional-test-module-customer": "1.0.0-dev",
-        "magento/magento2-functional-test-module-eav": "1.0.0-dev",
-        "magento/magento2-functional-test-module-newsletter": "1.0.0-dev",
-        "magento/magento2-functional-test-module-store": "1.0.0-dev",
-        "magento/magento2-functional-test-module-theme": "1.0.0-dev",
-        "magento/magento2-functional-test-module-ui": "1.0.0-dev"
+        "magento/magento2-functional-test-module-backend": "100.0.0-dev",
+        "magento/magento2-functional-test-module-catalog": "100.0.0-dev",
+        "magento/magento2-functional-test-module-customer": "100.0.0-dev",
+        "magento/magento2-functional-test-module-eav": "100.0.0-dev",
+        "magento/magento2-functional-test-module-newsletter": "100.0.0-dev",
+        "magento/magento2-functional-test-module-store": "100.0.0-dev",
+        "magento/magento2-functional-test-module-theme": "100.0.0-dev",
+        "magento/magento2-functional-test-module-ui": "100.0.0-dev"
     },
-    "type": "magento2-test-module",
-    "version": "1.0.0-dev",
-    "license": [
-        "OSL-3.0",
-        "AFL-3.0"
-    ],
     "autoload": {
         "psr-4": {
-            "Magento\\Review\\": ""
+            "Magento\\FunctionalTest\\Review\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ReviewAnalytics/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ReviewAnalytics/composer.json
index f6cbbd17193..546a20fe50c 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ReviewAnalytics/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ReviewAnalytics/composer.json
@@ -1,11 +1,11 @@
 {
     "name": "magento/magento2-functional-test-module-review-analytics",
     "description": "Magento 2 Acceptance Test Module Review Analytics",
-    "repositories": [
-        {
-            "type": "composer",
-            "url": "https://repo.magento.com/"
-        }
+    "type": "magento2-test-module",
+    "version": "100.0.0-dev",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
     ],
     "config": {
         "sort-packages": true
@@ -15,17 +15,11 @@
         "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-review": "1.0.0-dev"
+        "magento/magento2-functional-test-module-review": "100.0.0-dev"
     },
-    "type": "magento2-test-module",
-    "version": "1.0.0-dev",
-    "license": [
-        "OSL-3.0",
-        "AFL-3.0"
-    ],
     "autoload": {
         "psr-4": {
-            "Magento\\ReviewAnalytics\\": ""
+            "Magento\\FunctionalTest\\ReviewAnalytics\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Robots/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Robots/composer.json
index bbf0fc5edde..27945d5e161 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Robots/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Robots/composer.json
@@ -1,6 +1,12 @@
 {
     "name": "magento/magento2-functional-test-module-robots",
     "description": "Magento 2 Functional Test Module Robots",
+    "type": "magento2-test-module",
+    "version": "100.0.0-dev",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
     "config": {
         "sort-packages": true
     },
@@ -9,17 +15,11 @@
         "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-store": "1.0.0-dev"
+        "magento/magento2-functional-test-module-store": "100.0.0-dev"
     },
-    "type": "magento2-test-module",
-    "version": "1.0.0-dev",
-    "license": [
-        "OSL-3.0",
-        "AFL-3.0"
-    ],
     "autoload": {
         "psr-4": {
-            "Magento\\Robots\\": ""
+            "Magento\\FunctionalTest\\Robots\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Rss/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Rss/composer.json
index 1eb7d17a8a6..e8d57dd2456 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Rss/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Rss/composer.json
@@ -1,6 +1,12 @@
 {
     "name": "magento/magento2-functional-test-module-rss",
     "description": "Magento 2 Functional Test Module Rss",
+    "type": "magento2-test-module",
+    "version": "100.0.0-dev",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
     "config": {
         "sort-packages": true
     },
@@ -9,19 +15,13 @@
         "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-backend": "1.0.0-dev",
-        "magento/magento2-functional-test-module-customer": "1.0.0-dev",
-        "magento/magento2-functional-test-module-store": "1.0.0-dev"
+        "magento/magento2-functional-test-module-backend": "100.0.0-dev",
+        "magento/magento2-functional-test-module-customer": "100.0.0-dev",
+        "magento/magento2-functional-test-module-store": "100.0.0-dev"
     },
-    "type": "magento2-test-module",
-    "version": "1.0.0-dev",
-    "license": [
-        "OSL-3.0",
-        "AFL-3.0"
-    ],
     "autoload": {
         "psr-4": {
-            "Magento\\Rss\\": ""
+            "Magento\\FunctionalTest\\Rss\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Rule/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Rule/composer.json
index cc33ad7c9fa..1d19dad8e30 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Rule/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Rule/composer.json
@@ -1,6 +1,12 @@
 {
     "name": "magento/magento2-functional-test-module-rule",
     "description": "Magento 2 Functional Test Module Rule",
+    "type": "magento2-test-module",
+    "version": "100.0.0-dev",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
     "config": {
         "sort-packages": true
     },
@@ -9,20 +15,14 @@
         "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-backend": "1.0.0-dev",
-        "magento/magento2-functional-test-module-catalog": "1.0.0-dev",
-        "magento/magento2-functional-test-module-eav": "1.0.0-dev",
-        "magento/magento2-functional-test-module-store": "1.0.0-dev"
+        "magento/magento2-functional-test-module-backend": "100.0.0-dev",
+        "magento/magento2-functional-test-module-catalog": "100.0.0-dev",
+        "magento/magento2-functional-test-module-eav": "100.0.0-dev",
+        "magento/magento2-functional-test-module-store": "100.0.0-dev"
     },
-    "type": "magento2-test-module",
-    "version": "1.0.0-dev",
-    "license": [
-        "OSL-3.0",
-        "AFL-3.0"
-    ],
     "autoload": {
         "psr-4": {
-            "Magento\\Rule\\": ""
+            "Magento\\FunctionalTest\\Rule\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/composer.json
index a33c0c8171e..f9b37ac3d18 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/composer.json
@@ -1,6 +1,12 @@
 {
     "name": "magento/magento2-functional-test-module-sales",
     "description": "Magento 2 Functional Test Module Sales",
+    "type": "magento2-test-module",
+    "version": "100.0.0-dev",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
     "config": {
         "sort-packages": true
     },
@@ -9,39 +15,33 @@
         "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-authorization": "1.0.0-dev",
-        "magento/magento2-functional-test-module-backend": "1.0.0-dev",
-        "magento/magento2-functional-test-module-catalog": "1.0.0-dev",
-        "magento/magento2-functional-test-module-catalog-inventory": "1.0.0-dev",
-        "magento/magento2-functional-test-module-checkout": "1.0.0-dev",
-        "magento/magento2-functional-test-module-config": "1.0.0-dev",
-        "magento/magento2-functional-test-module-customer": "1.0.0-dev",
-        "magento/magento2-functional-test-module-directory": "1.0.0-dev",
-        "magento/magento2-functional-test-module-eav": "1.0.0-dev",
-        "magento/magento2-functional-test-module-gift-message": "1.0.0-dev",
-        "magento/magento2-functional-test-module-media-storage": "1.0.0-dev",
-        "magento/magento2-functional-test-module-payment": "1.0.0-dev",
-        "magento/magento2-functional-test-module-quote": "1.0.0-dev",
-        "magento/magento2-functional-test-module-reports": "1.0.0-dev",
-        "magento/magento2-functional-test-module-sales-rule": "1.0.0-dev",
-        "magento/magento2-functional-test-module-sales-sequence": "1.0.0-dev",
-        "magento/magento2-functional-test-module-shipping": "1.0.0-dev",
-        "magento/magento2-functional-test-module-store": "1.0.0-dev",
-        "magento/magento2-functional-test-module-tax": "1.0.0-dev",
-        "magento/magento2-functional-test-module-theme": "1.0.0-dev",
-        "magento/magento2-functional-test-module-ui": "1.0.0-dev",
-        "magento/magento2-functional-test-module-widget": "1.0.0-dev",
-        "magento/magento2-functional-test-module-wishlist": "1.0.0-dev"
+        "magento/magento2-functional-test-module-authorization": "100.0.0-dev",
+        "magento/magento2-functional-test-module-backend": "100.0.0-dev",
+        "magento/magento2-functional-test-module-catalog": "100.0.0-dev",
+        "magento/magento2-functional-test-module-catalog-inventory": "100.0.0-dev",
+        "magento/magento2-functional-test-module-checkout": "100.0.0-dev",
+        "magento/magento2-functional-test-module-config": "100.0.0-dev",
+        "magento/magento2-functional-test-module-customer": "100.0.0-dev",
+        "magento/magento2-functional-test-module-directory": "100.0.0-dev",
+        "magento/magento2-functional-test-module-eav": "100.0.0-dev",
+        "magento/magento2-functional-test-module-gift-message": "100.0.0-dev",
+        "magento/magento2-functional-test-module-media-storage": "100.0.0-dev",
+        "magento/magento2-functional-test-module-payment": "100.0.0-dev",
+        "magento/magento2-functional-test-module-quote": "100.0.0-dev",
+        "magento/magento2-functional-test-module-reports": "100.0.0-dev",
+        "magento/magento2-functional-test-module-sales-rule": "100.0.0-dev",
+        "magento/magento2-functional-test-module-sales-sequence": "100.0.0-dev",
+        "magento/magento2-functional-test-module-shipping": "100.0.0-dev",
+        "magento/magento2-functional-test-module-store": "100.0.0-dev",
+        "magento/magento2-functional-test-module-tax": "100.0.0-dev",
+        "magento/magento2-functional-test-module-theme": "100.0.0-dev",
+        "magento/magento2-functional-test-module-ui": "100.0.0-dev",
+        "magento/magento2-functional-test-module-widget": "100.0.0-dev",
+        "magento/magento2-functional-test-module-wishlist": "100.0.0-dev"
     },
-    "type": "magento2-test-module",
-    "version": "1.0.0-dev",
-    "license": [
-        "OSL-3.0",
-        "AFL-3.0"
-    ],
     "autoload": {
         "psr-4": {
-            "Magento\\Sales\\": ""
+            "Magento\\FunctionalTest\\Sales\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesAnalytics/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesAnalytics/composer.json
index 1b92df693dc..0b37233aa59 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesAnalytics/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesAnalytics/composer.json
@@ -1,11 +1,11 @@
 {
     "name": "magento/magento2-functional-test-module-sales-analytics",
     "description": "Magento 2 Acceptance Test Module Sales Analytics",
-    "repositories": [
-        {
-            "type": "composer",
-            "url": "https://repo.magento.com/"
-        }
+    "type": "magento2-test-module",
+    "version": "100.0.0-dev",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
     ],
     "config": {
         "sort-packages": true
@@ -15,17 +15,11 @@
         "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-sales": "1.0.0-dev"
+        "magento/magento2-functional-test-module-sales": "100.0.0-dev"
     },
-    "type": "magento2-test-module",
-    "version": "1.0.0-dev",
-    "license": [
-        "OSL-3.0",
-        "AFL-3.0"
-    ],
     "autoload": {
         "psr-4": {
-            "Magento\\SalesAnalytics\\": ""
+            "Magento\\FunctionalTest\\SalesAnalytics\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesInventory/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesInventory/composer.json
index dadb08dac12..75f35cd1d29 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesInventory/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesInventory/composer.json
@@ -1,6 +1,12 @@
 {
     "name": "magento/magento2-functional-test-module-sales-inventory",
     "description": "Magento 2 Functional Test Module Sales Inventory",
+    "type": "magento2-test-module",
+    "version": "100.0.0-dev",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
     "config": {
         "sort-packages": true
     },
@@ -9,20 +15,14 @@
         "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-catalog": "1.0.0-dev",
-        "magento/magento2-functional-test-module-catalog-inventory": "1.0.0-dev",
-        "magento/magento2-functional-test-module-sales": "1.0.0-dev",
-        "magento/magento2-functional-test-module-store": "1.0.0-dev"
+        "magento/magento2-functional-test-module-catalog": "100.0.0-dev",
+        "magento/magento2-functional-test-module-catalog-inventory": "100.0.0-dev",
+        "magento/magento2-functional-test-module-sales": "100.0.0-dev",
+        "magento/magento2-functional-test-module-store": "100.0.0-dev"
     },
-    "type": "magento2-test-module",
-    "version": "1.0.0-dev",
-    "license": [
-        "OSL-3.0",
-        "AFL-3.0"
-    ],
     "autoload": {
         "psr-4": {
-            "Magento\\SalesInventory\\": ""
+            "Magento\\FunctionalTest\\SalesInventory\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesRule/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesRule/composer.json
index c6591bd79be..0bb3ad9cf63 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesRule/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesRule/composer.json
@@ -1,6 +1,12 @@
 {
     "name": "magento/magento2-functional-test-module-sales-rule",
     "description": "Magento 2 Functional Test Module Sales Rule",
+    "type": "magento2-test-module",
+    "version": "100.0.0-dev",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
     "config": {
         "sort-packages": true
     },
@@ -9,32 +15,26 @@
         "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-backend": "1.0.0-dev",
-        "magento/magento2-functional-test-module-catalog": "1.0.0-dev",
-        "magento/magento2-functional-test-module-catalog-rule": "1.0.0-dev",
-        "magento/magento2-functional-test-module-config": "1.0.0-dev",
-        "magento/magento2-functional-test-module-customer": "1.0.0-dev",
-        "magento/magento2-functional-test-module-directory": "1.0.0-dev",
-        "magento/magento2-functional-test-module-eav": "1.0.0-dev",
-        "magento/magento2-functional-test-module-payment": "1.0.0-dev",
-        "magento/magento2-functional-test-module-quote": "1.0.0-dev",
-        "magento/magento2-functional-test-module-reports": "1.0.0-dev",
-        "magento/magento2-functional-test-module-rule": "1.0.0-dev",
-        "magento/magento2-functional-test-module-sales": "1.0.0-dev",
-        "magento/magento2-functional-test-module-shipping": "1.0.0-dev",
-        "magento/magento2-functional-test-module-store": "1.0.0-dev",
-        "magento/magento2-functional-test-module-ui": "1.0.0-dev",
-        "magento/magento2-functional-test-module-widget": "1.0.0-dev"
+        "magento/magento2-functional-test-module-backend": "100.0.0-dev",
+        "magento/magento2-functional-test-module-catalog": "100.0.0-dev",
+        "magento/magento2-functional-test-module-catalog-rule": "100.0.0-dev",
+        "magento/magento2-functional-test-module-config": "100.0.0-dev",
+        "magento/magento2-functional-test-module-customer": "100.0.0-dev",
+        "magento/magento2-functional-test-module-directory": "100.0.0-dev",
+        "magento/magento2-functional-test-module-eav": "100.0.0-dev",
+        "magento/magento2-functional-test-module-payment": "100.0.0-dev",
+        "magento/magento2-functional-test-module-quote": "100.0.0-dev",
+        "magento/magento2-functional-test-module-reports": "100.0.0-dev",
+        "magento/magento2-functional-test-module-rule": "100.0.0-dev",
+        "magento/magento2-functional-test-module-sales": "100.0.0-dev",
+        "magento/magento2-functional-test-module-shipping": "100.0.0-dev",
+        "magento/magento2-functional-test-module-store": "100.0.0-dev",
+        "magento/magento2-functional-test-module-ui": "100.0.0-dev",
+        "magento/magento2-functional-test-module-widget": "100.0.0-dev"
     },
-    "type": "magento2-test-module",
-    "version": "1.0.0-dev",
-    "license": [
-        "OSL-3.0",
-        "AFL-3.0"
-    ],
     "autoload": {
         "psr-4": {
-            "Magento\\SalesRule\\": ""
+            "Magento\\FunctionalTest\\SalesRule\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesSequence/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesSequence/composer.json
index 81c2f16f344..218a5e4ce1f 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesSequence/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesSequence/composer.json
@@ -1,6 +1,12 @@
 {
     "name": "magento/magento2-functional-test-module-sales-sequence",
     "description": "Magento 2 Functional Test Module Sales Sequence",
+    "type": "magento2-test-module",
+    "version": "100.0.0-dev",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
     "config": {
         "sort-packages": true
     },
@@ -8,15 +14,9 @@
         "magento/magento2-functional-testing-framework": "1.0.0",
         "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
-    "type": "magento2-test-module",
-    "version": "1.0.0-dev",
-    "license": [
-        "OSL-3.0",
-        "AFL-3.0"
-    ],
     "autoload": {
         "psr-4": {
-            "Magento\\SalesSequence\\": ""
+            "Magento\\FunctionalTest\\SalesSequence\\": ""
         }
     },
     "extra": {
@@ -26,6 +26,5 @@
                 "dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesSequence"
             ]
         ]
-    },
-    "suggest": null
+    }
 }
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleData/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleData/composer.json
index 80426872ef6..6e6229ae322 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleData/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleData/composer.json
@@ -1,6 +1,12 @@
 {
     "name": "magento/magento2-functional-test-module-sample-data",
     "description": "Magento 2 Functional Test Module Sample Data",
+    "type": "magento2-test-module",
+    "version": "100.0.0-dev",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
     "config": {
         "sort-packages": true
     },
@@ -8,15 +14,9 @@
         "magento/magento2-functional-testing-framework": "1.0.0",
         "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
-    "type": "magento2-test-module",
-    "version": "1.0.0-dev",
-    "license": [
-        "OSL-3.0",
-        "AFL-3.0"
-    ],
     "autoload": {
         "psr-4": {
-            "Magento\\SampleData\\": ""
+            "Magento\\FunctionalTest\\SampleData\\": ""
         }
     },
     "extra": {
@@ -26,6 +26,5 @@
                 "dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleData"
             ]
         ]
-    },
-    "suggest": null
+    }
 }
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTemplates/LICENSE.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTemplates/LICENSE.txt
new file mode 100644
index 00000000000..49525fd99da
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTemplates/LICENSE.txt
@@ -0,0 +1,48 @@
+
+Open Software License ("OSL") v. 3.0
+
+This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Open Software License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Open Software License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly. 
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including 'fair use' or 'fair dealing'). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright (C) 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTemplates/LICENSE_AFL.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTemplates/LICENSE_AFL.txt
new file mode 100644
index 00000000000..f39d641b18a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTemplates/LICENSE_AFL.txt
@@ -0,0 +1,48 @@
+
+Academic Free License ("AFL") v. 3.0
+
+This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Academic Free License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, under any license of your choice that does not contradict the terms and conditions, including Licensor's reserved rights and remedies, in this Academic Free License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly.
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including "fair use" or "fair dealing"). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright © 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Academic Free License" or "AFL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTemplates/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTemplates/README.md
new file mode 100644
index 00000000000..986c2af6164
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTemplates/README.md
@@ -0,0 +1,3 @@
+# Magento 2 Functional Tests
+
+The Functional Tests Module for **Magento_SampleTemplates** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTemplates/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTemplates/composer.json
new file mode 100644
index 00000000000..da0d8598f8d
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTemplates/composer.json
@@ -0,0 +1,30 @@
+{
+    "name": "magento/magento2-functional-test-module-sample-templates",
+    "description": "Magento 2 Functional Test Module Sample Templates",
+    "type": "magento2-test-module",
+    "version": "100.0.0-dev",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
+    "config": {
+        "sort-packages": true
+    },
+    "require": {
+        "magento/magento2-functional-testing-framework": "1.0.0",
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
+    },
+    "autoload": {
+        "psr-4": {
+            "Magento\\FunctionalTest\\SampleTemplates\\": ""
+        }
+    },
+    "extra": {
+        "map": [
+            [
+                "*",
+                "dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTemplates"
+            ]
+        ]
+    }
+}
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/LICENSE.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/LICENSE.txt
new file mode 100644
index 00000000000..49525fd99da
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/LICENSE.txt
@@ -0,0 +1,48 @@
+
+Open Software License ("OSL") v. 3.0
+
+This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Open Software License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Open Software License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly. 
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including 'fair use' or 'fair dealing'). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright (C) 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/LICENSE_AFL.txt b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/LICENSE_AFL.txt
new file mode 100644
index 00000000000..f39d641b18a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/LICENSE_AFL.txt
@@ -0,0 +1,48 @@
+
+Academic Free License ("AFL") v. 3.0
+
+This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:
+
+Licensed under the Academic Free License version 3.0
+
+   1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:
+
+         1. to reproduce the Original Work in copies, either alone or as part of a collective work;
+
+         2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;
+
+         3. to distribute or communicate copies of the Original Work and Derivative Works to the public, under any license of your choice that does not contradict the terms and conditions, including Licensor's reserved rights and remedies, in this Academic Free License;
+
+         4. to perform the Original Work publicly; and
+
+         5. to display the Original Work publicly.
+
+   2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.
+
+   3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.
+
+   4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.
+
+   5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).
+
+   6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.
+
+   7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.
+
+   8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.
+
+   9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including "fair use" or "fair dealing"). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).
+
+  10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.
+
+  11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.
+
+  12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.
+
+  13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
+
+  14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+  15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.
+
+  16. Modification of This License. This License is Copyright © 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Academic Free License" or "AFL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/README.md b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/README.md
new file mode 100644
index 00000000000..f3340b205f1
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/README.md
@@ -0,0 +1,3 @@
+# Magento 2 Functional Tests
+
+The Functional Tests Module for **Magento_SampleTests** Module.
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/composer.json
new file mode 100644
index 00000000000..70a9e9806b7
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/composer.json
@@ -0,0 +1,30 @@
+{
+    "name": "magento/magento2-functional-test-module-sample-tests",
+    "description": "Magento 2 Functional Test Module Sample Tests",
+    "type": "magento2-test-module",
+    "version": "100.0.0-dev",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
+    "config": {
+        "sort-packages": true
+    },
+    "require": {
+        "magento/magento2-functional-testing-framework": "1.0.0",
+        "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
+    },
+    "autoload": {
+        "psr-4": {
+            "Magento\\FunctionalTest\\SampleTests\\": ""
+        }
+    },
+    "extra": {
+        "map": [
+            [
+                "*",
+                "dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests"
+            ]
+        ]
+    }
+}
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Search/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Search/composer.json
index 446f4303e76..c49c01d906e 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Search/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Search/composer.json
@@ -1,6 +1,12 @@
 {
     "name": "magento/magento2-functional-test-module-search",
     "description": "Magento 2 Functional Test Module Search",
+    "type": "magento2-test-module",
+    "version": "100.0.0-dev",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
     "config": {
         "sort-packages": true
     },
@@ -9,21 +15,15 @@
         "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-backend": "1.0.0-dev",
-        "magento/magento2-functional-test-module-catalog-search": "1.0.0-dev",
-        "magento/magento2-functional-test-module-reports": "1.0.0-dev",
-        "magento/magento2-functional-test-module-store": "1.0.0-dev",
-        "magento/magento2-functional-test-module-ui": "1.0.0-dev"
+        "magento/magento2-functional-test-module-backend": "100.0.0-dev",
+        "magento/magento2-functional-test-module-catalog-search": "100.0.0-dev",
+        "magento/magento2-functional-test-module-reports": "100.0.0-dev",
+        "magento/magento2-functional-test-module-store": "100.0.0-dev",
+        "magento/magento2-functional-test-module-ui": "100.0.0-dev"
     },
-    "type": "magento2-test-module",
-    "version": "1.0.0-dev",
-    "license": [
-        "OSL-3.0",
-        "AFL-3.0"
-    ],
     "autoload": {
         "psr-4": {
-            "Magento\\Search\\": ""
+            "Magento\\FunctionalTest\\Search\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Security/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Security/composer.json
index 4350ca6810b..49278c3877a 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Security/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Security/composer.json
@@ -1,6 +1,12 @@
 {
     "name": "magento/magento2-functional-test-module-security",
     "description": "Magento 2 Functional Test Module Security",
+    "type": "magento2-test-module",
+    "version": "100.0.0-dev",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
     "config": {
         "sort-packages": true
     },
@@ -9,18 +15,12 @@
         "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-backend": "1.0.0-dev",
-        "magento/magento2-functional-test-module-store": "1.0.0-dev"
+        "magento/magento2-functional-test-module-backend": "100.0.0-dev",
+        "magento/magento2-functional-test-module-store": "100.0.0-dev"
     },
-    "type": "magento2-test-module",
-    "version": "1.0.0-dev",
-    "license": [
-        "OSL-3.0",
-        "AFL-3.0"
-    ],
     "autoload": {
         "psr-4": {
-            "Magento\\Security\\": ""
+            "Magento\\FunctionalTest\\Security\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SendFriend/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SendFriend/composer.json
index c93c457816d..34c4fe3b466 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SendFriend/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SendFriend/composer.json
@@ -1,6 +1,12 @@
 {
     "name": "magento/magento2-functional-test-module-send-friend",
     "description": "Magento 2 Functional Test Module Send Friend",
+    "type": "magento2-test-module",
+    "version": "100.0.0-dev",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
     "config": {
         "sort-packages": true
     },
@@ -9,19 +15,13 @@
         "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-catalog": "1.0.0-dev",
-        "magento/magento2-functional-test-module-customer": "1.0.0-dev",
-        "magento/magento2-functional-test-module-store": "1.0.0-dev"
+        "magento/magento2-functional-test-module-catalog": "100.0.0-dev",
+        "magento/magento2-functional-test-module-customer": "100.0.0-dev",
+        "magento/magento2-functional-test-module-store": "100.0.0-dev"
     },
-    "type": "magento2-test-module",
-    "version": "1.0.0-dev",
-    "license": [
-        "OSL-3.0",
-        "AFL-3.0"
-    ],
     "autoload": {
         "psr-4": {
-            "Magento\\SendFriend\\": ""
+            "Magento\\FunctionalTest\\SendFriend\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Shipping/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Shipping/composer.json
index cd82c92da19..007c4a85ee9 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Shipping/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Shipping/composer.json
@@ -1,6 +1,12 @@
 {
     "name": "magento/magento2-functional-test-module-shipping",
     "description": "Magento 2 Functional Test Module Shipping",
+    "type": "magento2-test-module",
+    "version": "100.0.0-dev",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
     "config": {
         "sort-packages": true
     },
@@ -9,29 +15,23 @@
         "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-backend": "1.0.0-dev",
-        "magento/magento2-functional-test-module-catalog": "1.0.0-dev",
-        "magento/magento2-functional-test-module-catalog-inventory": "1.0.0-dev",
-        "magento/magento2-functional-test-module-contact": "1.0.0-dev",
-        "magento/magento2-functional-test-module-customer": "1.0.0-dev",
-        "magento/magento2-functional-test-module-directory": "1.0.0-dev",
-        "magento/magento2-functional-test-module-payment": "1.0.0-dev",
-        "magento/magento2-functional-test-module-quote": "1.0.0-dev",
-        "magento/magento2-functional-test-module-sales": "1.0.0-dev",
-        "magento/magento2-functional-test-module-store": "1.0.0-dev",
-        "magento/magento2-functional-test-module-tax": "1.0.0-dev",
-        "magento/magento2-functional-test-module-ui": "1.0.0-dev",
-        "magento/magento2-functional-test-module-user": "1.0.0-dev"
+        "magento/magento2-functional-test-module-backend": "100.0.0-dev",
+        "magento/magento2-functional-test-module-catalog": "100.0.0-dev",
+        "magento/magento2-functional-test-module-catalog-inventory": "100.0.0-dev",
+        "magento/magento2-functional-test-module-contact": "100.0.0-dev",
+        "magento/magento2-functional-test-module-customer": "100.0.0-dev",
+        "magento/magento2-functional-test-module-directory": "100.0.0-dev",
+        "magento/magento2-functional-test-module-payment": "100.0.0-dev",
+        "magento/magento2-functional-test-module-quote": "100.0.0-dev",
+        "magento/magento2-functional-test-module-sales": "100.0.0-dev",
+        "magento/magento2-functional-test-module-store": "100.0.0-dev",
+        "magento/magento2-functional-test-module-tax": "100.0.0-dev",
+        "magento/magento2-functional-test-module-ui": "100.0.0-dev",
+        "magento/magento2-functional-test-module-user": "100.0.0-dev"
     },
-    "type": "magento2-test-module",
-    "version": "1.0.0-dev",
-    "license": [
-        "OSL-3.0",
-        "AFL-3.0"
-    ],
     "autoload": {
         "psr-4": {
-            "Magento\\Shipping\\": ""
+            "Magento\\FunctionalTest\\Shipping\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sitemap/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sitemap/composer.json
index ef33b62ac5e..35cfb059ee5 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sitemap/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sitemap/composer.json
@@ -1,6 +1,12 @@
 {
     "name": "magento/magento2-functional-test-module-sitemap",
     "description": "Magento 2 Functional Test Module Sitemap",
+    "type": "magento2-test-module",
+    "version": "100.0.0-dev",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
     "config": {
         "sort-packages": true
     },
@@ -9,25 +15,19 @@
         "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-backend": "1.0.0-dev",
-        "magento/magento2-functional-test-module-catalog": "1.0.0-dev",
-        "magento/magento2-functional-test-module-catalog-url-rewrite": "1.0.0-dev",
-        "magento/magento2-functional-test-module-cms": "1.0.0-dev",
-        "magento/magento2-functional-test-module-config": "1.0.0-dev",
-        "magento/magento2-functional-test-module-eav": "1.0.0-dev",
-        "magento/magento2-functional-test-module-media-storage": "1.0.0-dev",
-        "magento/magento2-functional-test-module-robots": "1.0.0-dev",
-        "magento/magento2-functional-test-module-store": "1.0.0-dev"
+        "magento/magento2-functional-test-module-backend": "100.0.0-dev",
+        "magento/magento2-functional-test-module-catalog": "100.0.0-dev",
+        "magento/magento2-functional-test-module-catalog-url-rewrite": "100.0.0-dev",
+        "magento/magento2-functional-test-module-cms": "100.0.0-dev",
+        "magento/magento2-functional-test-module-config": "100.0.0-dev",
+        "magento/magento2-functional-test-module-eav": "100.0.0-dev",
+        "magento/magento2-functional-test-module-media-storage": "100.0.0-dev",
+        "magento/magento2-functional-test-module-robots": "100.0.0-dev",
+        "magento/magento2-functional-test-module-store": "100.0.0-dev"
     },
-    "type": "magento2-test-module",
-    "version": "1.0.0-dev",
-    "license": [
-        "OSL-3.0",
-        "AFL-3.0"
-    ],
     "autoload": {
         "psr-4": {
-            "Magento\\Sitemap\\": ""
+            "Magento\\FunctionalTest\\Sitemap\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/composer.json
index 7e768c4b90e..e456d4113c4 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/composer.json
@@ -1,6 +1,12 @@
 {
     "name": "magento/magento2-functional-test-module-store",
     "description": "Magento 2 Functional Test Module Store",
+    "type": "magento2-test-module",
+    "version": "100.0.0-dev",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
     "config": {
         "sort-packages": true
     },
@@ -9,21 +15,15 @@
         "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-catalog": "1.0.0-dev",
-        "magento/magento2-functional-test-module-config": "1.0.0-dev",
-        "magento/magento2-functional-test-module-directory": "1.0.0-dev",
-        "magento/magento2-functional-test-module-media-storage": "1.0.0-dev",
-        "magento/magento2-functional-test-module-ui": "1.0.0-dev"
+        "magento/magento2-functional-test-module-catalog": "100.0.0-dev",
+        "magento/magento2-functional-test-module-config": "100.0.0-dev",
+        "magento/magento2-functional-test-module-directory": "100.0.0-dev",
+        "magento/magento2-functional-test-module-media-storage": "100.0.0-dev",
+        "magento/magento2-functional-test-module-ui": "100.0.0-dev"
     },
-    "type": "magento2-test-module",
-    "version": "1.0.0-dev",
-    "license": [
-        "OSL-3.0",
-        "AFL-3.0"
-    ],
     "autoload": {
         "psr-4": {
-            "Magento\\Store\\": ""
+            "Magento\\FunctionalTest\\Store\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Swagger/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Swagger/composer.json
index 213b3d1bdff..9d6c6ac8a8e 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Swagger/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Swagger/composer.json
@@ -1,6 +1,12 @@
 {
     "name": "magento/magento2-functional-test-module-swagger",
     "description": "Magento 2 Functional Test Module Swagger",
+    "type": "magento2-test-module",
+    "version": "100.0.0-dev",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
     "config": {
         "sort-packages": true
     },
@@ -8,15 +14,9 @@
         "magento/magento2-functional-testing-framework": "1.0.0",
         "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
-    "type": "magento2-test-module",
-    "version": "1.0.0-dev",
-    "license": [
-        "OSL-3.0",
-        "AFL-3.0"
-    ],
     "autoload": {
         "psr-4": {
-            "Magento\\Swagger\\": ""
+            "Magento\\FunctionalTest\\Swagger\\": ""
         }
     },
     "extra": {
@@ -26,6 +26,5 @@
                 "dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Swagger"
             ]
         ]
-    },
-    "suggest": null
+    }
 }
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Swatches/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Swatches/composer.json
index 3cfab737aa4..60588d548aa 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Swatches/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Swatches/composer.json
@@ -1,6 +1,12 @@
 {
     "name": "magento/magento2-functional-test-module-swatches",
     "description": "Magento 2 Functional Test Module Swatches",
+    "type": "magento2-test-module",
+    "version": "100.0.0-dev",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
     "config": {
         "sort-packages": true
     },
@@ -9,25 +15,19 @@
         "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-backend": "1.0.0-dev",
-        "magento/magento2-functional-test-module-catalog": "1.0.0-dev",
-        "magento/magento2-functional-test-module-config": "1.0.0-dev",
-        "magento/magento2-functional-test-module-configurable-product": "1.0.0-dev",
-        "magento/magento2-functional-test-module-customer": "1.0.0-dev",
-        "magento/magento2-functional-test-module-eav": "1.0.0-dev",
-        "magento/magento2-functional-test-module-media-storage": "1.0.0-dev",
-        "magento/magento2-functional-test-module-store": "1.0.0-dev",
-        "magento/magento2-functional-test-module-theme": "1.0.0-dev"
+        "magento/magento2-functional-test-module-backend": "100.0.0-dev",
+        "magento/magento2-functional-test-module-catalog": "100.0.0-dev",
+        "magento/magento2-functional-test-module-config": "100.0.0-dev",
+        "magento/magento2-functional-test-module-configurable-product": "100.0.0-dev",
+        "magento/magento2-functional-test-module-customer": "100.0.0-dev",
+        "magento/magento2-functional-test-module-eav": "100.0.0-dev",
+        "magento/magento2-functional-test-module-media-storage": "100.0.0-dev",
+        "magento/magento2-functional-test-module-store": "100.0.0-dev",
+        "magento/magento2-functional-test-module-theme": "100.0.0-dev"
     },
-    "type": "magento2-test-module",
-    "version": "1.0.0-dev",
-    "license": [
-        "OSL-3.0",
-        "AFL-3.0"
-    ],
     "autoload": {
         "psr-4": {
-            "Magento\\Swatches\\": ""
+            "Magento\\FunctionalTest\\Swatches\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SwatchesLayeredNavigation/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SwatchesLayeredNavigation/composer.json
index bb7df9b687e..64d374145ce 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SwatchesLayeredNavigation/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SwatchesLayeredNavigation/composer.json
@@ -1,6 +1,12 @@
 {
     "name": "magento/magento2-functional-test-module-swatches-layered-navigation",
     "description": "Magento 2 Functional Test Module Swatches Layered Navigation",
+    "type": "magento2-test-module",
+    "version": "100.0.0-dev",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
     "config": {
         "sort-packages": true
     },
@@ -8,15 +14,9 @@
         "magento/magento2-functional-testing-framework": "1.0.0",
         "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
-    "type": "magento2-test-module",
-    "version": "1.0.0-dev",
-    "license": [
-        "OSL-3.0",
-        "AFL-3.0"
-    ],
     "autoload": {
         "psr-4": {
-            "Magento\\SwatchesLayeredNavigation\\": ""
+            "Magento\\FunctionalTest\\SwatchesLayeredNavigation\\": ""
         }
     },
     "extra": {
@@ -26,6 +26,5 @@
                 "dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SwatchesLayeredNavigation"
             ]
         ]
-    },
-    "suggest": null
+    }
 }
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Tax/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Tax/composer.json
index cbcbbea1f25..c81eac8e64e 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Tax/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Tax/composer.json
@@ -1,6 +1,12 @@
 {
     "name": "magento/magento2-functional-test-module-tax",
     "description": "Magento 2 Functional Test Module Tax",
+    "type": "magento2-test-module",
+    "version": "100.0.0-dev",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
     "config": {
         "sort-packages": true
     },
@@ -9,29 +15,23 @@
         "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-backend": "1.0.0-dev",
-        "magento/magento2-functional-test-module-catalog": "1.0.0-dev",
-        "magento/magento2-functional-test-module-checkout": "1.0.0-dev",
-        "magento/magento2-functional-test-module-config": "1.0.0-dev",
-        "magento/magento2-functional-test-module-customer": "1.0.0-dev",
-        "magento/magento2-functional-test-module-directory": "1.0.0-dev",
-        "magento/magento2-functional-test-module-eav": "1.0.0-dev",
-        "magento/magento2-functional-test-module-page-cache": "1.0.0-dev",
-        "magento/magento2-functional-test-module-quote": "1.0.0-dev",
-        "magento/magento2-functional-test-module-reports": "1.0.0-dev",
-        "magento/magento2-functional-test-module-sales": "1.0.0-dev",
-        "magento/magento2-functional-test-module-shipping": "1.0.0-dev",
-        "magento/magento2-functional-test-module-store": "1.0.0-dev"
+        "magento/magento2-functional-test-module-backend": "100.0.0-dev",
+        "magento/magento2-functional-test-module-catalog": "100.0.0-dev",
+        "magento/magento2-functional-test-module-checkout": "100.0.0-dev",
+        "magento/magento2-functional-test-module-config": "100.0.0-dev",
+        "magento/magento2-functional-test-module-customer": "100.0.0-dev",
+        "magento/magento2-functional-test-module-directory": "100.0.0-dev",
+        "magento/magento2-functional-test-module-eav": "100.0.0-dev",
+        "magento/magento2-functional-test-module-page-cache": "100.0.0-dev",
+        "magento/magento2-functional-test-module-quote": "100.0.0-dev",
+        "magento/magento2-functional-test-module-reports": "100.0.0-dev",
+        "magento/magento2-functional-test-module-sales": "100.0.0-dev",
+        "magento/magento2-functional-test-module-shipping": "100.0.0-dev",
+        "magento/magento2-functional-test-module-store": "100.0.0-dev"
     },
-    "type": "magento2-test-module",
-    "version": "1.0.0-dev",
-    "license": [
-        "OSL-3.0",
-        "AFL-3.0"
-    ],
     "autoload": {
         "psr-4": {
-            "Magento\\Tax\\": ""
+            "Magento\\FunctionalTest\\Tax\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/TaxImportExport/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/TaxImportExport/composer.json
index b9c550fda24..92c8043066c 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/TaxImportExport/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/TaxImportExport/composer.json
@@ -1,6 +1,12 @@
 {
     "name": "magento/magento2-functional-test-module-tax-import-export",
     "description": "Magento 2 Functional Test Module Tax Import Export",
+    "type": "magento2-test-module",
+    "version": "100.0.0-dev",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
     "config": {
         "sort-packages": true
     },
@@ -9,20 +15,14 @@
         "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-backend": "1.0.0-dev",
-        "magento/magento2-functional-test-module-directory": "1.0.0-dev",
-        "magento/magento2-functional-test-module-store": "1.0.0-dev",
-        "magento/magento2-functional-test-module-tax": "1.0.0-dev"
+        "magento/magento2-functional-test-module-backend": "100.0.0-dev",
+        "magento/magento2-functional-test-module-directory": "100.0.0-dev",
+        "magento/magento2-functional-test-module-store": "100.0.0-dev",
+        "magento/magento2-functional-test-module-tax": "100.0.0-dev"
     },
-    "type": "magento2-test-module",
-    "version": "1.0.0-dev",
-    "license": [
-        "OSL-3.0",
-        "AFL-3.0"
-    ],
     "autoload": {
         "psr-4": {
-            "Magento\\TaxImportExport\\": ""
+            "Magento\\FunctionalTest\\TaxImportExport\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Theme/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Theme/composer.json
index 4fcba7e8bab..5e0e44f3b1f 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Theme/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Theme/composer.json
@@ -1,6 +1,12 @@
 {
     "name": "magento/magento2-functional-test-module-theme",
     "description": "Magento 2 Functional Test Module Theme",
+    "type": "magento2-test-module",
+    "version": "100.0.0-dev",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
     "config": {
         "sort-packages": true
     },
@@ -9,26 +15,20 @@
         "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-backend": "1.0.0-dev",
-        "magento/magento2-functional-test-module-cms": "1.0.0-dev",
-        "magento/magento2-functional-test-module-config": "1.0.0-dev",
-        "magento/magento2-functional-test-module-customer": "1.0.0-dev",
-        "magento/magento2-functional-test-module-eav": "1.0.0-dev",
-        "magento/magento2-functional-test-module-media-storage": "1.0.0-dev",
-        "magento/magento2-functional-test-module-require-js": "1.0.0-dev",
-        "magento/magento2-functional-test-module-store": "1.0.0-dev",
-        "magento/magento2-functional-test-module-ui": "1.0.0-dev",
-        "magento/magento2-functional-test-module-widget": "1.0.0-dev"
+        "magento/magento2-functional-test-module-backend": "100.0.0-dev",
+        "magento/magento2-functional-test-module-cms": "100.0.0-dev",
+        "magento/magento2-functional-test-module-config": "100.0.0-dev",
+        "magento/magento2-functional-test-module-customer": "100.0.0-dev",
+        "magento/magento2-functional-test-module-eav": "100.0.0-dev",
+        "magento/magento2-functional-test-module-media-storage": "100.0.0-dev",
+        "magento/magento2-functional-test-module-require-js": "100.0.0-dev",
+        "magento/magento2-functional-test-module-store": "100.0.0-dev",
+        "magento/magento2-functional-test-module-ui": "100.0.0-dev",
+        "magento/magento2-functional-test-module-widget": "100.0.0-dev"
     },
-    "type": "magento2-test-module",
-    "version": "1.0.0-dev",
-    "license": [
-        "OSL-3.0",
-        "AFL-3.0"
-    ],
     "autoload": {
         "psr-4": {
-            "Magento\\Theme\\": ""
+            "Magento\\FunctionalTest\\Theme\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Translation/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Translation/composer.json
index 9f1ff7470fe..3c41daeb237 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Translation/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Translation/composer.json
@@ -1,6 +1,12 @@
 {
     "name": "magento/magento2-functional-test-module-translation",
     "description": "Magento 2 Functional Test Module Translation",
+    "type": "magento2-test-module",
+    "version": "100.0.0-dev",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
     "config": {
         "sort-packages": true
     },
@@ -9,19 +15,13 @@
         "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-backend": "1.0.0-dev",
-        "magento/magento2-functional-test-module-developer": "1.0.0-dev",
-        "magento/magento2-functional-test-module-store": "1.0.0-dev"
+        "magento/magento2-functional-test-module-backend": "100.0.0-dev",
+        "magento/magento2-functional-test-module-developer": "100.0.0-dev",
+        "magento/magento2-functional-test-module-store": "100.0.0-dev"
     },
-    "type": "magento2-test-module",
-    "version": "1.0.0-dev",
-    "license": [
-        "OSL-3.0",
-        "AFL-3.0"
-    ],
     "autoload": {
         "psr-4": {
-            "Magento\\Translation\\": ""
+            "Magento\\FunctionalTest\\Translation\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Ui/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Ui/composer.json
index 3411d25cdb8..c8b95941339 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Ui/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Ui/composer.json
@@ -1,6 +1,12 @@
 {
     "name": "magento/magento2-functional-test-module-ui",
     "description": "Magento 2 Functional Test Module Ui",
+    "type": "magento2-test-module",
+    "version": "100.0.0-dev",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
     "config": {
         "sort-packages": true
     },
@@ -9,20 +15,14 @@
         "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-authorization": "1.0.0-dev",
-        "magento/magento2-functional-test-module-backend": "1.0.0-dev",
-        "magento/magento2-functional-test-module-eav": "1.0.0-dev",
-        "magento/magento2-functional-test-module-user": "1.0.0-dev"
+        "magento/magento2-functional-test-module-authorization": "100.0.0-dev",
+        "magento/magento2-functional-test-module-backend": "100.0.0-dev",
+        "magento/magento2-functional-test-module-eav": "100.0.0-dev",
+        "magento/magento2-functional-test-module-user": "100.0.0-dev"
     },
-    "type": "magento2-test-module",
-    "version": "1.0.0-dev",
-    "license": [
-        "OSL-3.0",
-        "AFL-3.0"
-    ],
     "autoload": {
         "psr-4": {
-            "Magento\\Ui\\": ""
+            "Magento\\FunctionalTest\\Ui\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Ups/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Ups/composer.json
index e3100ca49bc..d972a812329 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Ups/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Ups/composer.json
@@ -1,6 +1,12 @@
 {
     "name": "magento/magento2-functional-test-module-ups",
     "description": "Magento 2 Functional Test Module Ups",
+    "type": "magento2-test-module",
+    "version": "100.0.0-dev",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
     "config": {
         "sort-packages": true
     },
@@ -9,23 +15,17 @@
         "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-backend": "1.0.0-dev",
-        "magento/magento2-functional-test-module-catalog-inventory": "1.0.0-dev",
-        "magento/magento2-functional-test-module-directory": "1.0.0-dev",
-        "magento/magento2-functional-test-module-quote": "1.0.0-dev",
-        "magento/magento2-functional-test-module-sales": "1.0.0-dev",
-        "magento/magento2-functional-test-module-shipping": "1.0.0-dev",
-        "magento/magento2-functional-test-module-store": "1.0.0-dev"
+        "magento/magento2-functional-test-module-backend": "100.0.0-dev",
+        "magento/magento2-functional-test-module-catalog-inventory": "100.0.0-dev",
+        "magento/magento2-functional-test-module-directory": "100.0.0-dev",
+        "magento/magento2-functional-test-module-quote": "100.0.0-dev",
+        "magento/magento2-functional-test-module-sales": "100.0.0-dev",
+        "magento/magento2-functional-test-module-shipping": "100.0.0-dev",
+        "magento/magento2-functional-test-module-store": "100.0.0-dev"
     },
-    "type": "magento2-test-module",
-    "version": "1.0.0-dev",
-    "license": [
-        "OSL-3.0",
-        "AFL-3.0"
-    ],
     "autoload": {
         "psr-4": {
-            "Magento\\Ups\\": ""
+            "Magento\\FunctionalTest\\Ups\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/UrlRewrite/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/UrlRewrite/composer.json
index 4ecae5ca480..b0b8e5ff73a 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/UrlRewrite/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/UrlRewrite/composer.json
@@ -1,6 +1,12 @@
 {
     "name": "magento/magento2-functional-test-module-url-rewrite",
     "description": "Magento 2 Functional Test Module Url Rewrite",
+    "type": "magento2-test-module",
+    "version": "100.0.0-dev",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
     "config": {
         "sort-packages": true
     },
@@ -9,22 +15,16 @@
         "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-backend": "1.0.0-dev",
-        "magento/magento2-functional-test-module-catalog": "1.0.0-dev",
-        "magento/magento2-functional-test-module-catalog-url-rewrite": "1.0.0-dev",
-        "magento/magento2-functional-test-module-cms": "1.0.0-dev",
-        "magento/magento2-functional-test-module-cms-url-rewrite": "1.0.0-dev",
-        "magento/magento2-functional-test-module-store": "1.0.0-dev"
+        "magento/magento2-functional-test-module-backend": "100.0.0-dev",
+        "magento/magento2-functional-test-module-catalog": "100.0.0-dev",
+        "magento/magento2-functional-test-module-catalog-url-rewrite": "100.0.0-dev",
+        "magento/magento2-functional-test-module-cms": "100.0.0-dev",
+        "magento/magento2-functional-test-module-cms-url-rewrite": "100.0.0-dev",
+        "magento/magento2-functional-test-module-store": "100.0.0-dev"
     },
-    "type": "magento2-test-module",
-    "version": "1.0.0-dev",
-    "license": [
-        "OSL-3.0",
-        "AFL-3.0"
-    ],
     "autoload": {
         "psr-4": {
-            "Magento\\UrlRewrite\\": ""
+            "Magento\\FunctionalTest\\UrlRewrite\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/User/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/User/composer.json
index 945e3383a94..5263f088253 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/User/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/User/composer.json
@@ -1,6 +1,12 @@
 {
     "name": "magento/magento2-functional-test-module-user",
     "description": "Magento 2 Functional Test Module User",
+    "type": "magento2-test-module",
+    "version": "100.0.0-dev",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
     "config": {
         "sort-packages": true
     },
@@ -9,22 +15,16 @@
         "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-authorization": "1.0.0-dev",
-        "magento/magento2-functional-test-module-backend": "1.0.0-dev",
-        "magento/magento2-functional-test-module-email": "1.0.0-dev",
-        "magento/magento2-functional-test-module-integration": "1.0.0-dev",
-        "magento/magento2-functional-test-module-security": "1.0.0-dev",
-        "magento/magento2-functional-test-module-store": "1.0.0-dev"
+        "magento/magento2-functional-test-module-authorization": "100.0.0-dev",
+        "magento/magento2-functional-test-module-backend": "100.0.0-dev",
+        "magento/magento2-functional-test-module-email": "100.0.0-dev",
+        "magento/magento2-functional-test-module-integration": "100.0.0-dev",
+        "magento/magento2-functional-test-module-security": "100.0.0-dev",
+        "magento/magento2-functional-test-module-store": "100.0.0-dev"
     },
-    "type": "magento2-test-module",
-    "version": "1.0.0-dev",
-    "license": [
-        "OSL-3.0",
-        "AFL-3.0"
-    ],
     "autoload": {
         "psr-4": {
-            "Magento\\User\\": ""
+            "Magento\\FunctionalTest\\User\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Usps/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Usps/composer.json
index c8815b5d490..a4f4b182cae 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Usps/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Usps/composer.json
@@ -1,6 +1,12 @@
 {
     "name": "magento/magento2-functional-test-module-usps",
     "description": "Magento 2 Functional Test Module Usps",
+    "type": "magento2-test-module",
+    "version": "100.0.0-dev",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
     "config": {
         "sort-packages": true
     },
@@ -9,24 +15,18 @@
         "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-catalog": "1.0.0-dev",
-        "magento/magento2-functional-test-module-catalog-inventory": "1.0.0-dev",
-        "magento/magento2-functional-test-module-config": "1.0.0-dev",
-        "magento/magento2-functional-test-module-directory": "1.0.0-dev",
-        "magento/magento2-functional-test-module-quote": "1.0.0-dev",
-        "magento/magento2-functional-test-module-sales": "1.0.0-dev",
-        "magento/magento2-functional-test-module-shipping": "1.0.0-dev",
-        "magento/magento2-functional-test-module-store": "1.0.0-dev"
+        "magento/magento2-functional-test-module-catalog": "100.0.0-dev",
+        "magento/magento2-functional-test-module-catalog-inventory": "100.0.0-dev",
+        "magento/magento2-functional-test-module-config": "100.0.0-dev",
+        "magento/magento2-functional-test-module-directory": "100.0.0-dev",
+        "magento/magento2-functional-test-module-quote": "100.0.0-dev",
+        "magento/magento2-functional-test-module-sales": "100.0.0-dev",
+        "magento/magento2-functional-test-module-shipping": "100.0.0-dev",
+        "magento/magento2-functional-test-module-store": "100.0.0-dev"
     },
-    "type": "magento2-test-module",
-    "version": "1.0.0-dev",
-    "license": [
-        "OSL-3.0",
-        "AFL-3.0"
-    ],
     "autoload": {
         "psr-4": {
-            "Magento\\Usps\\": ""
+            "Magento\\FunctionalTest\\Usps\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Variable/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Variable/composer.json
index 4886a968b11..4b38be8f11d 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Variable/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Variable/composer.json
@@ -1,6 +1,12 @@
 {
     "name": "magento/magento2-functional-test-module-variable",
     "description": "Magento 2 Functional Test Module Variable",
+    "type": "magento2-test-module",
+    "version": "100.0.0-dev",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
     "config": {
         "sort-packages": true
     },
@@ -9,19 +15,13 @@
         "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-backend": "1.0.0-dev",
-        "magento/magento2-functional-test-module-email": "1.0.0-dev",
-        "magento/magento2-functional-test-module-store": "1.0.0-dev"
+        "magento/magento2-functional-test-module-backend": "100.0.0-dev",
+        "magento/magento2-functional-test-module-email": "100.0.0-dev",
+        "magento/magento2-functional-test-module-store": "100.0.0-dev"
     },
-    "type": "magento2-test-module",
-    "version": "1.0.0-dev",
-    "license": [
-        "OSL-3.0",
-        "AFL-3.0"
-    ],
     "autoload": {
         "psr-4": {
-            "Magento\\Variable\\": ""
+            "Magento\\FunctionalTest\\Variable\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Vault/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Vault/composer.json
index 51bbeb652ab..c5a28256b7a 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Vault/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Vault/composer.json
@@ -1,6 +1,12 @@
 {
     "name": "magento/magento2-functional-test-module-vault",
     "description": "Magento 2 Functional Test Module Vault",
+    "type": "magento2-test-module",
+    "version": "100.0.0-dev",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
     "config": {
         "sort-packages": true
     },
@@ -9,22 +15,16 @@
         "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-checkout": "1.0.0-dev",
-        "magento/magento2-functional-test-module-customer": "1.0.0-dev",
-        "magento/magento2-functional-test-module-payment": "1.0.0-dev",
-        "magento/magento2-functional-test-module-quote": "1.0.0-dev",
-        "magento/magento2-functional-test-module-sales": "1.0.0-dev",
-        "magento/magento2-functional-test-module-store": "1.0.0-dev"
+        "magento/magento2-functional-test-module-checkout": "100.0.0-dev",
+        "magento/magento2-functional-test-module-customer": "100.0.0-dev",
+        "magento/magento2-functional-test-module-payment": "100.0.0-dev",
+        "magento/magento2-functional-test-module-quote": "100.0.0-dev",
+        "magento/magento2-functional-test-module-sales": "100.0.0-dev",
+        "magento/magento2-functional-test-module-store": "100.0.0-dev"
     },
-    "type": "magento2-test-module",
-    "version": "1.0.0-dev",
-    "license": [
-        "OSL-3.0",
-        "AFL-3.0"
-    ],
     "autoload": {
         "psr-4": {
-            "Magento\\Vault\\": ""
+            "Magento\\FunctionalTest\\Vault\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Version/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Version/composer.json
index 119aa2fca54..3e222e5641a 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Version/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Version/composer.json
@@ -1,6 +1,12 @@
 {
     "name": "magento/magento2-functional-test-module-version",
     "description": "Magento 2 Functional Test Module Version",
+    "type": "magento2-test-module",
+    "version": "100.0.0-dev",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
     "config": {
         "sort-packages": true
     },
@@ -8,15 +14,9 @@
         "magento/magento2-functional-testing-framework": "1.0.0",
         "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
-    "type": "magento2-test-module",
-    "version": "1.0.0-dev",
-    "license": [
-        "OSL-3.0",
-        "AFL-3.0"
-    ],
     "autoload": {
         "psr-4": {
-            "Magento\\Version\\": ""
+            "Magento\\FunctionalTest\\Version\\": ""
         }
     },
     "extra": {
@@ -26,6 +26,5 @@
                 "dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Version"
             ]
         ]
-    },
-    "suggest": null
+    }
 }
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Webapi/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Webapi/composer.json
index e9a12a1c055..00916f722e3 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Webapi/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Webapi/composer.json
@@ -1,6 +1,12 @@
 {
     "name": "magento/magento2-functional-test-module-webapi",
     "description": "Magento 2 Functional Test Module Webapi",
+    "type": "magento2-test-module",
+    "version": "100.0.0-dev",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
     "config": {
         "sort-packages": true
     },
@@ -9,20 +15,14 @@
         "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-authorization": "1.0.0-dev",
-        "magento/magento2-functional-test-module-backend": "1.0.0-dev",
-        "magento/magento2-functional-test-module-integration": "1.0.0-dev",
-        "magento/magento2-functional-test-module-store": "1.0.0-dev"
+        "magento/magento2-functional-test-module-authorization": "100.0.0-dev",
+        "magento/magento2-functional-test-module-backend": "100.0.0-dev",
+        "magento/magento2-functional-test-module-integration": "100.0.0-dev",
+        "magento/magento2-functional-test-module-store": "100.0.0-dev"
     },
-    "type": "magento2-test-module",
-    "version": "1.0.0-dev",
-    "license": [
-        "OSL-3.0",
-        "AFL-3.0"
-    ],
     "autoload": {
         "psr-4": {
-            "Magento\\Webapi\\": ""
+            "Magento\\FunctionalTest\\Webapi\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/WebapiSecurity/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/WebapiSecurity/composer.json
index bda7e23dacb..f66e3e65d26 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/WebapiSecurity/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/WebapiSecurity/composer.json
@@ -1,6 +1,12 @@
 {
     "name": "magento/magento2-functional-test-module-webapi-security",
     "description": "Magento 2 Functional Test Module Webapi Security",
+    "type": "magento2-test-module",
+    "version": "100.0.0-dev",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
     "config": {
         "sort-packages": true
     },
@@ -9,17 +15,11 @@
         "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-webapi": "1.0.0-dev"
+        "magento/magento2-functional-test-module-webapi": "100.0.0-dev"
     },
-    "type": "magento2-test-module",
-    "version": "1.0.0-dev",
-    "license": [
-        "OSL-3.0",
-        "AFL-3.0"
-    ],
     "autoload": {
         "psr-4": {
-            "Magento\\WebapiSecurity\\": ""
+            "Magento\\FunctionalTest\\WebapiSecurity\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Weee/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Weee/composer.json
index 1698a517349..9bc06706ee7 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Weee/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Weee/composer.json
@@ -1,6 +1,12 @@
 {
     "name": "magento/magento2-functional-test-module-weee",
     "description": "Magento 2 Functional Test Module Weee",
+    "type": "magento2-test-module",
+    "version": "100.0.0-dev",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
     "config": {
         "sort-packages": true
     },
@@ -9,28 +15,22 @@
         "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-backend": "1.0.0-dev",
-        "magento/magento2-functional-test-module-catalog": "1.0.0-dev",
-        "magento/magento2-functional-test-module-checkout": "1.0.0-dev",
-        "magento/magento2-functional-test-module-customer": "1.0.0-dev",
-        "magento/magento2-functional-test-module-directory": "1.0.0-dev",
-        "magento/magento2-functional-test-module-eav": "1.0.0-dev",
-        "magento/magento2-functional-test-module-page-cache": "1.0.0-dev",
-        "magento/magento2-functional-test-module-quote": "1.0.0-dev",
-        "magento/magento2-functional-test-module-sales": "1.0.0-dev",
-        "magento/magento2-functional-test-module-store": "1.0.0-dev",
-        "magento/magento2-functional-test-module-tax": "1.0.0-dev",
-        "magento/magento2-functional-test-module-ui": "1.0.0-dev"
+        "magento/magento2-functional-test-module-backend": "100.0.0-dev",
+        "magento/magento2-functional-test-module-catalog": "100.0.0-dev",
+        "magento/magento2-functional-test-module-checkout": "100.0.0-dev",
+        "magento/magento2-functional-test-module-customer": "100.0.0-dev",
+        "magento/magento2-functional-test-module-directory": "100.0.0-dev",
+        "magento/magento2-functional-test-module-eav": "100.0.0-dev",
+        "magento/magento2-functional-test-module-page-cache": "100.0.0-dev",
+        "magento/magento2-functional-test-module-quote": "100.0.0-dev",
+        "magento/magento2-functional-test-module-sales": "100.0.0-dev",
+        "magento/magento2-functional-test-module-store": "100.0.0-dev",
+        "magento/magento2-functional-test-module-tax": "100.0.0-dev",
+        "magento/magento2-functional-test-module-ui": "100.0.0-dev"
     },
-    "type": "magento2-test-module",
-    "version": "1.0.0-dev",
-    "license": [
-        "OSL-3.0",
-        "AFL-3.0"
-    ],
     "autoload": {
         "psr-4": {
-            "Magento\\Weee\\": ""
+            "Magento\\FunctionalTest\\Weee\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Widget/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Widget/composer.json
index 0fdf707a3be..40445beb03c 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Widget/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Widget/composer.json
@@ -1,6 +1,12 @@
 {
     "name": "magento/magento2-functional-test-module-widget",
     "description": "Magento 2 Functional Test Module Widget",
+    "type": "magento2-test-module",
+    "version": "100.0.0-dev",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
     "config": {
         "sort-packages": true
     },
@@ -9,23 +15,17 @@
         "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-backend": "1.0.0-dev",
-        "magento/magento2-functional-test-module-catalog": "1.0.0-dev",
-        "magento/magento2-functional-test-module-cms": "1.0.0-dev",
-        "magento/magento2-functional-test-module-email": "1.0.0-dev",
-        "magento/magento2-functional-test-module-store": "1.0.0-dev",
-        "magento/magento2-functional-test-module-theme": "1.0.0-dev",
-        "magento/magento2-functional-test-module-variable": "1.0.0-dev"
+        "magento/magento2-functional-test-module-backend": "100.0.0-dev",
+        "magento/magento2-functional-test-module-catalog": "100.0.0-dev",
+        "magento/magento2-functional-test-module-cms": "100.0.0-dev",
+        "magento/magento2-functional-test-module-email": "100.0.0-dev",
+        "magento/magento2-functional-test-module-store": "100.0.0-dev",
+        "magento/magento2-functional-test-module-theme": "100.0.0-dev",
+        "magento/magento2-functional-test-module-variable": "100.0.0-dev"
     },
-    "type": "magento2-test-module",
-    "version": "1.0.0-dev",
-    "license": [
-        "OSL-3.0",
-        "AFL-3.0"
-    ],
     "autoload": {
         "psr-4": {
-            "Magento\\Widget\\": ""
+            "Magento\\FunctionalTest\\Widget\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Wishlist/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Wishlist/composer.json
index 1c8dcf9dbde..70e8df41e73 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Wishlist/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Wishlist/composer.json
@@ -1,6 +1,12 @@
 {
     "name": "magento/magento2-functional-test-module-wishlist",
     "description": "Magento 2 Functional Test Module Wishlist",
+    "type": "magento2-test-module",
+    "version": "100.0.0-dev",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
     "config": {
         "sort-packages": true
     },
@@ -9,25 +15,19 @@
         "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-backend": "1.0.0-dev",
-        "magento/magento2-functional-test-module-catalog": "1.0.0-dev",
-        "magento/magento2-functional-test-module-catalog-inventory": "1.0.0-dev",
-        "magento/magento2-functional-test-module-checkout": "1.0.0-dev",
-        "magento/magento2-functional-test-module-customer": "1.0.0-dev",
-        "magento/magento2-functional-test-module-rss": "1.0.0-dev",
-        "magento/magento2-functional-test-module-sales": "1.0.0-dev",
-        "magento/magento2-functional-test-module-store": "1.0.0-dev",
-        "magento/magento2-functional-test-module-ui": "1.0.0-dev"
+        "magento/magento2-functional-test-module-backend": "100.0.0-dev",
+        "magento/magento2-functional-test-module-catalog": "100.0.0-dev",
+        "magento/magento2-functional-test-module-catalog-inventory": "100.0.0-dev",
+        "magento/magento2-functional-test-module-checkout": "100.0.0-dev",
+        "magento/magento2-functional-test-module-customer": "100.0.0-dev",
+        "magento/magento2-functional-test-module-rss": "100.0.0-dev",
+        "magento/magento2-functional-test-module-sales": "100.0.0-dev",
+        "magento/magento2-functional-test-module-store": "100.0.0-dev",
+        "magento/magento2-functional-test-module-ui": "100.0.0-dev"
     },
-    "type": "magento2-test-module",
-    "version": "1.0.0-dev",
-    "license": [
-        "OSL-3.0",
-        "AFL-3.0"
-    ],
     "autoload": {
         "psr-4": {
-            "Magento\\Wishlist\\": ""
+            "Magento\\FunctionalTest\\Wishlist\\": ""
         }
     },
     "extra": {
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/WishlistAnalytics/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/WishlistAnalytics/composer.json
index 0c09eacb90d..b49a321f448 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/WishlistAnalytics/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/WishlistAnalytics/composer.json
@@ -1,11 +1,11 @@
 {
     "name": "magento/magento2-functional-test-module-wishlist-analytics",
     "description": "Magento 2 Acceptance Test Module WishlistAnalytics",
-    "repositories": [
-        {
-            "type": "composer",
-            "url": "https://repo.magento.com/"
-        }
+    "type": "magento2-test-module",
+    "version": "100.0.0-dev",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
     ],
     "config": {
         "sort-packages": true
@@ -15,17 +15,11 @@
         "php": "7.0.2|7.0.4|~7.0.6|~7.1.0"
     },
     "suggest": {
-        "magento/magento2-functional-test-module-wishlist": "1.0.0-dev"
+        "magento/magento2-functional-test-module-wishlist": "100.0.0-dev"
     },
-    "type": "magento2-test-module",
-    "version": "1.0.0-dev",
-    "license": [
-        "OSL-3.0",
-        "AFL-3.0"
-    ],
     "autoload": {
         "psr-4": {
-            "Magento\\WishlistAnalytics\\": ""
+            "Magento\\FunctionalTest\\WishlistAnalytics\\": ""
         }
     },
     "extra": {
-- 
GitLab


From ce4c05e1224c7e956d78bdfc81b17dc95b252812 Mon Sep 17 00:00:00 2001
From: Alex Kolesnyk <okolesnyk@magento.com>
Date: Fri, 8 Dec 2017 16:39:55 +0200
Subject: [PATCH 312/380] MQE-599: Move composer.json, README.MD, etc to CE

 - created README.MD in Magento (Open Source)
---
 dev/tests/acceptance/README.md | 70 ++++++++++++++++++++++++++++++++++
 1 file changed, 70 insertions(+)
 create mode 100755 dev/tests/acceptance/README.md

diff --git a/dev/tests/acceptance/README.md b/dev/tests/acceptance/README.md
new file mode 100755
index 00000000000..a124e63e814
--- /dev/null
+++ b/dev/tests/acceptance/README.md
@@ -0,0 +1,70 @@
+# Magento Functional Testing Framework
+
+----
+
+## System Requirements
+[Magento Functional Testing Framework system requirements](http://devdocs.magento.com/guides/v2.2/magento-functional-testing-framework/getting-started.html#prepare-environment)
+
+## Installation
+To install the Magento Functional Testing Framework, see [Getting Started](http://devdocs.magento.com/guides/v2.2/magento-functional-testing-framework/getting-started.html)
+
+## Contributing
+Contributions can take the form of new components or features, changes to existing features, tests, documentation (such as developer guides, user guides, examples, or specifications), bug fixes, optimizations, or just good suggestions.
+
+To learn about how to make a contribution, click [here][1].
+
+To open an issue, click [here][2].
+
+To suggest documentation improvements, click [here][3].
+
+[1]: <http://devdocs.magento.com/guides/v2.2/magento-functional-testing-framework/contribution-guidelines.html>
+[2]: <https://github.com/magento/magento2-functional-testing-framework/issues>
+[3]: <http://devdocs.magento.com>
+
+### Labels applied by the MFTF team
+
+Refer to the tables with descriptions of each label below. These labels are applied by the MFTF development team to community contributed issues and pull requests, to communicate status, impact, or which team is working on it.
+
+### Pull Request Status
+
+Label| Description
+---|---
+**accept**| The pull request has been accepted and will be merged into mainline code. 
+**reject**| The pull request has been rejected and will not be merged into mainline code. Possible reasons can include but are not limited to: issue has already been fixed in another code contribution, or there is an issue with the code contribution.
+**needsUpdate**| The Magento Team needs additional information from the reporter to properly prioritize and process the pull request.
+
+### Issue Resolution Status
+
+Label| Description
+---|---
+**acknowledged**| The Magento Team has validated the issue and an internal ticket has been created.
+**needsUpdate**| The Magento Team needs additional information from the reporter to properly prioritize and process the issue or pull request.
+**cannot reproduce**| The Magento Team has not confirmed that this issue contains the minimum required information to reproduce. 
+**non-issue**| The Magento Team has not recognised any issue according to provided information.
+
+### Domains Impacted
+
+Label| Description
+---|---
+**PROD**| Affects the Product team (mostly feature requests or business logic change).
+**DOC**| Affects Documentation domain.
+**TECH**| Affects Architect Group (mostly to make decisions around technology changes).
+
+### Type
+
+Label| Description
+---|---
+**bugfix**| The issue or pull request relates to bug fixing.
+**enhancement**| The issue or pull request that raises the MFTF to a higher degree (for example new features, optimization, refactoring, etc).
+
+## Reporting security issues
+
+To report security vulnerabilities in Magento software or web sites, please e-mail <a href="mailto:security@magento.com">security@magento.com</a>. Please do not report security issues using GitHub. Be sure to encrypt your e-mail with our <a href="https://info2.magento.com/rs/magentoenterprise/images/security_at_magento.asc">encryption key</a> if it includes sensitive information. Learn more about reporting security issues <a href="https://magento.com/security/reporting-magento-security-issue">here</a>.
+
+Stay up-to-date on the latest security news and patches for Magento by signing up for <a href="https://magento.com/security/sign-up">Security Alert Notifications</a>.
+
+## License
+
+Each Magento source file included in this distribution is licensed under APL 3.0
+
+Please see LICENSE_APL3.txt for the full text of the APL 3.0 license or contact license@magentocommerce.com for a copy.
-- 
GitLab


From d11319191d13934d6b990147782097cb37ebaf87 Mon Sep 17 00:00:00 2001
From: Alex Kolesnyk <okolesnyk@magento.com>
Date: Fri, 8 Dec 2017 17:24:11 +0200
Subject: [PATCH 313/380] MQE-599: Move composer.json, README, etc from EE to
 CE

 - update functional composer.json
---
 dev/tests/functional/composer.json | 1 +
 1 file changed, 1 insertion(+)

diff --git a/dev/tests/functional/composer.json b/dev/tests/functional/composer.json
index 08ac79f0ab6..05ef221a094 100644
--- a/dev/tests/functional/composer.json
+++ b/dev/tests/functional/composer.json
@@ -6,6 +6,7 @@
         "php": "7.0.2|~7.0.6|~7.1.0",
         "allure-framework/allure-phpunit": "~1.2.0",
         "magento/mtf": "1.0.0-rc57",
+        "allure-framework/allure-phpunit": "~1.2.0",
         "phpunit/phpunit": "~4.8.0|~5.5.0",
         "phpunit/phpunit-selenium": ">=1.2"
     },
-- 
GitLab


From 84e5aaef5956f8b87f37f7da30337f75e985a015 Mon Sep 17 00:00:00 2001
From: Alex Kolesnyk <okolesnyk@magento.com>
Date: Fri, 8 Dec 2017 18:04:12 +0200
Subject: [PATCH 314/380] MQE-599: Move composer.json, README, etc from EE to
 CE

 - revert repositories node
---
 dev/tests/acceptance/composer.json | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/dev/tests/acceptance/composer.json b/dev/tests/acceptance/composer.json
index c6bdf643db0..28627418eb1 100755
--- a/dev/tests/acceptance/composer.json
+++ b/dev/tests/acceptance/composer.json
@@ -10,6 +10,12 @@
     "config": {
         "sort-packages": true
     },
+    "repositories": [
+        {
+            "type": "git",
+            "url": "git@github.com:magento/magento2-functional-testing-framework.git"
+        }
+    ],
     "require": {
         "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
         "codeception/codeception": "~2.3.4",
-- 
GitLab


From 99a8f324ec2f6de04c97449262bc7b86128e0207 Mon Sep 17 00:00:00 2001
From: Ian Meron <imeron@magento.com>
Date: Fri, 8 Dec 2017 20:09:14 +0200
Subject: [PATCH 315/380] MQE-386: MFTF Compatibility with Windows Machine

- fix composer entry breaking windows robo commands
---
 dev/tests/acceptance/composer.json | 1 +
 1 file changed, 1 insertion(+)

diff --git a/dev/tests/acceptance/composer.json b/dev/tests/acceptance/composer.json
index 28627418eb1..a380c325a5e 100755
--- a/dev/tests/acceptance/composer.json
+++ b/dev/tests/acceptance/composer.json
@@ -20,6 +20,7 @@
         "allure-framework/allure-codeception": "dev-master#af40af5ae2b717618a42fe3e137d75878508c75d",
         "codeception/codeception": "~2.3.4",
         "consolidation/robo": "^1.0.0",
+        "symfony/process": ">=2.7 <3.4",
         "henrikbjorn/lurker": "^1.2",
         "magento/magento2-functional-testing-framework": "1.0.0",
         "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",
-- 
GitLab


From f1fa4594d8ff9368cf36dba5c09ccb517ece1a76 Mon Sep 17 00:00:00 2001
From: Alex Kolesnyk <okolesnyk@magento.com>
Date: Fri, 8 Dec 2017 20:43:52 +0200
Subject: [PATCH 316/380] MQE-599: Move composer.json, README, etc from EE to
 CE

---
 dev/tests/acceptance/README.md | 6 ------
 1 file changed, 6 deletions(-)

diff --git a/dev/tests/acceptance/README.md b/dev/tests/acceptance/README.md
index a124e63e814..6350b9cabcd 100755
--- a/dev/tests/acceptance/README.md
+++ b/dev/tests/acceptance/README.md
@@ -57,12 +57,6 @@ Label| Description
 **bugfix**| The issue or pull request relates to bug fixing.
 **enhancement**| The issue or pull request that raises the MFTF to a higher degree (for example new features, optimization, refactoring, etc).
 
-## Reporting security issues
-
-To report security vulnerabilities in Magento software or web sites, please e-mail <a href="mailto:security@magento.com">security@magento.com</a>. Please do not report security issues using GitHub. Be sure to encrypt your e-mail with our <a href="https://info2.magento.com/rs/magentoenterprise/images/security_at_magento.asc">encryption key</a> if it includes sensitive information. Learn more about reporting security issues <a href="https://magento.com/security/reporting-magento-security-issue">here</a>.
-
-Stay up-to-date on the latest security news and patches for Magento by signing up for <a href="https://magento.com/security/sign-up">Security Alert Notifications</a>.
-
 ## License
 
 Each Magento source file included in this distribution is licensed under APL 3.0
-- 
GitLab


From 0f0f1404ea651c5e7ed92131c44b51f943a604a0 Mon Sep 17 00:00:00 2001
From: Alex Kolesnyk <okolesnyk@magento.com>
Date: Fri, 8 Dec 2017 21:53:03 +0200
Subject: [PATCH 317/380] MQE-592: Audit Test Cases on Firefox/Chrome on
 Windows/OSX

---
 dev/tests/acceptance/tests/_bootstrap.php | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/dev/tests/acceptance/tests/_bootstrap.php b/dev/tests/acceptance/tests/_bootstrap.php
index a3d7b41f397..78d69c1ce9f 100644
--- a/dev/tests/acceptance/tests/_bootstrap.php
+++ b/dev/tests/acceptance/tests/_bootstrap.php
@@ -24,7 +24,7 @@ if (file_exists(PROJECT_ROOT . '/.env')) {
 defined('FW_BP') || define('FW_BP', PROJECT_ROOT . $RELATIVE_FW_PATH);
 
 // add the debug flag here
-$debug_mode = $_ENV['MFTF_DEBUG'] ?? false;
-if (!$debug_mode) {
+$debug_mode = (bool)$_ENV['MFTF_DEBUG'] ?? false;
+if (!$debug_mode && extension_loaded('xdebug')) {
     xdebug_disable();
 }
-- 
GitLab


From bf611beabbfcb95d78cb6286b5ba803bea6cdb37 Mon Sep 17 00:00:00 2001
From: Alan Hardman <ahardman@thrivelife.com>
Date: Fri, 8 Dec 2017 13:10:57 -0700
Subject: [PATCH 318/380] Check that $parentPathPieces is an array

This fixes an issue loading theme configuration on PHP 7.2
---
 lib/internal/Magento/Framework/View/Design/Theme/ThemeList.php | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/lib/internal/Magento/Framework/View/Design/Theme/ThemeList.php b/lib/internal/Magento/Framework/View/Design/Theme/ThemeList.php
index 826811b55b4..000fba24f08 100644
--- a/lib/internal/Magento/Framework/View/Design/Theme/ThemeList.php
+++ b/lib/internal/Magento/Framework/View/Design/Theme/ThemeList.php
@@ -234,7 +234,7 @@ class ThemeList extends \Magento\Framework\Data\Collection implements ListInterf
         $media = $themeConfig->getMedia();
 
         $parentPathPieces = $themeConfig->getParentTheme();
-        if (count($parentPathPieces) == 1) {
+        if (is_array($parentPathPieces) && count($parentPathPieces) == 1) {
             $pathPieces = $pathData['theme_path_pieces'];
             array_pop($pathPieces);
             $parentPathPieces = array_merge($pathPieces, $parentPathPieces);
-- 
GitLab


From a8e06f436110b2c95f36b387aead1c488f3ad432 Mon Sep 17 00:00:00 2001
From: Alex Kolesnyk <okolesnyk@magento.com>
Date: Fri, 8 Dec 2017 22:46:05 +0200
Subject: [PATCH 319/380] MQE-592: Audit Test Cases on Firefox/Chrome on
 Windows/OSX

---
 dev/tests/acceptance/tests/_bootstrap.php | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/dev/tests/acceptance/tests/_bootstrap.php b/dev/tests/acceptance/tests/_bootstrap.php
index 78d69c1ce9f..43139994761 100644
--- a/dev/tests/acceptance/tests/_bootstrap.php
+++ b/dev/tests/acceptance/tests/_bootstrap.php
@@ -24,7 +24,7 @@ if (file_exists(PROJECT_ROOT . '/.env')) {
 defined('FW_BP') || define('FW_BP', PROJECT_ROOT . $RELATIVE_FW_PATH);
 
 // add the debug flag here
-$debug_mode = (bool)$_ENV['MFTF_DEBUG'] ?? false;
-if (!$debug_mode && extension_loaded('xdebug')) {
+$debug_mode = $_ENV['MFTF_DEBUG'] ?? false;
+if (!(bool)$debug_mode && extension_loaded('xdebug')) {
     xdebug_disable();
 }
-- 
GitLab


From e9ba7eb2d8cb4d5603401e72321a618aec223149 Mon Sep 17 00:00:00 2001
From: Michele Fantetti <michele.fantetti@gmail.com>
Date: Sat, 9 Dec 2017 18:10:10 +0100
Subject: [PATCH 320/380] Update CrontabManager.php

If crontab is already populated, 'php bin/magento cron:install' adds '#~ MAGENTO START' and the rest of code directly to the last row of crontab without any spaces.
---
 lib/internal/Magento/Framework/Crontab/CrontabManager.php | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/lib/internal/Magento/Framework/Crontab/CrontabManager.php b/lib/internal/Magento/Framework/Crontab/CrontabManager.php
index cd0dcdaeaa6..b06e12a7736 100644
--- a/lib/internal/Magento/Framework/Crontab/CrontabManager.php
+++ b/lib/internal/Magento/Framework/Crontab/CrontabManager.php
@@ -114,7 +114,7 @@ class CrontabManager implements CrontabManagerInterface
     private function generateSection($content, $tasks = [])
     {
         if ($tasks) {
-            $content .= self::TASKS_BLOCK_START . PHP_EOL;
+            $content .= PHP_EOL . self::TASKS_BLOCK_START . PHP_EOL;
             foreach ($tasks as $task) {
                 $content .=  $task['expression'] . ' ' . PHP_BINARY . ' '. $task['command'] . PHP_EOL;
             }
-- 
GitLab


From 137117a9d9114d8d79e0cae4db7c80c11a148667 Mon Sep 17 00:00:00 2001
From: Pavel Bystritsky <p.bystritsky@yandex.ru>
Date: Mon, 11 Dec 2017 10:19:37 +0200
Subject: [PATCH 321/380] magento/magento2#12259: Save and Duplicated product
 not working

---
 app/code/Magento/Catalog/Model/Product/Copier.php              | 3 +++
 .../testsuite/Magento/Catalog/Model/Product/CopierTest.php     | 1 -
 2 files changed, 3 insertions(+), 1 deletion(-)

diff --git a/app/code/Magento/Catalog/Model/Product/Copier.php b/app/code/Magento/Catalog/Model/Product/Copier.php
index 906280257d4..70f8b988332 100644
--- a/app/code/Magento/Catalog/Model/Product/Copier.php
+++ b/app/code/Magento/Catalog/Model/Product/Copier.php
@@ -9,6 +9,9 @@ namespace Magento\Catalog\Model\Product;
 
 use Magento\Catalog\Api\Data\ProductInterface;
 
+/**
+ * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
+ */
 class Copier
 {
     /**
diff --git a/dev/tests/integration/testsuite/Magento/Catalog/Model/Product/CopierTest.php b/dev/tests/integration/testsuite/Magento/Catalog/Model/Product/CopierTest.php
index 8c91f5689f6..ec9c2752b18 100644
--- a/dev/tests/integration/testsuite/Magento/Catalog/Model/Product/CopierTest.php
+++ b/dev/tests/integration/testsuite/Magento/Catalog/Model/Product/CopierTest.php
@@ -6,7 +6,6 @@
 
 namespace Magento\Catalog\Model\Product;
 
-
 use Magento\Catalog\Model\ProductRepository;
 
 class CopierTest extends \PHPUnit\Framework\TestCase
-- 
GitLab


From 74dbd7d3b2146e1dacd1f0c9b49708ff2420c58f Mon Sep 17 00:00:00 2001
From: nmalevanec <mikola.malevanec@transoftgroup.com>
Date: Mon, 11 Dec 2017 10:26:31 +0200
Subject: [PATCH 322/380] 12613: Verbiage Update Required: Product Image
 Watermark size Validation Message.

---
 app/code/Magento/Catalog/i18n/en_US.csv                         | 2 +-
 .../Catalog/view/adminhtml/web/component/image-size-field.js    | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/app/code/Magento/Catalog/i18n/en_US.csv b/app/code/Magento/Catalog/i18n/en_US.csv
index de9f5e19758..a316bac5d35 100644
--- a/app/code/Magento/Catalog/i18n/en_US.csv
+++ b/app/code/Magento/Catalog/i18n/en_US.csv
@@ -615,7 +615,7 @@ Submit,Submit
 "We don't recognize or support this file extension type.","We don't recognize or support this file extension type."
 "Configure Product","Configure Product"
 OK,OK
-"This value does not follow the specified format (for example, 200X300).","This value does not follow the specified format (for example, 200X300)."
+"This value does not follow the specified format (for example, 200x300).","This value does not follow the specified format (for example, 200x300)."
 "Select type of option.","Select type of option."
 "Please add rows to option.","Please add rows to option."
 "Please select items.","Please select items."
diff --git a/app/code/Magento/Catalog/view/adminhtml/web/component/image-size-field.js b/app/code/Magento/Catalog/view/adminhtml/web/component/image-size-field.js
index 3ebd4bdf9c8..11a1a65cbab 100644
--- a/app/code/Magento/Catalog/view/adminhtml/web/component/image-size-field.js
+++ b/app/code/Magento/Catalog/view/adminhtml/web/component/image-size-field.js
@@ -26,7 +26,7 @@ define([
 
             return !!(m &&  m[1] > 0 && m[2] > 0);
         },
-        $.mage.__('This value does not follow the specified format (for example, 200X300).')
+        $.mage.__('This value does not follow the specified format (for example, 200x300).')
     );
 
     return Abstract.extend({
-- 
GitLab


From f7289237a8a2c352c5d732125a1b5e8a2f7b2bcf Mon Sep 17 00:00:00 2001
From: RomanKis <romaikiss@gmail.com>
Date: Mon, 11 Dec 2017 10:33:30 +0200
Subject: [PATCH 323/380] 8410: Custom Checkout Step and Shipping Step are
 Highlighted

---
 app/code/Magento/Checkout/view/frontend/web/js/view/payment.js | 1 +
 1 file changed, 1 insertion(+)

diff --git a/app/code/Magento/Checkout/view/frontend/web/js/view/payment.js b/app/code/Magento/Checkout/view/frontend/web/js/view/payment.js
index 3753091f0db..309395d4475 100644
--- a/app/code/Magento/Checkout/view/frontend/web/js/view/payment.js
+++ b/app/code/Magento/Checkout/view/frontend/web/js/view/payment.js
@@ -47,6 +47,7 @@ define([
         /** @inheritdoc */
         initialize: function () {
             var self = this;
+
             this._super();
             checkoutDataResolver.resolvePaymentMethod();
 
-- 
GitLab


From 98e7951b5a55e5f1fe2e8a3f63c4386623000c6c Mon Sep 17 00:00:00 2001
From: Oleksandr Miroshnichenko <omiroshnichenko@magento.com>
Date: Mon, 11 Dec 2017 11:17:43 +0200
Subject: [PATCH 324/380] 8410: Custom Checkout Step and Shipping Step are
 Highlighted

---
 .../view/frontend/web/js/model/step-navigator.js   | 14 ++++++++++++--
 .../Checkout/view/frontend/web/js/view/payment.js  | 14 --------------
 .../Checkout/view/frontend/web/js/view/shipping.js | 11 -----------
 .../Checkout/frontend/js/view/shipping.test.js     |  2 +-
 4 files changed, 13 insertions(+), 28 deletions(-)

diff --git a/app/code/Magento/Checkout/view/frontend/web/js/model/step-navigator.js b/app/code/Magento/Checkout/view/frontend/web/js/model/step-navigator.js
index bfcd0d02585..2341748bc4e 100644
--- a/app/code/Magento/Checkout/view/frontend/web/js/model/step-navigator.js
+++ b/app/code/Magento/Checkout/view/frontend/web/js/model/step-navigator.js
@@ -66,7 +66,7 @@ define([
          * @param {*} sortOrder
          */
         registerStep: function (code, alias, title, isVisible, navigate, sortOrder) {
-            var hash;
+            var hash, active;
 
             if ($.inArray(code, this.validCodes) !== -1) {
                 throw new DOMException('Step code [' + code + '] already registered in step navigator');
@@ -87,6 +87,12 @@ define([
                 navigate: navigate,
                 sortOrder: sortOrder
             });
+            active = this.getActiveItemIndex();
+            steps.each(function (elem, index) {
+                if (active !== index) {
+                    elem.isVisible(false);
+                }
+            });
             this.stepCodes.push(code);
             hash = window.location.hash.replace('#', '');
 
@@ -111,10 +117,14 @@ define([
         getActiveItemIndex: function () {
             var activeIndex = 0;
 
-            steps.sort(this.sortItems).forEach(function (element, index) {
+            steps.sort(this.sortItems).some(function (element, index) {
                 if (element.isVisible()) {
                     activeIndex = index;
+
+                    return true;
                 }
+
+                return false;
             });
 
             return activeIndex;
diff --git a/app/code/Magento/Checkout/view/frontend/web/js/view/payment.js b/app/code/Magento/Checkout/view/frontend/web/js/view/payment.js
index 309395d4475..c17e5e40d5c 100644
--- a/app/code/Magento/Checkout/view/frontend/web/js/view/payment.js
+++ b/app/code/Magento/Checkout/view/frontend/web/js/view/payment.js
@@ -46,22 +46,8 @@ define([
 
         /** @inheritdoc */
         initialize: function () {
-            var self = this;
-
             this._super();
             checkoutDataResolver.resolvePaymentMethod();
-
-            //If some step is active this step will become inactive.
-            if (stepNavigator.steps()) {
-                stepNavigator.steps().some(function (element) {
-                    if (element.isVisible()) {
-                        self.isVisible(false);
-
-                        return true;
-                    }
-                });
-            }
-
             stepNavigator.registerStep(
                 'payment',
                 null,
diff --git a/app/code/Magento/Checkout/view/frontend/web/js/view/shipping.js b/app/code/Magento/Checkout/view/frontend/web/js/view/shipping.js
index 52078488af4..619de95e467 100644
--- a/app/code/Magento/Checkout/view/frontend/web/js/view/shipping.js
+++ b/app/code/Magento/Checkout/view/frontend/web/js/view/shipping.js
@@ -82,17 +82,6 @@ define([
             this._super();
 
             if (!quote.isVirtual()) {
-                //If some step is active this step will become inactive.
-                if (stepNavigator.steps()) {
-                    stepNavigator.steps().some(function (element) {
-                        if (element.isVisible()) {
-                            self.visible(false);
-
-                            return true;
-                        }
-                    });
-                }
-
                 stepNavigator.registerStep(
                     'shipping',
                     '',
diff --git a/dev/tests/js/jasmine/tests/app/code/Magento/Checkout/frontend/js/view/shipping.test.js b/dev/tests/js/jasmine/tests/app/code/Magento/Checkout/frontend/js/view/shipping.test.js
index b25c36de28a..be27e16a137 100644
--- a/dev/tests/js/jasmine/tests/app/code/Magento/Checkout/frontend/js/view/shipping.test.js
+++ b/dev/tests/js/jasmine/tests/app/code/Magento/Checkout/frontend/js/view/shipping.test.js
@@ -42,7 +42,7 @@ define(['squire', 'ko', 'jquery', 'jquery/validate'], function (Squire, ko, $) {
             'Magento_Checkout/js/action/select-shipping-method': jasmine.createSpy(),
             'Magento_Checkout/js/model/shipping-rate-registry': jasmine.createSpy(),
             'Magento_Checkout/js/action/set-shipping-information': jasmine.createSpy(),
-            'Magento_Checkout/js/model/step-navigator': jasmine.createSpyObj('navigator', ['registerStep', 'steps']),
+            'Magento_Checkout/js/model/step-navigator': jasmine.createSpyObj('navigator', ['registerStep']),
             'Magento_Ui/js/modal/modal': jasmine.createSpy('modal').and.returnValue(modalStub),
             'Magento_Checkout/js/model/checkout-data-resolver': jasmine.createSpyObj(
                 'dataResolver',
-- 
GitLab


From 28cd0926589bf493c906fe340419ec33af5375d4 Mon Sep 17 00:00:00 2001
From: Pavel Bystritsky <p.bystritsky@yandex.ru>
Date: Mon, 11 Dec 2017 11:28:42 +0200
Subject: [PATCH 325/380] magento/magento2#12582: Can't remove item description
 from wishlist

---
 .../Wishlist/Controller/UpdateTest.php        | 45 +++++++++++--------
 1 file changed, 27 insertions(+), 18 deletions(-)

diff --git a/dev/tests/integration/testsuite/Magento/Wishlist/Controller/UpdateTest.php b/dev/tests/integration/testsuite/Magento/Wishlist/Controller/UpdateTest.php
index 4af27d705f5..48f738763b6 100644
--- a/dev/tests/integration/testsuite/Magento/Wishlist/Controller/UpdateTest.php
+++ b/dev/tests/integration/testsuite/Magento/Wishlist/Controller/UpdateTest.php
@@ -6,11 +6,14 @@
 
 namespace Magento\Wishlist\Controller;
 
+use Magento\Customer\Api\AccountManagementInterface;
 use Magento\Customer\Helper\View;
+use Magento\Customer\Model\Customer;
 use Magento\Customer\Model\Session;
 use Magento\Framework\Data\Form\FormKey;
 use Magento\Framework\Message\ManagerInterface;
 use Magento\Wishlist\Model\Item;
+use Magento\Wishlist\Model\Wishlist;
 use Psr\Log\LoggerInterface;
 use Zend\Http\Request;
 
@@ -18,7 +21,7 @@ use Zend\Http\Request;
  * Tests updating wishlist item comment.
  *
  * @magentoAppIsolation enabled
- * @magentoDbIsolation disabled
+ * @magentoDbIsolation enabled
  * @magentoAppArea frontend
  */
 class UpdateTest extends \Magento\TestFramework\TestCase\AbstractController
@@ -50,14 +53,22 @@ class UpdateTest extends \Magento\TestFramework\TestCase\AbstractController
      *
      * @magentoDataFixture Magento/Wishlist/_files/wishlist.php
      * @dataProvider commentDataProvider
+     * @param string|null $postDescription
+     * @param string $expectedResult
+     * @param boolean $presetComment
      */
-    public function testUpdateComment($postDescription, $postQty, $expectedResult, $presetComment)
+    public function testUpdateComment($postDescription, $expectedResult, $presetComment)
     {
-        $itemId = 1;
-        $wishlistId = 1;
+        /** @var Customer $customer */
+        $customer = $this->customerSession->getCustomer();
+        /** @var Wishlist $wishlist */
+        $wishlist = $this->_objectManager
+            ->get(Wishlist::class)
+            ->loadByCustomerId($customer->getId(), true);
+        /** @var Item $item */
+        $item = $wishlist->getItemCollection()->getFirstItem();
 
         if ($presetComment) {
-            $item = $this->_objectManager->create(Item::class)->load($itemId);
             $item->setDescription($this->description);
             $item->save();
         }
@@ -65,16 +76,16 @@ class UpdateTest extends \Magento\TestFramework\TestCase\AbstractController
         $formKey = $this->_objectManager->get(FormKey::class);
         $this->getRequest()->setPostValue(
             [
-                'description' => $postDescription,
-                'qty' => $postQty,
+                'description' => isset($postDescription) ? [$item->getId() => $postDescription] : [],
+                'qty' => isset($postDescription) ? [$item->getId() => 1] : [],
                 'do' => '',
                 'form_key' => $formKey->getFormKey()
             ]
         )->setMethod(Request::METHOD_POST);
-        $this->dispatch('wishlist/index/update/wishlist_id/' . $wishlistId);
-
-        $item = $this->_objectManager->create(Item::class)->load($itemId);
+        $this->dispatch('wishlist/index/update/wishlist_id/' . $wishlist->getId());
 
+        // Reload item
+        $item = $this->_objectManager->get(Item::class)->load($item->getId());
         self::assertEquals(
             $expectedResult,
             $item->getDescription()
@@ -88,22 +99,20 @@ class UpdateTest extends \Magento\TestFramework\TestCase\AbstractController
      */
     public function commentDataProvider()
     {
+
         return [
             'test adding comment' => [
-                'postDescription' => [1 => $this->description],
-                'postQty' => [1 => '1'],
+                'postDescription' => $this->description,
                 'expectedResult' => $this->description,
                 'presetComment' => false
             ],
             'test removing comment' => [
-                'postDescription' => [1 => ''],
-                'postQty' => [1 => '1'],
+                'postDescription' => '',
                 'expectedResult' => '',
                 'presetComment' => true
             ],
             'test not changing comment' => [
-                'postDescription' => [],
-                'postQty' => [1 => '1'],
+                'postDescription' => null,
                 'expectedResult' => $this->description,
                 'presetComment' => true
             ],
@@ -118,9 +127,9 @@ class UpdateTest extends \Magento\TestFramework\TestCase\AbstractController
             Session::class,
             [$logger]
         );
-        /** @var \Magento\Customer\Api\AccountManagementInterface $service */
+        /** @var AccountManagementInterface $service */
         $service = $this->_objectManager->create(
-            \Magento\Customer\Api\AccountManagementInterface::class
+            AccountManagementInterface::class
         );
         $customer = $service->authenticate('customer@example.com', 'password');
         $this->customerSession->setCustomerDataAsLoggedIn($customer);
-- 
GitLab


From 8bde63347f87cde07962ad1ffd59320513697897 Mon Sep 17 00:00:00 2001
From: nmalevanec <mikola.malevanec@transoftgroup.com>
Date: Mon, 11 Dec 2017 13:09:56 +0200
Subject: [PATCH 326/380] 8176: LinkManagement::getChildren() does not include
 product visibility.

---
 .../Model/Product/Type/Configurable.php            | 14 ++++++++++++--
 .../Unit/Model/Product/Type/ConfigurableTest.php   |  5 -----
 .../ConfigurableProduct/Api/LinkManagementTest.php |  3 +++
 3 files changed, 15 insertions(+), 7 deletions(-)

diff --git a/app/code/Magento/ConfigurableProduct/Model/Product/Type/Configurable.php b/app/code/Magento/ConfigurableProduct/Model/Product/Type/Configurable.php
index e6345af40f3..fbaa4e60c29 100644
--- a/app/code/Magento/ConfigurableProduct/Model/Product/Type/Configurable.php
+++ b/app/code/Magento/ConfigurableProduct/Model/Product/Type/Configurable.php
@@ -3,6 +3,7 @@
  * Copyright © Magento, Inc. All rights reserved.
  * See COPYING.txt for license details.
  */
+
 namespace Magento\ConfigurableProduct\Model\Product\Type;
 
 use Magento\Catalog\Api\Data\ProductAttributeInterface;
@@ -682,7 +683,7 @@ class Configurable extends \Magento\Catalog\Model\Product\Type\AbstractType
                 ->setProductId($product->getData($metadata->getLinkField()))
                 ->save();
         }
-        /** @var $configurableAttributesCollection \Magento\ConfigurableProduct\Model\ResourceModel\Product\Type\Configurable\Attribute\Collection  */
+        /** @var $configurableAttributesCollection \Magento\ConfigurableProduct\Model\ResourceModel\Product\Type\Configurable\Attribute\Collection */
         $configurableAttributesCollection = $this->_attributeCollectionFactory->create();
         $configurableAttributesCollection->setProductFilter($product);
         $configurableAttributesCollection->addFieldToFilter(
@@ -1397,7 +1398,16 @@ class Configurable extends \Magento\Catalog\Model\Product\Type\AbstractType
             ->addFilterByRequiredOptions()
             ->setStoreId($product->getStoreId());
 
-        $requiredAttributes = ['name', 'price', 'weight', 'image', 'thumbnail', 'status', 'media_gallery'];
+        $requiredAttributes = [
+            'name',
+            'price',
+            'weight',
+            'image',
+            'thumbnail',
+            'status',
+            'visibility',
+            'media_gallery'
+        ];
         foreach ($requiredAttributes as $attributeCode) {
             $collection->addAttributeToSelect($attributeCode);
         }
diff --git a/app/code/Magento/ConfigurableProduct/Test/Unit/Model/Product/Type/ConfigurableTest.php b/app/code/Magento/ConfigurableProduct/Test/Unit/Model/Product/Type/ConfigurableTest.php
index 6ffdede34d0..ea136dd037b 100644
--- a/app/code/Magento/ConfigurableProduct/Test/Unit/Model/Product/Type/ConfigurableTest.php
+++ b/app/code/Magento/ConfigurableProduct/Test/Unit/Model/Product/Type/ConfigurableTest.php
@@ -197,11 +197,6 @@ class ConfigurableTest extends \PHPUnit\Framework\TestCase
             ->disableOriginalConstructor()
             ->getMock();
 
-        $this->productFactory = $this->getMockBuilder(\Magento\Catalog\Api\Data\ProductInterfaceFactory::class)
-            ->setMethods(['create'])
-            ->disableOriginalConstructor()
-            ->getMock();
-
         $this->salableProcessor = $this->createMock(SalableProcessor::class);
 
         $this->model = $this->objectHelper->getObject(
diff --git a/dev/tests/api-functional/testsuite/Magento/ConfigurableProduct/Api/LinkManagementTest.php b/dev/tests/api-functional/testsuite/Magento/ConfigurableProduct/Api/LinkManagementTest.php
index d899839d43d..df4138db30c 100644
--- a/dev/tests/api-functional/testsuite/Magento/ConfigurableProduct/Api/LinkManagementTest.php
+++ b/dev/tests/api-functional/testsuite/Magento/ConfigurableProduct/Api/LinkManagementTest.php
@@ -57,6 +57,9 @@ class LinkManagementTest extends \Magento\TestFramework\TestCase\WebapiAbstract
 
             $this->assertArrayHasKey('status', $product);
             $this->assertEquals('1', $product['status']);
+
+            $this->assertArrayHasKey('visibility', $product);
+            $this->assertEquals('1', $product['visibility']);
         }
     }
 
-- 
GitLab


From cc27eabd71911046da62eaea3475a7d1a003cf65 Mon Sep 17 00:00:00 2001
From: Pavel Bystritsky <p.bystritsky@yandex.ru>
Date: Mon, 11 Dec 2017 14:31:55 +0200
Subject: [PATCH 327/380] magento/magento2#12259: Save and Duplicated product
 not working

---
 .../Catalog/Model/Product/CopierTest.php      | 23 +++++++++++++++++++
 .../_files/product_simple_rollback.php        | 22 ++++++++++--------
 2 files changed, 35 insertions(+), 10 deletions(-)

diff --git a/dev/tests/integration/testsuite/Magento/Catalog/Model/Product/CopierTest.php b/dev/tests/integration/testsuite/Magento/Catalog/Model/Product/CopierTest.php
index ec9c2752b18..d3e45c6e1d5 100644
--- a/dev/tests/integration/testsuite/Magento/Catalog/Model/Product/CopierTest.php
+++ b/dev/tests/integration/testsuite/Magento/Catalog/Model/Product/CopierTest.php
@@ -58,10 +58,33 @@ class CopierTest extends \PHPUnit\Framework\TestCase
         );
     }
 
+    /**
+     * @inheritdoc
+     */
     protected function setUp()
     {
+        parent::setUp();
         $this->objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
         $this->copier = $this->objectManager->get(Copier::class);
         $this->productRepository = $this->objectManager->get(ProductRepository::class);
     }
+
+    /**
+     * @inheritdoc
+     */
+    protected function tearDown()
+    {
+        $skus = [
+            'simple-1',
+            'simple-2'
+        ];
+        foreach ($skus as $sku) {
+            try {
+                $product = $this->productRepository->get($sku, false, null, true);
+                $this->productRepository->delete($product);
+            } catch (NoSuchEntityException $e) {
+            }
+        }
+        parent::tearDown();
+    }
 }
diff --git a/dev/tests/integration/testsuite/Magento/Catalog/_files/product_simple_rollback.php b/dev/tests/integration/testsuite/Magento/Catalog/_files/product_simple_rollback.php
index bdefb1470ec..28d229d06b2 100644
--- a/dev/tests/integration/testsuite/Magento/Catalog/_files/product_simple_rollback.php
+++ b/dev/tests/integration/testsuite/Magento/Catalog/_files/product_simple_rollback.php
@@ -3,21 +3,23 @@
  * Copyright © Magento, Inc. All rights reserved.
  * See COPYING.txt for license details.
  */
+use Magento\Framework\Exception\NoSuchEntityException;
 
-use Magento\Catalog\Model\Product;
-use Magento\Catalog\Model\ResourceModel\Product\Collection;
-use Magento\Framework\Registry;
-use Magento\TestFramework\Helper\Bootstrap;
+\Magento\TestFramework\Helper\Bootstrap::getInstance()->getInstance()->reinitialize();
 
-/** @var Registry $registry */
-$registry = Bootstrap::getObjectManager()->get(Registry::class);
+/** @var \Magento\Framework\Registry $registry */
+$registry = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->get(\Magento\Framework\Registry::class);
 
 $registry->unregister('isSecureArea');
 $registry->register('isSecureArea', true);
 
-/** @var Collection $productCollection */
-$productCollection = Bootstrap::getObjectManager()->get(Product::class)->getCollection();
-$productCollection->delete();
-
+/** @var \Magento\Catalog\Api\ProductRepositoryInterface $productRepository */
+$productRepository = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()
+    ->get(\Magento\Catalog\Api\ProductRepositoryInterface::class);
+try {
+    $product = $productRepository->get('simple', false, null, true);
+    $productRepository->delete($product);
+} catch (NoSuchEntityException $e) {
+}
 $registry->unregister('isSecureArea');
 $registry->register('isSecureArea', false);
-- 
GitLab


From 34b64380a1d2eb35d1155ea94dd117518d1d040e Mon Sep 17 00:00:00 2001
From: Oleksandr Miroshnichenko <omiroshnichenko@magento.com>
Date: Mon, 11 Dec 2017 14:43:15 +0200
Subject: [PATCH 328/380] 12468: Sort by Price not working on CatalogSearch
 Page in Magento 2

---
 .../Magento/Catalog/Block/Product/ProductList/Toolbar.php   | 2 +-
 .../Catalog/view/frontend/web/js/product/list/toolbar.js    | 6 +++---
 2 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/app/code/Magento/Catalog/Block/Product/ProductList/Toolbar.php b/app/code/Magento/Catalog/Block/Product/ProductList/Toolbar.php
index df98969c262..dfbaf3a6242 100644
--- a/app/code/Magento/Catalog/Block/Product/ProductList/Toolbar.php
+++ b/app/code/Magento/Catalog/Block/Product/ProductList/Toolbar.php
@@ -689,7 +689,7 @@ class Toolbar extends \Magento\Framework\View\Element\Template
             'limit' => ToolbarModel::LIMIT_PARAM_NAME,
             'modeDefault' => $defaultMode,
             'directionDefault' => $this->_direction ?: ProductList::DEFAULT_SORT_DIRECTION,
-            'orderDefault' => $this->_productListHelper->getDefaultSortField(),
+            'orderDefault' => $this->getOrderField(),
             'limitDefault' => $this->_productListHelper->getDefaultLimitPerPageValue($defaultMode),
             'url' => $this->getPagerUrl(),
         ];
diff --git a/app/code/Magento/Catalog/view/frontend/web/js/product/list/toolbar.js b/app/code/Magento/Catalog/view/frontend/web/js/product/list/toolbar.js
index 259ca979206..88be03a04e7 100644
--- a/app/code/Magento/Catalog/view/frontend/web/js/product/list/toolbar.js
+++ b/app/code/Magento/Catalog/view/frontend/web/js/product/list/toolbar.js
@@ -78,7 +78,6 @@ define([
             );
         },
 
-        /*eslint-disable no-unused-vars*/
         /**
          * @param {String} paramName
          * @param {*} paramValue
@@ -100,13 +99,14 @@ define([
             }
             paramData[paramName] = paramValue;
 
+            if (paramValue == defaultValue) { //eslint-disable-line eqeqeq
+                delete paramData[paramName];
+            }
             paramData = $.param(paramData);
 
             location.href = baseUrl + (paramData.length ? '?' + paramData : '');
         }
     });
 
-    /*eslint-enable no-unused-vars*/
-
     return $.mage.productListToolbarForm;
 });
-- 
GitLab


From 1e26ee8d22df859fbc264174be7e36c770af6f6a Mon Sep 17 00:00:00 2001
From: nmalevanec <mikola.malevanec@transoftgroup.com>
Date: Mon, 11 Dec 2017 14:45:02 +0200
Subject: [PATCH 329/380] 8011: Strip Tags from attribute.

---
 .../Magento/Rule/Model/Condition/Product/AbstractProduct.php    | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/app/code/Magento/Rule/Model/Condition/Product/AbstractProduct.php b/app/code/Magento/Rule/Model/Condition/Product/AbstractProduct.php
index 370d00d6c30..9a6f1b48620 100644
--- a/app/code/Magento/Rule/Model/Condition/Product/AbstractProduct.php
+++ b/app/code/Magento/Rule/Model/Condition/Product/AbstractProduct.php
@@ -743,7 +743,7 @@ abstract class AbstractProduct extends \Magento\Rule\Model\Condition\AbstractCon
      * @param array $selectOptions
      * @return array
      */
-    private function removeTagsFromLabel($selectOptions)
+    private function removeTagsFromLabel(array $selectOptions)
     {
         foreach ($selectOptions as &$option) {
             if (isset($option['label'])) {
-- 
GitLab


From 2ee232640aff5b4dba4868122ed2f93628909aae Mon Sep 17 00:00:00 2001
From: RomanKis <romaikiss@gmail.com>
Date: Mon, 11 Dec 2017 15:37:02 +0200
Subject: [PATCH 330/380] 8507: There is invalid type in PHPDoc block of
 \Magento\Framework\Data\Tree::getNodeById()

---
 lib/internal/Magento/Framework/Data/Tree.php | 14 +++++---------
 1 file changed, 5 insertions(+), 9 deletions(-)

diff --git a/lib/internal/Magento/Framework/Data/Tree.php b/lib/internal/Magento/Framework/Data/Tree.php
index b348bc8fdc9..a61c16bbc5d 100644
--- a/lib/internal/Magento/Framework/Data/Tree.php
+++ b/lib/internal/Magento/Framework/Data/Tree.php
@@ -23,17 +23,13 @@ class Tree
      */
     protected $_nodes;
 
-    /**
-     * Enter description here...
-     *
-     */
     public function __construct()
     {
         $this->_nodes = new NodeCollection($this);
     }
 
     /**
-     * Enter description here...
+     * Get Tree.
      *
      * @return \Magento\Framework\Data\Tree
      */
@@ -43,7 +39,7 @@ class Tree
     }
 
     /**
-     * Enter description here...
+     * Load Tree.
      *
      * @param Node $parentNode
      * @return void
@@ -54,7 +50,7 @@ class Tree
     }
 
     /**
-     * Enter description here...
+     * Load Node by Node id.
      *
      * @param int|string $nodeId
      * @return void
@@ -177,7 +173,7 @@ class Tree
     }
 
     /**
-     * Enter description here...
+     * Get Nodes.
      *
      * @return NodeCollection
      */
@@ -187,7 +183,7 @@ class Tree
     }
 
     /**
-     * Enter description here...
+     * Get Node by id.
      *
      * @param string|int $nodeId
      * @return Node
-- 
GitLab


From 6e3ebfbd04ae24ebcd0a08ff316182e575513c83 Mon Sep 17 00:00:00 2001
From: nmalevanec <mikola.malevanec@transoftgroup.com>
Date: Mon, 11 Dec 2017 15:47:08 +0200
Subject: [PATCH 331/380] 10797: catalogProductTierPriceManagementV1 DELETE and
 POST operation wipes out media gallery selections when used on store code
 "all".

---
 app/code/Magento/Catalog/Model/ProductRepository.php | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/app/code/Magento/Catalog/Model/ProductRepository.php b/app/code/Magento/Catalog/Model/ProductRepository.php
index cdab94b57b4..90b18031c14 100644
--- a/app/code/Magento/Catalog/Model/ProductRepository.php
+++ b/app/code/Magento/Catalog/Model/ProductRepository.php
@@ -507,7 +507,7 @@ class ProductRepository implements \Magento\Catalog\Api\ProductRepositoryInterfa
             foreach ($existingMediaGallery as $key => &$existingEntry) {
                 if (isset($entriesById[$existingEntry['value_id']])) {
                     $updatedEntry = $entriesById[$existingEntry['value_id']];
-                    if (isset($updatedEntry['file']) && $updatedEntry['file'] === null) {
+                    if (array_key_exists('file', $updatedEntry) && $updatedEntry['file'] === null) {
                         unset($updatedEntry['file']);
                     }
                     $existingMediaGallery[$key] = array_merge($existingEntry, $updatedEntry);
-- 
GitLab


From 491ed56238c618d84fe2b6a6a5007ead43a64883 Mon Sep 17 00:00:00 2001
From: Stanislav Idolov <sidolov@magento.com>
Date: Mon, 11 Dec 2017 16:00:53 +0200
Subject: [PATCH 332/380] magento/magento2#12610

---
 .../Magento/Framework/Crontab/CrontabManager.php      |  7 ++++++-
 .../Crontab/Test/Unit/CrontabManagerTest.php          | 11 +++++++++++
 2 files changed, 17 insertions(+), 1 deletion(-)

diff --git a/lib/internal/Magento/Framework/Crontab/CrontabManager.php b/lib/internal/Magento/Framework/Crontab/CrontabManager.php
index b06e12a7736..5a4cdac4321 100644
--- a/lib/internal/Magento/Framework/Crontab/CrontabManager.php
+++ b/lib/internal/Magento/Framework/Crontab/CrontabManager.php
@@ -114,7 +114,12 @@ class CrontabManager implements CrontabManagerInterface
     private function generateSection($content, $tasks = [])
     {
         if ($tasks) {
-            $content .= PHP_EOL . self::TASKS_BLOCK_START . PHP_EOL;
+            // Add EOL symbol to previous line if not exist.
+            if (substr($content, -strlen(PHP_EOL)) !== PHP_EOL) {
+                $content .= PHP_EOL;
+            }
+
+            $content .= self::TASKS_BLOCK_START . PHP_EOL;
             foreach ($tasks as $task) {
                 $content .=  $task['expression'] . ' ' . PHP_BINARY . ' '. $task['command'] . PHP_EOL;
             }
diff --git a/lib/internal/Magento/Framework/Crontab/Test/Unit/CrontabManagerTest.php b/lib/internal/Magento/Framework/Crontab/Test/Unit/CrontabManagerTest.php
index e4088b1e4be..71a4c6a6999 100644
--- a/lib/internal/Magento/Framework/Crontab/Test/Unit/CrontabManagerTest.php
+++ b/lib/internal/Magento/Framework/Crontab/Test/Unit/CrontabManagerTest.php
@@ -339,6 +339,17 @@ class CrontabManagerTest extends \PHPUnit\Framework\TestCase
                     . ' %% cron:run | grep -v \"Ran \'jobs\' by schedule\"' . PHP_EOL
                     . CrontabManagerInterface::TASKS_BLOCK_END . PHP_EOL,
             ],
+            [
+                'tasks' => [
+                    ['command' => '{magentoRoot}run.php % cron:run | grep -v "Ran \'jobs\' by schedule"']
+                ],
+                'content' => '* * * * * /bin/php /var/www/cron.php',
+                'contentToSave' => '* * * * * /bin/php /var/www/cron.php' . PHP_EOL
+                    . CrontabManagerInterface::TASKS_BLOCK_START . PHP_EOL
+                    . '* * * * * ' . PHP_BINARY . ' /var/www/magento2/run.php'
+                    . ' %% cron:run | grep -v \"Ran \'jobs\' by schedule\"' . PHP_EOL
+                    . CrontabManagerInterface::TASKS_BLOCK_END . PHP_EOL,
+                ],
         ];
     }
 }
-- 
GitLab


From 5bc45d98ef678b1e5b7e048debfb53199f75ffe7 Mon Sep 17 00:00:00 2001
From: Stanislav Idolov <sidolov@magento.com>
Date: Mon, 11 Dec 2017 16:38:34 +0200
Subject: [PATCH 333/380] magento/magento2#12610

---
 .../Framework/Crontab/Test/Unit/CrontabManagerTest.php        | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/lib/internal/Magento/Framework/Crontab/Test/Unit/CrontabManagerTest.php b/lib/internal/Magento/Framework/Crontab/Test/Unit/CrontabManagerTest.php
index ca74077be04..3c52b5d33a5 100644
--- a/lib/internal/Magento/Framework/Crontab/Test/Unit/CrontabManagerTest.php
+++ b/lib/internal/Magento/Framework/Crontab/Test/Unit/CrontabManagerTest.php
@@ -343,10 +343,10 @@ class CrontabManagerTest extends \PHPUnit\Framework\TestCase
                 ],
                 'content' => '* * * * * /bin/php /var/www/cron.php',
                 'contentToSave' => '* * * * * /bin/php /var/www/cron.php' . PHP_EOL
-                    . CrontabManagerInterface::TASKS_BLOCK_START . PHP_EOL
+                    . CrontabManagerInterface::TASKS_BLOCK_START . ' ' . md5(BP) . PHP_EOL
                     . '* * * * * ' . PHP_BINARY . ' /var/www/magento2/run.php'
                     . ' %% cron:run | grep -v \"Ran \'jobs\' by schedule\"' . PHP_EOL
-                    . CrontabManagerInterface::TASKS_BLOCK_END . PHP_EOL,
+                    . CrontabManagerInterface::TASKS_BLOCK_END . ' ' . md5(BP) . PHP_EOL,
                 ],
         ];
     }
-- 
GitLab


From 9650aa432072c764cb0259c8b2372abd2582f784 Mon Sep 17 00:00:00 2001
From: RomanKis <romaikiss@gmail.com>
Date: Mon, 11 Dec 2017 16:40:24 +0200
Subject: [PATCH 334/380] 12526: Currency change, Bank Transfer but checkout
 page shows "Your credit card will be charged for"

---
 app/code/Magento/Tax/i18n/en_US.csv                            | 3 ++-
 .../Magento/Tax/view/frontend/layout/checkout_index_index.xml  | 2 +-
 2 files changed, 3 insertions(+), 2 deletions(-)

diff --git a/app/code/Magento/Tax/i18n/en_US.csv b/app/code/Magento/Tax/i18n/en_US.csv
index 2314f27b929..e6d89deb769 100644
--- a/app/code/Magento/Tax/i18n/en_US.csv
+++ b/app/code/Magento/Tax/i18n/en_US.csv
@@ -176,4 +176,5 @@ Rate,Rate
 "Order Total Incl. Tax","Order Total Incl. Tax"
 "Order Total","Order Total"
 "Your credit card will be charged for","Your credit card will be charged for"
-"An error occurred while loading tax rates.","An error occurred while loading tax rates."
\ No newline at end of file
+"An error occurred while loading tax rates.","An error occurred while loading tax rates."
+"You will be charged for","You will be charged for"
diff --git a/app/code/Magento/Tax/view/frontend/layout/checkout_index_index.xml b/app/code/Magento/Tax/view/frontend/layout/checkout_index_index.xml
index 6d867fcb71f..6969580b78b 100644
--- a/app/code/Magento/Tax/view/frontend/layout/checkout_index_index.xml
+++ b/app/code/Magento/Tax/view/frontend/layout/checkout_index_index.xml
@@ -70,7 +70,7 @@
                                                             <item name="config" xsi:type="array">
                                                                 <item name="exclTaxLabel" xsi:type="string" translate="true">Order Total Excl. Tax</item>
                                                                 <item name="inclTaxLabel" xsi:type="string" translate="true">Order Total Incl. Tax</item>
-                                                                <item name="basicCurrencyMessage" xsi:type="string" translate="true">Your credit card will be charged for</item>
+                                                                <item name="basicCurrencyMessage" xsi:type="string" translate="true">You will be charged for</item>
                                                                 <item name="title" xsi:type="string" translate="true">Order Total</item>
                                                             </item>
                                                         </item>
-- 
GitLab


From 1ef70f0a2b78f0b87dd078af4e961f48cda886e7 Mon Sep 17 00:00:00 2001
From: RomanKis <romaikiss@gmail.com>
Date: Fri, 24 Nov 2017 15:06:50 +0200
Subject: [PATCH 335/380] 8862: Can't emptying values by magento 2 api

---
 .../Webapi/ServiceInputProcessor.php          | 31 +++++++++++----
 .../Test/Unit/ServiceInputProcessorTest.php   | 38 +++++++++++++++++++
 2 files changed, 62 insertions(+), 7 deletions(-)

diff --git a/lib/internal/Magento/Framework/Webapi/ServiceInputProcessor.php b/lib/internal/Magento/Framework/Webapi/ServiceInputProcessor.php
index faca0c1530a..65588906980 100644
--- a/lib/internal/Magento/Framework/Webapi/ServiceInputProcessor.php
+++ b/lib/internal/Magento/Framework/Webapi/ServiceInputProcessor.php
@@ -315,6 +315,10 @@ class ServiceInputProcessor implements ServicePayloadConverterInterface
      */
     public function convertValue($data, $type)
     {
+        if ($data === '') {
+            return $data;
+        }
+
         $isArrayType = $this->typeProcessor->isArrayType($type);
         if ($isArrayType && isset($data['item'])) {
             $data = $this->_removeSoapItemNode($data);
@@ -325,13 +329,7 @@ class ServiceInputProcessor implements ServicePayloadConverterInterface
             /** Complex type or array of complex types */
             if ($isArrayType) {
                 // Initializing the result for array type else it will return null for empty array
-                $result = is_array($data) ? [] : null;
-                $itemType = $this->typeProcessor->getArrayItemType($type);
-                if (is_array($data)) {
-                    foreach ($data as $key => $item) {
-                        $result[$key] = $this->_createFromArray($itemType, $item);
-                    }
-                }
+                $result = $this->getResultForArrayType($data, $type);
             } else {
                 $result = $this->_createFromArray($type, $data);
             }
@@ -385,4 +383,23 @@ class ServiceInputProcessor implements ServicePayloadConverterInterface
             }
         }
     }
+
+    /**
+     * @param mixed $data
+     * @param string $type
+     *
+     * @return array|null
+     */
+    private function getResultForArrayType($data, $type)
+    {
+        $result = is_array($data) ? [] : null;
+        $itemType = $this->typeProcessor->getArrayItemType($type);
+        if (is_array($data)) {
+            foreach ($data as $key => $item) {
+                $result[$key] = $this->_createFromArray($itemType, $item);
+            }
+        }
+
+        return $result;
+    }
 }
diff --git a/lib/internal/Magento/Framework/Webapi/Test/Unit/ServiceInputProcessorTest.php b/lib/internal/Magento/Framework/Webapi/Test/Unit/ServiceInputProcessorTest.php
index 6f5a18916e0..fe85e592218 100644
--- a/lib/internal/Magento/Framework/Webapi/Test/Unit/ServiceInputProcessorTest.php
+++ b/lib/internal/Magento/Framework/Webapi/Test/Unit/ServiceInputProcessorTest.php
@@ -569,4 +569,42 @@ class ServiceInputProcessorTest extends \PHPUnit\Framework\TestCase
             ]
         ];
     }
+
+    /**
+     * Test if $data == '', then we have to get the same ''.
+     *
+     * @param string $data
+     * @param string $type
+     *
+     * @dataProvider convertValueWithEmptyValueDataProvider
+     */
+    public function testConvertValueWithEmptyValue($data, $type)
+    {
+        $actualData = $this->serviceInputProcessor->convertValue($data, $type);
+
+        $this->assertEquals($data, $actualData);
+    }
+
+    /**
+     * DataProvider for testConvertValueWithEmptyValue.
+     *
+     * @return array
+     */
+    public function convertValueWithEmptyValueDataProvider()
+    {
+        return [
+            [
+                '',
+                'string'
+            ],
+            [
+                '',
+                'int'
+            ],
+            [
+                '',
+                'float'
+            ],
+        ];
+    }
 }
-- 
GitLab


From 1cd27f466b002b874dfb75a303b09ede6ea70918 Mon Sep 17 00:00:00 2001
From: nmalevanec <mikola.malevanec@transoftgroup.com>
Date: Mon, 11 Dec 2017 17:19:19 +0200
Subject: [PATCH 336/380] 2907: Integration Test Annotation magentoAppArea
 breaks with some valid values.

---
 .../Magento/TestFramework/Annotation/AppArea.php       | 10 +++++-----
 .../framework/Magento/TestFramework/Application.php    | 10 +++++++++-
 2 files changed, 14 insertions(+), 6 deletions(-)

diff --git a/dev/tests/integration/framework/Magento/TestFramework/Annotation/AppArea.php b/dev/tests/integration/framework/Magento/TestFramework/Annotation/AppArea.php
index 3ef7cd608c7..6a63a96d478 100644
--- a/dev/tests/integration/framework/Magento/TestFramework/Annotation/AppArea.php
+++ b/dev/tests/integration/framework/Magento/TestFramework/Annotation/AppArea.php
@@ -15,17 +15,17 @@ class AppArea
     private $_application;
 
     /**
-     * List of allowed areas
+     * List of allowed areas.
      *
      * @var array
      */
     private $_allowedAreas = [
         \Magento\Framework\App\Area::AREA_GLOBAL,
-        \Magento\Backend\App\Area\FrontNameResolver::AREA_CODE,
+        \Magento\Framework\App\Area::AREA_ADMINHTML,
         \Magento\Framework\App\Area::AREA_FRONTEND,
-        'webapi_rest',
-        'webapi_soap',
-        'cron',
+        \Magento\Framework\App\Area::AREA_WEBAPI_REST,
+        \Magento\Framework\App\Area::AREA_WEBAPI_SOAP,
+        \Magento\Framework\App\Area::AREA_CRONTAB,
     ];
 
     /**
diff --git a/dev/tests/integration/framework/Magento/TestFramework/Application.php b/dev/tests/integration/framework/Magento/TestFramework/Application.php
index e0cd3c52e2c..e8ad9d156a3 100644
--- a/dev/tests/integration/framework/Magento/TestFramework/Application.php
+++ b/dev/tests/integration/framework/Magento/TestFramework/Application.php
@@ -600,6 +600,7 @@ class Application
      *
      * @param string $areaCode
      * @return void
+     * @throws \Magento\Framework\Exception\LocalizedException
      */
     public function loadArea($areaCode)
     {
@@ -616,7 +617,14 @@ class Application
             )
         );
         $app = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->get(\Magento\Framework\App\AreaList::class);
-        if ($areaCode == \Magento\TestFramework\Application::DEFAULT_APP_AREA) {
+        $areasForPartialLoading = [
+            \Magento\Framework\App\Area::AREA_GLOBAL,
+            \Magento\Framework\App\Area::AREA_WEBAPI_REST,
+            \Magento\Framework\App\Area::AREA_WEBAPI_SOAP,
+            \Magento\Framework\App\Area::AREA_CRONTAB,
+
+        ];
+        if (in_array($areaCode, $areasForPartialLoading, true)) {
             $app->getArea($areaCode)->load(\Magento\Framework\App\Area::PART_CONFIG);
         } else {
             \Magento\TestFramework\Helper\Bootstrap::getInstance()->loadArea($areaCode);
-- 
GitLab


From ef1ffd5c61d50b44bcbeb663872dbb1236bb5f93 Mon Sep 17 00:00:00 2001
From: Miguel Balparda <mbalparda@nexcess.net>
Date: Mon, 11 Dec 2017 12:59:11 -0300
Subject: [PATCH 337/380] Removed old Connect image and links

---
 .../view/adminhtml/templates/index.phtml         |   4 ++--
 .../web/partners/images/magento-connect.png      | Bin 8179 -> 0 bytes
 .../web/partners/images/magento-marketplace.svg  |   1 +
 3 files changed, 3 insertions(+), 2 deletions(-)
 delete mode 100644 app/code/Magento/Marketplace/view/adminhtml/web/partners/images/magento-connect.png
 create mode 100644 app/code/Magento/Marketplace/view/adminhtml/web/partners/images/magento-marketplace.svg

diff --git a/app/code/Magento/Marketplace/view/adminhtml/templates/index.phtml b/app/code/Magento/Marketplace/view/adminhtml/templates/index.phtml
index ec74b837e10..ab84e91170e 100644
--- a/app/code/Magento/Marketplace/view/adminhtml/templates/index.phtml
+++ b/app/code/Magento/Marketplace/view/adminhtml/templates/index.phtml
@@ -48,7 +48,7 @@
             <img
                 class="magento-connect-logo"
                 src="<?php /* @escapeNotVerified */ echo $block
-                    ->getViewFileUrl('Magento_Marketplace::partners/images/magento-connect.png');
+                    ->getViewFileUrl('Magento_Marketplace::partners/images/magento-marketplace.svg');
                 ?>"
                 alt="Partner"/>
         </div>
@@ -61,7 +61,7 @@
                 ); ?>
             </p>
             <a class="action-secondary" target="_blank"
-               href="http://www.magentocommerce.com/magento-connect/">
+               href="https://marketplace.magento.com/">
                 <?= /* @escapeNotVerified */ __('Visit Magento Marketplaces') ?>
             </a>
         </div>
diff --git a/app/code/Magento/Marketplace/view/adminhtml/web/partners/images/magento-connect.png b/app/code/Magento/Marketplace/view/adminhtml/web/partners/images/magento-connect.png
deleted file mode 100644
index 575563f341b3550c8bd686eeeb0af8a8bc75690b..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 8179
zcmV<P9}M7$P)<h;3K|Lk000e1NJLTq006Q8000{Z1^@s6*qPN%001AlNkl<Zc-rlJ
z2~-@{nXcLxxnmQ1usuZMU?(<C?BL|tPs9_y@ZyYftQXDrC3>+lo(!41#5tA{C0=A%
zk}b4=*w<#?K|%`>XaykwVvztLfj|g^gpk;wX`uJLtGc?nzE^*>swH_zW^&#;<GiDL
zP93VNZ{NDhcmMzUzyC^00FPqHZN<YuvE**KTfRWW1q3kS1#k*@Z9(AeN_y_(5a6!_
zc<uuCZu!C%czlM{4Jc&1Lih~KGOYbm4;hBJ3+}t+3s+b`;TE7^$P#~6A(XR>Ex^s%
z1O6ix+Uc-K4KjA|@7;2@{68x2x&r-H`A?M#JzY_U5AW;Rx36^c!i6(YUY?PG`6q$j
zeCkBOfqlD1jvTD&o*KIz_W#So(fDW%0Pe15`a%HN8sxus&V<80A0pkmU3ace-I0TB
zs*G4~{Eqdg-d{3oGcPWcDsoVK)*{maPfQGlWo9Pw+3AVi{H#=Nc&I-T!e2k%7QiX&
zHsig`&BqIl9XrtMa5(OIoB!lM54<^;?s>gBh^yNU+lh3o$8Ndjj*1?JRghK9%SmwO
z=ES&5OOh=&uJtefyoL$H02A2SdOR~VbsGwElbMW^81(maMnQ1@)h{}Y&um_}ub?2^
zk(3k-qtU2ba<}}a6(<lNTV!^mYlU{>Q<#tY9z5EK5cYPe!Lx2Zkc*4r?P;kS(cE;n
z;`1$*JHTX`zpuPJTc4Yo#8#B3Ole75(09K5t-nTB%z5tgI=q(&uv)c&g@tMM{QMNB
zR;zvRFKyduwca~BJG<=eX86mC0|*3XmVk`m*7bN_2_!rNSSP}5K%l>(+it(7yeQ9-
ztBUtDo~WwM&5HFD=chV!nwen#VzXYw?H23eh0ZrsX*-0yyYkfs_7;t1q-?{P*2a`i
zc7pdX3LoEO>5}d}oQv-L&n2(m;v`80U;_YGpy0771&<>T;G}wgip$<kcj)(j?l*D~
zIL7x*k?X_DDd>{hvYB;DD@$?=`58NSyHyiJ?fR&eprDKH>6zDK4gwrXcpXamOdd(5
zS2mM*X<v6wR7-1P=H%t}m!{`5A(9r#8G}8HLty}d<lu$I41O*G=DA?72+#t-I`Q)H
zLv<u9&LHq^g;y|z$nR!3r@~`{61*V<f?X-QVIOz21%h)cWQ%3v5#Z+U+^}F>3OKd?
zHD2I+{V@SSa9vpsMiWMT^!0%a@PG-RJ~=%e1w6iWGkFlmKnQ@F6Z_^?=mkEQ<T9{M
z1q)}O*J=#}GaD{TXz(nC0oGu85A~G;BlU~M&%+RE<(z?VvkEwLL10Wu{mnU`elRXR
z0CSgCjIMtUuI!b7bvBfOKxs}zyex5;OiN1(a_psr>DIxE?W+#%FCEHCkM$1po`3x_
zB@l=8p4ub(+tQM@q4#{-TV3rZqE%@zLPP!0!?)Kn=(P__PTcr<OLIfc@wy}RhYs%V
zJ$j_3y`#M~dUj^wF&X5y18d}J|BFp04_6&IxVyXV=z(V19NPJ*V7Jqzm>L@mJA1k_
zdQrXbDAo6hM1N|0IPBz!<JEPwhZ_&p?7P_6+5CY)KmPy(A1Gx-rQvwp;miFOR}#p~
z`o;UZ&$h3vJyP9Pvw!zcZ%6C9qeBBP$&1t1d;ZO~=94*P`5BHvRXo?$axACk-09Ur
zm-=6YhxfO8<J!RU^xd(;d)ukMr&~^BPK}R*$s59EGA<pw*#BDn@gudDFPwgTd~QC3
z77)D6Z=GSj5sCiY>iLS_L!10EEIXcokP!h?{RUju&S7|Tp@2Qe3@8ai1Ypm_qgB?*
z{|!t0)4-N+7>Zv9*OJ1+G!aG?O0r-cr?|LQrNe9w<g0%Vez-{m+H@1GrTo6PVNLrX
z)Nwz6d+!=pdh6GKGZ47^dM&#1IeSBzi8cfyg3QyJEFks213MyM&HNGAhG@WWb%hV)
z^Wm^Ll{UZ!s>z;J=0nlKT;XfbZ}}D$OU3@xB{9&BM6d!EV5k1EJ_^dhEB(dwwpbi{
zAFiC&uo&|Lm}4Wsl>8fn78L{Iz#0g;FmK~#VE@mc-yQ~2(s$sfeIIP&hropjtu&d&
zMa_eSIqB@KvRtixVf>-K?$%$WCT_*y1G@)!#_=i3rkR;smY<Ws=BZLV4$Fd)fE>5|
zLmWM{zw7pTd-qh1CnfGc+>WitQl;{_IT`NMlz1d1#-g|=*V=obD@vv!oQqL(b+m5E
zQ6+nFvy!;Vio%7W{47UG!VctSCvf}smX2m;rtk@|+t7dE{F@G|;oj!PqZOIyF+x&e
zyx3lzH7hIGladmP%F5!ID?^te<$kEA#~#Z_O%O;~>F+)F`tF@Yn&gCS$j(gS(~@JM
zN)&%nTwqw7n|YXVITU53g$8<8PFkF|JU`W*BF;r(+%}XK7noRw{T_$K9N5})vLr{9
z>Pb(Dk=l{l%FRmS+FMVhSdF^-=-ne%hF<FHIU6-{ZD{$N$#TDM;oUy#WSj^?{RS}6
z4??%@ahMWcfiB}kuyM=aUb__f%`X7sRdyG+KoePSvn9}0vmTlaPeZ%u@8C>$8hrBi
zu^9avG#@?=WAQJ*O%Fs6P^9*GYY?|M8miy041Cc)0>}OcP4W*hz3Ew);v-=C=yACJ
zxCE0)KL&2pbwOYQWKZd+_ys05eG6zy=O>H)8MDz(!n^e=Kx`On?>qwIJHf!Q_W<Wq
zgyacsT6^@B*zIx4F}pq#Ce=$ouK2$A7cu+$hrt%T0e*3Cg~WL|RzVxh1Fr&?_Na9U
zKf=Nvmch7XIZT-=!Djvd>_=Y(^Y*=P9#6Jo>~!qnx~G8O2f(}jD{#K^APgTpgX#Cb
z2CeGHaB(7In4cM2mXndhmltQ5+)jgXK|LChCxR(AGnrphPdxfbAd@vqP1=FuM{3$=
z@R$2LUQ18j3gX$f*E@Ffa9h>B$`MjC$WjrYt_=3QLVzM*?5!-DVVxFfM_wDc99fvB
zau(#KGFJw>U*SbdU@>Tw1AV=#@^a$bc{z#h!!?z?S1(_D*=aKdT<Yt5JtJ+qkej`O
zyMFb`ix%Ue(xjhzpuO!x3IS@*u2Qv0r++|lnR8>0=4B_l>B`Pb;LD1$EbVO#31m@;
zB9-N4I<t}!K;xqNW24uez0`Mp)y|?UOF?FwXXNU@i$epwuMS=6dzCDDPglq4jFd!B
ze>=}KN6*cSFPohj4W)b90GVlt!a!foDyr+S7z6DVZJ^2S3b43^I|5-_ORn0v@nP8G
zo(4KHd2;jMEK2BmWBC&ayr$w^0dvhQ4zNmU3oYrKur3Jh*k^#A0tT*`a0xuuT4SMl
z8Lr<h0d_|L*7;xyp!D#J!mI9CV~BnVp3Pr@CHm_yl}14rJX#C0Is}tVwS4Le(7*E#
z+%@k(PWw{v7O#Z)y)Qw#<=b#=jQ~z=0T$b9SzUjWyE&P+(r=Rf9?)NppiL%OV$Jzj
zPsVas-~Te)wVMIkL<CuS7_Ud7<fpK#UIL+J4d5{aQ&NNI3a1?j=hB|Q)W)xYIj{kk
zA6x-J9}4!`8uaDy*ck=W*^*&!rXW*ybtxLQ!WH{Xu-hI7I#S^3s~ksv)v(m*sj;DN
z5Z^5?%CUG^TOiL^1CQ41?Io++(RL!?_Q|J(*<Dep$xKZWZd|?mB2Dl>-<j95MJ`!h
zl5e=ZuElIzDsf`g8VG?jSys9x$F6>(FfYSNmr<vdz;>ecNIh9eva+1WjcyMbj~}aS
z&P?4Voa<=XL>p&ec3j$M87W&aHQpZv;TAt;#f?aSr;XCy+9GjwgKi?2ta?sXyoYFj
zW_E0u%%y2E8;{mBrpL$Pz~0IcnIqdR`oQvnOuI@9V(n(bQhJA%a|Rf7ng<GUGnw?1
zc*!#mZ>8_(BHr8E-TAAe`0Xez$hK={Cqn2Qbh&S4r2KKo!dS>c-W%|&71_o4+BF0s
zE1)E6<)>yQz0%7HzB2~8kqB4%kHM~62L5yw<8)aS^qemG4X)LUW9uVuZhREp{saAT
zJD6-Mb!>P9x(%Vw?cXRscO#tmJkbw^heBPSK8z2QFc<v`z`Ft*GCkO}3e=u$`?uh^
zE^ZW-k;Xt2htpq*T8Ix5y+Rm-(a}iR`a5c4_{sMkgQ@bj0OOFjw!@16q8ylPt}<-?
zI$Uwj0ka({>L0D8p*}@B^PU3Q(q90J*QJd~9z~uDs}oAWG$Or&o^gxgA@l1(z{Y<Q
zaBD*VR*p%?{q?*g1#UZw)wme|4fS`g%n_{@@n)yP5+HcplFPX^G!U5-7Xtz_W3@_?
zb#<`om7=^9XGLj&-tBZKWF9GlLJEpFd!WTQuT)Rpc&x9dBT5D`@n3o$(UO$J?HKIu
zdX4JyZbtym`dskYGxaga@gJkLv95yL@=*VUm8#TuVP9pzjBb9E0w*arvzjzYn`JKO
zg2>xd=?UJNs(nNB`$e%%nh5%e(i{VUn1Dq9l>6A<b!K&LTC!MwkF>LCtolXugT#?{
zisRQW%s)hZB+y^I-1Bm(7#r*?E7TemHFu~PRL5yG-Amu4r|iJxOWiA_v3Ne6?spF!
zFJ0LBZ6NM(z-m`|ApTZx2ZHei!YN2Vqf3t3y(9ItmiNC3Z_IKCA~!YpgD{8E>O~;j
zrXc3PJDB+6BVdng06mx1Y^F07A3q9n+zY_`z$yYG+~y!THgR>AsUZT%R`G8jZckv5
z(!eD@f$hUbfdjt=J)_IR-rO8^gVLGwUAV+{g|Rl3^vrr~m8swjST;WcbY}_R9pYHH
z0JtV2Vbd$&o{5+%e+#o4z6EraXk8Q_vYIek&i{mS^WOoTMJ73CAy~!w9#;VMRoVoc
zD*!g5I7S2r<5$9+Z{G(byZ|_vKsZddR131G6s#So-ggn4&k|Y<i^}SKB_nA`(YVy#
z^BOHaElBO*ns(x?UF~N!`8nv+mC*d`L^oL~TJ+l&Os|^{>S}L{uBj>?CM%kq5zm(t
zWY{TCq`yY(bdVr+x}~YEBq=@`Cy&?Ey6lEPd6zLZHsH{{(qUC{40_tzJ^<qk=sVl7
zHajIz$jeCJ_mt&m3v)8rl6;k;v@p|38?U@L)0CR99hGIpS})^P7<Drb5SJ~=&vck{
z3lDq}RD<1}Q5oWxs&?-jmp7l;uyB8IPAZd^9?LtewtMM0ZN{@5CpQtLId-_J{WGOJ
zmtAqFdhbP|H>X>UXL?xkt-y|V`X?P{vN-MfWkBIdz_Ablw?!!js4U|%1oRn<#m9Gh
z3K{(2ULflq;PuRf+inB7?7gh#_OvW+dIDVe&jHb^N}!$XS>xIe0!PAfz;q*me&=<W
zlr%<3ZE4vI``b(4to#k=eX{D|D*Pu*zw@_1Q!HpL?7Ta`dsEAW-W2TG^c?v0_ko!_
z*&<nR{iQYL)E~mLPV@>nk(e!v!mR4on5z&sLjEtYu;+Ieje7|T?>`B?QDu^VY`U__
zoA6&@7dbD6Yg?$ljO<Amm+!AQe=L{)&g%%2tgpH&*1X}%u%&(nR)=03qtk~KD!tuJ
zZ)K)#7l`u;EUS<MlD1Pv3o_HT2&4uGqBSy!JhUK3#TMu1Ip(IP9`n1v#qkG;S`cT{
z&1)neyBSt-q33*5PId-Ipv@Qg>9Iq5y4qXoQ(8p&K%WW77K8eJS_rb#r9~<$aoFyz
zwzXvK=BCt-wKTL=5Qz7d6)))3GY?A^y16YSGcg`}N{h4&#||{sA3fMycX)q$gSZLm
zj_he`IDVk^_>lu`r%yHHP<`FP<U_exDIE3Btk+S%<u7CfNVOo2EK>_vek;jMbC%>J
zF~&thkSuvMH5}ZXl<+Yc>JJ~5<+x8;<>toY6{$%v(xxP^NY6zhK#M|)MY=UkZHMu_
zhhP;Kn%b4+DYCR=5kYl0NEQ+fLFs9ZgJbReK;_%8z!B^O69|_@a=|ozRvrQ9-=oGx
zCD_#Ofut&ut}x!SO87v0mbe^l&1lF1AkiI89HSdvg{vc-_q-DTXT`7l9GR#kcKr+s
z(a(ZCk;s9y-3%TH8}z+8%$gbwcl6`1PAo2ytms0|dR^)Ya2vh`N5WI!;=+K~=V03L
zO<>0haBL3+5`%#)ArKl=Ch9k@8(P6_eFo}n5x~OPQj*wY$x&8McvyoV>iV*G!j03h
zjt`fC*%1!jtW{coTl#$G>G~J~TU*nKf;+9LCMY8#!CR0U&svQ$L01O4UQLYKf`;SA
z{4yI)lWm++7UiWmb5)6+$<fQtk|sFN*SU(oT9A{%wzjlqS}nJ%k!F7S;liRUYffGY
zt20dbbLeB^SHDqIlx|H+*@D8{Bu14iDhr}z+gVzspB|t1I@KYG>}-2WH1TQT!V*ya
zOff7@JxDaEAUn-XK_P)n@ZLr(&NaW4m9kyfzqfo8;G{DaM1v{{Gpt2f32xd{<aSB!
z>u76ENK1;xu|w5eGCwB32{+v?)j4_mP;J7Fk8wuav@{oB)#21GY0MN|Q#~|ia8@zE
zLBUU8@gnf{!!R=UrF&8lNLS`t%K8l=H}vlODM*qd{z%qdUSKMYvt`42(fWD{{|De&
z@afGHo$J~4q9PLaeL#C<1qE8nO@2yN56#(j?Rt?{m%j#hEI|Y?`ra)9+4#YiVQoq`
zNkA1`fg}S;<1mg!*y3M?ZQFkVMo!dH-=Xba<N5emKm;<TPt`hEqY?&<w6>hh9ANVx
zz$sEdI5nZ1+o>QPEVZ-aMHsey8y-!2DZQ6xya9kA6kdHOZ6HB51Yji%+c41+VO{?S
znC;&H%%c%B55(=I31~V|Q=JsI86B-ncO*1iqM|?tiB#!Zg_g!c6_otQ%1Gp|3|xHW
zj(Rq&lB7EV?&!7t=V@o3s69|mn}e*RRL9}GN49oq^;k%5ZVFpaASPXOlR@(H(XlJf
zR#fC@cU5FBbf0Z}_xk1T$QwhwFHs7e>c~JQ6@>b+duM^hVO{hCnPHrFSVyPReveNs
zyuOSm4V?$k&d&rB0Pmm{J#BC1q{Vux_LPki*rXJ-L34j;UaB)UEyim#Y44K*!-0$4
zuaT6utGq}{fge4;{X7b7ls&r&)g;*s_MeydJ|!z;mn|2Zs~k3Ld=f}`K>{XG3mL=?
zkFPGgv<Zwsl6CH_X)%2m0yZrI&<(EgeQyi_Zw#RTjOH8-(a^s4AZ)vT1Gz2CU0CD!
zV3`Qy{|4wsA^=9R;(kNal%sX74g^a67a(pjx9knX4d(j813*KTi4{Nd6ts(%FYp`-
zvu=GJmXDqWZ4{{;r#{H2dQ+qcPr@@$srAi^M?q8&(1kfUpNtE#_8fd3#5@tckoQmU
z{%$GISs~Fn`5+KnzVj{Sn|+mxfkz*L$;KA%HWA~=-vjC9E?(5tdHBvJpRC(opPm$p
zzV5DH$&JYzZTQ;Ya!QU6_auGyaLvA6gZ@sQNt||XWyuU_z?9ISj9hiq&SA2eByY(s
zm)f(N7MHf2sx2T+zPlo4!E_VIoX4eTX{paiNfGtygB88=vm?tWTSIQ;cDGFzNnIs{
zSylq`xz3gk2w<{0Am2}n4nKSGLf4ygubZC;F3Qbd%8GML1T>k8-U{|wRuj-EIYJwX
zE&^#~d7idNmB<n8krfv@OjTZzYa-7?NfJ_H<i4>^Q($*j%UTKssm`Ki`eFGUTCa~X
z_{TEc6Qxgj8QlB#gB?B-MVTymPB9AHRwbom;bs&ZAc2bjX%_=5{f5Wj?b+W&fFieQ
z^!lQEsM|~3>EFe|`o9HpwrpGq76k-g`rI0<`x{txEC(qTQt%7-&nU1>xoYm6CBUvX
zK=1Jfk(ED#S?rtpR60ZNlCy^7{$ZI86GV$>6S*xnc77F|gYfXCVB7u;u&jLu_Ug9*
z)+Du~=b?0appaD*#x@mZavCM70Eaf%z54^;U2*zEj!v06dhTQq$Our-J?GB|T77_?
z>RP|J@hRxyA_4t$h#V_OK;BzfG((C3X`i1=|Jv-vfL-E(l7%6jNlA=PrHMsXOd4`>
zLJUZLBCFQYR9`|e)b5=nnwcBdzG2kN29FH(zFfV#WW1tKWhDz(UYKSzh>C*zu8xjV
zn@C-tBnNS2O1kW;te8A?^7!rx=Q>wYMotE7$LUisq}i&{le`Uehib>J4L+}#9(`=E
z@7$^r$7&igl6Ro8tUyb0qJDAaK~gcOzR^H!+?l@a={WTP1&90g?i#&4NIkHpd^9yK
z8g)mj+Ir5lt{xt`5J^<w{MqJr39O_`w~CumqZxa2YU;`pr_a<S<mM%^bdak1e8*e<
z0Pv=4ML-eUc4^`%^JYD=RnYz6OITE`0<IjFJeLeG@AP2A_^GN*p2<rQl&&VXPHKey
zy+^@{kv@jo*5AqwUWvltwU`$<w>keO5VY6BWvh$X-Y9JP8@R+x0NrpTja?@oSe63W
zQ!10^y(J(jK^sHrCvR19yMBs=b@zigmBdp$IiRFEuup{}PL$F%JPb@<l(KssqENkM
zCjO&P=(jxqbmTBF>Vu^3MAt7_(+hisXY+mu_vu14ZB+6&&hhgrW@DbhRP^7&)|qSK
zg~c%Wppe@=u>yVNrunu5Yaq@W&4YDz?BThMPs0=a1Ta$DMYMu8ngn<XvS^X73=Kwp
z`hbu}K|+5@Vk`;^vK@2ksgO?t*{z^spu`<dH#g=;R&#Rf2@0N46XTGZp2*XcE`nvJ
zs8ydo(->W~vrtW{gK>URlD5XKUkRs-+s?9F{fWBj`kI>E7c0t(wMB*b_O#?UDYHg8
zHMw@0RLYz+*4I|&s?t5laa)m<mLO09hX72+N(sch=gzDqE;z3q4<R5^R#81Wx$IL3
zp7!QVG(O5i-v0btXWIvbS*dQ?#A(T-4QDur$}kSSlE7Rj#s$d<TacN#gU=E*>eRHY
zLSB9nL#F~QX8lrW5!p{r3eMp_ATEej*<Sp*q$RuJz5{d7FJRmGTVPKVj4?0Z`bW!w
zo@~J=Cmh6c23*NMgM07GV57qzl>7|X8wGv#KSI6fNf=VT4-8iK6Q8FIK`M!Rb}(Y@
zcMo7b=DYCDTwDRKoi>!@9Z70+G^W|DZ;7{szW`+G#~6Zm@jd!?m%)8Bfg!MvoF{KI
zN?Mq=K8Zz9bzyIuTQLWOQXj!iN1*m&%x``I7SVI?$v*;L{Rd$8&*9CEgnh$TVA>c8
zbY%+QbkeyKNktKVqhI$O7(V<unA{%$CBFvttcF><cdYv=7WS?eV4d_Oe@t`1Zq+}4
z7c-LHgy-Nad>#Ce_3$04zt9oYb@ueTbT;C%fUMJM9;EXT1DASNeqKN|e0Au>_A_lU
zBiF7j_Xl-zvyYzbZ2#cc!TsG0bw_G@&vm?I(rSWe5+|--4L^IjC5Cg_6lPHpt0>Ml
zQLso>kLPXvgvi2z_MxGHo>x!Q9jqrXR#p@*xNK&>2(F%*45ifevBL-2iS{&}I97f6
z(uI|j!j`SKO}sxVf|AByvztD3%ye#QER<5t7cXAC!y}O<eErJ6OXOXePS#ePYN*>S
zw@Y4V{KnOA3Oo-Us_H&+bbnh*+wsiF>ES0n>jWTiSlJr;0YNlos<q0qe>JojKgOb{
z!P?$c0vo>sq&^S!*vEkJ$|?v}N%xg3&)l^z9C{y?#P31<akyxOzk>P1mtZS<6S%xj
zO_?<RJ1OxoHxi;P`X$WO>*3K)hJg1;XtK`i6|-XIyr08fpKN!!Xk6xCI$z;vNM<Z$
zzl81Vfl{g~Q8xEYMaw)LYN=TZYvr#Y%#DOe;}I-31Hsu4_H+j4&RGf5hu_59M~}f0
zy&T$Y--UhGzk=&6F~Oq=r}4|)2kd+pnzQWAtXJXK`Z)M^1Hp?*i#7RqP#-XHCKhgk
z?=TV_B<tTlY%F;LbK-n0u6qoQ?N0;Nh2SL=0C4WlK0NOIzi=#5=AEDSeTOKMWr`fV
z>BOOGz$NL0Zthm#M$a^}H<neD<{3yro1Z1G@b53O67gAy2`VyY{=D!0(y=-n?tA>8
z^%#Rm*!L?2JmddY!4#b{#<?IyGZJc_><@R$4299jFFBhfsUwd05GNo-?(i~Frq45Z
zF%s9BN}=g2g>xd3Kq@6=+_w@^q(j3!7Y>K-Oa$?6*)vdkaE?d9GapW;(j==2Yq0P1
z+gunN!%=c<;QKB77=d##0;ZuT>E5Li$F>mW&n9|xp|H({VzNIHH}=|X>cMd6u7?vn
zATY856c)~>)OcW5E&$Tl;Ft>~`s1EyE5+EcVVFl&5S8KJ3(gq^es9LvXTmUbMuls2
zEmrlY_<mcUByD^i&={Wmi-7EA{{6qZ*x9~Tl}rhV;>ktL_`|fZ<o-}Z>a;HeofVTR
z@v)mxT~#?OTVpwc_~(jnGXNAmXH$CFTbqXc#8F3C;oupMLe`CC7c77NbMGf$5Rl0N
z(!!91qobD&z^@<>xamBB?85!&XD<{Ic-_WevX<1AOSlCnIi*Y7mj2!@;h7jgN*2ff
zlaEBoMQRsT|1+s?j9F;{{DG(Z&+TQIPY}mWz%$;gLxCKezRVwSSXoVxKMOF2P^MB&
zv{A}hZcEyDoIZrIne-b{D=2L~1%y+d={eP-_(10L^q0P4z~9<b-Y>`*csk2)=)k@K
z3J%HQ*6iOk)O1peu$t?nBa)<0P^OF|FFF>w<ZiiJzKDga1_f_}Vk(@@Tu>^Rq`Z7F
znNpOW?l@etr<Y_rlFsh_9~^hf7aGX$`ZQoVcR{D+q>ECzE~Ao;bdp|6vff=F-z}e4
Z{txa8J~OL4=@S3|002ovPDHLkV1k>X=`a8Q

diff --git a/app/code/Magento/Marketplace/view/adminhtml/web/partners/images/magento-marketplace.svg b/app/code/Magento/Marketplace/view/adminhtml/web/partners/images/magento-marketplace.svg
new file mode 100644
index 00000000000..388544d5d7f
--- /dev/null
+++ b/app/code/Magento/Marketplace/view/adminhtml/web/partners/images/magento-marketplace.svg
@@ -0,0 +1 @@
+<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 273.37 35.85"><defs><style>.cls-1{fill:#f26322;}.cls-2{fill:#4d4d4d;}</style></defs><title>Artboard 1</title><g id="Logo"><polygon class="cls-1" points="15.54 0 0 8.97 0 26.89 4.43 29.45 4.41 11.53 15.51 5.12 26.61 11.53 26.61 29.44 31.05 26.89 31.05 8.95 15.54 0"/><polygon class="cls-1" points="17.74 29.45 15.52 30.73 13.3 29.46 13.3 11.53 8.86 14.09 8.87 32.01 15.52 35.85 22.18 32.01 22.18 14.09 17.74 11.53 17.74 29.45"/><path class="cls-2" d="M41.21,9.08l6.1,15.41h0l6-15.41h2.32V26.74H54V11.35h0q-.12.42-.27.84l-.28.77c-.11.28-.2.54-.28.79L48,26.74H46.57l-5.16-13q-.15-.35-.3-.75t-.27-.78l-.3-.86h0V26.74H39V9.08Z"/><path class="cls-2" d="M60.3,26.81A3.76,3.76,0,0,1,59,26.14,3.14,3.14,0,0,1,58.1,25a3.54,3.54,0,0,1-.32-1.56,3.64,3.64,0,0,1,.42-1.85,3.24,3.24,0,0,1,1.14-1.15A5.74,5.74,0,0,1,61,19.82a17.86,17.86,0,0,1,2-.35q.94-.1,1.59-.21A4.84,4.84,0,0,0,65.69,19a1.27,1.27,0,0,0,.59-.46,1.41,1.41,0,0,0,.19-.78V17.5a2.33,2.33,0,0,0-.79-1.94,3.57,3.57,0,0,0-2.27-.63q-3.41,0-3.58,2.84H58.32a4.17,4.17,0,0,1,1.37-3,5.44,5.44,0,0,1,3.72-1.11,5.32,5.32,0,0,1,3.31.93,3.57,3.57,0,0,1,1.21,3v6.94a1.31,1.31,0,0,0,.21.83.83.83,0,0,0,.63.28l.26,0,.31-.07h.07v1.11a2.9,2.9,0,0,1-.42.14,2.61,2.61,0,0,1-.62.06A2,2,0,0,1,67,26.48a1.87,1.87,0,0,1-.54-1.37v-.27h-.07a7.46,7.46,0,0,1-.65.77,4.41,4.41,0,0,1-.93.72,5.18,5.18,0,0,1-1.26.52A6.14,6.14,0,0,1,62,27a5.92,5.92,0,0,1-1.65-.22m3.77-1.35a4.33,4.33,0,0,0,1.35-.85,3.46,3.46,0,0,0,1.09-2.49v-2.3a5.29,5.29,0,0,1-1.49.53q-.88.19-1.82.31t-1.51.26a3.8,3.8,0,0,0-1.2.43,2.21,2.21,0,0,0-.8.8,2.6,2.6,0,0,0-.3,1.32,2.36,2.36,0,0,0,.23,1.11,2,2,0,0,0,.62.72,2.42,2.42,0,0,0,.9.38,5.18,5.18,0,0,0,1.09.11,4.75,4.75,0,0,0,1.84-.33"/><path class="cls-2" d="M72,30.26a3.4,3.4,0,0,1-1.46-2.38h1.48a2.08,2.08,0,0,0,1.2,1.59,5.45,5.45,0,0,0,2.38.48,4.13,4.13,0,0,0,3-1,3.62,3.62,0,0,0,1-2.68v-2h-.07a5.28,5.28,0,0,1-1.65,1.65,4.56,4.56,0,0,1-2.4.57A5.35,5.35,0,0,1,73.24,26a5,5,0,0,1-1.73-1.31,5.87,5.87,0,0,1-1.1-2A8.28,8.28,0,0,1,70,20.12a7.9,7.9,0,0,1,.44-2.75,6.14,6.14,0,0,1,1.19-2,4.89,4.89,0,0,1,1.74-1.23,5.4,5.4,0,0,1,2.11-.42A4.52,4.52,0,0,1,78,14.3a5,5,0,0,1,1.61,1.64h.07V14h1.51V26.24A4.92,4.92,0,0,1,80,29.68a5.62,5.62,0,0,1-4.27,1.53,6.06,6.06,0,0,1-3.66-1m6.69-6.46a6.2,6.2,0,0,0,1-3.7A8.14,8.14,0,0,0,79.49,18a4.52,4.52,0,0,0-.77-1.62,3.5,3.5,0,0,0-1.3-1A4.18,4.18,0,0,0,75.61,15a3.47,3.47,0,0,0-3,1.41,6.13,6.13,0,0,0-1,3.75,7.81,7.81,0,0,0,.25,2,4.82,4.82,0,0,0,.74,1.61,3.49,3.49,0,0,0,1.23,1.06,3.78,3.78,0,0,0,1.75.38,3.6,3.6,0,0,0,3.14-1.41"/><path class="cls-2" d="M86.45,26.55a5.21,5.21,0,0,1-1.86-1.41A6.29,6.29,0,0,1,83.44,23a8.58,8.58,0,0,1-.4-2.65,8.12,8.12,0,0,1,.42-2.66,6.63,6.63,0,0,1,1.17-2.12,5.3,5.3,0,0,1,1.83-1.41,5.57,5.57,0,0,1,2.41-.51,5.27,5.27,0,0,1,2.58.58,4.83,4.83,0,0,1,1.7,1.56A6.38,6.38,0,0,1,94.08,18a12.26,12.26,0,0,1,.27,2.59H84.62a7.4,7.4,0,0,0,.31,2,5.06,5.06,0,0,0,.82,1.62,3.7,3.7,0,0,0,1.35,1.09,4.31,4.31,0,0,0,1.9.4A3.62,3.62,0,0,0,91.48,25a4.26,4.26,0,0,0,1.25-2.09H94.2a5.44,5.44,0,0,1-1.73,3A5.13,5.13,0,0,1,89,27.06a6.07,6.07,0,0,1-2.54-.51m6-8.89a4.34,4.34,0,0,0-.72-1.43,3.28,3.28,0,0,0-1.19-1,3.88,3.88,0,0,0-1.7-.35,4.07,4.07,0,0,0-1.72.35,3.67,3.67,0,0,0-1.27,1,4.74,4.74,0,0,0-.83,1.42,7,7,0,0,0-.41,1.78h8.1a6.75,6.75,0,0,0-.27-1.77"/><path class="cls-2" d="M97.78,14v2h0a5.25,5.25,0,0,1,1.69-1.59,4.93,4.93,0,0,1,2.58-.63,4.23,4.23,0,0,1,2.93,1,3.75,3.75,0,0,1,1.15,3v9.06h-1.53V17.82a2.69,2.69,0,0,0-.78-2.14,3.14,3.14,0,0,0-2.14-.68,4.28,4.28,0,0,0-1.53.27,4,4,0,0,0-1.26.75,3.46,3.46,0,0,0-.85,1.15,3.42,3.42,0,0,0-.31,1.46v8.1H96.25V14Z"/><path class="cls-2" d="M110.13,26.3a2.13,2.13,0,0,1-.67-1.77V15.23h-1.93V14h1.93V10H111V14h2.37v1.26H111v9.06a1.2,1.2,0,0,0,.31,1,1.41,1.41,0,0,0,.93.26,2.62,2.62,0,0,0,.56-.06,2.55,2.55,0,0,0,.46-.14h.07v1.31a4.28,4.28,0,0,1-1.41.22,2.77,2.77,0,0,1-1.78-.53"/><path class="cls-2" d="M117.9,26.55A5.35,5.35,0,0,1,116,25.14,6.33,6.33,0,0,1,114.86,23a8.85,8.85,0,0,1,0-5.31A6.34,6.34,0,0,1,116,15.59a5.36,5.36,0,0,1,1.86-1.41,5.87,5.87,0,0,1,2.48-.51,5.79,5.79,0,0,1,2.47.51,5.39,5.39,0,0,1,1.85,1.41,6.17,6.17,0,0,1,1.16,2.12,9.11,9.11,0,0,1,0,5.31,6.17,6.17,0,0,1-1.16,2.12,5.38,5.38,0,0,1-1.85,1.41,5.78,5.78,0,0,1-2.47.51,5.86,5.86,0,0,1-2.48-.51m4.36-1.2a3.85,3.85,0,0,0,1.36-1.16,5.24,5.24,0,0,0,.82-1.73,8.23,8.23,0,0,0,0-4.2,5.23,5.23,0,0,0-.82-1.73,3.84,3.84,0,0,0-1.36-1.16,4.43,4.43,0,0,0-3.77,0,4,4,0,0,0-1.36,1.16,5.1,5.1,0,0,0-.83,1.73,8.25,8.25,0,0,0,0,4.2,5.11,5.11,0,0,0,.83,1.73,4.22,4.22,0,0,0,5.13,1.16"/><path class="cls-2" d="M128.22,16.09a1.54,1.54,0,0,1-1.6-1.64,1.61,1.61,0,1,1,3.21,0,1.56,1.56,0,0,1-1.61,1.64m0-3.1a1.34,1.34,0,0,0-1.37,1.46,1.38,1.38,0,1,0,2.75,0A1.34,1.34,0,0,0,128.22,13m.47,2.34-.54-.78H128v.75h-.31V13.48h.55c.38,0,.64.19.64.53a.49.49,0,0,1-.37.5l.52.74Zm-.48-1.56H128v.54h.23c.2,0,.33-.08.33-.27s-.11-.27-.32-.27"/></g><path class="cls-2" d="M134.39,9.93h4.27l4.51,11.7,4.41-11.7h4.22V27.07H148.6V14.13L143.5,27.07h-1l-5.2-12.95V27.07h-2.88Z"/><path class="cls-2" d="M154.45,23.59c0-2.92,2.83-4,6.42-4h1.56V19c0-1.68-.58-2.52-2.28-2.52a2.09,2.09,0,0,0-2.4,2H155c.24-2.92,2.56-4.15,5.37-4.15s5,1.15,5,4.58v8.22h-2.85V25.54a4.36,4.36,0,0,1-3.84,1.77C156.35,27.31,154.45,26.21,154.45,23.59Zm8-.91V21.44H161c-2.21,0-3.62.5-3.62,2,0,1.05.58,1.75,2,1.75C161.12,25.22,162.44,24.29,162.44,22.68Z"/><path class="cls-2" d="M168.67,14.53h2.9v2.35a4.18,4.18,0,0,1,4.08-2.54v2.71c-2.54,0-4.08.84-4.08,3.5v6.52h-2.9Z"/><path class="cls-2" d="M178.19,8.73h2.9V20l4.48-5.51h3.16l-4.87,5.75,5.27,6.78h-3.36l-4.7-6.16v6.16h-2.9Z"/><path class="cls-2" d="M189.7,20.93v-.19a6.1,6.1,0,0,1,6.23-6.47c3.12,0,5.92,1.85,5.92,6.33v.84h-9.18c.1,2.37,1.29,3.71,3.45,3.71,1.75,0,2.66-.7,2.88-1.92h2.8c-.41,2.64-2.54,4.08-5.75,4.08A6,6,0,0,1,189.7,20.93ZM199,19.5c-.14-2.16-1.25-3.12-3-3.12s-2.92,1.17-3.21,3.12Z"/><path class="cls-2" d="M204.92,23.57V16.72h-1.68V14.53h1.68V11.78h2.9v2.76h2.76v2.18h-2.76v6.59c0,1.1.53,1.61,1.44,1.61a3.58,3.58,0,0,0,1.41-.24V27a5.57,5.57,0,0,1-2,.31C206.22,27.29,204.92,25.94,204.92,23.57Z"/><path class="cls-2" d="M213.29,14.53h2.9v2a4.84,4.84,0,0,1,4.1-2.28c3.14,0,5.56,2.33,5.56,6.38v.19c0,4-2.33,6.47-5.56,6.47a4.53,4.53,0,0,1-4.1-2.21v6.26h-2.9Zm9.59,6.35v-.19c0-2.78-1.44-4.15-3.33-4.15s-3.45,1.37-3.45,4.15v.19c0,2.8,1.37,4.12,3.48,4.12S222.88,23.57,222.88,20.89Z"/><path class="cls-2" d="M228.54,8.73h2.9V27.07h-2.9Z"/><path class="cls-2" d="M234,23.59c0-2.92,2.83-4,6.42-4H242V19c0-1.68-.58-2.52-2.28-2.52a2.09,2.09,0,0,0-2.4,2h-2.8c.24-2.92,2.56-4.15,5.37-4.15s5,1.15,5,4.58v8.22h-2.85V25.54a4.36,4.36,0,0,1-3.84,1.77C235.94,27.31,234,26.21,234,23.59Zm8-.91V21.44h-1.49c-2.21,0-3.62.5-3.62,2,0,1.05.58,1.75,2,1.75C240.71,25.22,242,24.29,242,22.68Z"/><path class="cls-2" d="M247.43,21v-.19a6.18,6.18,0,0,1,6.33-6.5c2.78,0,5.39,1.25,5.73,4.7h-2.8a2.59,2.59,0,0,0-2.88-2.37c-2,0-3.4,1.53-3.4,4.12v.19c0,2.73,1.34,4.17,3.48,4.17a2.85,2.85,0,0,0,3-2.68h2.66c-.22,2.88-2.4,4.91-5.8,4.91A6,6,0,0,1,247.43,21Z"/><path class="cls-2" d="M261.21,20.93v-.19a6.1,6.1,0,0,1,6.23-6.47c3.12,0,5.92,1.85,5.92,6.33v.84h-9.18c.1,2.37,1.29,3.71,3.45,3.71,1.75,0,2.66-.7,2.88-1.92h2.8c-.41,2.64-2.54,4.08-5.75,4.08A6,6,0,0,1,261.21,20.93Zm9.28-1.44c-.14-2.16-1.25-3.12-3-3.12s-2.92,1.17-3.21,3.12Z"/></svg>
\ No newline at end of file
-- 
GitLab


From 362031345eaf8355fba213959ce1a5ccf12fe95e Mon Sep 17 00:00:00 2001
From: serhii balko <serhii.balko@transoftgroup.com>
Date: Mon, 11 Dec 2017 18:15:00 +0200
Subject: [PATCH 338/380] #8647: [GitHub] Order of how arguments are merged in
 multiple di.xml-files causes unexpected results

---
 .../Webapi/Rest/Response/RendererFactory.php  |  5 +++
 .../Rest/Response/RendererFactoryTest.php     | 37 +++++++++++++++----
 2 files changed, 34 insertions(+), 8 deletions(-)

diff --git a/lib/internal/Magento/Framework/Webapi/Rest/Response/RendererFactory.php b/lib/internal/Magento/Framework/Webapi/Rest/Response/RendererFactory.php
index c86b97b0fa8..938d4ef6d1b 100644
--- a/lib/internal/Magento/Framework/Webapi/Rest/Response/RendererFactory.php
+++ b/lib/internal/Magento/Framework/Webapi/Rest/Response/RendererFactory.php
@@ -71,7 +71,12 @@ class RendererFactory
         if (!is_array($acceptTypes)) {
             $acceptTypes = [$acceptTypes];
         }
+        // If Accept type = '*/*' then return default renderer.
+        $defaultRenderer = isset($this->_renders['default']) ? $this->_renders['default'] : null; 
         foreach ($acceptTypes as $acceptType) {
+            if ($acceptType == '*/*' && $defaultRenderer) {
+                return $defaultRenderer['model'];
+            }
             foreach ($this->_renders as $rendererConfig) {
                 $rendererType = $rendererConfig['type'];
                 if ($acceptType == $rendererType || $acceptType == current(
diff --git a/lib/internal/Magento/Framework/Webapi/Test/Unit/Rest/Response/RendererFactoryTest.php b/lib/internal/Magento/Framework/Webapi/Test/Unit/Rest/Response/RendererFactoryTest.php
index ba460c5a5f6..7b50a6f0224 100644
--- a/lib/internal/Magento/Framework/Webapi/Test/Unit/Rest/Response/RendererFactoryTest.php
+++ b/lib/internal/Magento/Framework/Webapi/Test/Unit/Rest/Response/RendererFactoryTest.php
@@ -26,11 +26,18 @@ class RendererFactoryTest extends \PHPUnit\Framework\TestCase
         )->disableOriginalConstructor()->getMock();
 
         $renders = [
-            'default' => ['type' => '*/*', 'model' => \Magento\Framework\Webapi\Rest\Response\Renderer\Json::class],
+            'application_xml' => [
+                'type' => 'application/xml',
+                'model' => \Magento\Framework\Webapi\Rest\Response\Renderer\Xml::class,
+            ],
             'application_json' => [
                 'type' => 'application/json',
                 'model' => \Magento\Framework\Webapi\Rest\Response\Renderer\Json::class,
             ],
+            'default' => [
+                'type' => '*/*', 
+                'model' => \Magento\Framework\Webapi\Rest\Response\Renderer\Json::class
+            ],
         ];
 
         $this->_factory = new \Magento\Framework\Webapi\Rest\Response\RendererFactory(
@@ -42,29 +49,43 @@ class RendererFactoryTest extends \PHPUnit\Framework\TestCase
 
     /**
      * Test GET method.
+     *
+     * @param array $acceptTypes
+     * @param string $model
+     * @dataProvider getTestDataProvider
      */
-    public function testGet()
+    public function testGet($acceptTypes, $model)
     {
-        $acceptTypes = ['application/json'];
-
         /** Mock request getAcceptTypes method to return specified value. */
         $this->_requestMock->expects($this->once())->method('getAcceptTypes')->will($this->returnValue($acceptTypes));
         /** Mock renderer. */
-        $rendererMock = $this->getMockBuilder(
-            \Magento\Framework\Webapi\Rest\Response\Renderer\Json::class
-        )->disableOriginalConstructor()->getMock();
+        $rendererMock = $this->getMockBuilder($model)->disableOriginalConstructor()->getMock();
         /** Mock object to return mocked renderer. */
         $this->_objectManagerMock->expects(
             $this->once()
         )->method(
             'get'
         )->with(
-            \Magento\Framework\Webapi\Rest\Response\Renderer\Json::class
+            $model
         )->will(
             $this->returnValue($rendererMock)
         );
         $this->_factory->get();
     }
+    
+    /**
+     * Data provider for method testGet
+     *
+     * @return array
+     */
+    public function getTestDataProvider()
+    {
+        return [
+            [['*/*'], \Magento\Framework\Webapi\Rest\Response\Renderer\Json::class],
+            [['application/json'], \Magento\Framework\Webapi\Rest\Response\Renderer\Json::class],
+            [['application/xml'], \Magento\Framework\Webapi\Rest\Response\Renderer\Xml::class],
+        ];
+    }
 
     /**
      * Test GET method with wrong Accept HTTP Header.
-- 
GitLab


From 93ec6ea5801e6fae870e3dc91d821a6f67a5d3e0 Mon Sep 17 00:00:00 2001
From: Matthias Zeis <admin@matthias-zeis.com>
Date: Mon, 11 Dec 2017 18:40:20 +0100
Subject: [PATCH 339/380] Remove @escapeNotVerified from documentation

As `@escapeNotVerified` must not be used from 2.2 going onwards (also compare [2.1](http://devdocs.magento.com/guides/v2.1/frontend-dev-guide/templates/template-security.html#Static-Test) and [2.2](http://devdocs.magento.com/guides/v2.2/frontend-dev-guide/templates/template-security.html) documentation), the inline documentation for this test has to be updated.
---
 .../Magento/Test/Php/XssPhtmlTemplateTest.php      | 14 ++++++--------
 1 file changed, 6 insertions(+), 8 deletions(-)

diff --git a/dev/tests/static/testsuite/Magento/Test/Php/XssPhtmlTemplateTest.php b/dev/tests/static/testsuite/Magento/Test/Php/XssPhtmlTemplateTest.php
index 34531b6b7c6..fac14af5eca 100644
--- a/dev/tests/static/testsuite/Magento/Test/Php/XssPhtmlTemplateTest.php
+++ b/dev/tests/static/testsuite/Magento/Test/Php/XssPhtmlTemplateTest.php
@@ -27,16 +27,14 @@ class XssPhtmlTemplateTest extends \PHPUnit\Framework\TestCase
              * Static test will cover the following cases:
              *
              * 1. /\* @noEscape \*\/ before output. Output doesn't require escaping. Test is green.
-             * 2. /\* @escapeNotVerified \*\/ before output. Output escaping is not checked and
-             *    should be verified. Test is green.
-             * 3. Methods which contains "html" in their names (e.g. echo $object->{suffix}Html{postfix}() ).
+             * 2. Methods which contains "html" in their names (e.g. echo $object->{suffix}Html{postfix}() ).
              *    Data is ready for the HTML output. Test is green.
-             * 4. AbstractBlock methods escapeHtml, escapeUrl, escapeQuote, escapeXssInUrl are allowed. Test is green.
-             * 5. Type casting and php function count() are allowed
+             * 3. AbstractBlock methods escapeHtml, escapeUrl, escapeQuote, escapeXssInUrl are allowed. Test is green.
+             * 4. Type casting and php function count() are allowed
              *    (e.g. echo (int)$var, echo (float)$var, echo (bool)$var, echo count($var)). Test is green.
-             * 6. Output in single quotes (e.g. echo 'some text'). Test is green.
-             * 7. Output in double quotes without variables (e.g. echo "some text"). Test is green.
-             * 8. Other of p.1-7. Output is not escaped. Test is red.
+             * 5. Output in single quotes (e.g. echo 'some text'). Test is green.
+             * 6. Output in double quotes without variables (e.g. echo "some text"). Test is green.
+             * 7. Other of p.1-6. Output is not escaped. Test is red.
              *
              * @param string $file
              */
-- 
GitLab


From 35b278da1b2ae87c09b54aa88c44a4b1f6aca25b Mon Sep 17 00:00:00 2001
From: Oleksii Korshenko <okorshenko@magento.com>
Date: Mon, 11 Dec 2017 21:05:53 +0200
Subject: [PATCH 340/380] MAGETWO-84764: NewRelic: Disables Module Deployments,
 Creates new Deploy Marker Command #12477

 - fixed SVC
---
 .../NewRelicReporting/Console/Command/DeployMarker.php        | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/app/code/Magento/NewRelicReporting/Console/Command/DeployMarker.php b/app/code/Magento/NewRelicReporting/Console/Command/DeployMarker.php
index 9b19cc957ae..795028cffd1 100644
--- a/app/code/Magento/NewRelicReporting/Console/Command/DeployMarker.php
+++ b/app/code/Magento/NewRelicReporting/Console/Command/DeployMarker.php
@@ -17,12 +17,12 @@ class DeployMarker extends Command
     /**
      * @var DeploymentsFactory
      */
-    protected $deploymentsFactory;
+    private $deploymentsFactory;
 
     /**
      * @var ServiceShellUser
      */
-    protected $serviceShellUser;
+    private $serviceShellUser;
 
     /**
      * Initialize dependencies.
-- 
GitLab


From cf7477ab8dfa08285c6b8ee5561b6b572baac24e Mon Sep 17 00:00:00 2001
From: serhii balko <serhii.balko@transoftgroup.com>
Date: Tue, 12 Dec 2017 09:40:00 +0200
Subject: [PATCH 341/380] #8647: [GitHub] Order of how arguments are merged in
 multiple di.xml-files causes unexpected results

---
 .../Webapi/Rest/Response/RendererFactory.php  | 42 +++++++++++++------
 .../Rest/Response/RendererFactoryTest.php     |  2 +-
 2 files changed, 30 insertions(+), 14 deletions(-)

diff --git a/lib/internal/Magento/Framework/Webapi/Rest/Response/RendererFactory.php b/lib/internal/Magento/Framework/Webapi/Rest/Response/RendererFactory.php
index 938d4ef6d1b..547b8fcb036 100644
--- a/lib/internal/Magento/Framework/Webapi/Rest/Response/RendererFactory.php
+++ b/lib/internal/Magento/Framework/Webapi/Rest/Response/RendererFactory.php
@@ -71,20 +71,10 @@ class RendererFactory
         if (!is_array($acceptTypes)) {
             $acceptTypes = [$acceptTypes];
         }
-        // If Accept type = '*/*' then return default renderer.
-        $defaultRenderer = isset($this->_renders['default']) ? $this->_renders['default'] : null; 
         foreach ($acceptTypes as $acceptType) {
-            if ($acceptType == '*/*' && $defaultRenderer) {
-                return $defaultRenderer['model'];
-            }
-            foreach ($this->_renders as $rendererConfig) {
-                $rendererType = $rendererConfig['type'];
-                if ($acceptType == $rendererType || $acceptType == current(
-                    explode('/', $rendererType)
-                ) . '/*' || $acceptType == '*/*'
-                ) {
-                    return $rendererConfig['model'];
-                }
+            $renderer = $this->getRendererConfig($acceptType);
+            if ($renderer !== null) {
+                return $renderer['model'];
             }
         }
         /** If server does not have renderer for any of the accepted types it SHOULD send 406 (not acceptable). */
@@ -98,4 +88,30 @@ class RendererFactory
             \Magento\Framework\Webapi\Exception::HTTP_NOT_ACCEPTABLE
         );
     }
+
+    /**
+     * Get renderer config by accept type.
+     *
+     * @param string $acceptType
+     * @return array|null
+     */
+    private function getRendererConfig($acceptType)
+    {
+        // If Accept type = '*/*' then return default renderer.
+        if ($acceptType == '*/*' && isset($this->_renders['default'])) {
+            return $this->_renders['default'];
+        }
+        
+        foreach ($this->_renders as $rendererConfig) {
+            $rendererType = $rendererConfig['type'];
+            if ($acceptType == $rendererType
+                || $acceptType == current(explode('/', $rendererType)) . '/*'
+                || $acceptType == '*/*'
+            ) {
+                return $rendererConfig;
+            }
+        }
+
+        return null;
+    }
 }
diff --git a/lib/internal/Magento/Framework/Webapi/Test/Unit/Rest/Response/RendererFactoryTest.php b/lib/internal/Magento/Framework/Webapi/Test/Unit/Rest/Response/RendererFactoryTest.php
index 7b50a6f0224..dd7aa845f30 100644
--- a/lib/internal/Magento/Framework/Webapi/Test/Unit/Rest/Response/RendererFactoryTest.php
+++ b/lib/internal/Magento/Framework/Webapi/Test/Unit/Rest/Response/RendererFactoryTest.php
@@ -35,7 +35,7 @@ class RendererFactoryTest extends \PHPUnit\Framework\TestCase
                 'model' => \Magento\Framework\Webapi\Rest\Response\Renderer\Json::class,
             ],
             'default' => [
-                'type' => '*/*', 
+                'type' => '*/*',
                 'model' => \Magento\Framework\Webapi\Rest\Response\Renderer\Json::class
             ],
         ];
-- 
GitLab


From 059c8b4374babf0f8c437cfb1cddd63b15d48522 Mon Sep 17 00:00:00 2001
From: nmalevanec <mikola.malevanec@transoftgroup.com>
Date: Tue, 12 Dec 2017 10:44:23 +0200
Subject: [PATCH 342/380] 2907: Integration Test Annotation magentoAppArea
 breaks with some valid values.

---
 .../integration/framework/Magento/TestFramework/Application.php  | 1 -
 1 file changed, 1 deletion(-)

diff --git a/dev/tests/integration/framework/Magento/TestFramework/Application.php b/dev/tests/integration/framework/Magento/TestFramework/Application.php
index e8ad9d156a3..368d756b880 100644
--- a/dev/tests/integration/framework/Magento/TestFramework/Application.php
+++ b/dev/tests/integration/framework/Magento/TestFramework/Application.php
@@ -622,7 +622,6 @@ class Application
             \Magento\Framework\App\Area::AREA_WEBAPI_REST,
             \Magento\Framework\App\Area::AREA_WEBAPI_SOAP,
             \Magento\Framework\App\Area::AREA_CRONTAB,
-
         ];
         if (in_array($areaCode, $areasForPartialLoading, true)) {
             $app->getArea($areaCode)->load(\Magento\Framework\App\Area::PART_CONFIG);
-- 
GitLab


From 390d751acf1f3b1f097933c232b1ee35fda96bbf Mon Sep 17 00:00:00 2001
From: nmalevanec <mikola.malevanec@transoftgroup.com>
Date: Tue, 12 Dec 2017 10:54:39 +0200
Subject: [PATCH 343/380] 12535: Product change sku via repository.

---
 .../testsuite/Magento/Catalog/Model/ProductRepositoryTest.php | 4 ----
 1 file changed, 4 deletions(-)

diff --git a/dev/tests/integration/testsuite/Magento/Catalog/Model/ProductRepositoryTest.php b/dev/tests/integration/testsuite/Magento/Catalog/Model/ProductRepositoryTest.php
index cbd2a90b4d7..9518e9c0cdf 100644
--- a/dev/tests/integration/testsuite/Magento/Catalog/Model/ProductRepositoryTest.php
+++ b/dev/tests/integration/testsuite/Magento/Catalog/Model/ProductRepositoryTest.php
@@ -34,7 +34,6 @@ class ProductRepositoryTest extends \PHPUnit\Framework\TestCase
      * Test Product Repository can change(update) "sku" for given product.
      *
      * @magentoDataFixture Magento/Catalog/_files/product_simple.php
-     * @magentoDbIsolation enabled
      * @magentoAppArea adminhtml
      */
     public function testUpdateProductSku()
@@ -49,8 +48,5 @@ class ProductRepositoryTest extends \PHPUnit\Framework\TestCase
         $updatedProduct = Bootstrap::getObjectManager()->create(Product::class);
         $updatedProduct->load($productId);
         self::assertSame($newSku, $updatedProduct->getSku());
-
-        //clean up.
-        $this->productRepository->delete($updatedProduct);
     }
 }
-- 
GitLab


From 12410d6d1ce1ae0ee4a40de61eb5366fd5213fed Mon Sep 17 00:00:00 2001
From: nmalevanec <mikola.malevanec@transoftgroup.com>
Date: Tue, 12 Dec 2017 11:35:34 +0200
Subject: [PATCH 344/380] 5738: SearchCriteriaBuilder builds wrong criteria
 (ORDER BY part).

---
 .../CollectionProcessor/SortingProcessor.php     | 10 ++++++----
 .../CollectionProcessor/SortingProcessorTest.php | 16 +++++++++++++---
 2 files changed, 19 insertions(+), 7 deletions(-)

diff --git a/lib/internal/Magento/Framework/Api/SearchCriteria/CollectionProcessor/SortingProcessor.php b/lib/internal/Magento/Framework/Api/SearchCriteria/CollectionProcessor/SortingProcessor.php
index 8a69f712378..7598c4eb4ab 100644
--- a/lib/internal/Magento/Framework/Api/SearchCriteria/CollectionProcessor/SortingProcessor.php
+++ b/lib/internal/Magento/Framework/Api/SearchCriteria/CollectionProcessor/SortingProcessor.php
@@ -74,10 +74,12 @@ class SortingProcessor implements CollectionProcessorInterface
         /** @var SortOrder $sortOrder */
         foreach ($sortOrders as $sortOrder) {
             $field = $this->getFieldMapping($sortOrder->getField());
-            $order = $sortOrder->getDirection() == SortOrder::SORT_ASC
-                ? Collection::SORT_ORDER_ASC
-                : Collection::SORT_ORDER_DESC;
-            $collection->addOrder($field, $order);
+            if (null !== $field) {
+                $order = $sortOrder->getDirection() == SortOrder::SORT_ASC
+                    ? Collection::SORT_ORDER_ASC
+                    : Collection::SORT_ORDER_DESC;
+                $collection->addOrder($field, $order);
+            }
         }
     }
 
diff --git a/lib/internal/Magento/Framework/Api/Test/Unit/SearchCriteria/CollectionProcessor/SortingProcessorTest.php b/lib/internal/Magento/Framework/Api/Test/Unit/SearchCriteria/CollectionProcessor/SortingProcessorTest.php
index 01b272a9e91..d8d4e480474 100644
--- a/lib/internal/Magento/Framework/Api/Test/Unit/SearchCriteria/CollectionProcessor/SortingProcessorTest.php
+++ b/lib/internal/Magento/Framework/Api/Test/Unit/SearchCriteria/CollectionProcessor/SortingProcessorTest.php
@@ -76,15 +76,25 @@ class SortingProcessorTest extends \PHPUnit\Framework\TestCase
             ->method('getDirection')
             ->willReturn($orderThreeDirection);
 
+        /** @var SortOrder|\PHPUnit_Framework_MockObject_MockObject $sortOrderThreeMock */
+        $sortOrderFourMock = $this->getMockBuilder(SortOrder::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $sortOrderFourMock->expects($this->once())
+            ->method('getField')
+            ->willReturn(null);
+        $sortOrderFourMock->expects($this->never())
+            ->method('getDirection');
+
         /** @var SearchCriteriaInterface|\PHPUnit_Framework_MockObject_MockObject $searchCriteriaMock */
         $searchCriteriaMock = $this->getMockBuilder(SearchCriteriaInterface::class)
             ->getMock();
 
         $searchCriteriaMock->expects($this->exactly(2))
             ->method('getSortOrders')
-            ->willReturn([$sortOrderOneMock, $sortOrderTwoMock, $sortOrderThreeMock]);
+            ->willReturn([$sortOrderOneMock, $sortOrderTwoMock, $sortOrderThreeMock, $sortOrderFourMock]);
 
-        /** @var AbstractDb|\PHPUnit_Framework_MockObject_MockObject $searchCriteriarMock */
+        /** @var AbstractDb|\PHPUnit_Framework_MockObject_MockObject $collectionMock */
         $collectionMock = $this->getMockBuilder(AbstractDb::class)
             ->disableOriginalConstructor()
             ->getMock();
@@ -130,7 +140,7 @@ class SortingProcessorTest extends \PHPUnit\Framework\TestCase
             ->method('getSortOrders')
             ->willReturn([]);
 
-        /** @var AbstractDb|\PHPUnit_Framework_MockObject_MockObject $searchCriteriarMock */
+        /** @var AbstractDb|\PHPUnit_Framework_MockObject_MockObject $collectionMock */
         $collectionMock = $this->getMockBuilder(AbstractDb::class)
             ->disableOriginalConstructor()
             ->getMock();
-- 
GitLab


From 93df8bf33a25756cbaedfc686be3e9f982df6ff8 Mon Sep 17 00:00:00 2001
From: Ievgen Shakhsuvarov <ishakhsuvarov@users.noreply.github.com>
Date: Tue, 12 Dec 2017 13:58:50 +0200
Subject: [PATCH 345/380] Update ProductRepository.php

---
 app/code/Magento/Catalog/Model/ProductRepository.php | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/app/code/Magento/Catalog/Model/ProductRepository.php b/app/code/Magento/Catalog/Model/ProductRepository.php
index 90b18031c14..e76bba52b4a 100644
--- a/app/code/Magento/Catalog/Model/ProductRepository.php
+++ b/app/code/Magento/Catalog/Model/ProductRepository.php
@@ -491,7 +491,7 @@ class ProductRepository implements \Magento\Catalog\Api\ProductRepositoryInterfa
      * @throws LocalizedException
      * @SuppressWarnings(PHPMD.CyclomaticComplexity)
      */
-    protected function processMediaGallery(ProductInterface $product, array $mediaGalleryEntries)
+    protected function processMediaGallery(ProductInterface $product, $mediaGalleryEntries)
     {
         $existingMediaGallery = $product->getMediaGallery('images');
         $newEntries = [];
-- 
GitLab


From 70122b57918fd8709f48afedbc85c1de2802a71b Mon Sep 17 00:00:00 2001
From: nmalevanec <mikola.malevanec@transoftgroup.com>
Date: Tue, 12 Dec 2017 14:47:14 +0200
Subject: [PATCH 346/380] 2907: magento/magento2#2907: Integration Test
 Annotation magentoAppArea breaks with some valid values

---
 .../Magento/Test/Annotation/AppAreaTest.php   |  52 +++++-
 .../Magento/Test/ApplicationTest.php          | 171 ++++++++++++++++--
 2 files changed, 210 insertions(+), 13 deletions(-)

diff --git a/dev/tests/integration/framework/tests/unit/testsuite/Magento/Test/Annotation/AppAreaTest.php b/dev/tests/integration/framework/tests/unit/testsuite/Magento/Test/Annotation/AppAreaTest.php
index a4c8816b13e..dd361a5d0ed 100644
--- a/dev/tests/integration/framework/tests/unit/testsuite/Magento/Test/Annotation/AppAreaTest.php
+++ b/dev/tests/integration/framework/tests/unit/testsuite/Magento/Test/Annotation/AppAreaTest.php
@@ -3,8 +3,11 @@
  * Copyright © Magento, Inc. All rights reserved.
  * See COPYING.txt for license details.
  */
+
 namespace Magento\Test\Annotation;
 
+use Magento\Framework\App\Area;
+
 class AppAreaTest extends \PHPUnit\Framework\TestCase
 {
     /**
@@ -13,12 +16,12 @@ class AppAreaTest extends \PHPUnit\Framework\TestCase
     protected $_object;
 
     /**
-     * @var \PHPUnit_Framework_MockObject_MockObject
+     * @var \Magento\TestFramework\Application|\PHPUnit_Framework_MockObject_MockObject
      */
     protected $_applicationMock;
 
     /**
-     * @var \PHPUnit_Framework_MockObject_MockObject
+     * @var \PHPUnit\Framework\TestCase|\PHPUnit_Framework_MockObject_MockObject
      */
     protected $_testCaseMock;
 
@@ -69,6 +72,22 @@ class AppAreaTest extends \PHPUnit\Framework\TestCase
         $this->_object->startTest($this->_testCaseMock);
     }
 
+    /**
+     * Check startTest() with different allowed area codes.
+     *
+     * @dataProvider startTestWithDifferentAreaCodes
+     * @param string $areaCode
+     */
+    public function testStartTestWithDifferentAreaCodes(string $areaCode)
+    {
+        $annotations = ['method' => ['magentoAppArea' => [$areaCode]]];
+        $this->_testCaseMock->expects($this->once())->method('getAnnotations')->will($this->returnValue($annotations));
+        $this->_applicationMock->expects($this->any())->method('getArea')->willReturn(null);
+        $this->_applicationMock->expects($this->once())->method('reinitialize');
+        $this->_applicationMock->expects($this->once())->method('loadArea')->with($areaCode);
+        $this->_object->startTest($this->_testCaseMock);
+    }
+
     public function testStartTestPreventDoubleAreaLoadingAfterReinitialization()
     {
         $annotations = ['method' => ['magentoAppArea' => ['global']]];
@@ -89,4 +108,33 @@ class AppAreaTest extends \PHPUnit\Framework\TestCase
         $this->_applicationMock->expects($this->never())->method('loadArea');
         $this->_object->startTest($this->_testCaseMock);
     }
+
+    /**
+     *  Provide test data for testStartTestWithDifferentAreaCodes().
+     *
+     * @return array
+     */
+    public function startTestWithDifferentAreaCodes()
+    {
+        return [
+            [
+                'area_code' => Area::AREA_GLOBAL,
+            ],
+            [
+                'area_code' => Area::AREA_ADMINHTML,
+            ],
+            [
+                'area_code' => Area::AREA_FRONTEND,
+            ],
+            [
+                'area_code' => Area::AREA_WEBAPI_REST,
+            ],
+            [
+                'area_code' => Area::AREA_WEBAPI_SOAP,
+            ],
+            [
+                'area_code' => Area::AREA_CRONTAB,
+            ],
+        ];
+    }
 }
diff --git a/dev/tests/integration/framework/tests/unit/testsuite/Magento/Test/ApplicationTest.php b/dev/tests/integration/framework/tests/unit/testsuite/Magento/Test/ApplicationTest.php
index f8f49613c41..ee794fc262a 100644
--- a/dev/tests/integration/framework/tests/unit/testsuite/Magento/Test/ApplicationTest.php
+++ b/dev/tests/integration/framework/tests/unit/testsuite/Magento/Test/ApplicationTest.php
@@ -3,39 +3,71 @@
  * Copyright © Magento, Inc. All rights reserved.
  * See COPYING.txt for license details.
  */
+
 namespace Magento\Test;
 
+use Magento\Framework\App\Area;
+use Magento\Framework\App\AreaList;
 use Magento\Framework\App\Bootstrap;
+use Magento\Framework\App\ObjectManager\ConfigLoader;
 use Magento\Framework\App\State;
+use Magento\Framework\Autoload\ClassLoaderWrapper;
+use Magento\Framework\Config\Scope;
+use Magento\Framework\ObjectManagerInterface;
+use Magento\Framework\Shell;
+use Magento\TestFramework\Application;
 
+/**
+ * Provide tests for \Magento\TestFramework\Application.
+ */
 class ApplicationTest extends \PHPUnit\Framework\TestCase
 {
     /**
-     * @covers \Magento\TestFramework\Application::getTempDir
-     * @covers \Magento\TestFramework\Application::getDbInstance()
-     * @covers \Magento\TestFramework\Application::getInitParams()
+     * Test subject.
+     *
+     * @var Application
      */
-    public function testConstructor()
+    private $subject;
+
+    /**
+     * @var string
+     */
+    private $tempDir;
+
+    /**
+     * @inheritdoc
+     */
+    protected function setUp()
     {
-        $shell = $this->createMock(\Magento\Framework\Shell::class);
-        $autoloadWrapper = $this->getMockBuilder(\Magento\Framework\Autoload\ClassLoaderWrapper::class)
+        /** @var Shell|\PHPUnit_Framework_MockObject_MockObject $shell */
+        $shell = $this->createMock(Shell::class);
+        /** @var ClassLoaderWrapper|\PHPUnit_Framework_MockObject_MockObject $autoloadWrapper */
+        $autoloadWrapper = $this->getMockBuilder(ClassLoaderWrapper::class)
             ->disableOriginalConstructor()->getMock();
-        $tempDir = '/temp/dir';
+        $this->tempDir = '/temp/dir';
         $appMode = \Magento\Framework\App\State::MODE_DEVELOPER;
 
-        $object = new \Magento\TestFramework\Application(
+        $this->subject = new Application(
             $shell,
-            $tempDir,
+            $this->tempDir,
             'config.php',
             'global-config.php',
             '',
             $appMode,
             $autoloadWrapper
         );
+    }
 
-        $this->assertEquals($tempDir, $object->getTempDir(), 'Temp directory is not set in Application');
+    /**
+     * @covers \Magento\TestFramework\Application::getTempDir
+     * @covers \Magento\TestFramework\Application::getDbInstance()
+     * @covers \Magento\TestFramework\Application::getInitParams()
+     */
+    public function testConstructor()
+    {
+        $this->assertEquals($this->tempDir, $this->subject->getTempDir(), 'Temp directory is not set in Application');
 
-        $initParams = $object->getInitParams();
+        $initParams = $this->subject->getInitParams();
         $this->assertInternalType('array', $initParams, 'Wrong initialization parameters type');
         $this->assertArrayHasKey(
             Bootstrap::INIT_PARAM_FILESYSTEM_DIR_PATHS,
@@ -49,4 +81,121 @@ class ApplicationTest extends \PHPUnit\Framework\TestCase
             'Wrong application mode configured'
         );
     }
+
+    /**
+     * Test \Magento\TestFramework\Application will correctly load different areas.
+     *
+     * @dataProvider loadAreaDataProvider
+     *
+     * @param string $areaCode
+     * @param bool $partialLoad
+     */
+    public function testLoadArea(string $areaCode, bool $partialLoad)
+    {
+        $objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
+        /** @var ObjectManagerInterface|\PHPUnit_Framework_MockObject_MockObject $objectManagerMock */
+        $objectManagerMock = $this->getMockBuilder(ObjectManagerInterface::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $configScope = $this->getMockBuilder(Scope::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $configScope->expects($this->once())
+            ->method('setCurrentScope')
+            ->with($this->identicalTo($areaCode));
+        $configLoader = $this->getMockBuilder(ConfigLoader::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $configLoader->expects($this->once())
+            ->method('load')
+            ->with($this->identicalTo($areaCode))
+            ->willReturn([]);
+        $areaList = $this->getMockBuilder(AreaList::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $area = $this->getMockBuilder(Area::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $appState = $this->getMockBuilder(State::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $objectManagerMock->expects($this->once())
+            ->method('configure')
+            ->with($this->identicalTo([]));
+        if ($partialLoad) {
+            $objectManagerMock->expects($this->exactly(3))
+                ->method('get')
+                ->willReturnOnConsecutiveCalls(
+                    $configScope,
+                    $configLoader,
+                    $areaList
+                );
+            $areaList->expects($this->once())
+                ->method('getArea')
+                ->with($this->identicalTo($areaCode))
+                ->willReturn($area);
+            $area->expects($this->once())
+                ->method('load')
+                ->with($this->identicalTo(Area::PART_CONFIG));
+        } else {
+            $area->expects($this->once())
+                ->method('load');
+            $appState->expects($this->once())
+                ->method('setAreaCode')
+                ->with($this->identicalTo($areaCode));
+            $areaList->expects($this->once())
+                ->method('getArea')
+                ->with($this->identicalTo($areaCode))
+                ->willReturn($area);
+            $objectManagerMock->expects($this->exactly(5))
+                ->method('get')
+                ->willReturnOnConsecutiveCalls(
+                    $configScope,
+                    $configLoader,
+                    $areaList,
+                    $appState,
+                    $areaList
+                );
+        }
+        \Magento\TestFramework\Helper\Bootstrap::setObjectManager($objectManagerMock);
+        $this->subject->loadArea($areaCode);
+
+        //restore Object Manager to successfully finish the test.
+        \Magento\TestFramework\Helper\Bootstrap::setObjectManager($objectManager);
+    }
+
+    /**
+     * Provide test data for testLoadArea().
+     *
+     * @return array
+     */
+    public function loadAreaDataProvider()
+    {
+        return [
+            [
+                'area_code' => Area::AREA_GLOBAL,
+                'partial_load' => true,
+            ],
+            [
+                'area_code' => Area::AREA_ADMINHTML,
+                'partial_load' => false,
+            ],
+            [
+                'area_code' => Area::AREA_FRONTEND,
+                'partial_load' => false,
+            ],
+            [
+                'area_code' => Area::AREA_WEBAPI_REST,
+                'partial_load' => true,
+            ],
+            [
+                'area_code' => Area::AREA_WEBAPI_SOAP,
+                'partial_load' => true,
+            ],
+            [
+                'area_code' => Area::AREA_CRONTAB,
+                'partial_load' => true,
+            ],
+        ];
+    }
 }
-- 
GitLab


From cef5991721a1c85bc937b9d4d33fe79417ccc55e Mon Sep 17 00:00:00 2001
From: Miguel Balparda <mbalparda@nexcess.net>
Date: Tue, 12 Dec 2017 10:18:46 -0300
Subject: [PATCH 347/380] Removed old Connect css class

---
 .../Magento/Marketplace/view/adminhtml/templates/index.phtml    | 2 +-
 .../backend/Magento_Marketplace/web/css/source/_module.less     | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/app/code/Magento/Marketplace/view/adminhtml/templates/index.phtml b/app/code/Magento/Marketplace/view/adminhtml/templates/index.phtml
index ab84e91170e..a37306bf1ee 100644
--- a/app/code/Magento/Marketplace/view/adminhtml/templates/index.phtml
+++ b/app/code/Magento/Marketplace/view/adminhtml/templates/index.phtml
@@ -46,7 +46,7 @@
         </div>
         <div class="col-m-3">
             <img
-                class="magento-connect-logo"
+                class="magento-marketplace-logo"
                 src="<?php /* @escapeNotVerified */ echo $block
                     ->getViewFileUrl('Magento_Marketplace::partners/images/magento-marketplace.svg');
                 ?>"
diff --git a/app/design/adminhtml/Magento/backend/Magento_Marketplace/web/css/source/_module.less b/app/design/adminhtml/Magento/backend/Magento_Marketplace/web/css/source/_module.less
index 6afe96c7f9e..d4f918567e5 100644
--- a/app/design/adminhtml/Magento/backend/Magento_Marketplace/web/css/source/_module.less
+++ b/app/design/adminhtml/Magento/backend/Magento_Marketplace/web/css/source/_module.less
@@ -61,7 +61,7 @@
 }
 
 .partners-footer {
-    .magento-connect-logo {
+    .magento-marketplace-logo {
         float: right;
         margin-bottom: 1px;
     }
-- 
GitLab


From 9e85ead7e15d9f454a58cd9906dd6c36f2de0829 Mon Sep 17 00:00:00 2001
From: RomanKis <romaikiss@gmail.com>
Date: Tue, 12 Dec 2017 14:59:17 +0200
Subject: [PATCH 348/380] 8204: catalog:images:resize = getimagesize(): Read
 error!

---
 .../Console/Command/ImagesResizeCommand.php   | 28 +++++++---
 .../Catalog/Model/Product/Image/Cache.php     | 33 ++++++++++--
 .../Command/ImagesResizeCommandTest.php       | 40 ++++++++++++++
 .../Unit/Model/Product/Image/CacheTest.php    | 52 +++++++++++++++++++
 4 files changed, 142 insertions(+), 11 deletions(-)

diff --git a/app/code/Magento/Catalog/Console/Command/ImagesResizeCommand.php b/app/code/Magento/Catalog/Console/Command/ImagesResizeCommand.php
index 49f82562f33..b0c93ee3283 100644
--- a/app/code/Magento/Catalog/Console/Command/ImagesResizeCommand.php
+++ b/app/code/Magento/Catalog/Console/Command/ImagesResizeCommand.php
@@ -5,6 +5,9 @@
  */
 namespace Magento\Catalog\Console\Command;
 
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Output\OutputInterface;
+
 class ImagesResizeCommand extends \Symfony\Component\Console\Command\Command
 {
     /**
@@ -58,10 +61,8 @@ class ImagesResizeCommand extends \Symfony\Component\Console\Command\Command
     /**
      * {@inheritdoc}
      */
-    protected function execute(
-        \Symfony\Component\Console\Input\InputInterface $input,
-        \Symfony\Component\Console\Output\OutputInterface $output
-    ) {
+    protected function execute(InputInterface $input, OutputInterface $output)
+    {
         $this->appState->setAreaCode(\Magento\Framework\App\Area::AREA_GLOBAL);
 
         /** @var \Magento\Catalog\Model\ResourceModel\Product\Collection $productCollection */
@@ -73,6 +74,7 @@ class ImagesResizeCommand extends \Symfony\Component\Console\Command\Command
             return \Magento\Framework\Console\Cli::RETURN_SUCCESS;
         }
 
+        $exceptionMessage = '';
         try {
             foreach ($productIds as $productId) {
                 try {
@@ -82,9 +84,13 @@ class ImagesResizeCommand extends \Symfony\Component\Console\Command\Command
                     continue;
                 }
 
-                /** @var \Magento\Catalog\Model\Product\Image\Cache $imageCache */
-                $imageCache = $this->imageCacheFactory->create();
-                $imageCache->generate($product);
+                try {
+                    /** @var \Magento\Catalog\Model\Product\Image\Cache $imageCache */
+                    $imageCache = $this->imageCacheFactory->create();
+                    $imageCache->generate($product);
+                } catch (\Exception $e) {
+                    $exceptionMessage = $e->getMessage();
+                }
 
                 $output->write(".");
             }
@@ -95,6 +101,12 @@ class ImagesResizeCommand extends \Symfony\Component\Console\Command\Command
         }
 
         $output->write("\n");
-        $output->writeln("<info>Product images resized successfully</info>");
+        $output->writeln("<info>Product images resized successfully.</info>");
+
+        if ($exceptionMessage) {
+            $output->writeln("<comment>{$exceptionMessage}</comment>");
+        }
+
+        return 0;
     }
 }
diff --git a/app/code/Magento/Catalog/Model/Product/Image/Cache.php b/app/code/Magento/Catalog/Model/Product/Image/Cache.php
index c5e5e0ecac4..cd66257657c 100644
--- a/app/code/Magento/Catalog/Model/Product/Image/Cache.php
+++ b/app/code/Magento/Catalog/Model/Product/Image/Cache.php
@@ -10,6 +10,7 @@ use Magento\Catalog\Model\Product;
 use Magento\Theme\Model\ResourceModel\Theme\Collection as ThemeCollection;
 use Magento\Framework\App\Area;
 use Magento\Framework\View\ConfigInterface;
+use Psr\Log\LoggerInterface;
 
 class Cache
 {
@@ -33,19 +34,29 @@ class Cache
      */
     protected $data = [];
 
+    /**
+     * Logger.
+     *
+     * @var LoggerInterface
+     */
+    private $logger;
+
     /**
      * @param ConfigInterface $viewConfig
      * @param ThemeCollection $themeCollection
      * @param ImageHelper $imageHelper
+     * @param LoggerInterface $logger
      */
     public function __construct(
         ConfigInterface $viewConfig,
         ThemeCollection $themeCollection,
-        ImageHelper $imageHelper
+        ImageHelper $imageHelper,
+        LoggerInterface $logger = null
     ) {
         $this->viewConfig = $viewConfig;
         $this->themeCollection = $themeCollection;
         $this->imageHelper = $imageHelper;
+        $this->logger = $logger ?: \Magento\Framework\App\ObjectManager::getInstance()->get(LoggerInterface::class);
     }
 
     /**
@@ -74,21 +85,37 @@ class Cache
     }
 
     /**
-     * Resize product images and save results to image cache
+     * Resize product images and save results to image cache.
      *
      * @param Product $product
+     *
      * @return $this
+     * @throws \Exception
      */
     public function generate(Product $product)
     {
+        $isException = false;
         $galleryImages = $product->getMediaGalleryImages();
         if ($galleryImages) {
             foreach ($galleryImages as $image) {
                 foreach ($this->getData() as $imageData) {
-                    $this->processImageData($product, $imageData, $image->getFile());
+                    try {
+                        $this->processImageData($product, $imageData, $image->getFile());
+                    } catch (\Exception $e) {
+                        $isException = true;
+                        $this->logger->error($e->getMessage());
+                        $this->logger->error(__('The image could not be resized: ') . $image->getPath());
+                    }
                 }
             }
         }
+
+        if ($isException === true) {
+            throw new \Magento\Framework\Exception\RuntimeException(
+                __('Some images could not be resized. See log file for details.')
+            );
+        }
+
         return $this;
     }
 
diff --git a/app/code/Magento/Catalog/Test/Unit/Console/Command/ImagesResizeCommandTest.php b/app/code/Magento/Catalog/Test/Unit/Console/Command/ImagesResizeCommandTest.php
index 457ba7b9452..b4687e18daf 100644
--- a/app/code/Magento/Catalog/Test/Unit/Console/Command/ImagesResizeCommandTest.php
+++ b/app/code/Magento/Catalog/Test/Unit/Console/Command/ImagesResizeCommandTest.php
@@ -208,4 +208,44 @@ class ImagesResizeCommandTest extends \PHPUnit\Framework\TestCase
             ->method('create')
             ->willReturn($this->imageCache);
     }
+
+    public function testExecuteWithExceptionInGenerate()
+    {
+        $productsIds = [1, 2];
+
+        $this->appState->expects($this->once())
+            ->method('setAreaCode')
+            ->with(Area::AREA_GLOBAL)
+            ->willReturnSelf();
+
+        $this->productCollection->expects($this->once())
+            ->method('getAllIds')
+            ->willReturn($productsIds);
+
+        $productMock = $this->getMockBuilder(\Magento\Catalog\Model\Product::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $this->productRepository->expects($this->at(0))
+            ->method('getById')
+            ->with($productsIds[0])
+            ->willReturn($productMock);
+        $this->productRepository->expects($this->at(1))
+            ->method('getById')
+            ->with($productsIds[1])
+            ->willThrowException(new NoSuchEntityException());
+
+        $this->imageCache->expects($this->exactly(count($productsIds) - 1))
+            ->method('generate')
+            ->with($productMock)
+            ->willThrowException(new \Magento\Framework\Exception\RuntimeException(__('Some text is here.')));
+
+        $commandTester = new CommandTester($this->command);
+        $commandTester->execute([]);
+
+        $this->assertContains(
+            'Some text is here.',
+            $commandTester->getDisplay()
+        );
+    }
 }
diff --git a/app/code/Magento/Catalog/Test/Unit/Model/Product/Image/CacheTest.php b/app/code/Magento/Catalog/Test/Unit/Model/Product/Image/CacheTest.php
index 3ff3601da8c..428ef432888 100644
--- a/app/code/Magento/Catalog/Test/Unit/Model/Product/Image/CacheTest.php
+++ b/app/code/Magento/Catalog/Test/Unit/Model/Product/Image/CacheTest.php
@@ -189,6 +189,58 @@ class CacheTest extends \PHPUnit\Framework\TestCase
         $this->model->generate($this->product);
     }
 
+    /**
+     * @expectedException \Magento\Framework\Exception\RuntimeException
+     */
+    public function testGenerateWithException()
+    {
+        $imageFile = 'image.jpg';
+        $imageItem = $this->objectManager->getObject(
+            \Magento\Framework\DataObject::class,
+            [
+                'data' => ['file' => $imageFile]
+            ]
+        );
+        $this->mediaGalleryCollection->expects($this->once())
+            ->method('getIterator')
+            ->willReturn(new \ArrayIterator([$imageItem]));
+
+        $this->product->expects($this->atLeastOnce())
+            ->method('getMediaGalleryImages')
+            ->willReturn($this->mediaGalleryCollection);
+
+        $data = $this->getTestData();
+        $this->config->expects($this->once())
+            ->method('getMediaEntities')
+            ->with('Magento_Catalog')
+            ->willReturn($data);
+
+        $themeMock = $this->getMockBuilder(\Magento\Theme\Model\Theme::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $themeMock->expects($this->exactly(3))
+            ->method('getCode')
+            ->willReturn('Magento\theme');
+
+        $this->themeCollection->expects($this->once())
+            ->method('loadRegisteredThemes')
+            ->willReturn([$themeMock]);
+
+        $this->viewConfig->expects($this->once())
+            ->method('getViewConfig')
+            ->with([
+                'area' => Area::AREA_FRONTEND,
+                'themeModel' => $themeMock,
+            ])
+            ->willReturn($this->config);
+
+        $this->imageHelper->expects($this->exactly(3))
+            ->method('init')
+            ->willThrowException(new \Exception('Some text '));
+
+        $this->model->generate($this->product);
+    }
+
     /**
      * @return array
      */
-- 
GitLab


From f5bdc45addf879d2006432a47fb327c0a4962db4 Mon Sep 17 00:00:00 2001
From: RomanKis <romaikiss@gmail.com>
Date: Tue, 12 Dec 2017 15:33:05 +0200
Subject: [PATCH 349/380] 8601: Can bypass Minimum Order Amount Logic

---
 .../Magento/Multishipping/Model/Checkout/Type/Multishipping.php | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/app/code/Magento/Multishipping/Model/Checkout/Type/Multishipping.php b/app/code/Magento/Multishipping/Model/Checkout/Type/Multishipping.php
index 7c72c09c0d9..767f58bb9e4 100644
--- a/app/code/Magento/Multishipping/Model/Checkout/Type/Multishipping.php
+++ b/app/code/Magento/Multishipping/Model/Checkout/Type/Multishipping.php
@@ -1066,7 +1066,7 @@ class Multishipping extends \Magento\Framework\DataObject
 
         $baseTotal = 0;
         foreach ($addresses as $address) {
-            $taxes = ($taxInclude) ? $address->getBaseTaxAmount() : 0;
+            $taxes = $taxInclude ? $address->getBaseTaxAmount() : 0;
             $baseTotal += $address->getBaseSubtotalWithDiscount() + $taxes;
         }
 
-- 
GitLab


From baaff9580dc804f49f22448b372f7adf9bed683b Mon Sep 17 00:00:00 2001
From: nmalevanec <mikola.malevanec@transoftgroup.com>
Date: Tue, 12 Dec 2017 15:40:02 +0200
Subject: [PATCH 350/380] 2907: magento/magento2#2907: Integration Test
 Annotation magentoAppArea breaks with some valid values

---
 .../Magento/Test/ApplicationTest.php          | 164 +++++++++++-------
 1 file changed, 102 insertions(+), 62 deletions(-)

diff --git a/dev/tests/integration/framework/tests/unit/testsuite/Magento/Test/ApplicationTest.php b/dev/tests/integration/framework/tests/unit/testsuite/Magento/Test/ApplicationTest.php
index ee794fc262a..9e7f6cc8dd7 100644
--- a/dev/tests/integration/framework/tests/unit/testsuite/Magento/Test/ApplicationTest.php
+++ b/dev/tests/integration/framework/tests/unit/testsuite/Magento/Test/ApplicationTest.php
@@ -13,6 +13,7 @@ use Magento\Framework\App\ObjectManager\ConfigLoader;
 use Magento\Framework\App\State;
 use Magento\Framework\Autoload\ClassLoaderWrapper;
 use Magento\Framework\Config\Scope;
+use Magento\Framework\Exception\LocalizedException;
 use Magento\Framework\ObjectManagerInterface;
 use Magento\Framework\Shell;
 use Magento\TestFramework\Application;
@@ -83,26 +84,20 @@ class ApplicationTest extends \PHPUnit\Framework\TestCase
     }
 
     /**
-     * Test \Magento\TestFramework\Application will correctly load different areas.
+     * Test \Magento\TestFramework\Application will correctly load specified areas.
      *
      * @dataProvider loadAreaDataProvider
-     *
      * @param string $areaCode
-     * @param bool $partialLoad
      */
-    public function testLoadArea(string $areaCode, bool $partialLoad)
+    public function testLoadArea(string $areaCode)
     {
-        $objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
-        /** @var ObjectManagerInterface|\PHPUnit_Framework_MockObject_MockObject $objectManagerMock */
-        $objectManagerMock = $this->getMockBuilder(ObjectManagerInterface::class)
-            ->disableOriginalConstructor()
-            ->getMock();
         $configScope = $this->getMockBuilder(Scope::class)
             ->disableOriginalConstructor()
             ->getMock();
         $configScope->expects($this->once())
             ->method('setCurrentScope')
             ->with($this->identicalTo($areaCode));
+
         $configLoader = $this->getMockBuilder(ConfigLoader::class)
             ->disableOriginalConstructor()
             ->getMock();
@@ -113,88 +108,133 @@ class ApplicationTest extends \PHPUnit\Framework\TestCase
         $areaList = $this->getMockBuilder(AreaList::class)
             ->disableOriginalConstructor()
             ->getMock();
-        $area = $this->getMockBuilder(Area::class)
-            ->disableOriginalConstructor()
-            ->getMock();
-        $appState = $this->getMockBuilder(State::class)
+
+        /** @var ObjectManagerInterface|\PHPUnit_Framework_MockObject_MockObject $objectManager */
+        $objectManager = $this->getMockBuilder(ObjectManagerInterface::class)
             ->disableOriginalConstructor()
             ->getMock();
-        $objectManagerMock->expects($this->once())
+        $objectManager->expects($this->once())
             ->method('configure')
             ->with($this->identicalTo([]));
-        if ($partialLoad) {
-            $objectManagerMock->expects($this->exactly(3))
-                ->method('get')
-                ->willReturnOnConsecutiveCalls(
-                    $configScope,
-                    $configLoader,
-                    $areaList
-                );
-            $areaList->expects($this->once())
-                ->method('getArea')
-                ->with($this->identicalTo($areaCode))
-                ->willReturn($area);
-            $area->expects($this->once())
-                ->method('load')
-                ->with($this->identicalTo(Area::PART_CONFIG));
-        } else {
-            $area->expects($this->once())
-                ->method('load');
-            $appState->expects($this->once())
-                ->method('setAreaCode')
+        $objectManager->expects($this->exactly(3))
+            ->method('get')
+            ->willReturnOnConsecutiveCalls(
+                $configScope,
+                $configLoader,
+                $areaList
+            );
+
+        \Magento\TestFramework\Helper\Bootstrap::setObjectManager($objectManager);
+        try {
+            \Magento\TestFramework\Helper\Bootstrap::getInstance();
+        } catch (LocalizedException $e) {
+            /** @var \Magento\TestFramework\Helper\Bootstrap|\PHPUnit_Framework_MockObject_MockObject $bootstrap */
+            $bootstrap = $this->getMockBuilder(\Magento\TestFramework\Helper\Bootstrap::class)
+                ->disableOriginalConstructor()
+                ->getMock();
+            $bootstrap->expects($this->once())
+                ->method('loadArea')
                 ->with($this->identicalTo($areaCode));
-            $areaList->expects($this->once())
-                ->method('getArea')
-                ->with($this->identicalTo($areaCode))
-                ->willReturn($area);
-            $objectManagerMock->expects($this->exactly(5))
-                ->method('get')
-                ->willReturnOnConsecutiveCalls(
-                    $configScope,
-                    $configLoader,
-                    $areaList,
-                    $appState,
-                    $areaList
-                );
+            \Magento\TestFramework\Helper\Bootstrap::setInstance($bootstrap);
         }
-        \Magento\TestFramework\Helper\Bootstrap::setObjectManager($objectManagerMock);
+
         $this->subject->loadArea($areaCode);
+    }
+
+    /**
+     * Test \Magento\TestFramework\Application will correctly load specified areas.
+     *
+     * @dataProvider partialLoadAreaDataProvider
+     * @param string $areaCode
+     */
+    public function testPartialLoadArea(string $areaCode)
+    {
+        $configScope = $this->getMockBuilder(Scope::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $configScope->expects($this->once())
+            ->method('setCurrentScope')
+            ->with($this->identicalTo($areaCode));
+
+        $configLoader = $this->getMockBuilder(ConfigLoader::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $configLoader->expects($this->once())
+            ->method('load')
+            ->with($this->identicalTo($areaCode))
+            ->willReturn([]);
+
+        $area = $this->getMockBuilder(Area::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $area->expects($this->once())
+            ->method('load')
+            ->with($this->identicalTo(Area::PART_CONFIG));
+
+        $areaList = $this->getMockBuilder(AreaList::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $areaList->expects($this->once())
+            ->method('getArea')
+            ->with($this->identicalTo($areaCode))
+            ->willReturn($area);
+
+        /** @var ObjectManagerInterface|\PHPUnit_Framework_MockObject_MockObject $objectManager */
+        $objectManager = $this->getMockBuilder(ObjectManagerInterface::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $objectManager->expects($this->once())
+            ->method('configure')
+            ->with($this->identicalTo([]));
+        $objectManager->expects($this->exactly(3))
+            ->method('get')
+            ->willReturnOnConsecutiveCalls(
+                $configScope,
+                $configLoader,
+                $areaList
+            );
 
-        //restore Object Manager to successfully finish the test.
         \Magento\TestFramework\Helper\Bootstrap::setObjectManager($objectManager);
+
+        $this->subject->loadArea($areaCode);
     }
 
     /**
-     * Provide test data for testLoadArea().
+     * Provide test data for testPartialLoadArea().
      *
      * @return array
      */
-    public function loadAreaDataProvider()
+    public function partialLoadAreaDataProvider()
     {
         return [
             [
                 'area_code' => Area::AREA_GLOBAL,
-                'partial_load' => true,
             ],
             [
-                'area_code' => Area::AREA_ADMINHTML,
-                'partial_load' => false,
+                'area_code' => Area::AREA_WEBAPI_REST,
             ],
             [
-                'area_code' => Area::AREA_FRONTEND,
-                'partial_load' => false,
+                'area_code' => Area::AREA_WEBAPI_SOAP,
             ],
             [
-                'area_code' => Area::AREA_WEBAPI_REST,
-                'partial_load' => true,
+                'area_code' => Area::AREA_CRONTAB,
             ],
+        ];
+    }
+
+    /**
+     * Provide test data for testLoadArea().
+     *
+     * @return array
+     */
+    public function loadAreaDataProvider()
+    {
+        return [
             [
-                'area_code' => Area::AREA_WEBAPI_SOAP,
-                'partial_load' => true,
+                'area_code' => Area::AREA_ADMINHTML,
             ],
             [
-                'area_code' => Area::AREA_CRONTAB,
-                'partial_load' => true,
+                'area_code' => Area::AREA_FRONTEND,
             ],
         ];
     }
-- 
GitLab


From 97e43c1dbeefdc38120c9d62b2083e194c971bb2 Mon Sep 17 00:00:00 2001
From: RomanKis <romaikiss@gmail.com>
Date: Tue, 12 Dec 2017 15:48:37 +0200
Subject: [PATCH 351/380] 8204: catalog:images:resize = getimagesize(): Read
 error!

---
 .../Catalog/Console/Command/ImagesResizeCommand.php    | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/app/code/Magento/Catalog/Console/Command/ImagesResizeCommand.php b/app/code/Magento/Catalog/Console/Command/ImagesResizeCommand.php
index b0c93ee3283..09cd6793b47 100644
--- a/app/code/Magento/Catalog/Console/Command/ImagesResizeCommand.php
+++ b/app/code/Magento/Catalog/Console/Command/ImagesResizeCommand.php
@@ -74,7 +74,7 @@ class ImagesResizeCommand extends \Symfony\Component\Console\Command\Command
             return \Magento\Framework\Console\Cli::RETURN_SUCCESS;
         }
 
-        $exceptionMessage = '';
+        $errorMessage = '';
         try {
             foreach ($productIds as $productId) {
                 try {
@@ -88,8 +88,8 @@ class ImagesResizeCommand extends \Symfony\Component\Console\Command\Command
                     /** @var \Magento\Catalog\Model\Product\Image\Cache $imageCache */
                     $imageCache = $this->imageCacheFactory->create();
                     $imageCache->generate($product);
-                } catch (\Exception $e) {
-                    $exceptionMessage = $e->getMessage();
+                } catch (\Magento\Framework\Exception\RuntimeException $e) {
+                    $errorMessage = $e->getMessage();
                 }
 
                 $output->write(".");
@@ -103,8 +103,8 @@ class ImagesResizeCommand extends \Symfony\Component\Console\Command\Command
         $output->write("\n");
         $output->writeln("<info>Product images resized successfully.</info>");
 
-        if ($exceptionMessage) {
-            $output->writeln("<comment>{$exceptionMessage}</comment>");
+        if ($errorMessage !== '') {
+            $output->writeln("<comment>{$errorMessage}</comment>");
         }
 
         return 0;
-- 
GitLab


From 6b749c0b2d8cc6952cae0f2037ae41b1a91ac048 Mon Sep 17 00:00:00 2001
From: Stanislav Idolov <sidolov@magento.com>
Date: Tue, 12 Dec 2017 16:00:31 +0200
Subject: [PATCH 352/380] magento/magento2#2907

---
 .../Magento/Test/ApplicationTest.php          | 96 +++++++++----------
 1 file changed, 44 insertions(+), 52 deletions(-)

diff --git a/dev/tests/integration/framework/tests/unit/testsuite/Magento/Test/ApplicationTest.php b/dev/tests/integration/framework/tests/unit/testsuite/Magento/Test/ApplicationTest.php
index 9e7f6cc8dd7..47c3ef64280 100644
--- a/dev/tests/integration/framework/tests/unit/testsuite/Magento/Test/ApplicationTest.php
+++ b/dev/tests/integration/framework/tests/unit/testsuite/Magento/Test/ApplicationTest.php
@@ -85,37 +85,59 @@ class ApplicationTest extends \PHPUnit\Framework\TestCase
 
     /**
      * Test \Magento\TestFramework\Application will correctly load specified areas.
-     *
-     * @dataProvider loadAreaDataProvider
-     * @param string $areaCode
      */
-    public function testLoadArea(string $areaCode)
+    public function testBackEndLoadArea()
     {
-        $configScope = $this->getMockBuilder(Scope::class)
-            ->disableOriginalConstructor()
-            ->getMock();
-        $configScope->expects($this->once())
-            ->method('setCurrentScope')
-            ->with($this->identicalTo($areaCode));
+        $configScope = $this->getMockBuilder(Scope::class)->disableOriginalConstructor()->getMock();
+        $configScope->expects($this->once())->method('setCurrentScope')->with($this->identicalTo(Area::AREA_ADMINHTML));
 
-        $configLoader = $this->getMockBuilder(ConfigLoader::class)
-            ->disableOriginalConstructor()
-            ->getMock();
+        $configLoader = $this->getMockBuilder(ConfigLoader::class)->disableOriginalConstructor()->getMock();
         $configLoader->expects($this->once())
             ->method('load')
-            ->with($this->identicalTo($areaCode))
+            ->with($this->identicalTo(Area::AREA_ADMINHTML))
             ->willReturn([]);
-        $areaList = $this->getMockBuilder(AreaList::class)
-            ->disableOriginalConstructor()
-            ->getMock();
+        $areaList = $this->getMockBuilder(AreaList::class)->disableOriginalConstructor()->getMock();
 
         /** @var ObjectManagerInterface|\PHPUnit_Framework_MockObject_MockObject $objectManager */
-        $objectManager = $this->getMockBuilder(ObjectManagerInterface::class)
+        $objectManager = $this->getMockBuilder(ObjectManagerInterface::class)->disableOriginalConstructor()->getMock();
+        $objectManager->expects($this->once())->method('configure')->with($this->identicalTo([]));
+        $objectManager->expects($this->exactly(3))
+            ->method('get')
+            ->willReturnOnConsecutiveCalls(
+                $configScope,
+                $configLoader,
+                $areaList
+            );
+
+        \Magento\TestFramework\Helper\Bootstrap::setObjectManager($objectManager);
+
+        $bootstrap = $this->getMockBuilder(\Magento\TestFramework\Helper\Bootstrap::class)
             ->disableOriginalConstructor()
             ->getMock();
-        $objectManager->expects($this->once())
-            ->method('configure')
-            ->with($this->identicalTo([]));
+        $bootstrap->expects($this->once())->method('loadArea')->with($this->identicalTo(Area::AREA_ADMINHTML));
+        \Magento\TestFramework\Helper\Bootstrap::setInstance($bootstrap);
+
+        $this->subject->loadArea(Area::AREA_ADMINHTML);
+    }
+
+    /**
+     * Test \Magento\TestFramework\Application will correctly load specified areas.
+     */
+    public function testFrontEndLoadArea()
+    {
+        $configScope = $this->getMockBuilder(Scope::class)->disableOriginalConstructor()->getMock();
+        $configScope->expects($this->once())->method('setCurrentScope')->with($this->identicalTo(Area::AREA_FRONTEND));
+
+        $configLoader = $this->getMockBuilder(ConfigLoader::class)->disableOriginalConstructor()->getMock();
+        $configLoader->expects($this->once())
+            ->method('load')
+            ->with($this->identicalTo(Area::AREA_FRONTEND))
+            ->willReturn([]);
+        $areaList = $this->getMockBuilder(AreaList::class)->disableOriginalConstructor()->getMock();
+
+        /** @var ObjectManagerInterface|\PHPUnit_Framework_MockObject_MockObject $objectManager */
+        $objectManager = $this->getMockBuilder(ObjectManagerInterface::class)->disableOriginalConstructor()->getMock();
+        $objectManager->expects($this->once())->method('configure')->with($this->identicalTo([]));
         $objectManager->expects($this->exactly(3))
             ->method('get')
             ->willReturnOnConsecutiveCalls(
@@ -125,20 +147,7 @@ class ApplicationTest extends \PHPUnit\Framework\TestCase
             );
 
         \Magento\TestFramework\Helper\Bootstrap::setObjectManager($objectManager);
-        try {
-            \Magento\TestFramework\Helper\Bootstrap::getInstance();
-        } catch (LocalizedException $e) {
-            /** @var \Magento\TestFramework\Helper\Bootstrap|\PHPUnit_Framework_MockObject_MockObject $bootstrap */
-            $bootstrap = $this->getMockBuilder(\Magento\TestFramework\Helper\Bootstrap::class)
-                ->disableOriginalConstructor()
-                ->getMock();
-            $bootstrap->expects($this->once())
-                ->method('loadArea')
-                ->with($this->identicalTo($areaCode));
-            \Magento\TestFramework\Helper\Bootstrap::setInstance($bootstrap);
-        }
-
-        $this->subject->loadArea($areaCode);
+        $this->subject->loadArea(Area::AREA_FRONTEND);
     }
 
     /**
@@ -221,21 +230,4 @@ class ApplicationTest extends \PHPUnit\Framework\TestCase
             ],
         ];
     }
-
-    /**
-     * Provide test data for testLoadArea().
-     *
-     * @return array
-     */
-    public function loadAreaDataProvider()
-    {
-        return [
-            [
-                'area_code' => Area::AREA_ADMINHTML,
-            ],
-            [
-                'area_code' => Area::AREA_FRONTEND,
-            ],
-        ];
-    }
 }
-- 
GitLab


From 0d3d70cd1cf32abf1cd588b096b9cdc20e94b18f Mon Sep 17 00:00:00 2001
From: Ievgen Shakhsuvarov <ishakhsuvarov@users.noreply.github.com>
Date: Tue, 12 Dec 2017 16:29:26 +0200
Subject: [PATCH 353/380] magento/magento2#12259: Save and Duplicated product
 not working

---
 app/code/Magento/Catalog/Model/Product/Copier.php | 5 -----
 1 file changed, 5 deletions(-)

diff --git a/app/code/Magento/Catalog/Model/Product/Copier.php b/app/code/Magento/Catalog/Model/Product/Copier.php
index 70f8b988332..39fb948579f 100644
--- a/app/code/Magento/Catalog/Model/Product/Copier.php
+++ b/app/code/Magento/Catalog/Model/Product/Copier.php
@@ -9,9 +9,6 @@ namespace Magento\Catalog\Model\Product;
 
 use Magento\Catalog\Api\Data\ProductInterface;
 
-/**
- * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
- */
 class Copier
 {
     /**
@@ -56,8 +53,6 @@ class Copier
     {
         $product->getWebsiteIds();
         $product->getCategoryIds();
-
-        /** @var \Magento\Framework\EntityManager\EntityMetadataInterface $metadata */
         $metadata = $this->getMetadataPool()->getMetadata(ProductInterface::class);
 
         /** @var \Magento\Catalog\Model\Product $duplicate */
-- 
GitLab


From 7be1e58c14db3af2c47af5702292ed19118e1b9c Mon Sep 17 00:00:00 2001
From: nmalevanec <mikola.malevanec@transoftgroup.com>
Date: Tue, 12 Dec 2017 16:30:20 +0200
Subject: [PATCH 354/380] 2907: magento/magento2#2907: Integration Test
 Annotation magentoAppArea breaks with some valid values

---
 .../Magento/Test/ApplicationTest.php          | 68 -------------------
 1 file changed, 68 deletions(-)

diff --git a/dev/tests/integration/framework/tests/unit/testsuite/Magento/Test/ApplicationTest.php b/dev/tests/integration/framework/tests/unit/testsuite/Magento/Test/ApplicationTest.php
index 47c3ef64280..50b18c3a86d 100644
--- a/dev/tests/integration/framework/tests/unit/testsuite/Magento/Test/ApplicationTest.php
+++ b/dev/tests/integration/framework/tests/unit/testsuite/Magento/Test/ApplicationTest.php
@@ -13,7 +13,6 @@ use Magento\Framework\App\ObjectManager\ConfigLoader;
 use Magento\Framework\App\State;
 use Magento\Framework\Autoload\ClassLoaderWrapper;
 use Magento\Framework\Config\Scope;
-use Magento\Framework\Exception\LocalizedException;
 use Magento\Framework\ObjectManagerInterface;
 use Magento\Framework\Shell;
 use Magento\TestFramework\Application;
@@ -83,73 +82,6 @@ class ApplicationTest extends \PHPUnit\Framework\TestCase
         );
     }
 
-    /**
-     * Test \Magento\TestFramework\Application will correctly load specified areas.
-     */
-    public function testBackEndLoadArea()
-    {
-        $configScope = $this->getMockBuilder(Scope::class)->disableOriginalConstructor()->getMock();
-        $configScope->expects($this->once())->method('setCurrentScope')->with($this->identicalTo(Area::AREA_ADMINHTML));
-
-        $configLoader = $this->getMockBuilder(ConfigLoader::class)->disableOriginalConstructor()->getMock();
-        $configLoader->expects($this->once())
-            ->method('load')
-            ->with($this->identicalTo(Area::AREA_ADMINHTML))
-            ->willReturn([]);
-        $areaList = $this->getMockBuilder(AreaList::class)->disableOriginalConstructor()->getMock();
-
-        /** @var ObjectManagerInterface|\PHPUnit_Framework_MockObject_MockObject $objectManager */
-        $objectManager = $this->getMockBuilder(ObjectManagerInterface::class)->disableOriginalConstructor()->getMock();
-        $objectManager->expects($this->once())->method('configure')->with($this->identicalTo([]));
-        $objectManager->expects($this->exactly(3))
-            ->method('get')
-            ->willReturnOnConsecutiveCalls(
-                $configScope,
-                $configLoader,
-                $areaList
-            );
-
-        \Magento\TestFramework\Helper\Bootstrap::setObjectManager($objectManager);
-
-        $bootstrap = $this->getMockBuilder(\Magento\TestFramework\Helper\Bootstrap::class)
-            ->disableOriginalConstructor()
-            ->getMock();
-        $bootstrap->expects($this->once())->method('loadArea')->with($this->identicalTo(Area::AREA_ADMINHTML));
-        \Magento\TestFramework\Helper\Bootstrap::setInstance($bootstrap);
-
-        $this->subject->loadArea(Area::AREA_ADMINHTML);
-    }
-
-    /**
-     * Test \Magento\TestFramework\Application will correctly load specified areas.
-     */
-    public function testFrontEndLoadArea()
-    {
-        $configScope = $this->getMockBuilder(Scope::class)->disableOriginalConstructor()->getMock();
-        $configScope->expects($this->once())->method('setCurrentScope')->with($this->identicalTo(Area::AREA_FRONTEND));
-
-        $configLoader = $this->getMockBuilder(ConfigLoader::class)->disableOriginalConstructor()->getMock();
-        $configLoader->expects($this->once())
-            ->method('load')
-            ->with($this->identicalTo(Area::AREA_FRONTEND))
-            ->willReturn([]);
-        $areaList = $this->getMockBuilder(AreaList::class)->disableOriginalConstructor()->getMock();
-
-        /** @var ObjectManagerInterface|\PHPUnit_Framework_MockObject_MockObject $objectManager */
-        $objectManager = $this->getMockBuilder(ObjectManagerInterface::class)->disableOriginalConstructor()->getMock();
-        $objectManager->expects($this->once())->method('configure')->with($this->identicalTo([]));
-        $objectManager->expects($this->exactly(3))
-            ->method('get')
-            ->willReturnOnConsecutiveCalls(
-                $configScope,
-                $configLoader,
-                $areaList
-            );
-
-        \Magento\TestFramework\Helper\Bootstrap::setObjectManager($objectManager);
-        $this->subject->loadArea(Area::AREA_FRONTEND);
-    }
-
     /**
      * Test \Magento\TestFramework\Application will correctly load specified areas.
      *
-- 
GitLab


From ccc35c24de7b27d5e3cd4e42bdbfd57f8ce6de9d Mon Sep 17 00:00:00 2001
From: Pavel Bystritsky <p.bystritsky@yandex.ru>
Date: Tue, 12 Dec 2017 16:46:35 +0200
Subject: [PATCH 355/380] magento/magento2#12285: The option <var
 name="allowfullscreen">false</var> for mobile device don't work in product
 view page gallery

---
 .../Framework/Config/ConverterTest.php        | 92 +++++++++++++++++++
 .../Magento/Framework/Config/Converter.php    |  4 +-
 2 files changed, 95 insertions(+), 1 deletion(-)
 create mode 100644 dev/tests/integration/testsuite/Magento/Framework/Config/ConverterTest.php

diff --git a/dev/tests/integration/testsuite/Magento/Framework/Config/ConverterTest.php b/dev/tests/integration/testsuite/Magento/Framework/Config/ConverterTest.php
new file mode 100644
index 00000000000..f68e36d39a3
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Framework/Config/ConverterTest.php
@@ -0,0 +1,92 @@
+<?php
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Framework\Config;
+
+use Magento\Framework\ObjectManagerInterface;
+
+/**
+ * Tests Magento\Framework\Config\Convert
+ */
+class ConverterTest extends \PHPUnit\Framework\TestCase
+{
+    /**
+     * @var ObjectManagerInterface
+     */
+    private $objectManager;
+
+    /**
+     * @var Converter
+     */
+    private $converter;
+
+    /**
+     * Tests config value "false" is not interpreted as true.
+     *
+     * @param string $sourceString
+     * @param array $expected
+     * @dataProvider parseVarElementDataProvider
+     */
+    public function testParseVarElement($sourceString, $expected)
+    {
+        $document = new \DOMDocument();
+        $document->loadXML($sourceString);
+        $actual = $this->converter->convert($document);
+
+        self::assertEquals(
+            $expected,
+            $actual
+        );
+    }
+
+    /**
+     * Data provider for testParseVarElement.
+     *
+     * @return array
+     */
+    public function parseVarElementDataProvider()
+    {
+        $sourceString = <<<'XML'
+<?xml version="1.0"?>
+<view xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Config/etc/view.xsd">
+    <vars module="Magento_Test">    
+        <var name="str">some string</var>  
+        <var name="int-1">1</var>        
+        <var name="int-0">0</var>        
+        <var name="bool-true">true</var> 
+        <var name="bool-false">false</var> 
+    </vars>
+ </view>
+XML;
+        $expectedResult = [
+            'vars' => [
+                'Magento_Test' => [
+                    'str' => 'some string',
+                    'int-1' => '1',
+                    'int-0' => '0',
+                    'bool-true' => true,
+                    'bool-false' => false
+                ]
+            ]
+        ];
+
+        return [
+            [
+                $sourceString,
+                $expectedResult
+            ],
+        ];
+    }
+
+    /**
+     * @inheritdoc
+     */
+    protected function setUp()
+    {
+        $this->objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
+        $this->converter = $this->objectManager->get(Converter::class);
+    }
+}
diff --git a/lib/internal/Magento/Framework/Config/Converter.php b/lib/internal/Magento/Framework/Config/Converter.php
index 0401471f27e..380aeeee5a0 100644
--- a/lib/internal/Magento/Framework/Config/Converter.php
+++ b/lib/internal/Magento/Framework/Config/Converter.php
@@ -103,7 +103,9 @@ class Converter implements \Magento\Framework\Config\ConverterInterface
             }
         }
         if (!count($result)) {
-            $result = $node->nodeValue;
+            $result = (strtolower($node->nodeValue) !== 'true' &&  strtolower($node->nodeValue) !== 'false')
+                ? $node->nodeValue
+                : filter_var($node->nodeValue, FILTER_VALIDATE_BOOLEAN);
         }
         return $result;
     }
-- 
GitLab


From 5c36f9888bc39efbfe479adb0e11d2d49f94d715 Mon Sep 17 00:00:00 2001
From: Pavel Bystritsky <p.bystritsky@yandex.ru>
Date: Tue, 12 Dec 2017 17:28:48 +0200
Subject: [PATCH 356/380] magento/magento2#12378: Regions list in Directory
 module for India

---
 .../Magento/Directory/Setup/UpgradeData.php   | 80 ++++++++++++++++---
 app/code/Magento/Directory/etc/module.xml     |  2 +-
 2 files changed, 71 insertions(+), 11 deletions(-)

diff --git a/app/code/Magento/Directory/Setup/UpgradeData.php b/app/code/Magento/Directory/Setup/UpgradeData.php
index aa0f81a32ff..ea7e36cfbee 100644
--- a/app/code/Magento/Directory/Setup/UpgradeData.php
+++ b/app/code/Magento/Directory/Setup/UpgradeData.php
@@ -41,23 +41,21 @@ class UpgradeData implements UpgradeDataInterface
     public function upgrade(ModuleDataSetupInterface $setup, ModuleContextInterface $context)
     {
         if (version_compare($context->getVersion(), '2.0.1', '<')) {
-            $this->addCroatia($setup);
+            $this->addCountry($setup, $this->getCroatianData());
+        }
+        if (version_compare($context->getVersion(), '2.0.2', '<')) {
+            $this->addCountry($setup, $this->getIndianData());
         }
     }
 
     /**
-     * Add Croatia and it's states to appropriate tables.
+     * Croatian states data.
      *
-     * @param ModuleDataSetupInterface $setup
-     * @return void
+     * @return array
      */
-    private function addCroatia($setup)
+    private function getCroatianData()
     {
-        /**
-         * Fill table directory/country_region
-         * Fill table directory/country_region_name for en_US locale
-         */
-        $data = [
+        return [
             ['HR', 'HR-01', 'Zagrebačka županija'],
             ['HR', 'HR-02', 'Krapinsko-zagorska županija'],
             ['HR', 'HR-03', 'Sisačko-moslavačka županija'],
@@ -80,6 +78,68 @@ class UpgradeData implements UpgradeDataInterface
             ['HR', 'HR-20', 'Međimurska županija'],
             ['HR', 'HR-21', 'Grad Zagreb']
         ];
+    }
+
+    /**
+     * Indian states data.
+     *
+     * @return array
+     */
+    private function getIndianData()
+    {
+        return [
+            ['IN', 'AN', 'Andaman and Nicobar Islands'],
+            ['IN', 'AP', 'Andhra Pradesh'],
+            ['IN', 'AR', 'Arunachal Pradesh'],
+            ['IN', 'AS', 'Assam'],
+            ['IN', 'BR', 'Bihar'],
+            ['IN', 'CH', 'Chandigarh'],
+            ['IN', 'CT', 'Chhattisgarh'],
+            ['IN', 'DN', 'Dadra and Nagar Haveli'],
+            ['IN', 'DD', 'Daman and Diu'],
+            ['IN', 'DL', 'Delhi'],
+            ['IN', 'GA', 'Goa'],
+            ['IN', 'GJ', 'Gujarat'],
+            ['IN', 'HR', 'Haryana'],
+            ['IN', 'HP', 'Himachal Pradesh'],
+            ['IN', 'JK', 'Jammu and Kashmir'],
+            ['IN', 'JH', 'Jharkhand'],
+            ['IN', 'KA', 'Karnataka'],
+            ['IN', 'KL', 'Kerala'],
+            ['IN', 'LD', 'Lakshadweep'],
+            ['IN', 'MP', 'Madhya Pradesh'],
+            ['IN', 'MH', 'Maharashtra'],
+            ['IN', 'MN', 'Manipur'],
+            ['IN', 'ML', 'Meghalaya'],
+            ['IN', 'MZ', 'Mizoram'],
+            ['IN', 'NL', 'Nagaland'],
+            ['IN', 'OR', 'Odisha'],
+            ['IN', 'PY', 'Puducherry'],
+            ['IN', 'PB', 'Punjab'],
+            ['IN', 'RJ', 'Rajasthan'],
+            ['IN', 'SK', 'Sikkim'],
+            ['IN', 'TN', 'Tamil Nadu'],
+            ['IN', 'TG', 'Telangana'],
+            ['IN', 'TR', 'Tripura'],
+            ['IN', 'UP', 'Uttar Pradesh'],
+            ['IN', 'UT', 'Uttarakhand'],
+            ['IN', 'WB', 'West Bengal']
+        ];
+    }
+
+    /**
+     * Add country data to appropriate tables.
+     *
+     * @param ModuleDataSetupInterface $setup
+     * @param array $data
+     * @return void
+     */
+    private function addCountry(ModuleDataSetupInterface $setup, array $data)
+    {
+        /**
+         * Fill table directory/country_region
+         * Fill table directory/country_region_name for en_US locale
+         */
         foreach ($data as $row) {
             $bind = ['country_id' => $row[0], 'code' => $row[1], 'default_name' => $row[2]];
             $setup->getConnection()->insert($setup->getTable('directory_country_region'), $bind);
diff --git a/app/code/Magento/Directory/etc/module.xml b/app/code/Magento/Directory/etc/module.xml
index 2711a91577a..a3735ca6ddd 100644
--- a/app/code/Magento/Directory/etc/module.xml
+++ b/app/code/Magento/Directory/etc/module.xml
@@ -6,7 +6,7 @@
  */
 -->
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
-    <module name="Magento_Directory" setup_version="2.0.1">
+    <module name="Magento_Directory" setup_version="2.0.2">
         <sequence>
             <module name="Magento_Store"/>
         </sequence>
-- 
GitLab


From 3747258db22d993e9150f4644a251a6eda857f90 Mon Sep 17 00:00:00 2001
From: nmalevanec <mikola.malevanec@transoftgroup.com>
Date: Tue, 12 Dec 2017 18:27:40 +0200
Subject: [PATCH 357/380] 10814: magento/magento2#10814: Attribute repository
 resets sourceModel for new attributes. Disable ability to set custom
 sourceModel, backendModel and backendType during update with Attribute
 repository, as they depends on frontend input for user defined attributes.

---
 .../Model/Product/Attribute/Repository.php    | 32 +++++++++++++------
 .../Api/ProductAttributeRepositoryTest.php    | 31 +++++++++++++++++-
 2 files changed, 53 insertions(+), 10 deletions(-)

diff --git a/app/code/Magento/Catalog/Model/Product/Attribute/Repository.php b/app/code/Magento/Catalog/Model/Product/Attribute/Repository.php
index 270a2f22967..f538d15a474 100644
--- a/app/code/Magento/Catalog/Model/Product/Attribute/Repository.php
+++ b/app/code/Magento/Catalog/Model/Product/Attribute/Repository.php
@@ -118,6 +118,9 @@ class Repository implements \Magento\Catalog\Api\ProductAttributeRepositoryInter
             $attribute->setAttributeId($existingModel->getAttributeId());
             $attribute->setIsUserDefined($existingModel->getIsUserDefined());
             $attribute->setFrontendInput($existingModel->getFrontendInput());
+            if ($attribute->getIsUserDefined()) {
+                $this->processAttributeData($attribute);
+            }
 
             if (is_array($attribute->getFrontendLabels())) {
                 $defaultFrontendLabel = $attribute->getDefaultFrontendLabel();
@@ -156,15 +159,7 @@ class Repository implements \Magento\Catalog\Api\ProductAttributeRepositoryInter
             $this->validateCode($attribute->getAttributeCode());
             $this->validateFrontendInput($attribute->getFrontendInput());
 
-            $attribute->setBackendType(
-                $attribute->getBackendTypeByInput($attribute->getFrontendInput())
-            );
-            $attribute->setSourceModel(
-                $this->productHelper->getAttributeSourceModelByInputType($attribute->getFrontendInput())
-            );
-            $attribute->setBackendModel(
-                $this->productHelper->getAttributeBackendModelByInputType($attribute->getFrontendInput())
-            );
+            $this->processAttributeData($attribute);
             $attribute->setEntityTypeId(
                 $this->eavConfig
                     ->getEntityType(\Magento\Catalog\Api\Data\ProductAttributeInterface::ENTITY_TYPE_CODE)
@@ -275,4 +270,23 @@ class Repository implements \Magento\Catalog\Api\ProductAttributeRepositoryInter
             throw InputException::invalidFieldValue('frontend_input', $frontendInput);
         }
     }
+
+    /**
+     * Process attribute data depends on attribute frontend input type.
+     *
+     * @param \Magento\Catalog\Api\Data\ProductAttributeInterface $attribute
+     * @return void
+     */
+    private function processAttributeData(\Magento\Catalog\Api\Data\ProductAttributeInterface $attribute)
+    {
+        $attribute->setBackendType(
+            $attribute->getBackendTypeByInput($attribute->getFrontendInput())
+        );
+        $attribute->setSourceModel(
+            $this->productHelper->getAttributeSourceModelByInputType($attribute->getFrontendInput())
+        );
+        $attribute->setBackendModel(
+            $this->productHelper->getAttributeBackendModelByInputType($attribute->getFrontendInput())
+        );
+    }
 }
diff --git a/dev/tests/api-functional/testsuite/Magento/Catalog/Api/ProductAttributeRepositoryTest.php b/dev/tests/api-functional/testsuite/Magento/Catalog/Api/ProductAttributeRepositoryTest.php
index e48c5ad018d..00b20ae8eec 100644
--- a/dev/tests/api-functional/testsuite/Magento/Catalog/Api/ProductAttributeRepositoryTest.php
+++ b/dev/tests/api-functional/testsuite/Magento/Catalog/Api/ProductAttributeRepositoryTest.php
@@ -7,7 +7,6 @@
 namespace Magento\Catalog\Api;
 
 use Magento\Framework\Webapi\Exception as HTTPExceptionCodes;
-use Magento\TestFramework\Helper\Bootstrap;
 
 class ProductAttributeRepositoryTest extends \Magento\TestFramework\TestCase\WebapiAbstract
 {
@@ -194,6 +193,36 @@ class ProductAttributeRepositoryTest extends \Magento\TestFramework\TestCase\Web
         $this->assertEquals("Default Blue Updated", $result['options'][1]['label']);
     }
 
+    /**
+     * Test source model and backend type can not be changed to custom, as they depends on attribute frontend type.
+     *
+     * @magentoApiDataFixture Magento/Catalog/Model/Product/Attribute/_files/create_attribute_service.php
+     * @return void
+     */
+    public function testUpdateAttributeSourceAndType()
+    {
+        $attributeCode = uniqid('label_attr_code');
+        $attribute = $this->createAttribute($attributeCode);
+        $attributeData = [
+            'attribute' => [
+                'attribute_id' => $attribute['attribute_id'],
+                'attribute_code' => $attributeCode,
+                'entity_type_id' => 4,
+                'is_required' => false,
+                'frontend_input' => 'select',
+                'source_model' => "Some/Custom/Source/Model",
+                'backend_type' => 'varchar',
+                'frontend_labels' => [
+                    ['store_id' => 1, 'label' => 'front_lbl_new'],
+                ],
+            ],
+        ];
+
+        $result = $this->updateAttribute($attributeCode, $attributeData);
+        $this->assertEquals(\Magento\Eav\Model\Entity\Attribute\Source\Table::class, $result['source_model']);
+        $this->assertEquals('int', $result['backend_type']);
+    }
+
     /**
      * @magentoApiDataFixture Magento/Catalog/Model/Product/Attribute/_files/create_attribute_service.php
      */
-- 
GitLab


From bf40afa9414d35fe7f9125af8fc9c8042a054842 Mon Sep 17 00:00:00 2001
From: Pavel Bystritsky <p.bystritsky@yandex.ru>
Date: Wed, 13 Dec 2017 10:21:19 +0200
Subject: [PATCH 358/380] magento/magento2#12285: The option <var
 name="allowfullscreen">false</var> for mobile device don't work in product
 view page gallery

---
 .../testsuite/Magento/Framework/Config/ConverterTest.php        | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/dev/tests/integration/testsuite/Magento/Framework/Config/ConverterTest.php b/dev/tests/integration/testsuite/Magento/Framework/Config/ConverterTest.php
index f68e36d39a3..1d2e090d192 100644
--- a/dev/tests/integration/testsuite/Magento/Framework/Config/ConverterTest.php
+++ b/dev/tests/integration/testsuite/Magento/Framework/Config/ConverterTest.php
@@ -49,6 +49,7 @@ class ConverterTest extends \PHPUnit\Framework\TestCase
      */
     public function parseVarElementDataProvider()
     {
+        // @codingStandardsIgnoreStart
         $sourceString = <<<'XML'
 <?xml version="1.0"?>
 <view xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Config/etc/view.xsd">
@@ -61,6 +62,7 @@ class ConverterTest extends \PHPUnit\Framework\TestCase
     </vars>
  </view>
 XML;
+        // @codingStandardsIgnoreEnd
         $expectedResult = [
             'vars' => [
                 'Magento_Test' => [
-- 
GitLab


From d29548fcb731511869c7dda4994b51541a02700b Mon Sep 17 00:00:00 2001
From: nmalevanec <mikola.malevanec@transoftgroup.com>
Date: Wed, 13 Dec 2017 10:28:56 +0200
Subject: [PATCH 359/380] 10814: magento/magento2#10814: Attribute repository
 resets sourceModel for new attributes. Disable ability to set custom
 sourceModel, backendModel and backendType during update with Attribute
 repository, as they depends on frontend input for user defined attributes.

---
 app/code/Magento/Catalog/Model/Product/Attribute/Repository.php | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/app/code/Magento/Catalog/Model/Product/Attribute/Repository.php b/app/code/Magento/Catalog/Model/Product/Attribute/Repository.php
index f538d15a474..c19efac12ae 100644
--- a/app/code/Magento/Catalog/Model/Product/Attribute/Repository.php
+++ b/app/code/Magento/Catalog/Model/Product/Attribute/Repository.php
@@ -272,7 +272,7 @@ class Repository implements \Magento\Catalog\Api\ProductAttributeRepositoryInter
     }
 
     /**
-     * Process attribute data depends on attribute frontend input type.
+     * Process attribute data based on attribute frontend input type.
      *
      * @param \Magento\Catalog\Api\Data\ProductAttributeInterface $attribute
      * @return void
-- 
GitLab


From b8232c5d957b25cbb0c902f4928349617803b488 Mon Sep 17 00:00:00 2001
From: Pavel Bystritsky <p.bystritsky@yandex.ru>
Date: Wed, 13 Dec 2017 11:26:26 +0200
Subject: [PATCH 360/380] magento/magento2#12285: The option <var
 name="allowfullscreen">false</var> for mobile device don't work in product
 view page gallery

---
 lib/internal/Magento/Framework/Config/Converter.php | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/lib/internal/Magento/Framework/Config/Converter.php b/lib/internal/Magento/Framework/Config/Converter.php
index 380aeeee5a0..3e66f641b86 100644
--- a/lib/internal/Magento/Framework/Config/Converter.php
+++ b/lib/internal/Magento/Framework/Config/Converter.php
@@ -103,7 +103,7 @@ class Converter implements \Magento\Framework\Config\ConverterInterface
             }
         }
         if (!count($result)) {
-            $result = (strtolower($node->nodeValue) !== 'true' &&  strtolower($node->nodeValue) !== 'false')
+            $result = (strtolower($node->nodeValue) !== 'true' && strtolower($node->nodeValue) !== 'false')
                 ? $node->nodeValue
                 : filter_var($node->nodeValue, FILTER_VALIDATE_BOOLEAN);
         }
-- 
GitLab


From c27a56a5d1527ffb3a66a375fc486675d716d54b Mon Sep 17 00:00:00 2001
From: Pavel Bystritsky <p.bystritsky@yandex.ru>
Date: Wed, 13 Dec 2017 11:36:25 +0200
Subject: [PATCH 361/380] magento/magento2#12378: Regions list in Directory
 module for India

---
 app/code/Magento/Directory/Setup/UpgradeData.php | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/app/code/Magento/Directory/Setup/UpgradeData.php b/app/code/Magento/Directory/Setup/UpgradeData.php
index ea7e36cfbee..4ee9ea33673 100644
--- a/app/code/Magento/Directory/Setup/UpgradeData.php
+++ b/app/code/Magento/Directory/Setup/UpgradeData.php
@@ -41,10 +41,10 @@ class UpgradeData implements UpgradeDataInterface
     public function upgrade(ModuleDataSetupInterface $setup, ModuleContextInterface $context)
     {
         if (version_compare($context->getVersion(), '2.0.1', '<')) {
-            $this->addCountry($setup, $this->getCroatianData());
+            $this->addCountryRegions($setup, $this->getDataForCroatia());
         }
         if (version_compare($context->getVersion(), '2.0.2', '<')) {
-            $this->addCountry($setup, $this->getIndianData());
+            $this->addCountryRegions($setup, $this->getDataForIndia());
         }
     }
 
@@ -53,7 +53,7 @@ class UpgradeData implements UpgradeDataInterface
      *
      * @return array
      */
-    private function getCroatianData()
+    private function getDataForCroatia()
     {
         return [
             ['HR', 'HR-01', 'Zagrebačka županija'],
@@ -85,7 +85,7 @@ class UpgradeData implements UpgradeDataInterface
      *
      * @return array
      */
-    private function getIndianData()
+    private function getDataForIndia()
     {
         return [
             ['IN', 'AN', 'Andaman and Nicobar Islands'],
@@ -128,13 +128,13 @@ class UpgradeData implements UpgradeDataInterface
     }
 
     /**
-     * Add country data to appropriate tables.
+     * Add country regions data to appropriate tables.
      *
      * @param ModuleDataSetupInterface $setup
      * @param array $data
      * @return void
      */
-    private function addCountry(ModuleDataSetupInterface $setup, array $data)
+    private function addCountryRegions(ModuleDataSetupInterface $setup, array $data)
     {
         /**
          * Fill table directory/country_region
-- 
GitLab


From 8e3348b908db6480dc5b050c068ab7de38d63007 Mon Sep 17 00:00:00 2001
From: Ievgen Shakhsuvarov <ishakhsuvarov@users.noreply.github.com>
Date: Wed, 13 Dec 2017 11:42:57 +0200
Subject: [PATCH 362/380] magento/magento2#12259: Save and Duplicated product
 not working

---
 .../Magento/Catalog/Model/Product/Copier.php  | 38 ++++++++++---------
 1 file changed, 21 insertions(+), 17 deletions(-)

diff --git a/app/code/Magento/Catalog/Model/Product/Copier.php b/app/code/Magento/Catalog/Model/Product/Copier.php
index 39fb948579f..a7941ba5c0a 100644
--- a/app/code/Magento/Catalog/Model/Product/Copier.php
+++ b/app/code/Magento/Catalog/Model/Product/Copier.php
@@ -1,18 +1,24 @@
 <?php
 /**
- * Catalog product copier. Creates product duplicate
- *
  * Copyright © Magento, Inc. All rights reserved.
  * See COPYING.txt for license details.
  */
 namespace Magento\Catalog\Model\Product;
 
 use Magento\Catalog\Api\Data\ProductInterface;
+use Magento\Catalog\Model\Product;
+use Magento\Framework\App\ObjectManager;
+use Magento\Framework\EntityManager\MetadataPool;
+use Magento\Catalog\Model\ProductFactory;
+use Magento\Catalog\Model\Product\Option\Repository as OptionRepository;
 
+/**
+ * Catalog product copier. Creates product duplicate
+ */
 class Copier
 {
     /**
-     * @var Option\Repository
+     * @var OptionRepository
      */
     protected $optionRepository;
 
@@ -22,22 +28,22 @@ class Copier
     protected $copyConstructor;
 
     /**
-     * @var \Magento\Catalog\Model\ProductFactory
+     * @var ProductFactory
      */
     protected $productFactory;
 
     /**
-     * @var \Magento\Framework\EntityManager\MetadataPool
+     * @var MetadataPool
      */
     protected $metadataPool;
 
     /**
      * @param CopyConstructorInterface $copyConstructor
-     * @param \Magento\Catalog\Model\ProductFactory $productFactory
+     * @param ProductFactory $productFactory
      */
     public function __construct(
         CopyConstructorInterface $copyConstructor,
-        \Magento\Catalog\Model\ProductFactory $productFactory
+        ProductFactory $productFactory
     ) {
         $this->productFactory = $productFactory;
         $this->copyConstructor = $copyConstructor;
@@ -46,16 +52,16 @@ class Copier
     /**
      * Create product duplicate
      *
-     * @param \Magento\Catalog\Model\Product $product
-     * @return \Magento\Catalog\Model\Product
+     * @param Product $product
+     * @return Product
      */
-    public function copy(\Magento\Catalog\Model\Product $product)
+    public function copy(Product $product)
     {
         $product->getWebsiteIds();
         $product->getCategoryIds();
+
         $metadata = $this->getMetadataPool()->getMetadata(ProductInterface::class);
 
-        /** @var \Magento\Catalog\Model\Product $duplicate */
         $duplicate = $this->productFactory->create();
         $productData = $product->getData();
         $productData = $this->removeStockItem($productData);
@@ -93,27 +99,25 @@ class Copier
     }
 
     /**
-     * @return Option\Repository
+     * @return OptionRepository
      * @deprecated 101.0.0
      */
     private function getOptionRepository()
     {
         if (null === $this->optionRepository) {
-            $this->optionRepository = \Magento\Framework\App\ObjectManager::getInstance()
-                ->get(\Magento\Catalog\Model\Product\Option\Repository::class);
+            $this->optionRepository = ObjectManager::getInstance()->get(OptionRepository::class);
         }
         return $this->optionRepository;
     }
 
     /**
-     * @return \Magento\Framework\EntityManager\MetadataPool
+     * @return MetadataPool
      * @deprecated 101.0.0
      */
     private function getMetadataPool()
     {
         if (null === $this->metadataPool) {
-            $this->metadataPool = \Magento\Framework\App\ObjectManager::getInstance()
-                ->get(\Magento\Framework\EntityManager\MetadataPool::class);
+            $this->metadataPool = ObjectManager::getInstance()->get(MetadataPool::class);
         }
         return $this->metadataPool;
     }
-- 
GitLab


From c7abab1d2351d8c6dad59d5bb153f23924ae2e6d Mon Sep 17 00:00:00 2001
From: Tomasz Gregorczyk <tom@lcbrq.com>
Date: Wed, 13 Dec 2017 11:08:59 +0100
Subject: [PATCH 363/380] Fixes #12660 invalid parameter configuration provided
 for argument

---
 .../Magento/Framework/View/Element/UiComponentFactory.php | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/lib/internal/Magento/Framework/View/Element/UiComponentFactory.php b/lib/internal/Magento/Framework/View/Element/UiComponentFactory.php
index 94d84dd0560..93fe88a30f0 100755
--- a/lib/internal/Magento/Framework/View/Element/UiComponentFactory.php
+++ b/lib/internal/Magento/Framework/View/Element/UiComponentFactory.php
@@ -147,6 +147,14 @@ class UiComponentFactory extends DataObject
         }
         $components = array_filter($components);
         $componentArguments['components'] = $components;
+
+       /**
+        * Prevent passing ACL restricted blocks to htmlContent constructor
+        */
+        if (isset($componentArguments['block']) && !$componentArguments['block']) {
+            return null;
+        }
+
         if (!isset($componentArguments['context'])) {
             $componentArguments['context'] = $renderContext;
         }
-- 
GitLab


From 4d5ea55540002dcdfb47784943fab60c5f5dde07 Mon Sep 17 00:00:00 2001
From: gwharton <graham@gwharton.me.uk>
Date: Wed, 13 Dec 2017 10:39:01 +0000
Subject: [PATCH 364/380] Updated Product Codes

Updated product codes for Products I, O and 1 in accordance with DHL Document DHLIS1 - Products and Services Version 2.1

Legacy product codes, no longer listed in the above document left in place and not changed.

http://www.dhl.co.uk/content/dam/downloads/uk/Express/PDFs/developer_centre/dhlis1_products_and_services.pdf
---
 app/code/Magento/Dhl/Model/Carrier.php | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/app/code/Magento/Dhl/Model/Carrier.php b/app/code/Magento/Dhl/Model/Carrier.php
index 45a97e22878..41c00cb822c 100644
--- a/app/code/Magento/Dhl/Model/Carrier.php
+++ b/app/code/Magento/Dhl/Model/Carrier.php
@@ -607,8 +607,9 @@ class Carrier extends \Magento\Dhl\Model\AbstractDhl implements \Magento\Shippin
             'G' => __('Domestic economy select'),
             'W' => __('Economy select'),
             'I' => __('Break bulk economy'),
+            'I' => __('Domestic express 9:00'),
             'N' => __('Domestic express'),
-            'O' => __('Others'),
+            'O' => __('Domestic express 10:30'),
             'R' => __('Globalmail business'),
             'S' => __('Same day'),
             'T' => __('Express 12:00'),
@@ -616,7 +617,7 @@ class Carrier extends \Magento\Dhl\Model\AbstractDhl implements \Magento\Shippin
         ];
 
         $nonDocType = [
-            '1' => __('Customer services'),
+            '1' => __('Domestic express 12:00'),
             '3' => __('Easy shop'),
             '4' => __('Jetline'),
             '8' => __('Express easy'),
-- 
GitLab


From 30a426bd996a5bb95e2bcf2a7a99ed02774a9171 Mon Sep 17 00:00:00 2001
From: gwharton <graham@gwharton.me.uk>
Date: Wed, 13 Dec 2017 10:44:18 +0000
Subject: [PATCH 365/380] Removed old code "I"

Old code "I" was not removed in initial commit for some reason.
---
 app/code/Magento/Dhl/Model/Carrier.php | 1 -
 1 file changed, 1 deletion(-)

diff --git a/app/code/Magento/Dhl/Model/Carrier.php b/app/code/Magento/Dhl/Model/Carrier.php
index 41c00cb822c..a9bdc99e8dc 100644
--- a/app/code/Magento/Dhl/Model/Carrier.php
+++ b/app/code/Magento/Dhl/Model/Carrier.php
@@ -606,7 +606,6 @@ class Carrier extends \Magento\Dhl\Model\AbstractDhl implements \Magento\Shippin
             'L' => __('Express 10:30'),
             'G' => __('Domestic economy select'),
             'W' => __('Economy select'),
-            'I' => __('Break bulk economy'),
             'I' => __('Domestic express 9:00'),
             'N' => __('Domestic express'),
             'O' => __('Domestic express 10:30'),
-- 
GitLab


From a6abc596a1e5a6c901cc721393000e8e25e6dff5 Mon Sep 17 00:00:00 2001
From: gwharton <graham@gwharton.me.uk>
Date: Wed, 13 Dec 2017 10:54:28 +0000
Subject: [PATCH 366/380] Updated i18n

Added product codes to i18n
---
 app/code/Magento/Dhl/i18n/en_US.csv | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/app/code/Magento/Dhl/i18n/en_US.csv b/app/code/Magento/Dhl/i18n/en_US.csv
index 90ec8b5f17a..412f69af14b 100644
--- a/app/code/Magento/Dhl/i18n/en_US.csv
+++ b/app/code/Magento/Dhl/i18n/en_US.csv
@@ -81,3 +81,6 @@ Size,Size
 "Show Method if Not Applicable","Show Method if Not Applicable"
 "Sort Order","Sort Order"
 Debug,Debug
+Domestic express 9:00,Domestic express 9:00
+Domestic express 10:30,Domestic express 10:30
+Domestic express 12:00,Domestic express 12:00
-- 
GitLab


From b422f2c8ad83127a725d12336c5bd287c745128d Mon Sep 17 00:00:00 2001
From: gwharton <graham@gwharton.me.uk>
Date: Wed, 13 Dec 2017 10:57:21 +0000
Subject: [PATCH 367/380] Removed legacy codes from i18n

These codes have been renamed, so entries removed from i18n
---
 app/code/Magento/Dhl/i18n/en_US.csv | 3 ---
 1 file changed, 3 deletions(-)

diff --git a/app/code/Magento/Dhl/i18n/en_US.csv b/app/code/Magento/Dhl/i18n/en_US.csv
index 412f69af14b..27c36bb466b 100644
--- a/app/code/Magento/Dhl/i18n/en_US.csv
+++ b/app/code/Magento/Dhl/i18n/en_US.csv
@@ -23,14 +23,11 @@ Europack,Europack
 "Express 10:30","Express 10:30"
 "Domestic economy select","Domestic economy select"
 "Economy select","Economy select"
-"Break bulk economy","Break bulk economy"
 "Domestic express","Domestic express"
-Others,Others
 "Globalmail business","Globalmail business"
 "Same day","Same day"
 "Express 12:00","Express 12:00"
 "Express envelope","Express envelope"
-"Customer services","Customer services"
 Jetline,Jetline
 "Freight worldwide","Freight worldwide"
 "Jumbo box","Jumbo box"
-- 
GitLab


From 2ba87c689ef2a8d356ddd5a986a9fa2abd9e13ce Mon Sep 17 00:00:00 2001
From: gwharton <graham@gwharton.me.uk>
Date: Wed, 13 Dec 2017 10:59:36 +0000
Subject: [PATCH 368/380] Fixed quotes around strings

Added quotes around strings in i18n
---
 app/code/Magento/Dhl/i18n/en_US.csv | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/app/code/Magento/Dhl/i18n/en_US.csv b/app/code/Magento/Dhl/i18n/en_US.csv
index 27c36bb466b..998cc51c636 100644
--- a/app/code/Magento/Dhl/i18n/en_US.csv
+++ b/app/code/Magento/Dhl/i18n/en_US.csv
@@ -78,6 +78,6 @@ Size,Size
 "Show Method if Not Applicable","Show Method if Not Applicable"
 "Sort Order","Sort Order"
 Debug,Debug
-Domestic express 9:00,Domestic express 9:00
-Domestic express 10:30,Domestic express 10:30
-Domestic express 12:00,Domestic express 12:00
+"Domestic express 9:00","Domestic express 9:00"
+"Domestic express 10:30","Domestic express 10:30"
+"Domestic express 12:00","Domestic express 12:00"
-- 
GitLab


From c27282c5c7c67fe5ea2c8e03fa99a9b029c54907 Mon Sep 17 00:00:00 2001
From: Pavel Bystritsky <p.bystritsky@yandex.ru>
Date: Wed, 13 Dec 2017 14:08:34 +0200
Subject: [PATCH 369/380] magento/magento2#12084: Product csv import > fail on
 round brackets in image filename

---
 .../Model/Import/Product/Validator/Media.php                    | 2 +-
 .../Model/Import/_files/import_media_existing_images.csv        | 2 +-
 .../Model/Import/_files/import_with_filesystem_images.php       | 2 +-
 3 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/app/code/Magento/CatalogImportExport/Model/Import/Product/Validator/Media.php b/app/code/Magento/CatalogImportExport/Model/Import/Product/Validator/Media.php
index d1fe1eee80e..e6d6136498a 100644
--- a/app/code/Magento/CatalogImportExport/Model/Import/Product/Validator/Media.php
+++ b/app/code/Magento/CatalogImportExport/Model/Import/Product/Validator/Media.php
@@ -17,7 +17,7 @@ class Media extends AbstractImportValidator implements RowValidatorInterface
      */
     const URL_REGEXP = '|^http(s)?://[a-z0-9-]+(.[a-z0-9-]+)*(:[0-9]+)?(/.*)?$|i';
 
-    const PATH_REGEXP = '#^(?!.*[\\/]\.{2}[\\/])(?!\.{2}[\\/])[-\w.\\/]+$#';
+    const PATH_REGEXP = '#^(?!.*[\\/]\.{2}[\\/])(?!\.{2}[\\/])[-\w.\\/()]+$#';
 
     const ADDITIONAL_IMAGES = 'additional_images';
 
diff --git a/dev/tests/integration/testsuite/Magento/CatalogImportExport/Model/Import/_files/import_media_existing_images.csv b/dev/tests/integration/testsuite/Magento/CatalogImportExport/Model/Import/_files/import_media_existing_images.csv
index a3e8f8e47ab..1e7303d9b73 100644
--- a/dev/tests/integration/testsuite/Magento/CatalogImportExport/Model/Import/_files/import_media_existing_images.csv
+++ b/dev/tests/integration/testsuite/Magento/CatalogImportExport/Model/Import/_files/import_media_existing_images.csv
@@ -1,2 +1,2 @@
 sku,store_view_code,attribute_set_code,product_type,categories,product_websites,name,description,short_description,weight,product_online,tax_class_name,visibility,price,special_price,special_price_from_date,special_price_to_date,url_key,meta_title,meta_keywords,meta_description,base_image,base_image_label,small_image,small_image_label,thumbnail_image,thumbnail_image_label,swatch_image,swatch_image_label1,created_at,updated_at,new_from_date,new_to_date,display_product_options_in,map_price,msrp_price,map_enabled,gift_message_available,custom_design,custom_design_from,custom_design_to,custom_layout_update,page_layout,product_options_container,msrp_display_actual_price_type,country_of_manufacture,additional_attributes,qty,out_of_stock_qty,use_config_min_qty,is_qty_decimal,allow_backorders,use_config_backorders,min_cart_qty,use_config_min_sale_qty,max_cart_qty,use_config_max_sale_qty,is_in_stock,notify_on_stock_below,use_config_notify_stock_qty,manage_stock,use_config_manage_stock,use_config_qty_increments,qty_increments,use_config_enable_qty_inc,enable_qty_increments,is_decimal_divided,website_id,related_skus,crosssell_skus,upsell_skus,additional_images,additional_image_labels,hide_from_product_page,custom_options,bundle_price_type,bundle_sku_type,bundle_price_view,bundle_weight_type,bundle_values,associated_skus
-simple_new,,Default,simple,,base,New Product,,,,1,Taxable Goods,"Catalog, Search",10,,,,new-product,New Product,New Product,New Product ,magento_image.jpg,Image Label,magento_small_image.jpg,Small Image Label,magento_thumbnail.jpg,Thumbnail Label,magento_image.jpg,Image Label,10/20/15 07:05,10/20/15 07:05,,,Block after Info Column,,,,,,,,,,,,,"has_options=1,quantity_and_stock_status=In Stock,required_options=1",100,0,1,0,0,1,1,1,10000,1,1,1,1,1,0,1,1,0,0,0,1,,,,"magento_additional_image_one.jpg, magento_additional_image_two.jpg","Additional Image Label One,Additional Image Label Two",,,,,,,,
+simple_new,,Default,simple,,base,New Product,,,,1,Taxable Goods,"Catalog, Search",10,,,,new-product,New Product,New Product,New Product ,magento_image(1).jpg,Image Label,magento_small_image.jpg,Small Image Label,magento_thumbnail.jpg,Thumbnail Label,magento_image(1).jpg,Image Label,10/20/15 07:05,10/20/15 07:05,,,Block after Info Column,,,,,,,,,,,,,"has_options=1,quantity_and_stock_status=In Stock,required_options=1",100,0,1,0,0,1,1,1,10000,1,1,1,1,1,0,1,1,0,0,0,1,,,,"magento_additional_image_one.jpg, magento_additional_image_two.jpg","Additional Image Label One,Additional Image Label Two",,,,,,,,
diff --git a/dev/tests/integration/testsuite/Magento/CatalogImportExport/Model/Import/_files/import_with_filesystem_images.php b/dev/tests/integration/testsuite/Magento/CatalogImportExport/Model/Import/_files/import_with_filesystem_images.php
index 04b3092c8fa..23e8fbd5d0f 100644
--- a/dev/tests/integration/testsuite/Magento/CatalogImportExport/Model/Import/_files/import_with_filesystem_images.php
+++ b/dev/tests/integration/testsuite/Magento/CatalogImportExport/Model/Import/_files/import_with_filesystem_images.php
@@ -20,7 +20,7 @@ $dirPath = $mediaDirectory->getAbsolutePath($path);
 $items = [
     [
         'source' => __DIR__ . '/../../../../../Magento/Catalog/_files/magento_image.jpg',
-        'dest' => $dirPath . '/magento_image.jpg',
+        'dest' => $dirPath . '/magento_image(1).jpg',
     ],
     [
         'source' => __DIR__ . '/../../../../../Magento/Catalog/_files/magento_small_image.jpg',
-- 
GitLab


From 1ef474cb75650e68f4ea7f13e9704a237eab9fe7 Mon Sep 17 00:00:00 2001
From: Stanislav Idolov <sidolov@magento.com>
Date: Wed, 13 Dec 2017 15:35:12 +0200
Subject: [PATCH 370/380] magento/magento2#12063

---
 .../Aggregation/DataProvider/QueryBuilder.php | 105 ++++++------------
 .../DataProvider/QueryBuilderTest.php         |   4 +-
 2 files changed, 38 insertions(+), 71 deletions(-)

diff --git a/app/code/Magento/CatalogSearch/Model/Adapter/Mysql/Aggregation/DataProvider/QueryBuilder.php b/app/code/Magento/CatalogSearch/Model/Adapter/Mysql/Aggregation/DataProvider/QueryBuilder.php
index d27b6dd2658..ca077ef7227 100644
--- a/app/code/Magento/CatalogSearch/Model/Adapter/Mysql/Aggregation/DataProvider/QueryBuilder.php
+++ b/app/code/Magento/CatalogSearch/Model/Adapter/Mysql/Aggregation/DataProvider/QueryBuilder.php
@@ -9,7 +9,6 @@ namespace Magento\CatalogSearch\Model\Adapter\Mysql\Aggregation\DataProvider;
 use Magento\CatalogInventory\Model\Configuration as CatalogInventoryConfiguration;
 use Magento\CatalogInventory\Model\Stock;
 use Magento\Eav\Model\Entity\Attribute\AbstractAttribute;
-use Magento\Framework\App\ObjectManager;
 use Magento\Framework\App\ResourceConnection;
 use Magento\Framework\App\ScopeResolverInterface;
 use Magento\Framework\DB\Adapter\AdapterInterface;
@@ -17,7 +16,7 @@ use Magento\Framework\DB\Select;
 use Magento\Framework\Search\Request\BucketInterface;
 
 /**
- *  Class for query building for Magento\CatalogSearch\Model\Adapter\Mysql\Aggregation\DataProvider.
+ *  Attribute query builder
  */
 class QueryBuilder
 {
@@ -36,27 +35,19 @@ class QueryBuilder
      */
     private $inventoryConfig;
 
-    /**
-     * @var AdapterInterface
-     */
-    private $connection;
-
     /**
      * @param ResourceConnection $resource
      * @param ScopeResolverInterface $scopeResolver
-     * @param CatalogInventoryConfiguration|null $inventoryConfig
+     * @param CatalogInventoryConfiguration $inventoryConfig
      */
     public function __construct(
         ResourceConnection $resource,
         ScopeResolverInterface $scopeResolver,
-        CatalogInventoryConfiguration $inventoryConfig = null
+        CatalogInventoryConfiguration $inventoryConfig
     ) {
         $this->resource = $resource;
         $this->scopeResolver = $scopeResolver;
-        $this->inventoryConfig = $inventoryConfig ?: ObjectManager::getInstance()->get(
-            CatalogInventoryConfiguration::class
-        );
-        $this->connection = $resource->getConnection();
+        $this->inventoryConfig = $inventoryConfig;
     }
 
     /**
@@ -71,12 +62,11 @@ class QueryBuilder
      */
     public function build(
         AbstractAttribute $attribute,
-        $tableName,
-        $currentScope,
-        $customerGroupId
-    ) {
-        $select = $this->getSelect();
-
+        string $tableName,
+        int $currentScope,
+        int $customerGroupId
+    ) : Select {
+        $select = $this->resource->getConnection()->select();
         $select->joinInner(
             ['entities' => $tableName],
             'main_table.entity_id  = entities.entity_id',
@@ -84,73 +74,60 @@ class QueryBuilder
         );
 
         if ($attribute->getAttributeCode() === 'price') {
-            /** @var \Magento\Store\Model\Store $store */
-            $store = $this->scopeResolver->getScope($currentScope);
-            if (!$store instanceof \Magento\Store\Model\Store) {
-                throw new \RuntimeException('Illegal scope resolved');
-            }
-
-            $select = $this->buildIfPrice(
-                $store->getWebsiteId(),
-                $customerGroupId,
-                $select
-            );
-        } else {
-            $currentScopeId = $this->scopeResolver->getScope($currentScope)
-                ->getId();
-
-            $select = $this->buildIfNotPrice(
-                $currentScopeId,
-                $attribute,
-                $select
-            );
+            return $this->buildQueryForPriceAttribute($currentScope, $customerGroupId, $select);
         }
 
-        return $select;
+        return $this->buildQueryForAttribute($currentScope, $attribute, $select);
     }
 
     /**
-     * Build select if it is price attribute.
+     * Build select for price attribute.
      *
-     * @param int $websiteId
+     * @param int $currentScope
      * @param int $customerGroupId
      * @param Select $select
      *
      * @return Select
      */
-    private function buildIfPrice(
-        $websiteId,
-        $customerGroupId,
+    private function buildQueryForPriceAttribute(
+        int $currentScope,
+        int $customerGroupId,
         Select $select
-    ) {
+    ) : Select {
+        /** @var \Magento\Store\Model\Store $store */
+        $store = $this->scopeResolver->getScope($currentScope);
+        if (!$store instanceof \Magento\Store\Model\Store) {
+            throw new \RuntimeException('Illegal scope resolved');
+        }
+
         $table = $this->resource->getTableName('catalog_product_index_price');
         $select->from(['main_table' => $table], null)
             ->columns([BucketInterface::FIELD_VALUE => 'main_table.min_price'])
             ->where('main_table.customer_group_id = ?', $customerGroupId)
-            ->where('main_table.website_id = ?', $websiteId);
+            ->where('main_table.website_id = ?', $store->getWebsiteId());
 
         return $select;
     }
 
     /**
-     * Build select if it is not price attribute.
+     * Build select for attribute.
      *
-     * @param int $currentScopeId
+     * @param int $currentScope
      * @param AbstractAttribute $attribute
      * @param Select $select
      *
      * @return Select
      */
-    private function buildIfNotPrice(
-        $currentScopeId,
+    private function buildQueryForAttribute(
+        int $currentScope,
         AbstractAttribute $attribute,
         Select $select
-    ) {
+    ) : Select {
+        $currentScopeId = $this->scopeResolver->getScope($currentScope)->getId();
         $table = $this->resource->getTableName(
             'catalog_product_index_eav' . ($attribute->getBackendType() === 'decimal' ? '_decimal' : '')
         );
-        $subSelect = $select;
-        $subSelect->from(['main_table' => $table], ['main_table.entity_id', 'main_table.value'])
+        $select->from(['main_table' => $table], ['main_table.entity_id', 'main_table.value'])
             ->distinct()
             ->joinLeft(
                 ['stock_index' => $this->resource->getTableName('cataloginventory_stock_status')],
@@ -161,23 +138,11 @@ class QueryBuilder
             ->where('main_table.store_id = ? ', $currentScopeId);
 
         if (!$this->inventoryConfig->isShowOutOfStock($currentScopeId)) {
-            $subSelect->where('stock_index.stock_status = ?', Stock::STOCK_IN_STOCK);
+            $select->where('stock_index.stock_status = ?', Stock::STOCK_IN_STOCK);
         }
 
-        $parentSelect = $this->getSelect();
-        $parentSelect->from(['main_table' => $subSelect], ['main_table.value']);
-        $select = $parentSelect;
-
-        return $select;
-    }
-
-    /**
-     * Get empty select.
-     *
-     * @return Select
-     */
-    private function getSelect()
-    {
-        return $this->connection->select();
+        $parentSelect = $this->resource->getConnection()->select();
+        $parentSelect->from(['main_table' => $select], ['main_table.value']);
+        return $parentSelect;
     }
 }
diff --git a/app/code/Magento/CatalogSearch/Test/Unit/Model/Adapter/Mysql/Aggregation/DataProvider/QueryBuilderTest.php b/app/code/Magento/CatalogSearch/Test/Unit/Model/Adapter/Mysql/Aggregation/DataProvider/QueryBuilderTest.php
index 3a5e2838ef2..b52664df749 100644
--- a/app/code/Magento/CatalogSearch/Test/Unit/Model/Adapter/Mysql/Aggregation/DataProvider/QueryBuilderTest.php
+++ b/app/code/Magento/CatalogSearch/Test/Unit/Model/Adapter/Mysql/Aggregation/DataProvider/QueryBuilderTest.php
@@ -53,7 +53,9 @@ class QueryBuilderTest extends \PHPUnit\Framework\TestCase
         $this->adapterMock = $this->createMock(AdapterInterface::class);
         $this->inventoryConfigMock = $this->createMock(CatalogInventoryConfiguration::class);
 
-        $this->resourceConnectionMock->expects($this->once())->method('getConnection')->willReturn($this->adapterMock);
+        $this->resourceConnectionMock->expects($this->atLeastOnce())
+            ->method('getConnection')
+            ->willReturn($this->adapterMock);
 
         $this->model = new QueryBuilder(
             $this->resourceConnectionMock,
-- 
GitLab


From 7982b300b4d7e20f60f0873c246739e02adbd390 Mon Sep 17 00:00:00 2001
From: RomanKis <romaikiss@gmail.com>
Date: Wed, 13 Dec 2017 16:21:59 +0200
Subject: [PATCH 371/380] magento/magento2#12656: Checkout: Whitespace in front
 of coupon code causes "Coupon code is not valid"

---
 .../Magento/Quote/Model/CouponManagement.php  |  1 +
 .../Quote/Api/CouponManagementTest.php        | 42 +++++++++++++++++++
 2 files changed, 43 insertions(+)

diff --git a/app/code/Magento/Quote/Model/CouponManagement.php b/app/code/Magento/Quote/Model/CouponManagement.php
index 7701e41e0b5..87398ad36cf 100644
--- a/app/code/Magento/Quote/Model/CouponManagement.php
+++ b/app/code/Magento/Quote/Model/CouponManagement.php
@@ -50,6 +50,7 @@ class CouponManagement implements CouponManagementInterface
      */
     public function set($cartId, $couponCode)
     {
+        $couponCode = trim($couponCode);
         /** @var  \Magento\Quote\Model\Quote $quote */
         $quote = $this->quoteRepository->getActive($cartId);
         if (!$quote->getItemsCount()) {
diff --git a/dev/tests/api-functional/testsuite/Magento/Quote/Api/CouponManagementTest.php b/dev/tests/api-functional/testsuite/Magento/Quote/Api/CouponManagementTest.php
index f50276fd6ce..c58b5c16544 100644
--- a/dev/tests/api-functional/testsuite/Magento/Quote/Api/CouponManagementTest.php
+++ b/dev/tests/api-functional/testsuite/Magento/Quote/Api/CouponManagementTest.php
@@ -297,4 +297,46 @@ class CouponManagementTest extends WebapiAbstract
 
         $this->assertEquals($quoteWithCoupon->getCouponCode(), $couponCode);
     }
+
+    /**
+     * @magentoApiDataFixture Magento/Sales/_files/quote.php
+     * @magentoApiDataFixture Magento/Checkout/_files/discount_10percent.php
+     */
+    public function testSetCouponWihSpaces()
+    {
+        /** @var \Magento\Quote\Model\Quote $quote */
+        $quote = $this->objectManager->create(\Magento\Quote\Model\Quote::class);
+        $quote->load('test01', 'reserved_order_id');
+        $cartId = $quote->getId();
+        /** @var \Magento\SalesRule\Model\Rule $salesRule */
+        $salesRule = $this->objectManager->create(\Magento\SalesRule\Model\Rule::class);
+        $salesRuleId = $this->objectManager->get(\Magento\Framework\Registry::class)
+            ->registry('Magento/Checkout/_file/discount_10percent');
+        $salesRule->load($salesRuleId);
+        $couponCode = $salesRule->getPrimaryCoupon()->getCode() ;
+        $serviceInfo = [
+            'rest' => [
+                'resourcePath' => self::RESOURCE_PATH . $cartId . '/coupons/'
+                    . rawurlencode(' ') . $couponCode . rawurlencode(' '),
+                'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_PUT,
+            ],
+            'soap' => [
+                'service' => self::SERVICE_NAME,
+                'serviceVersion' => self::SERVICE_VERSION,
+                'operation' => self::SERVICE_NAME . 'Set',
+            ],
+        ];
+
+        $requestData = [
+            "cartId" => $cartId,
+            "couponCode" => $couponCode,
+        ];
+
+        $this->assertTrue($this->_webApiCall($serviceInfo, $requestData));
+
+        $quoteWithCoupon = $this->objectManager->create(\Magento\Quote\Model\Quote::class);
+        $quoteWithCoupon->load('test01', 'reserved_order_id');
+
+        $this->assertEquals($quoteWithCoupon->getCouponCode(), $couponCode);
+    }
 }
-- 
GitLab


From f99ae4ddf32873bed7e6e1cb5a2237a84fe4ff16 Mon Sep 17 00:00:00 2001
From: gwharton <graham@gwharton.me.uk>
Date: Wed, 13 Dec 2017 15:51:15 +0000
Subject: [PATCH 372/380] Reverted change for product code "O"

Product code "O" changed in error. This reverts the change.
---
 app/code/Magento/Dhl/Model/Carrier.php | 2 +-
 app/code/Magento/Dhl/i18n/en_US.csv    | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/app/code/Magento/Dhl/Model/Carrier.php b/app/code/Magento/Dhl/Model/Carrier.php
index a9bdc99e8dc..9a26efee744 100644
--- a/app/code/Magento/Dhl/Model/Carrier.php
+++ b/app/code/Magento/Dhl/Model/Carrier.php
@@ -608,7 +608,7 @@ class Carrier extends \Magento\Dhl\Model\AbstractDhl implements \Magento\Shippin
             'W' => __('Economy select'),
             'I' => __('Domestic express 9:00'),
             'N' => __('Domestic express'),
-            'O' => __('Domestic express 10:30'),
+            'O' => __('Others'),
             'R' => __('Globalmail business'),
             'S' => __('Same day'),
             'T' => __('Express 12:00'),
diff --git a/app/code/Magento/Dhl/i18n/en_US.csv b/app/code/Magento/Dhl/i18n/en_US.csv
index 998cc51c636..a5532c2cea9 100644
--- a/app/code/Magento/Dhl/i18n/en_US.csv
+++ b/app/code/Magento/Dhl/i18n/en_US.csv
@@ -24,6 +24,7 @@ Europack,Europack
 "Domestic economy select","Domestic economy select"
 "Economy select","Economy select"
 "Domestic express","Domestic express"
+Others,Others
 "Globalmail business","Globalmail business"
 "Same day","Same day"
 "Express 12:00","Express 12:00"
@@ -79,5 +80,4 @@ Size,Size
 "Sort Order","Sort Order"
 Debug,Debug
 "Domestic express 9:00","Domestic express 9:00"
-"Domestic express 10:30","Domestic express 10:30"
 "Domestic express 12:00","Domestic express 12:00"
-- 
GitLab


From 585803acd949ac5f1be4297ec93144b4e1de74de Mon Sep 17 00:00:00 2001
From: RomanKis <romaikiss@gmail.com>
Date: Wed, 13 Dec 2017 18:01:45 +0200
Subject: [PATCH 373/380] magento/magento2#12667: Incorrect partial attribute
 (EAV) reindex (Update by Schedule) for configurable product with childs
 visibility "Not Visible Individually"

---
 .../Catalog/Model/Indexer/Product/Eav/AbstractAction.php     | 1 +
 .../Unit/Model/Indexer/Product/Eav/AbstractActionTest.php    | 5 +++--
 2 files changed, 4 insertions(+), 2 deletions(-)

diff --git a/app/code/Magento/Catalog/Model/Indexer/Product/Eav/AbstractAction.php b/app/code/Magento/Catalog/Model/Indexer/Product/Eav/AbstractAction.php
index 6a2642a8568..ffd912a7cf3 100644
--- a/app/code/Magento/Catalog/Model/Indexer/Product/Eav/AbstractAction.php
+++ b/app/code/Magento/Catalog/Model/Indexer/Product/Eav/AbstractAction.php
@@ -143,6 +143,7 @@ abstract class AbstractAction
     protected function processRelations($indexer, $ids, $onlyParents = false)
     {
         $parentIds = $indexer->getRelationsByChild($ids);
+        $parentIds = array_unique(array_merge($parentIds, $ids));
         $childIds = $onlyParents ? [] : $indexer->getRelationsByParent($parentIds);
         return array_unique(array_merge($ids, $childIds, $parentIds));
     }
diff --git a/app/code/Magento/Catalog/Test/Unit/Model/Indexer/Product/Eav/AbstractActionTest.php b/app/code/Magento/Catalog/Test/Unit/Model/Indexer/Product/Eav/AbstractActionTest.php
index 58654136ab5..b621f1a4906 100644
--- a/app/code/Magento/Catalog/Test/Unit/Model/Indexer/Product/Eav/AbstractActionTest.php
+++ b/app/code/Magento/Catalog/Test/Unit/Model/Indexer/Product/Eav/AbstractActionTest.php
@@ -129,8 +129,9 @@ class AbstractActionTest extends \PHPUnit\Framework\TestCase
             ->disableOriginalConstructor()
             ->getMock();
 
-        $eavSource->expects($this->once())->method('getRelationsByChild')->with($childIds)->willReturn($childIds);
-        $eavSource->expects($this->once())->method('getRelationsByParent')->with($childIds)->willReturn($parentIds);
+        $eavSource->expects($this->once())->method('getRelationsByChild')->with($childIds)->willReturn($parentIds);
+        $eavSource->expects($this->once())->method('getRelationsByParent')
+            ->with(array_unique(array_merge($parentIds, $childIds)))->willReturn($parentIds);
 
         $eavDecimal->expects($this->once())->method('getRelationsByChild')->with($reindexIds)->willReturn($reindexIds);
         $eavDecimal->expects($this->once())->method('getRelationsByParent')->with($reindexIds)->willReturn([]);
-- 
GitLab


From 1f77aaad920551ae0309a9964989213f6c265e4f Mon Sep 17 00:00:00 2001
From: Pavel Bystritsky <p.bystritsky@yandex.ru>
Date: Wed, 13 Dec 2017 18:54:40 +0200
Subject: [PATCH 374/380] magento/magento2#10734: Magento 2 is not showing
 Popular Search Terms [backport]

---
 app/code/Magento/Search/Block/Term.php        |   6 +-
 .../Search/view/frontend/templates/term.phtml |   2 +-
 .../Magento/CatalogSearch/Block/TermTest.php  |   2 +-
 .../Magento/Search/Block/TermTest.php         | 117 ++++++++++++++++++
 .../testsuite/Magento/Search/_files/query.php |  61 +++++++++
 .../Magento/Search/_files/query_rollback.php  |  24 ++++
 6 files changed, 207 insertions(+), 5 deletions(-)
 create mode 100644 dev/tests/integration/testsuite/Magento/Search/Block/TermTest.php
 create mode 100644 dev/tests/integration/testsuite/Magento/Search/_files/query.php
 create mode 100644 dev/tests/integration/testsuite/Magento/Search/_files/query_rollback.php

diff --git a/app/code/Magento/Search/Block/Term.php b/app/code/Magento/Search/Block/Term.php
index d92ba03bfcf..ee62129051b 100644
--- a/app/code/Magento/Search/Block/Term.php
+++ b/app/code/Magento/Search/Block/Term.php
@@ -95,8 +95,8 @@ class Term extends Template
                     continue;
                 }
                 $term->setRatio(($term->getPopularity() - $this->_minPopularity) / $range);
-                $temp[$term->getName()] = $term;
-                $termKeys[] = $term->getName();
+                $temp[$term->getData('query_text')] = $term;
+                $termKeys[] = $term->getData('query_text');
             }
             natcasesort($termKeys);
 
@@ -128,7 +128,7 @@ class Term extends Template
          * url encoding will be done in Url.php http_build_query
          * so no need to explicitly called urlencode for the text
          */
-        $url->setQueryParam('q', $obj->getName());
+        $url->setQueryParam('q', $obj->getData('query_text'));
         return $url->getUrl('catalogsearch/result');
     }
 
diff --git a/app/code/Magento/Search/view/frontend/templates/term.phtml b/app/code/Magento/Search/view/frontend/templates/term.phtml
index 4285b42fa03..8acee0cf3d4 100644
--- a/app/code/Magento/Search/view/frontend/templates/term.phtml
+++ b/app/code/Magento/Search/view/frontend/templates/term.phtml
@@ -13,7 +13,7 @@
             <li class="item">
                 <a href="<?= /* @escapeNotVerified */ $block->getSearchUrl($_term) ?>"
                    style="font-size:<?= /* @escapeNotVerified */ $_term->getRatio()*70+75 ?>%;">
-                    <?= $block->escapeHtml($_term->getName()) ?>
+                    <?= $block->escapeHtml($_term->getData('query_text')) ?>
                 </a>
             </li>
         <?php endforeach; ?>
diff --git a/dev/tests/integration/testsuite/Magento/CatalogSearch/Block/TermTest.php b/dev/tests/integration/testsuite/Magento/CatalogSearch/Block/TermTest.php
index a6b0fcc463e..bc1bc3a7968 100644
--- a/dev/tests/integration/testsuite/Magento/CatalogSearch/Block/TermTest.php
+++ b/dev/tests/integration/testsuite/Magento/CatalogSearch/Block/TermTest.php
@@ -24,7 +24,7 @@ class TermTest extends \PHPUnit\Framework\TestCase
     public function testGetSearchUrl()
     {
         $query = uniqid();
-        $obj = new \Magento\Framework\DataObject(['name' => $query]);
+        $obj = new \Magento\Framework\DataObject(['query_text' => $query]);
         $this->assertStringEndsWith("/catalogsearch/result/?q={$query}", $this->_block->getSearchUrl($obj));
     }
 }
diff --git a/dev/tests/integration/testsuite/Magento/Search/Block/TermTest.php b/dev/tests/integration/testsuite/Magento/Search/Block/TermTest.php
new file mode 100644
index 00000000000..08645869f36
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Search/Block/TermTest.php
@@ -0,0 +1,117 @@
+<?php
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Search\Block;
+
+use Magento\Framework\ObjectManagerInterface;
+use Magento\Framework\View\LayoutInterface;
+
+/**
+ * Tests Magento\Search\Block\Term.
+ *
+ * @magentoAppIsolation enabled
+ * @magentoDbIsolation enabled
+ */
+class TermTest extends \PHPUnit\Framework\TestCase
+{
+    /**
+     * @var ObjectManagerInterface
+     */
+    private $objectManager;
+
+    /**
+     * @var Term
+     */
+    private $term;
+
+    /**
+     * Tests Magento\Search\Block\Term::GetTerms.
+     *
+     * @magentoDataFixture Magento/Search/_files/query.php
+     * @dataProvider getTermsDataProvider
+     * @param array $expected
+     */
+    public function testGetTerms(array $expected)
+    {
+        $result = $this->term->getTerms();
+        $actual = array_map(function ($object) {
+            return $object->setUpdatedAt(null)->getData();
+        },
+            $result);
+
+        self::assertEquals(
+            $expected,
+            $actual
+        );
+    }
+
+    /**
+     * Data provider for testGetTerms.
+     *
+     * @return array
+     */
+    public function getTermsDataProvider()
+    {
+        return [
+            [
+                [
+                    '1st query' =>
+                        [
+                            'query_id' => '1',
+                            'query_text' => '1st query',
+                            'num_results' => '1',
+                            'popularity' => '5',
+                            'redirect' => null,
+                            'store_id' => '1',
+                            'display_in_terms' => '1',
+                            'is_active' => '1',
+                            'is_processed' => '1',
+                            'updated_at' => null,
+                            'ratio' => 0.44444444444444,
+                        ],
+                    '2nd query' =>
+                        [
+                            'query_id' => '2',
+                            'query_text' => '2nd query',
+                            'num_results' => '1',
+                            'popularity' => '10',
+                            'redirect' => null,
+                            'store_id' => '1',
+                            'display_in_terms' => '1',
+                            'is_active' => '1',
+                            'is_processed' => '1',
+                            'updated_at' => null,
+                            'ratio' => 1,
+                        ],
+                    '3rd query' =>
+                        [
+                            'query_id' => '3',
+                            'query_text' => '3rd query',
+                            'num_results' => '1',
+                            'popularity' => '1',
+                            'redirect' => null,
+                            'store_id' => '1',
+                            'display_in_terms' => '1',
+                            'is_active' => '1',
+                            'is_processed' => '1',
+                            'updated_at' => null,
+                            'ratio' => 0,
+                        ],
+                ],
+            ],
+        ];
+    }
+
+    protected function setUp()
+    {
+        $this->objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
+        $this->term = $this->objectManager->get(
+            LayoutInterface::class
+        )->createBlock(
+            Term::class
+        );
+    }
+}
diff --git a/dev/tests/integration/testsuite/Magento/Search/_files/query.php b/dev/tests/integration/testsuite/Magento/Search/_files/query.php
new file mode 100644
index 00000000000..f088da0e83a
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Search/_files/query.php
@@ -0,0 +1,61 @@
+<?php
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+$objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
+
+$queries = [
+    [
+        'text' => '1st query',
+        'results' => 1,
+        'popularity' => 5,
+        'display' => 1,
+        'active' => 1,
+        'processed' => 1
+    ],
+    [
+        'text' => '2nd query',
+        'results' => 1,
+        'popularity' => 10,
+        'display' => 1,
+        'active' => 1,
+        'processed' => 1
+    ],
+    [
+        'text' => '3rd query',
+        'results' => 1,
+        'popularity' => 1,
+        'display' => 1,
+        'active' => 1,
+        'processed' => 1
+    ],
+    [
+        'text' => '4th query',
+        'results' => 0,
+        'popularity' => 1,
+        'display' => 1,
+        'active' => 1,
+        'processed' => 1
+    ],
+];
+
+foreach ($queries as $queryData) {
+    /** @var $queryData \Magento\Search\Model\Query */
+    $query = $objectManager->create(\Magento\Search\Model\Query::class);
+    $query->setStoreId(1);
+    $query->setQueryText(
+        $queryData['text']
+    )->setNumResults(
+        $queryData['results']
+    )->setPopularity(
+        $queryData['popularity']
+    )->setDisplayInTerms(
+        $queryData['display']
+    )->setIsActive(
+        $queryData['active']
+    )->setIsProcessed(
+        $queryData['processed']
+    );
+    $query->save();
+}
diff --git a/dev/tests/integration/testsuite/Magento/Search/_files/query_rollback.php b/dev/tests/integration/testsuite/Magento/Search/_files/query_rollback.php
new file mode 100644
index 00000000000..5bf123fcd96
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Search/_files/query_rollback.php
@@ -0,0 +1,24 @@
+<?php
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+$objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
+
+/** @var $query \Magento\Search\Model\Query */
+$query = $objectManager->get(\Magento\Search\Model\Query::class);
+
+$queries = [
+    '1st query',
+    '2nd query',
+    '3rd query',
+    '4th query',
+];
+
+foreach ($queries as $queryText) {
+    try {
+        $query->loadByQueryText($queryText);
+        $query->delete();
+    }  catch (\Magento\Framework\Exception\NoSuchEntityException $exception) {
+    }
+}
-- 
GitLab


From cc10dc1d4f6ca7e2d88fd05122facacc0d0cf5ae Mon Sep 17 00:00:00 2001
From: Stanislav Idolov <sidolov@magento.com>
Date: Thu, 14 Dec 2017 09:12:33 +0200
Subject: [PATCH 375/380] magento/magento2#12666

---
 .../Dhl/Test/Unit/Model/CarrierTest.php       | 63 +++++++++++++++++++
 1 file changed, 63 insertions(+)

diff --git a/app/code/Magento/Dhl/Test/Unit/Model/CarrierTest.php b/app/code/Magento/Dhl/Test/Unit/Model/CarrierTest.php
index 0f0d784813d..8738d3bb8da 100644
--- a/app/code/Magento/Dhl/Test/Unit/Model/CarrierTest.php
+++ b/app/code/Magento/Dhl/Test/Unit/Model/CarrierTest.php
@@ -447,4 +447,67 @@ class CarrierTest extends \PHPUnit\Framework\TestCase
             ]
         ];
     }
+
+    /**
+     * @dataProvider dhlProductsDataProvider
+     *
+     * @param string $docType
+     * @param array $products
+     */
+    public function testGetDhlProducts(string $docType, array $products)
+    {
+        $this->assertEquals($products, $this->model->getDhlProducts($docType));
+    }
+
+    /**
+     * @return array
+     */
+    public function dhlProductsDataProvider() : array
+    {
+        return [
+            'doc' => [
+                'docType' => \Magento\Dhl\Model\Carrier::DHL_CONTENT_TYPE_DOC,
+                'products' => [
+                    '2' => 'Easy shop',
+                    '5' => 'Sprintline',
+                    '6' => 'Secureline',
+                    '7' => 'Express easy',
+                    '9' => 'Europack',
+                    'B' => 'Break bulk express',
+                    'C' => 'Medical express',
+                    'D' => 'Express worldwide',
+                    'U' => 'Express worldwide',
+                    'K' => 'Express 9:00',
+                    'L' => 'Express 10:30',
+                    'G' => 'Domestic economy select',
+                    'W' => 'Economy select',
+                    'I' => 'Domestic express 9:00',
+                    'N' => 'Domestic express',
+                    'O' => 'Others',
+                    'R' => 'Globalmail business',
+                    'S' => 'Same day',
+                    'T' => 'Express 12:00',
+                    'X' => 'Express envelope',
+                ]
+            ],
+            'non-doc' => [
+                'docType' => \Magento\Dhl\Model\Carrier::DHL_CONTENT_TYPE_NON_DOC,
+                'products' => [
+                    '1' => 'Domestic express 12:00',
+                    '3' => 'Easy shop',
+                    '4' => 'Jetline',
+                    '8' => 'Express easy',
+                    'P' => 'Express worldwide',
+                    'Q' => 'Medical express',
+                    'E' => 'Express 9:00',
+                    'F' => 'Freight worldwide',
+                    'H' => 'Economy select',
+                    'J' => 'Jumbo box',
+                    'M' => 'Express 10:30',
+                    'V' => 'Europack',
+                    'Y' => 'Express 12:00',
+                ]
+            ]
+        ];
+    }
 }
-- 
GitLab


From e340347310cfd1c2e91e79f07d21291de7a55348 Mon Sep 17 00:00:00 2001
From: Pavel Bystritsky <p.bystritsky@yandex.ru>
Date: Thu, 14 Dec 2017 11:04:41 +0200
Subject: [PATCH 376/380] magento/magento2#10734: Magento 2 is not showing
 Popular Search Terms [backport]

---
 .../testsuite/Magento/Search/_files/query_rollback.php          | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/dev/tests/integration/testsuite/Magento/Search/_files/query_rollback.php b/dev/tests/integration/testsuite/Magento/Search/_files/query_rollback.php
index 5bf123fcd96..87b2d112220 100644
--- a/dev/tests/integration/testsuite/Magento/Search/_files/query_rollback.php
+++ b/dev/tests/integration/testsuite/Magento/Search/_files/query_rollback.php
@@ -19,6 +19,6 @@ foreach ($queries as $queryText) {
     try {
         $query->loadByQueryText($queryText);
         $query->delete();
-    }  catch (\Magento\Framework\Exception\NoSuchEntityException $exception) {
+    } catch (\Magento\Framework\Exception\NoSuchEntityException $exception) {
     }
 }
-- 
GitLab


From 43ede3ca2718c3c3bb9242e99a8bd121680ecf6e Mon Sep 17 00:00:00 2001
From: Pavel Bystritsky <p.bystritsky@yandex.ru>
Date: Thu, 14 Dec 2017 11:47:35 +0200
Subject: [PATCH 377/380] magento/magento2#10734: Magento 2 is not showing
 Popular Search Terms [backport]

---
 .../testsuite/Magento/Search/Block/TermTest.php        | 10 ++++++----
 1 file changed, 6 insertions(+), 4 deletions(-)

diff --git a/dev/tests/integration/testsuite/Magento/Search/Block/TermTest.php b/dev/tests/integration/testsuite/Magento/Search/Block/TermTest.php
index 08645869f36..c1b3b6062fa 100644
--- a/dev/tests/integration/testsuite/Magento/Search/Block/TermTest.php
+++ b/dev/tests/integration/testsuite/Magento/Search/Block/TermTest.php
@@ -37,10 +37,12 @@ class TermTest extends \PHPUnit\Framework\TestCase
     public function testGetTerms(array $expected)
     {
         $result = $this->term->getTerms();
-        $actual = array_map(function ($object) {
-            return $object->setUpdatedAt(null)->getData();
-        },
-            $result);
+        $actual = array_map(
+            function ($object) {
+                return $object->setUpdatedAt(null)->getData();
+            },
+            $result
+        );
 
         self::assertEquals(
             $expected,
-- 
GitLab


From f69dd0fd83b067a84faddebd378837568866c4bc Mon Sep 17 00:00:00 2001
From: Ievgen Shakhsuvarov <ishakhsuvarov@users.noreply.github.com>
Date: Thu, 13 Jul 2017 16:50:27 +0300
Subject: [PATCH 378/380] Create CODE_OF_CONDUCT.md

---
 CODE_OF_CONDUCT.md | 46 ++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 46 insertions(+)
 create mode 100644 CODE_OF_CONDUCT.md

diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md
new file mode 100644
index 00000000000..4e82725a7fb
--- /dev/null
+++ b/CODE_OF_CONDUCT.md
@@ -0,0 +1,46 @@
+# Contributor Covenant Code of Conduct
+
+## Our Pledge
+
+In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation.
+
+## Our Standards
+
+Examples of behavior that contributes to creating a positive environment include:
+
+* Using welcoming and inclusive language
+* Being respectful of differing viewpoints and experiences
+* Gracefully accepting constructive criticism
+* Focusing on what is best for the community
+* Showing empathy towards other community members
+
+Examples of unacceptable behavior by participants include:
+
+* The use of sexualized language or imagery and unwelcome sexual attention or advances
+* Trolling, insulting/derogatory comments, and personal or political attacks
+* Public or private harassment
+* Publishing others' private information, such as a physical or electronic address, without explicit permission
+* Other conduct which could reasonably be considered inappropriate in a professional setting
+
+## Our Responsibilities
+
+Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior.
+
+Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful.
+
+## Scope
+
+This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers.
+
+## Enforcement
+
+Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at engcom@magento.com. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately.
+
+Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership.
+
+## Attribution
+
+This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version]
+
+[homepage]: http://contributor-covenant.org
+[version]: http://contributor-covenant.org/version/1/4/
-- 
GitLab


From 104faf3cd9d4353cfa7f6dc86abb828eebc412cb Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Andreas=20M=C3=B6ller?= <am@localheinz.com>
Date: Tue, 5 Sep 2017 14:37:14 +0200
Subject: [PATCH 379/380] Fix: Move GitHub-specific documents into .github

---
 CODE_OF_CONDUCT.md => .github/CODE_OF_CONDUCT.md             | 0
 CONTRIBUTING.md => .github/CONTRIBUTING.md                   | 0
 ISSUE_TEMPLATE.md => .github/ISSUE_TEMPLATE.md               | 0
 PULL_REQUEST_TEMPLATE.md => .github/PULL_REQUEST_TEMPLATE.md | 0
 4 files changed, 0 insertions(+), 0 deletions(-)
 rename CODE_OF_CONDUCT.md => .github/CODE_OF_CONDUCT.md (100%)
 rename CONTRIBUTING.md => .github/CONTRIBUTING.md (100%)
 rename ISSUE_TEMPLATE.md => .github/ISSUE_TEMPLATE.md (100%)
 rename PULL_REQUEST_TEMPLATE.md => .github/PULL_REQUEST_TEMPLATE.md (100%)

diff --git a/CODE_OF_CONDUCT.md b/.github/CODE_OF_CONDUCT.md
similarity index 100%
rename from CODE_OF_CONDUCT.md
rename to .github/CODE_OF_CONDUCT.md
diff --git a/CONTRIBUTING.md b/.github/CONTRIBUTING.md
similarity index 100%
rename from CONTRIBUTING.md
rename to .github/CONTRIBUTING.md
diff --git a/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md
similarity index 100%
rename from ISSUE_TEMPLATE.md
rename to .github/ISSUE_TEMPLATE.md
diff --git a/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md
similarity index 100%
rename from PULL_REQUEST_TEMPLATE.md
rename to .github/PULL_REQUEST_TEMPLATE.md
-- 
GitLab


From 3d2e1eb5e9ddf20b6c4e78bedfea2d2403b62ff3 Mon Sep 17 00:00:00 2001
From: Ievgen Shakhsuvarov <ishakhsuvarov@magento.com>
Date: Fri, 15 Dec 2017 01:15:27 +0200
Subject: [PATCH 380/380] Deny access to .github directory

---
 .github/.htaccess | 8 ++++++++
 .htaccess         | 9 ---------
 .htaccess.sample  | 9 ---------
 3 files changed, 8 insertions(+), 18 deletions(-)
 create mode 100644 .github/.htaccess

diff --git a/.github/.htaccess b/.github/.htaccess
new file mode 100644
index 00000000000..707c26b075e
--- /dev/null
+++ b/.github/.htaccess
@@ -0,0 +1,8 @@
+<IfVersion < 2.4>
+    order allow,deny
+    deny from all
+</IfVersion>
+<IfVersion >= 2.4>
+    Require all denied
+</IfVersion>
+
diff --git a/.htaccess b/.htaccess
index f824f0b7bbc..6247830fa8d 100644
--- a/.htaccess
+++ b/.htaccess
@@ -274,15 +274,6 @@
             Require all denied
         </IfVersion>
     </Files>
-    <Files CONTRIBUTING.md>
-        <IfVersion < 2.4>
-            order allow,deny
-            deny from all
-        </IfVersion>
-        <IfVersion >= 2.4>
-            Require all denied
-        </IfVersion>
-    </Files>
     <Files COPYING.txt>
         <IfVersion < 2.4>
             order allow,deny
diff --git a/.htaccess.sample b/.htaccess.sample
index f3a4474aec9..3c412725f21 100644
--- a/.htaccess.sample
+++ b/.htaccess.sample
@@ -251,15 +251,6 @@
             Require all denied
         </IfVersion>
     </Files>
-    <Files CONTRIBUTING.md>
-        <IfVersion < 2.4>
-            order allow,deny
-            deny from all
-        </IfVersion>
-        <IfVersion >= 2.4>
-            Require all denied
-        </IfVersion>
-    </Files>
     <Files COPYING.txt>
         <IfVersion < 2.4>
             order allow,deny
-- 
GitLab