diff --git a/app/code/Magento/Catalog/Ui/DataProvider/Product/Form/Modifier/General.php b/app/code/Magento/Catalog/Ui/DataProvider/Product/Form/Modifier/General.php
index 0fbba264f7e93383f07434a7fe2ebf4586d54516..886c7a070adf93b68ec54f45813ba80911029e44 100755
--- a/app/code/Magento/Catalog/Ui/DataProvider/Product/Form/Modifier/General.php
+++ b/app/code/Magento/Catalog/Ui/DataProvider/Product/Form/Modifier/General.php
@@ -315,17 +315,6 @@ class General extends AbstractModifier
             $importsConfig = [
                 'mask' => $this->locator->getStore()->getConfig('catalog/fields_masks/' . $listener),
                 'component' => 'Magento_Catalog/js/components/import-handler',
-                'imports' => [
-                    'handleNameChanges' => '${$.provider}:data.product.name',
-                    'handleDescriptionChanges' => '${$.provider}:data.product.description',
-                    'handleSkuChanges' => '${$.provider}:data.product.sku',
-                    'handleColorChanges' => '${$.provider}:data.product.color',
-                    'handleCountryChanges' => '${$.provider}:data.product.country_of_manufacture',
-                    'handleGenderChanges' => '${$.provider}:data.product.gender',
-                    'handleMaterialChanges' => '${$.provider}:data.product.material',
-                    'handleShortDescriptionChanges' => '${$.provider}:data.product.short_description',
-                    'handleSizeChanges' => '${$.provider}:data.product.size'
-                ],
                 'allowImport' => !$this->locator->getProduct()->getId(),
             ];
 
diff --git a/app/code/Magento/Catalog/view/adminhtml/web/js/components/import-handler.js b/app/code/Magento/Catalog/view/adminhtml/web/js/components/import-handler.js
index e67bde152475f62769d6eaff73548893f98ed7d0..a0aec918ccda24f1ae05486bc5d9ec59522f0ca7 100644
--- a/app/code/Magento/Catalog/view/adminhtml/web/js/components/import-handler.js
+++ b/app/code/Magento/Catalog/view/adminhtml/web/js/components/import-handler.js
@@ -4,148 +4,78 @@
  */
 
 define([
+    'Magento_Ui/js/form/element/abstract',
     'underscore',
-    'Magento_Ui/js/form/element/textarea'
-], function (_, Textarea) {
+    'uiRegistry'
+], function (Abstract, _, registry) {
     'use strict';
 
-    return Textarea.extend({
+    return Abstract.extend({
         defaults: {
             allowImport: true,
             autoImportIfEmpty: false,
-            values: {
-                'name': '',
-                'description': '',
-                'sku': '',
-                'color': '',
-                'country_of_manufacture': '',
-                'gender': '',
-                'material': '',
-                'short_description': '',
-                'size': ''
-            },
-            valueUpdate: 'input',
-            mask: ''
+            values: {},
+            mask: '',
+            queryTemplate: 'ns = ${ $.ns }, index = '
         },
 
-        /**
-         * Handle name value changes, if it's allowed
-         *
-         * @param {String} newValue
-         */
-        handleNameChanges: function (newValue) {
-            this.values.name = newValue;
-            this.updateValue();
-        },
-
-        /**
-         * Handle description value changes, if it's allowed
-         *
-         * @param {String} newValue
-         */
-        handleDescriptionChanges: function (newValue) {
-            this.values.description = newValue;
-            this.updateValue();
-        },
+        /** @inheritdoc */
+        initialize: function () {
+            this._super();
 
-        /**
-         * Handle sku value changes, if it's allowed
-         *
-         * @param {String} newValue
-         */
-        handleSkuChanges: function (newValue) {
-            if (this.code !== 'sku') {
-                this.values.sku = newValue;
-                this.updateValue();
+            if (this.allowImport) {
+                this.setHandlers();
             }
         },
 
         /**
-         * Handle color value changes, if it's allowed
-         *
-         * @param {String} newValue
-         */
-        handleColorChanges: function (newValue) {
-            this.values.color = newValue;
-            this.updateValue();
-        },
-
-        /**
-         * Handle country value changes, if it's allowed
-         *
-         * @param {String} newValue
+         * Split mask placeholder and attach events to placeholder fields.
          */
-        handleCountryChanges: function (newValue) {
-            this.values.country = newValue;
-            this.updateValue();
-        },
+        setHandlers: function () {
+            var str = this.mask || '',
+                placeholders;
 
-        /**
-         * Handle gender value changes, if it's allowed
-         *
-         * @param {String} newValue
-         */
-        handleGenderChanges: function (newValue) {
-            this.values.gender = newValue;
-            this.updateValue();
-        },
+            placeholders = str.match(/{{(.*?)}}/g); // Get placeholders
 
-        /**
-         * Handle material value changes, if it's allowed
-         *
-         * @param {String} newValue
-         */
-        handleMaterialChanges: function (newValue) {
-            this.values.material = newValue;
-            this.updateValue();
-        },
+            _.each(placeholders, function (placeholder) {
+                placeholder = placeholder.replace(/[{{}}]/g, ''); // Remove curly braces
 
-        /**
-         * Handle short description value changes, if it's allowed
-         *
-         * @param {String} newValue
-         */
-        handleShortDescriptionChanges: function (newValue) {
-            this.values['short_description'] = newValue;
-            this.updateValue();
+                registry.get(this.queryTemplate + placeholder, function (component) {
+                    this.values[placeholder] = component.getPreview();
+                    component.on('value', this.updateValue.bind(this, placeholder, component));
+                    component.valueUpdate = 'keyup';
+                }.bind(this));
+            }, this);
         },
 
         /**
-         * Handle size value changes, if it's allowed
+         * Update field with mask value, if it's allowed.
          *
-         * @param {String} newValue
+         * @param {Object} placeholder
+         * @param {Object} component
          */
-        handleSizeChanges: function (newValue) {
-            this.values.size = newValue;
-            this.updateValue();
-        },
+        updateValue: function (placeholder, component) {
+            var string = this.mask || '',
+                nonEmptyValueFlag = false;
 
-        /**
-         * Update field value, if it's allowed
-         */
-        updateValue: function () {
-            var str = this.mask || '',
-                nonEmptyValueFlag = false,
-                tmpElement;
+            if (placeholder) {
+                this.values[placeholder] = component.getPreview() || '';
+            }
 
             if (!this.allowImport) {
                 return;
             }
 
-            if (str) {
-                _.each(this.values, function (propertyValue, propertyName) {
-                    str = str.replace('{{' + propertyName + '}}', propertyValue);
-                    nonEmptyValueFlag = nonEmptyValueFlag || !!propertyValue;
-                });
-            }
-
-            // strip tags
-            tmpElement = document.createElement('div');
-            tmpElement.innerHTML = str;
-            str =  tmpElement.textContent || tmpElement.innerText || '';
+            _.each(this.values, function (propertyValue, propertyName) {
+                string = string.replace('{{' + propertyName + '}}', propertyValue);
+                nonEmptyValueFlag = nonEmptyValueFlag || !!propertyValue;
+            });
 
             if (nonEmptyValueFlag) {
-                this.value(str);
+                string = string.replace(/(<([^>]+)>)/ig, ''); // Remove html tags
+                this.value(string);
+            } else {
+                this.value('');
             }
         },
 
@@ -169,13 +99,20 @@ define([
          *  and disallow/allow import value
          */
         userChanges: function () {
+
+            /**
+             *  As userChanges is called before updateValue,
+             *  we forced to get value from component by reference
+             */
+            var actualValue = arguments[1].currentTarget.value;
+
             this._super();
 
-            if (this.value() === '') {
+            if (actualValue === '') {
                 this.allowImport = true;
 
                 if (this.autoImportIfEmpty) {
-                    this.updateValue();
+                    this.updateValue(null, null);
                 }
             } else {
                 this.allowImport = false;
diff --git a/app/code/Magento/Ui/view/base/web/js/lib/knockout/bindings/datepicker.js b/app/code/Magento/Ui/view/base/web/js/lib/knockout/bindings/datepicker.js
index 16c102b8367f4b8762030057c4d249adb132693b..77d3a069ccef76bbcacad28459820b3359b025e7 100644
--- a/app/code/Magento/Ui/view/base/web/js/lib/knockout/bindings/datepicker.js
+++ b/app/code/Magento/Ui/view/base/web/js/lib/knockout/bindings/datepicker.js
@@ -51,7 +51,12 @@ define([
 
             observable() && $(el).datepicker(
                 'setDate',
-                moment(observable(), utils.normalizeDate(config.options.dateFormat)).toDate()
+                moment(
+                    observable(),
+                    utils.normalizeDate(
+                        options.dateFormat + (options.showsTime ? ' ' + options.timeFormat : '')
+                    )
+                ).toDate()
             );
 
             $(el).blur();
diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/Repository/ConfigData.xml b/dev/tests/functional/tests/app/Magento/Catalog/Test/Repository/ConfigData.xml
index 9ae1e2ebfacca405f8505496f546cf2182e2dd3f..c32999a6ebce7e0a4c44c1a10bc8fe4010a795f7 100644
--- a/dev/tests/functional/tests/app/Magento/Catalog/Test/Repository/ConfigData.xml
+++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/Repository/ConfigData.xml
@@ -34,5 +34,16 @@
                 <item name="inherit" xsi:type="number">1</item>
             </field>
         </dataset>
+        <dataset name="attribute_product_mask_sku">
+            <field name="catalog/fields_masks/sku" xsi:type="array">
+                <item name="value" xsi:type="string">{{name}} {{country_of_manufacture}}</item>
+            </field>
+        </dataset>
+        <dataset name="attribute_product_mask_sku_rollback">
+            <field name="catalog/fields_masks/sku" xsi:type="array">
+                <item name="value" xsi:type="string">{{name}}</item>
+                <item name="inherit" xsi:type="number">1</item>
+            </field>
+        </dataset>
     </repository>
 </config>
diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/Product/CreateSimpleProductEntityByAttributeMaskSkuTest.php b/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/Product/CreateSimpleProductEntityByAttributeMaskSkuTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..0884e93387b2ac60c0be00e56791ae2b03443d38
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/Product/CreateSimpleProductEntityByAttributeMaskSkuTest.php
@@ -0,0 +1,134 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Catalog\Test\TestCase\Product;
+
+use Magento\Catalog\Test\Fixture\CatalogProductSimple;
+use Magento\Catalog\Test\Page\Adminhtml\CatalogProductIndex;
+use Magento\Catalog\Test\Page\Adminhtml\CatalogProductNew;
+use Magento\Mtf\TestCase\Injectable;
+
+/**
+ * Steps:
+ * 1. Login to the backend.
+ * 2. Navigate to Products > Catalog.
+ * 3. Start to create simple product.
+ * 4. Fill in data according to data set.
+ * 5. Save Product.
+ * 6. Perform appropriate assertions.
+ *
+ * @group Products
+ * @ZephyrId MAGETWO-59861
+ */
+class CreateSimpleProductEntityByAttributeMaskSkuTest extends Injectable
+{
+    /**
+     * Configuration setting.
+     *
+     * @var string
+     */
+    protected $configData;
+
+    /**
+     * Should cache be flushed
+     *
+     * @var bool
+     */
+    private $flushCache;
+
+    /**
+     * @var \Magento\Mtf\Fixture\FixtureFactory
+     */
+    private $fixtureFactory;
+
+    /**
+     * Run create product simple entity by attribute mask SKU test.
+     *
+     * @param CatalogProductSimple $product
+     * @param CatalogProductIndex $productGrid
+     * @param CatalogProductNew $newProductPage
+     * @param string $configData
+     * @param bool $flushCache
+     * @return array
+     */
+    public function testCreate(
+        CatalogProductSimple $product,
+        CatalogProductIndex $productGrid,
+        CatalogProductNew $newProductPage,
+        \Magento\Mtf\Fixture\FixtureFactory $fixtureFactory,
+        $flushCache = false,
+        $configData = null
+    ) {
+        $this->configData = $configData;
+        $this->flushCache = $flushCache;
+        $this->fixtureFactory = $fixtureFactory;
+
+        // Preconditions
+        $this->objectManager->create(
+            \Magento\Config\Test\TestStep\SetupConfigurationStep::class,
+            ['configData' => $this->configData, 'flushCache' => $this->flushCache]
+        )->run();
+
+        // Steps
+        $productGrid->open();
+        $productGrid->getGridPageActionBlock()->addProduct('simple');
+        $newProductPage->getProductForm()->fill($product);
+        $newProductPage->getFormPageActions()->save();
+
+        $skuMask = $this->prepareSkuByMask($product);
+
+        $productSimple = $fixtureFactory->createByCode(
+            'catalogProductSimple',
+            ['data' => array_merge($product->getData(), ['sku' => $skuMask])]
+        );
+
+        return ['product' => $productSimple];
+    }
+
+    /**
+     * Obtains product sku based on attributes define in Stores > Configuration->Catalog > Catalog > Mask for SKU
+     *
+     * @param CatalogProductSimple $product
+     * @return string
+     */
+    private function prepareSkuByMask(CatalogProductSimple $product)
+    {
+        $productData = $product->getData();
+        $skuMask = '';
+        $config = $this->fixtureFactory->createByCode('configData', ['dataset' => $this->configData]);
+        $section = $config->getData('section');
+        if (is_array($section) && array_key_exists('catalog/fields_masks/sku', $section)) {
+            $skuMask = $section['catalog/fields_masks/sku']['value'];
+        }
+
+        $attributesInPattern = [];
+        $count = preg_match_all('/{{(\w+)}}/', $skuMask, $matches);
+        if ($count > 0 && is_array($matches[0])) {
+            foreach ($matches[1] as $attributeName) {
+                if (array_key_exists($attributeName, $productData)) {
+                    $attributesInPattern[$attributeName] = $productData[$attributeName];
+                }
+            }
+        }
+        foreach ($attributesInPattern as $attributeName => $attributeValue) {
+            $skuMask = str_replace('{{' . $attributeName . '}}', $attributeValue, $skuMask);
+        }
+        return $skuMask;
+    }
+
+    /**
+     * Clean data after running test.
+     *
+     * @return void
+     */
+    public function tearDown()
+    {
+        $this->objectManager->create(
+            \Magento\Config\Test\TestStep\SetupConfigurationStep::class,
+            ['configData' => $this->configData, 'rollback' => true, 'flushCache' => $this->flushCache]
+        )->run();
+    }
+}
diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/Product/CreateSimpleProductEntityByAttributeMaskSkuTest.xml b/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/Product/CreateSimpleProductEntityByAttributeMaskSkuTest.xml
new file mode 100644
index 0000000000000000000000000000000000000000..338f34a57ab5d8745a9cf53665d34e39a0369694
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/Product/CreateSimpleProductEntityByAttributeMaskSkuTest.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+ -->
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../../vendor/magento/mtf/etc/variations.xsd">
+    <testCase name="Magento\Catalog\Test\TestCase\Product\CreateSimpleProductEntityByAttributeMaskSkuTest" summary="Create Simple Product with attribute sku mask" ticketId="MAGETWO-59861">
+        <variation name="CreateSimpleProductEntityByAttributeMaskSkuTest1">
+            <data name="configData" xsi:type="string">attribute_product_mask_sku</data>
+            <data name="description" xsi:type="string">Create product with country of manufacture attribute sku mask</data>
+            <data name="product/data/url_key" xsi:type="string">simple-product-%isolation%</data>
+            <data name="product/data/name" xsi:type="string">Simple Product %isolation%</data>
+            <data name="product/data/price/value" xsi:type="string">10000</data>
+            <data name="product/data/weight" xsi:type="string">50</data>
+            <data name="product/data/quantity_and_stock_status/qty" xsi:type="string">657</data>
+            <data name="product/data/country_of_manufacture" xsi:type="string">Ukraine</data>
+            <constraint name="Magento\Catalog\Test\Constraint\AssertProductSaveMessage" />
+            <constraint name="Magento\Catalog\Test\Constraint\AssertProductInGrid" />
+        </variation>
+    </testCase>
+</config>