diff --git a/app/code/Magento/Config/Model/Config/Backend/File.php b/app/code/Magento/Config/Model/Config/Backend/File.php
index f12d7bfdcec8ce5a935329730c33df742c015e18..809014f11f46f0109fe1476108642539b7e8f387 100644
--- a/app/code/Magento/Config/Model/Config/Backend/File.php
+++ b/app/code/Magento/Config/Model/Config/Backend/File.php
@@ -179,7 +179,6 @@ class File extends \Magento\Framework\App\Config\Value
     protected function _getUploadDir()
     {
         $fieldConfig = $this->getFieldConfig();
-        /* @var $fieldConfig \Magento\Framework\Simplexml\Element */
 
         if (!array_key_exists('upload_dir', $fieldConfig)) {
             throw new \Magento\Framework\Exception\LocalizedException(
@@ -189,13 +188,15 @@ class File extends \Magento\Framework\App\Config\Value
 
         if (is_array($fieldConfig['upload_dir'])) {
             $uploadDir = $fieldConfig['upload_dir']['value'];
-            if (array_key_exists('scope_info', $fieldConfig['upload_dir']) && $fieldConfig['upload_dir']['scope_info']
+            if (
+                array_key_exists('scope_info', $fieldConfig['upload_dir'])
+                && $fieldConfig['upload_dir']['scope_info']
             ) {
                 $uploadDir = $this->_appendScopeInfo($uploadDir);
             }
 
             if (array_key_exists('config', $fieldConfig['upload_dir'])) {
-                $uploadDir = $this->_mediaDirectory->getAbsolutePath($uploadDir);
+                $uploadDir = $this->getUploadDirPath($uploadDir);
             }
         } else {
             $uploadDir = (string)$fieldConfig['upload_dir'];
@@ -204,6 +205,17 @@ class File extends \Magento\Framework\App\Config\Value
         return $uploadDir;
     }
 
+    /**
+     * Retrieve upload directory path
+     *
+     * @param string $uploadDir
+     * @return string
+     */
+    protected function getUploadDirPath($uploadDir)
+    {
+        return $this->_mediaDirectory->getAbsolutePath($uploadDir);
+    }
+
     /**
      * Prepend path with scope info
      *
diff --git a/app/code/Magento/Theme/Controller/Adminhtml/Design/Config/FileUploader/Save.php b/app/code/Magento/Theme/Controller/Adminhtml/Design/Config/FileUploader/Save.php
index a9595a01207c085460a0ce9d68eb5d4c474ff624..23eb7590ca604a6b3ecdfdedfab810bc77f31d7f 100644
--- a/app/code/Magento/Theme/Controller/Adminhtml/Design/Config/FileUploader/Save.php
+++ b/app/code/Magento/Theme/Controller/Adminhtml/Design/Config/FileUploader/Save.php
@@ -8,25 +8,25 @@ namespace Magento\Theme\Controller\Adminhtml\Design\Config\FileUploader;
 use Magento\Backend\App\Action;
 use Magento\Backend\App\Action\Context;
 use Magento\Framework\Controller\ResultFactory;
-use Magento\Theme\Model\Design\Config\FileUploader\ImageProcessor;
+use Magento\Theme\Model\Design\Config\FileUploader\FileProcessor;
 
 class Save extends Action
 {
     /**
-     * @var ImageProcessor
+     * @var FileProcessor
      */
-    protected $imageProcessor;
+    protected $fileProcessor;
 
     /**
      * @param Context $context
-     * @param ImageProcessor $imageProcessor
+     * @param FileProcessor $fileProcessor
      */
     public function __construct(
         Context $context,
-        ImageProcessor $imageProcessor
+        FileProcessor $fileProcessor
     ) {
         parent::__construct($context);
-        $this->imageProcessor = $imageProcessor;
+        $this->fileProcessor = $fileProcessor;
     }
 
     /**
@@ -34,7 +34,7 @@ class Save extends Action
      */
     public function execute()
     {
-        $result = $this->imageProcessor->saveToTmp(key($_FILES));
+        $result = $this->fileProcessor->saveToTmp(key($_FILES));
         return $this->resultFactory->create(ResultFactory::TYPE_JSON)->setData($result);
     }
 }
diff --git a/app/code/Magento/Theme/Model/Design/Backend/Favicon.php b/app/code/Magento/Theme/Model/Design/Backend/Favicon.php
index 46496287caf88a2c2d76fbfaf931642b75932801..ebab873f99f60a9f4d77f688f25861213151ed63 100644
--- a/app/code/Magento/Theme/Model/Design/Backend/Favicon.php
+++ b/app/code/Magento/Theme/Model/Design/Backend/Favicon.php
@@ -5,12 +5,36 @@
  */
 namespace Magento\Theme\Model\Design\Backend;
 
+use Magento\Framework\Filesystem;
+
 class Favicon extends Image
 {
     /**
-     * @var string
+     * The tail part of directory path for uploading
+     *
+     */
+    const UPLOAD_DIR = 'favicon';
+
+    /**
+     * Return path to directory for upload file
+     *
+     * @return string
+     * @throw \Magento\Framework\Exception\LocalizedException
+     */
+    protected function _getUploadDir()
+    {
+        return $this->_mediaDirectory->getRelativePath($this->_appendScopeInfo(self::UPLOAD_DIR));
+    }
+
+    /**
+     * Makes a decision about whether to add info about the scope.
+     *
+     * @return boolean
      */
-    protected $uploadDir = 'favicon';
+    protected function _addWhetherScopeInfo()
+    {
+        return true;
+    }
 
     /**
      * Getter for allowed extensions of uploaded files.
diff --git a/app/code/Magento/Theme/Model/Design/Backend/File.php b/app/code/Magento/Theme/Model/Design/Backend/File.php
new file mode 100644
index 0000000000000000000000000000000000000000..52e4b3a35e6004c62d018a8105a3a0df7ae1c7e5
--- /dev/null
+++ b/app/code/Magento/Theme/Model/Design/Backend/File.php
@@ -0,0 +1,156 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Theme\Model\Design\Backend;
+
+use Magento\Config\Model\Config\Backend\File\RequestData\RequestDataInterface;
+use Magento\Config\Model\Config\Backend\File as BackendFile;
+use Magento\Framework\App\Cache\TypeListInterface;
+use Magento\Framework\App\Config\ScopeConfigInterface;
+use Magento\Framework\Data\Collection\AbstractDb;
+use Magento\Framework\Exception\LocalizedException;
+use Magento\Framework\Filesystem;
+use Magento\Framework\Model\Context;
+use Magento\Framework\Model\ResourceModel\AbstractResource;
+use Magento\Framework\Registry;
+use Magento\MediaStorage\Model\File\UploaderFactory;
+use Magento\Theme\Model\Design\Config\FileUploader\Config;
+
+class File extends BackendFile
+{
+    /**
+     * @var Config
+     */
+    protected $fileConfig;
+
+    /**
+     * @param Context $context
+     * @param Registry $registry
+     * @param ScopeConfigInterface $config
+     * @param TypeListInterface $cacheTypeList
+     * @param UploaderFactory $uploaderFactory
+     * @param RequestDataInterface $requestData
+     * @param Filesystem $filesystem
+     * @param Config $fileConfig
+     * @param AbstractResource|null $resource
+     * @param AbstractDb|null $resourceCollection
+     * @param array $data
+     * @SuppressWarnings(PHPMD.ExcessiveParameterList)
+     */
+    public function __construct(
+        Context $context,
+        Registry $registry,
+        ScopeConfigInterface $config,
+        TypeListInterface $cacheTypeList,
+        UploaderFactory $uploaderFactory,
+        RequestDataInterface $requestData,
+        Filesystem $filesystem,
+        Config $fileConfig,
+        AbstractResource $resource = null,
+        AbstractDb $resourceCollection = null,
+        array $data = []
+    ) {
+        parent::__construct(
+            $context,
+            $registry,
+            $config,
+            $cacheTypeList,
+            $uploaderFactory,
+            $requestData,
+            $filesystem,
+            $resource,
+            $resourceCollection,
+            $data
+        );
+        $this->fileConfig = $fileConfig;
+    }
+
+    /**
+     * Save uploaded file and remote temporary file before saving config value
+     *
+     * @return $this
+     * @throws LocalizedException
+     */
+    public function beforeSave()
+    {
+        $values = $this->getValue();
+        $value = reset($values) ?: [];
+        if (!isset($value['file'])) {
+             throw new LocalizedException(
+                 __('%1 does not contain field \'file\'', $this->getData('field_config/field'))
+             );
+        }
+        if (isset($value['exists'])) {
+            $this->setValue($value['file']);
+            return $this;
+        }
+        $filename = $value['file'];
+        $result = $this->_mediaDirectory->copyFile(
+            $this->fileConfig->getTmpMediaPath($filename),
+            $this->_getUploadDir() . '/' . $filename
+        );
+        if ($result) {
+            $this->_mediaDirectory->delete($this->fileConfig->getTmpMediaPath($filename));
+            if ($this->_addWhetherScopeInfo()) {
+                $filename = $this->_prependScopeInfo($filename);
+            }
+            $this->setValue($filename);
+        } else {
+            $this->unsValue();
+        }
+
+        return $this;
+    }
+
+    /**
+     * @return array
+     */
+    public function afterLoad()
+    {
+        $value = $this->getValue();
+        if ($value && !is_array($value)) {
+            $fileName = $this->_getUploadDir() . '/' . basename($value);
+            $stat = $this->_mediaDirectory->stat($fileName);
+            $this->setValue([
+                [
+                    'url' => $this->fileConfig->getStoreMediaUrl() .  $fileName,
+                    'file' => $value,
+                    'size' => is_array($stat) ? $stat['size'] : 0,
+                    'exists' => true
+                ]
+            ]);
+        }
+        return $this;
+    }
+
+    /**
+     * Getter for allowed extensions of uploaded files
+     *
+     * @return array
+     */
+    public function getAllowedExtensions()
+    {
+        return [];
+    }
+
+    /**
+     * Retrieve upload directory path
+     *
+     * @param string $uploadDir
+     * @return string
+     */
+    protected function getUploadDirPath($uploadDir)
+    {
+        return $this->_mediaDirectory->getRelativePath($uploadDir);
+    }
+
+    /**
+     * @return array
+     */
+    public function getValue()
+    {
+        return $this->getData('value') ?: [];
+    }
+}
diff --git a/app/code/Magento/Theme/Model/Design/Backend/Image.php b/app/code/Magento/Theme/Model/Design/Backend/Image.php
index 8f7dbbca100d4588aaae35e6cb1361ff4fccfcaf..f9e80b921fd1391edba904002b1aff06eb3a8fae 100644
--- a/app/code/Magento/Theme/Model/Design/Backend/Image.php
+++ b/app/code/Magento/Theme/Model/Design/Backend/Image.php
@@ -5,129 +5,8 @@
  */
 namespace Magento\Theme\Model\Design\Backend;
 
-use Magento\Config\Model\Config\Backend\File\RequestData\RequestDataInterface;
-use \Magento\Config\Model\Config\Backend\File as File;
-use Magento\Framework\App\Cache\TypeListInterface;
-use Magento\Framework\App\Config\ScopeConfigInterface;
-use Magento\Framework\Data\Collection\AbstractDb;
-use Magento\Framework\Exception\LocalizedException;
-use Magento\Framework\Filesystem;
-use Magento\Framework\Model\Context;
-use Magento\Framework\Model\ResourceModel\AbstractResource;
-use Magento\Framework\Registry;
-use Magento\MediaStorage\Model\File\UploaderFactory;
-use Magento\Theme\Model\Design\Config\FileUploader\Config;
-
 class Image extends File
 {
-    /**
-     * @var string
-     */
-    protected $uploadDir = 'image';
-
-    /**
-     * @var Config
-     */
-    protected $imageConfig;
-
-    /**
-     * @param Context $context
-     * @param Registry $registry
-     * @param ScopeConfigInterface $config
-     * @param TypeListInterface $cacheTypeList
-     * @param UploaderFactory $uploaderFactory
-     * @param RequestDataInterface $requestData
-     * @param Filesystem $filesystem
-     * @param Config $imageConfig
-     * @param AbstractResource|null $resource
-     * @param AbstractDb|null $resourceCollection
-     * @param array $data
-     * @SuppressWarnings(PHPMD.ExcessiveParameterList)
-     */
-    public function __construct(
-        Context $context,
-        Registry $registry,
-        ScopeConfigInterface $config,
-        TypeListInterface $cacheTypeList,
-        UploaderFactory $uploaderFactory,
-        RequestDataInterface $requestData,
-        Filesystem $filesystem,
-        Config $imageConfig,
-        AbstractResource $resource = null,
-        AbstractDb $resourceCollection = null,
-        array $data = []
-    ) {
-        parent::__construct(
-            $context,
-            $registry,
-            $config,
-            $cacheTypeList,
-            $uploaderFactory,
-            $requestData,
-            $filesystem,
-            $resource,
-            $resourceCollection,
-            $data
-        );
-        $this->imageConfig = $imageConfig;
-    }
-
-    /**
-     * Save uploaded file and remote temporary file before saving config value
-     *
-     * @return $this
-     * @throws LocalizedException
-     */
-    public function beforeSave()
-    {
-        $values = $this->getValue();
-        $value = reset($values) ?: [];
-        if (!isset($value['file'])) {
-             throw new LocalizedException(
-                 __('%1 does not contain field \'file\'', $this->getData('field_config/field'))
-             );
-        }
-        if (isset($value['exists'])) {
-            $this->setValue($value['file']);
-            return $this;
-        }
-        $filename = $value['file'];
-        $result = $this->_mediaDirectory->copyFile(
-            $this->imageConfig->getTmpMediaPath($filename),
-            $this->_appendScopeInfo($this->uploadDir) . '/' . $filename
-        );
-        if ($result) {
-            $this->_mediaDirectory->delete($this->imageConfig->getTmpMediaPath($filename));
-            $filename = $this->_prependScopeInfo($filename);
-            $this->setValue($filename);
-        } else {
-            $this->unsValue();
-        }
-
-        return $this;
-    }
-
-    /**
-     * @return array
-     */
-    public function afterLoad()
-    {
-        $value = $this->getValue();
-        if ($value && !is_array($value)) {
-            $fileName = '/' . $this->uploadDir . '/' . $value;
-            $stat = $this->_mediaDirectory->stat($fileName);
-            $this->setValue([
-                [
-                    'url' => $this->imageConfig->getStoreMediaUrl() .  $fileName,
-                    'file' => $value,
-                    'size' => is_array($stat) ? $stat['size'] : 0,
-                    'exists' => true
-                ]
-            ]);
-        }
-        return $this;
-    }
-
     /**
      * Getter for allowed extensions of uploaded files
      *
@@ -137,12 +16,4 @@ class Image extends File
     {
         return ['jpg', 'jpeg', 'gif', 'png'];
     }
-
-    /**
-     * @return array
-     */
-    public function getValue()
-    {
-        return $this->getData('value') ?: [];
-    }
 }
diff --git a/app/code/Magento/Theme/Model/Design/Backend/Logo.php b/app/code/Magento/Theme/Model/Design/Backend/Logo.php
index b658bfefa312d3c4484b148b9bf94c30f2b33305..78bc7603492aba395fbd7bce9493ce21cf2ee1e1 100644
--- a/app/code/Magento/Theme/Model/Design/Backend/Logo.php
+++ b/app/code/Magento/Theme/Model/Design/Backend/Logo.php
@@ -8,9 +8,31 @@ namespace Magento\Theme\Model\Design\Backend;
 class Logo extends Image
 {
     /**
-     * @var string
+     * The tail part of directory path for uploading
+     *
      */
-    protected $uploadDir = 'logo';
+    const UPLOAD_DIR = 'logo';
+
+    /**
+     * Return path to directory for upload file
+     *
+     * @return string
+     * @throw \Magento\Framework\Exception\LocalizedException
+     */
+    protected function _getUploadDir()
+    {
+        return $this->_mediaDirectory->getRelativePath($this->_appendScopeInfo(self::UPLOAD_DIR));
+    }
+
+    /**
+     * Makes a decision about whether to add info about the scope.
+     *
+     * @return boolean
+     */
+    protected function _addWhetherScopeInfo()
+    {
+        return true;
+    }
 
     /**
      * Getter for allowed extensions of uploaded files.
diff --git a/app/code/Magento/Theme/Model/Design/Config/FileUploader/ImageProcessor.php b/app/code/Magento/Theme/Model/Design/Config/FileUploader/FileProcessor.php
similarity index 86%
rename from app/code/Magento/Theme/Model/Design/Config/FileUploader/ImageProcessor.php
rename to app/code/Magento/Theme/Model/Design/Config/FileUploader/FileProcessor.php
index f8eaa277b157469ef1a95f0f189b5a34d3dceb05..3bb27e0c168e6b5aea5f18aa20aeac3c5a6ee7bf 100644
--- a/app/code/Magento/Theme/Model/Design/Config/FileUploader/ImageProcessor.php
+++ b/app/code/Magento/Theme/Model/Design/Config/FileUploader/FileProcessor.php
@@ -7,11 +7,11 @@ namespace Magento\Theme\Model\Design\Config\FileUploader;
 
 use Magento\Framework\Exception\LocalizedException;
 use Magento\MediaStorage\Model\File\UploaderFactory;
-use Magento\Theme\Model\Design\Backend\Image;
+use Magento\Theme\Model\Design\Backend\File;
 use Magento\Theme\Model\Design\BackendModelFactory;
 use Magento\Theme\Model\Design\Config\MetadataProvider;
 
-class ImageProcessor
+class FileProcessor
 {
     /**
      * @var UploaderFactory
@@ -21,7 +21,7 @@ class ImageProcessor
     /**
      * @var Config
      */
-    protected $imageConfig;
+    protected $fileConfig;
 
     /**
      * @var BackendModelFactory
@@ -35,18 +35,18 @@ class ImageProcessor
 
     /**
      * @param UploaderFactory $uploaderFactory
-     * @param Config $imageConfig
+     * @param Config $fileConfig
      * @param BackendModelFactory $backendModelFactory
      * @param MetadataProvider $metadataProvider
      */
     public function __construct(
         UploaderFactory $uploaderFactory,
-        Config $imageConfig,
+        Config $fileConfig,
         BackendModelFactory $backendModelFactory,
         MetadataProvider $metadataProvider
     ) {
         $this->uploaderFactory = $uploaderFactory;
-        $this->imageConfig = $imageConfig;
+        $this->fileConfig = $fileConfig;
         $this->backendModelFactory = $backendModelFactory;
         $this->metadataProvider = $metadataProvider;
     }
@@ -61,8 +61,8 @@ class ImageProcessor
     public function saveToTmp($fileId)
     {
         try {
-            $result = $this->save($fileId, $this->imageConfig->getAbsoluteTmpMediaPath());
-            $result['url'] = $this->imageConfig->getTmpMediaUrl($result['file']);
+            $result = $this->save($fileId, $this->fileConfig->getAbsoluteTmpMediaPath());
+            $result['url'] = $this->fileConfig->getTmpMediaUrl($result['file']);
         } catch (\Exception $e) {
             $result = ['error' => $e->getMessage(), 'errorcode' => $e->getCode()];
         }
@@ -80,7 +80,7 @@ class ImageProcessor
     protected function save($fileId, $destination)
     {
         $result = ['file' => '', 'size' => ''];
-        /** @var Image $backendModel */
+        /** @var File $backendModel */
         $backendModel = $this->getBackendModel($fileId);
         $uploader = $this->uploaderFactory->create(['fileId' => $fileId]);
         $uploader->setAllowRenameFiles(true);
@@ -94,7 +94,7 @@ class ImageProcessor
      * Retrieve backend model by field code
      *
      * @param string $code
-     * @return Image
+     * @return File
      * @throws LocalizedException
      */
     protected function getBackendModel($code)
diff --git a/app/code/Magento/Theme/Model/Design/Config/Storage.php b/app/code/Magento/Theme/Model/Design/Config/Storage.php
index aa518a085a54805556110be7cb96d1eb16e11e35..5e47d1aefe4e0255174833e55e6f8e77b0bd73aa 100644
--- a/app/code/Magento/Theme/Model/Design/Config/Storage.php
+++ b/app/code/Magento/Theme/Model/Design/Config/Storage.php
@@ -77,7 +77,9 @@ class Storage
         foreach ($fieldsData as &$fieldData) {
             $value = $this->valueProcessor->process(
                 $this->scopeConfig->getValue($fieldData->getPath(), $scope, $scopeId),
-                $fieldData->getPath()
+                $scope,
+                $scopeId,
+                $fieldData->getFieldConfig()
             );
             if ($value !== null) {
                 $fieldData->setValue($value);
@@ -113,7 +115,7 @@ class Storage
                     $fieldData->getValue(),
                     $designConfig->getScope(),
                     $designConfig->getScopeId(),
-                    $fieldData->getFieldConfig()['path']
+                    $fieldData->getFieldConfig()
                 )
             ) {
                 $saveTransaction->addObject($backendModel);
diff --git a/app/code/Magento/Theme/Model/Design/Config/ValueChecker.php b/app/code/Magento/Theme/Model/Design/Config/ValueChecker.php
index a65c566a61b3461a0f90b405baff1010b1a0d505..0a1c61f75644f02d64c5b40197735b715f71afb5 100644
--- a/app/code/Magento/Theme/Model/Design/Config/ValueChecker.php
+++ b/app/code/Magento/Theme/Model/Design/Config/ValueChecker.php
@@ -47,21 +47,25 @@ class ValueChecker
      * @param string $value
      * @param string $scope
      * @param int $scopeId
-     * @param string $path
+     * @param array $fieldConfig
      * @return bool
      */
-    public function isDifferentFromDefault($value, $scope, $scopeId, $path)
+    public function isDifferentFromDefault($value, $scope, $scopeId, array $fieldConfig)
     {
         list($scope, $scopeId) = $this->fallbackResolver->getFallbackScope($scope, $scopeId);
         if ($scope) {
             return !$this->isEqual(
                 $this->valueProcessor->process(
                     $value,
-                    $path
+                    $scope,
+                    $scopeId,
+                    $fieldConfig
                 ),
                 $this->valueProcessor->process(
-                    $this->appConfig->getValue($path, $scope, $scopeId),
-                    $path
+                    $this->appConfig->getValue($fieldConfig['path'], $scope, $scopeId),
+                    $scope,
+                    $scopeId,
+                    $fieldConfig
                 )
             );
         }
diff --git a/app/code/Magento/Theme/Model/Design/Config/ValueProcessor.php b/app/code/Magento/Theme/Model/Design/Config/ValueProcessor.php
index 7ce660f625f09e4e3426eba6a52e810d9336355c..ed3ae3809fdbe1c67e638673ce571ea8c219039e 100644
--- a/app/code/Magento/Theme/Model/Design/Config/ValueProcessor.php
+++ b/app/code/Magento/Theme/Model/Design/Config/ValueProcessor.php
@@ -27,12 +27,22 @@ class ValueProcessor
      * Process value
      *
      * @param string $value
-     * @param string $path
+     * @param string $scope
+     * @param string $scopeId
+     * @param array $fieldConfig
      * @return mixed
      */
-    public function process($value, $path)
+    public function process($value, $scope, $scopeId, array $fieldConfig)
     {
-        $backendModel = $this->backendModelFactory->createByPath($path, ['value' => $value]);
+        $backendModel = $this->backendModelFactory->createByPath(
+            $fieldConfig['path'],
+            [
+                'value' => $value,
+                'field_config' => $fieldConfig,
+                'scope' => $scope,
+                'scope_id' => $scopeId
+            ]
+        );
         $backendModel->afterLoad();
         return $backendModel->getValue();
     }
diff --git a/app/code/Magento/Theme/Model/ResourceModel/Design/Config/Collection.php b/app/code/Magento/Theme/Model/ResourceModel/Design/Config/Collection.php
index 0bd41722b9cfa37635ef6e52c0b52a02c3c091a8..eeb73108d96e844f2366fedfaa34ca1d5bbe691d 100644
--- a/app/code/Magento/Theme/Model/ResourceModel/Design/Config/Collection.php
+++ b/app/code/Magento/Theme/Model/ResourceModel/Design/Config/Collection.php
@@ -73,7 +73,15 @@ class Collection extends ConfigCollection
     protected function _afterLoad()
     {
         foreach ($this->_items as $item) {
-            $item->setData('value', $this->valueProcessor->process($item->getData('value'), $item->getData('path')));
+            $item->setData(
+                'value',
+                $this->valueProcessor->process(
+                    $item->getData('value'),
+                    $this->getData('scope'),
+                    $this->getData('scope_id'),
+                    $item->getData('path')
+                )
+            );
         }
         parent::_afterLoad();
     }
diff --git a/app/code/Magento/Theme/Model/ResourceModel/Design/Config/Scope/Collection.php b/app/code/Magento/Theme/Model/ResourceModel/Design/Config/Scope/Collection.php
index 9196d6d55644bb7d5b740b01f70384ec8676f229..7c1b50024ba6ecc85b9ffcccabe9c202cdfa2828 100644
--- a/app/code/Magento/Theme/Model/ResourceModel/Design/Config/Scope/Collection.php
+++ b/app/code/Magento/Theme/Model/ResourceModel/Design/Config/Scope/Collection.php
@@ -101,7 +101,9 @@ class Collection extends \Magento\Framework\Data\Collection
             if (isset($itemData['use_in_grid']) && (boolean)$itemData['use_in_grid']) {
                 $result[$itemName] = $this->valueProcessor->process(
                     $this->appConfig->getValue($itemData['path'], $scope, $scopeId),
-                    $itemData['path']
+                    $scope,
+                    $scopeId,
+                    $itemData
                 );
             }
         }
diff --git a/app/code/Magento/Theme/Test/Unit/Controller/Adminhtml/Design/Config/FileUploader/SaveTest.php b/app/code/Magento/Theme/Test/Unit/Controller/Adminhtml/Design/Config/FileUploader/SaveTest.php
index c155934c9f579e2138bd34f1ac006424f1b12891..011f89b342bc775759f2eaf0b40b34f4b0ca6699 100644
--- a/app/code/Magento/Theme/Test/Unit/Controller/Adminhtml/Design/Config/FileUploader/SaveTest.php
+++ b/app/code/Magento/Theme/Test/Unit/Controller/Adminhtml/Design/Config/FileUploader/SaveTest.php
@@ -19,8 +19,8 @@ class SaveTest extends \PHPUnit_Framework_TestCase
     /** @var \Magento\Framework\Controller\ResultInterface|\PHPUnit_Framework_MockObject_MockObject */
     protected $resultPage;
 
-    /** @var \Magento\Theme\Model\Design\Config\FileUploader\ImageProcessor|\PHPUnit_Framework_MockObject_MockObject */
-    protected $imageProcessor;
+    /** @var \Magento\Theme\Model\Design\Config\FileUploader\FileProcessor|\PHPUnit_Framework_MockObject_MockObject */
+    protected $fileProcessor;
 
     /** @var Save */
     protected $controller;
@@ -36,14 +36,14 @@ class SaveTest extends \PHPUnit_Framework_TestCase
         $this->resultPage = $this->getMockBuilder('Magento\Framework\Controller\ResultInterface')
             ->setMethods(['setData'])
             ->getMockForAbstractClass();
-        $this->imageProcessor = $this->getMockBuilder('Magento\Theme\Model\Design\Config\FileUploader\ImageProcessor')
+        $this->fileProcessor = $this->getMockBuilder('Magento\Theme\Model\Design\Config\FileUploader\FileProcessor')
             ->disableOriginalConstructor()
             ->getMock();
         $this->context->expects($this->once())
             ->method('getResultFactory')
             ->willReturn($this->resultFactory);
 
-        $this->controller = new Save($this->context, $this->imageProcessor);
+        $this->controller = new Save($this->context, $this->fileProcessor);
     }
 
     public function testExecute()
@@ -55,7 +55,7 @@ class SaveTest extends \PHPUnit_Framework_TestCase
         ];
         $resultJson = '{"file": "", "url": ""}';
 
-        $this->imageProcessor->expects($this->once())
+        $this->fileProcessor->expects($this->once())
             ->method('saveToTmp')
             ->with('test_key')
             ->willReturn($result);
diff --git a/app/code/Magento/Theme/Test/Unit/Model/Design/Backend/ImageTest.php b/app/code/Magento/Theme/Test/Unit/Model/Design/Backend/FileTest.php
similarity index 72%
rename from app/code/Magento/Theme/Test/Unit/Model/Design/Backend/ImageTest.php
rename to app/code/Magento/Theme/Test/Unit/Model/Design/Backend/FileTest.php
index ce2a8c47419e79487940f5b79451fe2287e833b0..c11b539f2b807953673046aa075a46398272c810 100644
--- a/app/code/Magento/Theme/Test/Unit/Model/Design/Backend/ImageTest.php
+++ b/app/code/Magento/Theme/Test/Unit/Model/Design/Backend/FileTest.php
@@ -5,20 +5,19 @@
  */
 namespace Magento\Theme\Test\Unit\Model\Design\Backend;
 
-use Magento\Theme\Model\Design\Backend\Image;
+use Magento\Theme\Model\Design\Backend\File;
 use Magento\Framework\App\Filesystem\DirectoryList;
 
-class ImageTest extends \PHPUnit_Framework_TestCase
+class FileTest extends \PHPUnit_Framework_TestCase
 {
-
     /** @var \Magento\Framework\Filesystem\Directory\WriteInterface|\PHPUnit_Framework_MockObject_MockObject */
     protected $mediaDirectory;
 
     /** @var \Magento\Theme\Model\Design\Config\FileUploader\Config|\PHPUnit_Framework_MockObject_MockObject */
-    protected $imageConfig;
+    protected $fileConfig;
 
-    /** @var Image */
-    protected $imageBackend;
+    /** @var File */
+    protected $fileBackend;
 
     public function setUp()
     {
@@ -31,7 +30,7 @@ class ImageTest extends \PHPUnit_Framework_TestCase
             'Magento\Config\Model\Config\Backend\File\RequestData\RequestDataInterface'
         );
         $filesystem = $this->getMockObject('Magento\Framework\Filesystem');
-        $this->imageConfig = $this->getMockObject('Magento\Theme\Model\Design\Config\FileUploader\Config');
+        $this->fileConfig = $this->getMockObject('Magento\Theme\Model\Design\Config\FileUploader\Config');
 
         $this->mediaDirectory = $this->getMockObjectForAbstractClass(
             'Magento\Framework\Filesystem\Directory\WriteInterface'
@@ -42,7 +41,7 @@ class ImageTest extends \PHPUnit_Framework_TestCase
             ->with(DirectoryList::MEDIA)
             ->willReturn($this->mediaDirectory);
 
-        $this->imageBackend = new Image(
+        $this->fileBackend = new File(
             $context,
             $registry,
             $config,
@@ -50,13 +49,13 @@ class ImageTest extends \PHPUnit_Framework_TestCase
             $uploaderFactory,
             $requestData,
             $filesystem,
-            $this->imageConfig
+            $this->fileConfig
         );
     }
 
     public function tearDown()
     {
-        unset($this->imageBackend);
+        unset($this->fileBackend);
     }
 
     /**
@@ -86,26 +85,34 @@ class ImageTest extends \PHPUnit_Framework_TestCase
 
     public function testAfterLoad()
     {
-        $value = 'store/1/filename.jpg';
-        $this->imageBackend->setValue($value);
+        $value = '/filename.jpg';
+        $this->fileBackend->setValue($value);
+        $this->fileBackend->setFieldConfig(
+            [
+                'upload_dir' => [
+                    'value' => 'value',
+                    'config' => 'system/filesystem/media',
+                ],
+            ]
+        );
         $this->mediaDirectory->expects($this->once())
             ->method('stat')
-            ->with('/image/' . $value)
+            ->with($value)
             ->willReturn(['size' => 234234]);
-        $this->imageConfig->expects($this->once())
+        $this->fileConfig->expects($this->once())
             ->method('getStoreMediaUrl')
             ->willReturn('http://magento2.com/pub/media');
-        $this->imageBackend->afterLoad();
+        $this->fileBackend->afterLoad();
         $this->assertEquals(
             [
                 [
-                    'url' => 'http://magento2.com/pub/media/image/' . $value,
+                    'url' => 'http://magento2.com/pub/media' . $value,
                     'file' => $value,
                     'size' => 234234,
                     'exists' => true,
                 ]
             ],
-            $this->imageBackend->getValue()
+            $this->fileBackend->getValue()
         );
     }
 
@@ -113,9 +120,9 @@ class ImageTest extends \PHPUnit_Framework_TestCase
     {
         $value = 'filename.jpg';
         $tmpMediaPath = 'tmp/image/' . $value;
-        $this->imageBackend->setScope('store');
-        $this->imageBackend->setScopeId(1);
-        $this->imageBackend->setValue(
+        $this->fileBackend->setScope('store');
+        $this->fileBackend->setScopeId(1);
+        $this->fileBackend->setValue(
             [
                 [
                     'url' => 'http://magento2.com/pub/media/tmp/image/' . $value,
@@ -124,24 +131,29 @@ class ImageTest extends \PHPUnit_Framework_TestCase
                 ]
             ]
         );
-        $this->imageConfig->expects($this->exactly(2))
+        $this->fileBackend->setFieldConfig(
+            [
+                'upload_dir' => [
+                    'value' => 'value',
+                    'config' => 'system/filesystem/media',
+                ],
+            ]
+        );
+        $this->fileConfig->expects($this->exactly(2))
             ->method('getTmpMediaPath')
             ->with($value)
             ->willReturn($tmpMediaPath);
 
         $this->mediaDirectory->expects($this->once())
             ->method('copyFile')
-            ->with(
-                $tmpMediaPath,
-                'image/store/1/' . $value
-            )
+            ->with($tmpMediaPath, '/' . $value)
             ->willReturn(true);
         $this->mediaDirectory->expects($this->once())
             ->method('delete')
             ->with($tmpMediaPath);
 
-        $this->imageBackend->beforeSave();
-        $this->assertEquals('store/1/filename.jpg', $this->imageBackend->getValue());
+        $this->fileBackend->beforeSave();
+        $this->assertEquals('filename.jpg', $this->fileBackend->getValue());
     }
 
     /**
@@ -150,7 +162,7 @@ class ImageTest extends \PHPUnit_Framework_TestCase
      */
     public function testBeforeSaveWithoutFile()
     {
-        $this->imageBackend->setData(
+        $this->fileBackend->setData(
             [
                 'value' => [
                     'test' => ''
@@ -160,13 +172,13 @@ class ImageTest extends \PHPUnit_Framework_TestCase
                 ],
             ]
         );
-        $this->imageBackend->beforeSave();
+        $this->fileBackend->beforeSave();
     }
 
     public function testBeforeSaveWithExistingFile()
     {
         $value = 'filename.jpg';
-        $this->imageBackend->setValue(
+        $this->fileBackend->setValue(
             [
                 [
                     'url' => 'http://magento2.com/pub/media/tmp/image/' . $value,
@@ -176,10 +188,10 @@ class ImageTest extends \PHPUnit_Framework_TestCase
                 ]
             ]
         );
-        $this->imageBackend->beforeSave();
+        $this->fileBackend->beforeSave();
         $this->assertEquals(
             $value,
-            $this->imageBackend->getValue()
+            $this->fileBackend->getValue()
         );
     }
 }
diff --git a/app/code/Magento/Theme/Test/Unit/Model/Design/Config/FileUploader/ImageProcessorTest.php b/app/code/Magento/Theme/Test/Unit/Model/Design/Config/FileUploader/FileProcessorTest.php
similarity index 90%
rename from app/code/Magento/Theme/Test/Unit/Model/Design/Config/FileUploader/ImageProcessorTest.php
rename to app/code/Magento/Theme/Test/Unit/Model/Design/Config/FileUploader/FileProcessorTest.php
index 4449104fdd76148cf97de19a831df4808e474a5e..efb8334e67a17a6fbf43379962d1b5d9c9b3c9d1 100644
--- a/app/code/Magento/Theme/Test/Unit/Model/Design/Config/FileUploader/ImageProcessorTest.php
+++ b/app/code/Magento/Theme/Test/Unit/Model/Design/Config/FileUploader/FileProcessorTest.php
@@ -5,9 +5,9 @@
  */
 namespace Magento\Theme\Test\Unit\Model\Design\Config\FileUploader;
 
-use Magento\Theme\Model\Design\Config\FileUploader\ImageProcessor;
+use Magento\Theme\Model\Design\Config\FileUploader\FileProcessor;
 
-class ImageProcessorTest extends \PHPUnit_Framework_TestCase
+class FileProcessorTest extends \PHPUnit_Framework_TestCase
 {
     /** @var \Magento\MediaStorage\Model\File\UploaderFactory|\PHPUnit_Framework_MockObject_MockObject */
     protected $uploaderFactory;
@@ -21,14 +21,14 @@ class ImageProcessorTest extends \PHPUnit_Framework_TestCase
     /** @var \Magento\Theme\Model\Design\BackendModelFactory|\PHPUnit_Framework_MockObject_MockObject */
     protected $backendModelFactory;
 
-    /** @var \Magento\Theme\Model\Design\Backend\Image|\PHPUnit_Framework_MockObject_MockObject */
+    /** @var \Magento\Theme\Model\Design\Backend\File|\PHPUnit_Framework_MockObject_MockObject */
     protected $backendModel;
 
     /** @var \Magento\Theme\Model\Design\Config\MetadataProvider|\PHPUnit_Framework_MockObject_MockObject */
     protected $metadataProvider;
 
-    /** @var ImageProcessor */
-    protected $imageProcessor;
+    /** @var FileProcessor */
+    protected $fileProcessor;
 
     public function setUp()
     {
@@ -45,13 +45,13 @@ class ImageProcessorTest extends \PHPUnit_Framework_TestCase
         $this->backendModelFactory = $this->getMockBuilder('Magento\Theme\Model\Design\BackendModelFactory')
             ->disableOriginalConstructor()
             ->getMock();
-        $this->backendModel = $this->getMockBuilder('Magento\Theme\Model\Design\Backend\Image')
+        $this->backendModel = $this->getMockBuilder('Magento\Theme\Model\Design\Backend\File')
             ->disableOriginalConstructor()
             ->getMock();
         $this->metadataProvider = $this->getMockBuilder('Magento\Theme\Model\Design\Config\MetadataProvider')
             ->disableOriginalConstructor()
             ->getMock();
-        $this->imageProcessor = new ImageProcessor(
+        $this->fileProcessor = new FileProcessor(
             $this->uploaderFactory,
             $this->imageConfig,
             $this->backendModelFactory,
@@ -66,7 +66,7 @@ class ImageProcessorTest extends \PHPUnit_Framework_TestCase
         $metadata = [
             $fieldCode => [
                 'path' => $path,
-                'backend_model' => 'Magento\Theme\Model\Design\Backend\Image'
+                'backend_model' => 'Magento\Theme\Model\Design\Backend\File'
             ],
         ];
 
@@ -115,7 +115,7 @@ class ImageProcessorTest extends \PHPUnit_Framework_TestCase
                 'size' => '234234',
                 'url' => 'http://magento2.com/pub/media/tmp/file.jpg'
             ],
-            $this->imageProcessor->saveToTmp($fieldCode)
+            $this->fileProcessor->saveToTmp($fieldCode)
         );
     }
 }
diff --git a/app/code/Magento/Theme/Test/Unit/Model/Design/Config/StorageTest.php b/app/code/Magento/Theme/Test/Unit/Model/Design/Config/StorageTest.php
index 77c1b2b7ca81161e98fdcc62185f65c4192fadf8..58d993cf20cfdc1c2bc71ab51d745a8fb6685e3d 100644
--- a/app/code/Magento/Theme/Test/Unit/Model/Design/Config/StorageTest.php
+++ b/app/code/Magento/Theme/Test/Unit/Model/Design/Config/StorageTest.php
@@ -145,7 +145,7 @@ class StorageTest extends \PHPUnit_Framework_TestCase
             ->willReturn($this->backendModelMock);
         $this->valueCheckerMock->expects($this->once())
             ->method('isDifferentFromDefault')
-            ->with('value', $scope, $scopeId, 'design/head/default_title')
+            ->with('value', $scope, $scopeId, ['path' => 'design/head/default_title'])
             ->willReturn(true);
         $this->transactionMock->expects($this->once())
             ->method('addObject')
@@ -175,13 +175,16 @@ class StorageTest extends \PHPUnit_Framework_TestCase
         $this->designConfigData->expects($this->atLeastOnce())
             ->method('getPath')
             ->willReturn('path');
+        $this->designConfigData->expects($this->atLeastOnce())
+            ->method('getFieldConfig')
+            ->willReturn(['path' => 'path']);
         $this->scopeConfig->expects($this->once())
             ->method('getValue')
             ->with('path', $scope, $scopeId)
             ->willReturn('value');
         $this->valueProcessor->expects($this->once())
             ->method('process')
-            ->with('value', 'path')
+            ->with('value', 'website', 1, ['path' => 'path'])
             ->willReturnArgument(0);
         $this->designConfigData->expects($this->once())
             ->method('setValue')
diff --git a/app/code/Magento/Theme/Test/Unit/Model/Design/Config/ValueCheckerTest.php b/app/code/Magento/Theme/Test/Unit/Model/Design/Config/ValueCheckerTest.php
index 35afbdfc4660630cc121f9d8b32f088909b7e418..2a41342a855c67d60959705609329b1e3918be4e 100644
--- a/app/code/Magento/Theme/Test/Unit/Model/Design/Config/ValueCheckerTest.php
+++ b/app/code/Magento/Theme/Test/Unit/Model/Design/Config/ValueCheckerTest.php
@@ -53,7 +53,7 @@ class ValueCheckerTest extends \PHPUnit_Framework_TestCase
                 'value',
                 'default',
                 0,
-                'design/head/default_title'
+                ['path' => 'design/head/default_title']
             )
         );
     }
@@ -77,7 +77,7 @@ class ValueCheckerTest extends \PHPUnit_Framework_TestCase
                 'value',
                 'website',
                 1,
-                'design/head/default_title'
+                ['path' => 'design/head/default_title']
             )
         );
     }
@@ -111,7 +111,7 @@ class ValueCheckerTest extends \PHPUnit_Framework_TestCase
                 ],
                 'website',
                 1,
-                $path
+                ['path' => $path]
             )
         );
     }
diff --git a/app/code/Magento/Theme/Test/Unit/Model/Design/Config/ValueProcessorTest.php b/app/code/Magento/Theme/Test/Unit/Model/Design/Config/ValueProcessorTest.php
index ac8097a28fa271f0589bdee59bb912732e5d34d3..03eaca7853a52163544c8987ab6aa13c14b06df8 100644
--- a/app/code/Magento/Theme/Test/Unit/Model/Design/Config/ValueProcessorTest.php
+++ b/app/code/Magento/Theme/Test/Unit/Model/Design/Config/ValueProcessorTest.php
@@ -35,16 +35,26 @@ class ValueProcessorTest extends \PHPUnit_Framework_TestCase
     {
         $path = 'design/head/logo';
         $value = 'path/to/logo';
+        $scope = 'websites';
+        $scopeId = 1;
 
         $this->backendModelFactory->expects($this->once())
             ->method('createByPath')
-            ->with($path, ['value' => $value])
+            ->with(
+                $path,
+                [
+                    'value' => $value,
+                    'field_config' => ['path' => $path],
+                    'scope' => $scope,
+                    'scope_id' => $scopeId
+                ]
+            )
             ->willReturn($this->backendModel);
         $this->backendModel->expects($this->once())
             ->method('afterLoad');
         $this->backendModel->expects($this->once())
             ->method('getValue')
             ->willReturn($value);
-        $this->assertEquals($value, $this->valueProcessor->process($value, $path));
+        $this->assertEquals($value, $this->valueProcessor->process($value, $scope, $scopeId, ['path' => $path]));
     }
 }
diff --git a/app/code/Magento/Theme/Test/Unit/Model/ResourceModel/Design/Config/Scope/CollectionTest.php b/app/code/Magento/Theme/Test/Unit/Model/ResourceModel/Design/Config/Scope/CollectionTest.php
index 45a812039df8b20b1e76118d279ba528f1a1a74e..378016bb7e140104c579a2124a9bd098c292fb8f 100644
--- a/app/code/Magento/Theme/Test/Unit/Model/ResourceModel/Design/Config/Scope/CollectionTest.php
+++ b/app/code/Magento/Theme/Test/Unit/Model/ResourceModel/Design/Config/Scope/CollectionTest.php
@@ -113,9 +113,9 @@ class CollectionTest extends \PHPUnit_Framework_TestCase
         $this->valueProcessor->expects($this->atLeastOnce())
             ->method('process')
             ->withConsecutive(
-                ['DefaultValue', 'second/field/path'],
-                ['WebsiteValue', 'second/field/path'],
-                ['WebsiteValue', 'second/field/path']
+                ['DefaultValue', 'default', null, ['path' => 'second/field/path', 'use_in_grid' => 1]],
+                ['WebsiteValue', 'website', 1, ['path' => 'second/field/path', 'use_in_grid' => 1]],
+                ['WebsiteValue', 'store', 1, ['path' => 'second/field/path', 'use_in_grid' => 1]]
             )
             ->willReturnOnConsecutiveCalls(
                 'DefaultValue',