diff --git a/app/code/Magento/Backend/Block/Cache/Grid/Massaction/ProductionModeVisibilityChecker.php b/app/code/Magento/Backend/Block/Cache/Grid/Massaction/ProductionModeVisibilityChecker.php
new file mode 100644
index 0000000000000000000000000000000000000000..70a125e399ab3034669c011ee24c3877154469e9
--- /dev/null
+++ b/app/code/Magento/Backend/Block/Cache/Grid/Massaction/ProductionModeVisibilityChecker.php
@@ -0,0 +1,36 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Backend\Block\Cache\Grid\Massaction;
+
+use Magento\Backend\Block\Widget\Grid\Massaction\VisibilityCheckerInterface;
+use Magento\Framework\App\State;
+
+/**
+ * Class checks that action can be displayed on massaction list
+ */
+class ProductionModeVisibilityChecker implements VisibilityCheckerInterface
+{
+    /**
+     * @var State
+     */
+    private $state;
+
+    /**
+     * @param State $state
+     */
+    public function __construct(State $state)
+    {
+        $this->state = $state;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function isVisible()
+    {
+        return $this->state->getMode() !== State::MODE_PRODUCTION;
+    }
+}
diff --git a/app/code/Magento/Backend/Block/Widget/Grid/Massaction.php b/app/code/Magento/Backend/Block/Widget/Grid/Massaction.php
index ffe12c6cff46ee17442f7a69293172c02e206d30..c86907cc98042b30f6bac68ea0b0d2977ae87591 100644
--- a/app/code/Magento/Backend/Block/Widget/Grid/Massaction.php
+++ b/app/code/Magento/Backend/Block/Widget/Grid/Massaction.php
@@ -3,14 +3,11 @@
  * Copyright © 2016 Magento. All rights reserved.
  * See COPYING.txt for license details.
  */
+namespace Magento\Backend\Block\Widget\Grid;
 
 /**
  * Grid widget massaction default block
- *
- * @author     Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\Backend\Block\Widget\Grid;
-
 class Massaction extends \Magento\Backend\Block\Widget\Grid\Massaction\AbstractMassaction
 {
 }
diff --git a/app/code/Magento/Backend/Block/Widget/Grid/Massaction/AbstractMassaction.php b/app/code/Magento/Backend/Block/Widget/Grid/Massaction/AbstractMassaction.php
index 2f3df1377b395de426cc573f4d48016de82d7229..7f697599c7003583d08bc6c2f40ff138971bd4c0 100644
--- a/app/code/Magento/Backend/Block/Widget/Grid/Massaction/AbstractMassaction.php
+++ b/app/code/Magento/Backend/Block/Widget/Grid/Massaction/AbstractMassaction.php
@@ -5,14 +5,14 @@
  */
 namespace Magento\Backend\Block\Widget\Grid\Massaction;
 
-use Magento\Framework\View\Element\Template;
+use Magento\Backend\Block\Widget\Grid\Massaction\VisibilityCheckerInterface as VisibilityChecker;
+use Magento\Framework\DataObject;
 
 /**
  * Grid widget massaction block
  *
  * @method \Magento\Quote\Model\Quote setHideFormElement(boolean $value) Hide Form element to prevent IE errors
  * @method boolean getHideFormElement()
- * @author      Magento Core Team <core@magentocommerce.com>
  */
 abstract class AbstractMassaction extends \Magento\Backend\Block\Widget
 {
@@ -73,20 +73,21 @@ abstract class AbstractMassaction extends \Magento\Backend\Block\Widget
      *      'complete' => string, // Only for ajax enabled grid (optional)
      *      'url'      => string,
      *      'confirm'  => string, // text of confirmation of this action (optional)
-     *      'additional' => string // (optional)
+     *      'additional' => string, // (optional)
+     *      'visible' => object // instance of VisibilityCheckerInterface (optional)
      * );
      *
      * @param string $itemId
-     * @param array|\Magento\Framework\DataObject $item
+     * @param array|DataObject $item
      * @return $this
      */
     public function addItem($itemId, $item)
     {
         if (is_array($item)) {
-            $item = new \Magento\Framework\DataObject($item);
+            $item = new DataObject($item);
         }
 
-        if ($item instanceof \Magento\Framework\DataObject) {
+        if ($item instanceof DataObject && $this->isVisible($item)) {
             $item->setId($itemId);
             $item->setUrl($this->getUrl($item->getUrl()));
             $this->_items[$itemId] = $item;
@@ -95,6 +96,19 @@ abstract class AbstractMassaction extends \Magento\Backend\Block\Widget
         return $this;
     }
 
+    /**
+     * Check that item can be added to list
+     *
+     * @param DataObject $item
+     * @return bool
+     */
+    private function isVisible(DataObject $item)
+    {
+        /** @var VisibilityChecker $checker */
+        $checker = $item->getData('visible');
+        return (!$checker instanceof VisibilityChecker) || $checker->isVisible();
+    }
+
     /**
      * Retrieve massaction item with id $itemId
      *
diff --git a/app/code/Magento/Backend/Block/Widget/Grid/Massaction/VisibilityCheckerInterface.php b/app/code/Magento/Backend/Block/Widget/Grid/Massaction/VisibilityCheckerInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..934c4a84d145f349e028fc5497b9db62b2cdac54
--- /dev/null
+++ b/app/code/Magento/Backend/Block/Widget/Grid/Massaction/VisibilityCheckerInterface.php
@@ -0,0 +1,18 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Backend\Block\Widget\Grid\Massaction;
+
+use Magento\Framework\View\Element\Block\ArgumentInterface;
+
+interface VisibilityCheckerInterface extends ArgumentInterface
+{
+    /**
+     * Check that action can be displayed on massaction list
+     *
+     * @return bool
+     */
+    public function isVisible();
+}
diff --git a/app/code/Magento/Backend/Controller/Adminhtml/Cache/MassDisable.php b/app/code/Magento/Backend/Controller/Adminhtml/Cache/MassDisable.php
index 7266775959fc348796fabbb150f9e49b2ae9f7ad..42cbe229815aef16e13005ebdc802ec9b9bbd5c5 100644
--- a/app/code/Magento/Backend/Controller/Adminhtml/Cache/MassDisable.php
+++ b/app/code/Magento/Backend/Controller/Adminhtml/Cache/MassDisable.php
@@ -8,15 +8,41 @@ namespace Magento\Backend\Controller\Adminhtml\Cache;
 
 use Magento\Framework\Exception\LocalizedException;
 use Magento\Framework\Controller\ResultFactory;
+use Magento\Framework\App\State;
+use Magento\Framework\App\ObjectManager;
 
+/**
+ * Controller disables some types of cache
+ */
 class MassDisable extends \Magento\Backend\Controller\Adminhtml\Cache
 {
+    /**
+     * @var State
+     */
+    private $state;
+
     /**
      * Mass action for cache disabling
      *
      * @return \Magento\Backend\Model\View\Result\Redirect
      */
     public function execute()
+    {
+        if ($this->getState()->getMode() === State::MODE_PRODUCTION) {
+            $this->messageManager->addErrorMessage(__('You can\'t change status of cache type(s) in production mode'));
+        } else {
+            $this->disableCache();
+        }
+
+        return $this->resultFactory->create(ResultFactory::TYPE_REDIRECT)->setPath('adminhtml/*');
+    }
+
+    /**
+     * Disable cache
+     *
+     * @return void
+     */
+    private function disableCache()
     {
         try {
             $types = $this->getRequest()->getParam('types');
@@ -41,9 +67,20 @@ class MassDisable extends \Magento\Backend\Controller\Adminhtml\Cache
         } catch (\Exception $e) {
             $this->messageManager->addException($e, __('An error occurred while disabling cache.'));
         }
+    }
+
+    /**
+     * Get State Instance
+     *
+     * @return State
+     * @deprecated
+     */
+    private function getState()
+    {
+        if ($this->state === null) {
+            $this->state = ObjectManager::getInstance()->get(State::class);
+        }
 
-        /** @var \Magento\Backend\Model\View\Result\Redirect $resultRedirect */
-        $resultRedirect = $this->resultFactory->create(ResultFactory::TYPE_REDIRECT);
-        return $resultRedirect->setPath('adminhtml/*');
+        return $this->state;
     }
 }
diff --git a/app/code/Magento/Backend/Controller/Adminhtml/Cache/MassEnable.php b/app/code/Magento/Backend/Controller/Adminhtml/Cache/MassEnable.php
index 6c8bccfee166a5f746fd138c1b4e043ac1834542..8c4117831e8c8d7463b3112ac495cdede04f13d5 100644
--- a/app/code/Magento/Backend/Controller/Adminhtml/Cache/MassEnable.php
+++ b/app/code/Magento/Backend/Controller/Adminhtml/Cache/MassEnable.php
@@ -8,15 +8,41 @@ namespace Magento\Backend\Controller\Adminhtml\Cache;
 
 use Magento\Framework\Exception\LocalizedException;
 use Magento\Framework\Controller\ResultFactory;
+use Magento\Framework\App\State;
+use Magento\Framework\App\ObjectManager;
 
+/**
+ * Controller enables some types of cache
+ */
 class MassEnable extends \Magento\Backend\Controller\Adminhtml\Cache
 {
+    /**
+     * @var State
+     */
+    private $state;
+
     /**
      * Mass action for cache enabling
      *
      * @return \Magento\Backend\Model\View\Result\Redirect
      */
     public function execute()
+    {
+        if ($this->getState()->getMode() === State::MODE_PRODUCTION) {
+            $this->messageManager->addErrorMessage(__('You can\'t change status of cache type(s) in production mode'));
+        } else {
+            $this->enableCache();
+        }
+
+        return $this->resultFactory->create(ResultFactory::TYPE_REDIRECT)->setPath('adminhtml/*');
+    }
+
+    /**
+     * Enable cache
+     *
+     * @return void
+     */
+    private function enableCache()
     {
         try {
             $types = $this->getRequest()->getParam('types');
@@ -40,9 +66,20 @@ class MassEnable extends \Magento\Backend\Controller\Adminhtml\Cache
         } catch (\Exception $e) {
             $this->messageManager->addException($e, __('An error occurred while enabling cache.'));
         }
+    }
+
+    /**
+     * Get State Instance
+     *
+     * @return State
+     * @deprecated
+     */
+    private function getState()
+    {
+        if ($this->state === null) {
+            $this->state = ObjectManager::getInstance()->get(State::class);
+        }
 
-        /** @var \Magento\Backend\Model\View\Result\Redirect $resultRedirect */
-        $resultRedirect = $this->resultFactory->create(ResultFactory::TYPE_REDIRECT);
-        return $resultRedirect->setPath('adminhtml/*');
+        return $this->state;
     }
 }
diff --git a/app/code/Magento/Backend/Test/Unit/Block/Widget/Grid/MassactionTest.php b/app/code/Magento/Backend/Test/Unit/Block/Widget/Grid/MassactionTest.php
index 234e9d857549e073cb2fdba1bc39b3e4c7248349..137c70289df0b0cebd1a266dd4cb80f2f670746e 100644
--- a/app/code/Magento/Backend/Test/Unit/Block/Widget/Grid/MassactionTest.php
+++ b/app/code/Magento/Backend/Test/Unit/Block/Widget/Grid/MassactionTest.php
@@ -9,6 +9,8 @@
  */
 namespace Magento\Backend\Test\Unit\Block\Widget\Grid;
 
+use Magento\Backend\Block\Widget\Grid\Massaction\VisibilityCheckerInterface as VisibilityChecker;
+
 class MassactionTest extends \PHPUnit_Framework_TestCase
 {
     /**
@@ -17,12 +19,12 @@ class MassactionTest extends \PHPUnit_Framework_TestCase
     protected $_block;
 
     /**
-     * @var \PHPUnit_Framework_MockObject_MockObject
+     * @var \Magento\Framework\View\Layout|\PHPUnit_Framework_MockObject_MockObject
      */
     protected $_layoutMock;
 
     /**
-     * @var \PHPUnit_Framework_MockObject_MockObject
+     * @var \Magento\Backend\Block\Widget\Grid|\PHPUnit_Framework_MockObject_MockObject
      */
     protected $_gridMock;
 
@@ -32,63 +34,63 @@ class MassactionTest extends \PHPUnit_Framework_TestCase
     protected $_eventManagerMock;
 
     /**
-     * @var \PHPUnit_Framework_MockObject_MockObject
+     * @var \Magento\Backend\Model\Url|\PHPUnit_Framework_MockObject_MockObject
      */
     protected $_urlModelMock;
 
     /**
-     * @var \PHPUnit_Framework_MockObject_MockObject
+     * @var \Magento\Framework\App\Request\Http|\PHPUnit_Framework_MockObject_MockObject
      */
     protected $_requestMock;
 
+    /**
+     * @var VisibilityChecker|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $visibilityCheckerMock;
+
     protected function setUp()
     {
-        $this->_gridMock = $this->getMock(
-            \Magento\Backend\Block\Widget\Grid::class,
-            ['getId', 'getCollection'],
-            [],
-            '',
-            false
-        );
-        $this->_gridMock->expects($this->any())->method('getId')->will($this->returnValue('test_grid'));
-
-        $this->_layoutMock = $this->getMock(
-            \Magento\Framework\View\Layout::class,
-            ['getParentName', 'getBlock', 'helper'],
-            [],
-            '',
-            false,
-            false
-        );
+        $this->_gridMock = $this->getMockBuilder(\Magento\Backend\Block\Widget\Grid::class)
+            ->disableOriginalConstructor()
+            ->disableOriginalClone()
+            ->setMethods(['getId', 'getCollection'])
+            ->getMock();
+        $this->_gridMock->expects($this->any())
+            ->method('getId')
+            ->willReturn('test_grid');
 
-        $this->_layoutMock->expects(
-            $this->any()
-        )->method(
-            'getParentName'
-        )->with(
-            'test_grid_massaction'
-        )->will(
-            $this->returnValue('test_grid')
-        );
-        $this->_layoutMock->expects(
-            $this->any()
-        )->method(
-            'getBlock'
-        )->with(
-            'test_grid'
-        )->will(
-            $this->returnValue($this->_gridMock)
-        );
+        $this->_layoutMock = $this->getMockBuilder(\Magento\Framework\View\Layout::class)
+            ->disableOriginalConstructor()
+            ->disableOriginalClone()
+            ->setMethods(['getParentName', 'getBlock', 'helper'])
+            ->getMock();
+        $this->_layoutMock->expects($this->any())
+            ->method('getParentName')
+            ->with('test_grid_massaction')
+            ->willReturn('test_grid');
+        $this->_layoutMock->expects($this->any())
+            ->method('getBlock')
+            ->with('test_grid')
+            ->willReturn($this->_gridMock);
+
+        $this->_requestMock = $this->getMockBuilder(\Magento\Framework\App\Request\Http::class)
+            ->disableOriginalConstructor()
+            ->disableOriginalClone()
+            ->getMock();
 
-        $this->_requestMock = $this->getMock(\Magento\Framework\App\Request\Http::class, [], [], '', false);
+        $this->_urlModelMock = $this->getMockBuilder(\Magento\Backend\Model\Url::class)
+            ->disableOriginalConstructor()
+            ->disableOriginalClone()
+            ->getMock();
 
-        $this->_urlModelMock = $this->getMock(\Magento\Backend\Model\Url::class, [], [], '', false);
+        $this->visibilityCheckerMock = $this->getMockBuilder(VisibilityChecker::class)
+            ->getMockForAbstractClass();
 
         $arguments = [
             'layout' => $this->_layoutMock,
             'request' => $this->_requestMock,
             'urlBuilder' => $this->_urlModelMock,
-            'data' => ['massaction_id_field' => 'test_id', 'massaction_id_filter' => 'test_id'],
+            'data' => ['massaction_id_field' => 'test_id', 'massaction_id_filter' => 'test_id']
         ];
 
         $objectManagerHelper = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
@@ -124,26 +126,24 @@ class MassactionTest extends \PHPUnit_Framework_TestCase
     }
 
     /**
-     * @param $itemId
-     * @param $item
+     * @param string$itemId
+     * @param \Magento\Framework\DataObject $item
      * @param $expectedItem \Magento\Framework\DataObject
-     * @dataProvider itemsDataProvider
+     * @dataProvider itemsProcessingDataProvider
      */
     public function testItemsProcessing($itemId, $item, $expectedItem)
     {
-        $this->_urlModelMock->expects(
-            $this->any()
-        )->method(
-            'getBaseUrl'
-        )->will(
-            $this->returnValue('http://localhost/index.php')
-        );
+        $this->_urlModelMock->expects($this->any())
+            ->method('getBaseUrl')
+            ->willReturn('http://localhost/index.php');
 
         $urlReturnValueMap = [
             ['*/*/test1', [], 'http://localhost/index.php/backend/admin/test/test1'],
             ['*/*/test2', [], 'http://localhost/index.php/backend/admin/test/test2'],
         ];
-        $this->_urlModelMock->expects($this->any())->method('getUrl')->will($this->returnValueMap($urlReturnValueMap));
+        $this->_urlModelMock->expects($this->any())
+            ->method('getUrl')
+            ->willReturnMap($urlReturnValueMap);
 
         $this->_block->addItem($itemId, $item);
         $this->assertEquals(1, $this->_block->getCount());
@@ -157,7 +157,10 @@ class MassactionTest extends \PHPUnit_Framework_TestCase
         $this->assertNull($this->_block->getItem($itemId));
     }
 
-    public function itemsDataProvider()
+    /**
+     * @return array
+     */
+    public function itemsProcessingDataProvider()
     {
         return [
             [
@@ -186,22 +189,17 @@ class MassactionTest extends \PHPUnit_Framework_TestCase
     }
 
     /**
-     * @param $param
-     * @param $expectedJson
-     * @param $expected
+     * @param string $param
+     * @param string $expectedJson
+     * @param array $expected
      * @dataProvider selectedDataProvider
      */
     public function testSelected($param, $expectedJson, $expected)
     {
-        $this->_requestMock->expects(
-            $this->any()
-        )->method(
-            'getParam'
-        )->with(
-            $this->_block->getFormFieldNameInternal()
-        )->will(
-            $this->returnValue($param)
-        );
+        $this->_requestMock->expects($this->any())
+            ->method('getParam')
+            ->with($this->_block->getFormFieldNameInternal())
+            ->willReturn($param);
 
         $this->assertEquals($expectedJson, $this->_block->getSelectedJson());
         $this->assertEquals($expected, $this->_block->getSelected());
@@ -262,6 +260,9 @@ class MassactionTest extends \PHPUnit_Framework_TestCase
         $this->assertEquals($result, $this->_block->getGridIdsJson());
     }
 
+    /**
+     * @return array
+     */
     public function dataProviderGetGridIdsJsonWithUseSelectAll()
     {
         return [
@@ -279,4 +280,71 @@ class MassactionTest extends \PHPUnit_Framework_TestCase
             ],
         ];
     }
+
+    /**
+     * @param string $itemId
+     * @param array|\Magento\Framework\DataObject $item
+     * @param int $count
+     * @param bool $withVisibilityChecker
+     * @param bool $isVisible
+     * @dataProvider addItemDataProvider
+     */
+    public function testAddItem($itemId, $item, $count, $withVisibilityChecker, $isVisible)
+    {
+        $this->visibilityCheckerMock->expects($this->any())
+            ->method('isVisible')
+            ->willReturn($isVisible);
+
+        if ($withVisibilityChecker) {
+            $item['visible'] = $this->visibilityCheckerMock;
+        }
+
+        $urlReturnValueMap = [
+            ['*/*/test1', [], 'http://localhost/index.php/backend/admin/test/test1'],
+            ['*/*/test2', [], 'http://localhost/index.php/backend/admin/test/test2'],
+        ];
+        $this->_urlModelMock->expects($this->any())
+            ->method('getUrl')
+            ->willReturnMap($urlReturnValueMap);
+
+        $this->_block->addItem($itemId, $item);
+        $this->assertEquals($count, $this->_block->getCount());
+    }
+
+    /**
+     * @return array
+     */
+    public function addItemDataProvider()
+    {
+        return [
+            [
+                'itemId' => 'test1',
+                'item' => ['label' => 'Test 1', 'url' => '*/*/test1'],
+                'count' => 1,
+                'withVisibilityChecker' => false,
+                '$isVisible' => false,
+            ],
+            [
+                'itemId' => 'test2',
+                'item' => ['label' => 'Test 2', 'url' => '*/*/test2'],
+                'count' => 1,
+                'withVisibilityChecker' => false,
+                'isVisible' => true,
+            ],
+            [
+                'itemId' => 'test1',
+                'item' => ['label' => 'Test 1. Hide', 'url' => '*/*/test1'],
+                'count' => 0,
+                'withVisibilityChecker' => true,
+                'isVisible' => false,
+            ],
+            [
+                'itemId' => 'test2',
+                'item' => ['label' => 'Test 2. Does not hide', 'url' => '*/*/test2'],
+                'count' => 1,
+                'withVisibilityChecker' => true,
+                'isVisible' => true,
+            ]
+        ];
+    }
 }
diff --git a/app/code/Magento/Backend/Test/Unit/Controller/Adminhtml/Cache/MassDisableTest.php b/app/code/Magento/Backend/Test/Unit/Controller/Adminhtml/Cache/MassDisableTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..b2fc808b0e237b8bbeb5b323fb173ecff67d8071
--- /dev/null
+++ b/app/code/Magento/Backend/Test/Unit/Controller/Adminhtml/Cache/MassDisableTest.php
@@ -0,0 +1,224 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Backend\Test\Unit\Controller\Adminhtml\Cache;
+
+use PHPUnit_Framework_MockObject_MockObject as MockObject;
+use Magento\Backend\Controller\Adminhtml\Cache\MassDisable;
+use Magento\Framework\TestFramework\Unit\Helper\ObjectManager as ObjectManagerHelper;
+use Magento\Framework\App\State;
+use Magento\Backend\App\Action\Context;
+use Magento\Framework\Message\ManagerInterface as MessageManager;
+use Magento\Framework\Controller\ResultFactory;
+use Magento\Backend\Model\View\Result\Redirect;
+use Magento\Framework\App\RequestInterface as Request;
+use Magento\Framework\App\Cache\TypeListInterface as CacheTypeList;
+use Magento\Framework\App\Cache\StateInterface as CacheState;
+
+/**
+ * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
+ */
+class MassDisableTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var MassDisable
+     */
+    private $controller;
+
+    /**
+     * @var State|MockObject
+     */
+    private $stateMock;
+
+    /**
+     * @var MessageManager|MockObject
+     */
+    private $messageManagerMock;
+
+    /**
+     * @var Redirect|MockObject
+     */
+    private $redirectMock;
+
+    /**
+     * @var Request|MockObject
+     */
+    private $requestMock;
+
+    /**
+     * @var CacheTypeList|MockObject
+     */
+    private $cacheTypeListMock;
+
+    /**
+     * @var CacheState|MockObject
+     */
+    private $cacheStateMock;
+
+    protected function setUp()
+    {
+        $objectManagerHelper = new ObjectManagerHelper($this);
+
+        $this->stateMock = $this->getMockBuilder(State::class)
+            ->disableOriginalConstructor()
+            ->disableOriginalClone()
+            ->getMock();
+
+        $this->messageManagerMock = $this->getMockBuilder(MessageManager::class)
+            ->getMockForAbstractClass();
+
+        $this->requestMock = $this->getMockBuilder(Request::class)
+            ->getMockForAbstractClass();
+
+        $this->cacheTypeListMock = $this->getMockBuilder(CacheTypeList::class)
+            ->getMockForAbstractClass();
+
+        $this->cacheStateMock = $this->getMockBuilder(CacheState::class)
+            ->getMockForAbstractClass();
+
+        $this->redirectMock = $this->getMockBuilder(Redirect::class)
+            ->disableOriginalConstructor()
+            ->disableOriginalClone()
+            ->getMock();
+        $this->redirectMock->expects($this->once())
+            ->method('setPath')
+            ->with('adminhtml/*')
+            ->willReturnSelf();
+        $resultFactoryMock = $this->getMockBuilder(ResultFactory::class)
+            ->disableOriginalConstructor()
+            ->disableOriginalClone()
+            ->getMock();
+        $resultFactoryMock->expects($this->once())
+            ->method('create')
+            ->with(ResultFactory::TYPE_REDIRECT)
+            ->willReturn($this->redirectMock);
+
+        $contextMock = $this->getMockBuilder(Context::class)
+            ->disableOriginalConstructor()
+            ->disableOriginalClone()
+            ->getMock();
+        $contextMock->expects($this->once())
+            ->method('getMessageManager')
+            ->willReturn($this->messageManagerMock);
+        $contextMock->expects($this->once())
+            ->method('getResultFactory')
+            ->willReturn($resultFactoryMock);
+        $contextMock->expects($this->once())
+            ->method('getRequest')
+            ->willReturn($this->requestMock);
+
+        $this->controller = $objectManagerHelper->getObject(
+            MassDisable::class,
+            [
+                'context' => $contextMock,
+                'cacheTypeList' => $this->cacheTypeListMock,
+                'cacheState' => $this->cacheStateMock
+            ]
+        );
+        $objectManagerHelper->setBackwardCompatibleProperty($this->controller, 'state', $this->stateMock);
+    }
+
+    public function testExecuteInProductionMode()
+    {
+        $this->stateMock->expects($this->once())
+            ->method('getMode')
+            ->willReturn(State::MODE_PRODUCTION);
+
+        $this->messageManagerMock->expects($this->once())
+            ->method('addErrorMessage')
+            ->with('You can\'t change status of cache type(s) in production mode', null)
+            ->willReturnSelf();
+
+        $this->assertSame($this->redirectMock, $this->controller->execute());
+    }
+
+    public function testExecuteInvalidTypeCache()
+    {
+        $this->stateMock->expects($this->once())
+            ->method('getMode')
+            ->willReturn(State::MODE_DEVELOPER);
+
+        $this->cacheTypeListMock->expects($this->once())
+            ->method('getTypes')
+            ->willReturn([
+                'pageCache' => [
+                    'id' => 'pageCache',
+                    'label' => 'Cache of Page'
+                ]
+            ]);
+
+        $this->requestMock->expects($this->once())
+            ->method('getParam')
+            ->with('types')
+            ->willReturn(['someCache']);
+
+        $this->messageManagerMock->expects($this->once())
+            ->method('addError')
+            ->with('Specified cache type(s) don\'t exist: someCache')
+            ->willReturnSelf();
+
+        $this->assertSame($this->redirectMock, $this->controller->execute());
+    }
+
+    public function testExecuteWithException()
+    {
+        $exception = new \Exception();
+
+        $this->stateMock->expects($this->once())
+            ->method('getMode')
+            ->willReturn(State::MODE_DEVELOPER);
+
+        $this->requestMock->expects($this->once())
+            ->method('getParam')
+            ->willThrowException($exception);
+
+        $this->messageManagerMock->expects($this->once())
+            ->method('addException')
+            ->with($exception, 'An error occurred while disabling cache.')
+            ->willReturnSelf();
+
+        $this->assertSame($this->redirectMock, $this->controller->execute());
+    }
+
+    public function testExecuteSuccess()
+    {
+        $cacheType = 'pageCache';
+
+        $this->stateMock->expects($this->once())
+            ->method('getMode')
+            ->willReturn(State::MODE_DEVELOPER);
+
+        $this->cacheTypeListMock->expects($this->once())
+            ->method('getTypes')
+            ->willReturn([
+                'pageCache' => [
+                    'id' => 'pageCache',
+                    'label' => 'Cache of Page'
+                ]
+            ]);
+
+        $this->requestMock->expects($this->once())
+            ->method('getParam')
+            ->with('types')
+            ->willReturn([$cacheType]);
+
+        $this->cacheStateMock->expects($this->once())
+            ->method('isEnabled')
+            ->with($cacheType)
+            ->willReturn(true);
+        $this->cacheStateMock->expects($this->once())
+            ->method('setEnabled')
+            ->with($cacheType, false);
+        $this->cacheStateMock->expects($this->once())
+            ->method('persist');
+
+        $this->messageManagerMock->expects($this->once())
+            ->method('addSuccess')
+            ->with('1 cache type(s) disabled.')
+            ->willReturnSelf();
+
+        $this->assertSame($this->redirectMock, $this->controller->execute());
+    }
+}
diff --git a/app/code/Magento/Backend/Test/Unit/Controller/Adminhtml/Cache/MassEnableTest.php b/app/code/Magento/Backend/Test/Unit/Controller/Adminhtml/Cache/MassEnableTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..8c1b9f1718ab924379cf3e5440a942c0be5502d7
--- /dev/null
+++ b/app/code/Magento/Backend/Test/Unit/Controller/Adminhtml/Cache/MassEnableTest.php
@@ -0,0 +1,224 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Backend\Test\Unit\Controller\Adminhtml\Cache;
+
+use PHPUnit_Framework_MockObject_MockObject as MockObject;
+use Magento\Backend\Controller\Adminhtml\Cache\MassEnable;
+use Magento\Framework\TestFramework\Unit\Helper\ObjectManager as ObjectManagerHelper;
+use Magento\Framework\App\State;
+use Magento\Backend\App\Action\Context;
+use Magento\Framework\Message\ManagerInterface as MessageManager;
+use Magento\Framework\Controller\ResultFactory;
+use Magento\Backend\Model\View\Result\Redirect;
+use Magento\Framework\App\RequestInterface as Request;
+use Magento\Framework\App\Cache\TypeListInterface as CacheTypeList;
+use Magento\Framework\App\Cache\StateInterface as CacheState;
+
+/**
+ * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
+ */
+class MassEnableTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var MassEnable
+     */
+    private $controller;
+
+    /**
+     * @var State|MockObject
+     */
+    private $stateMock;
+
+    /**
+     * @var MessageManager|MockObject
+     */
+    private $messageManagerMock;
+
+    /**
+     * @var Redirect|MockObject
+     */
+    private $redirectMock;
+
+    /**
+     * @var Request|MockObject
+     */
+    private $requestMock;
+
+    /**
+     * @var CacheTypeList|MockObject
+     */
+    private $cacheTypeListMock;
+
+    /**
+     * @var CacheState|MockObject
+     */
+    private $cacheStateMock;
+
+    protected function setUp()
+    {
+        $objectManagerHelper = new ObjectManagerHelper($this);
+
+        $this->stateMock = $this->getMockBuilder(State::class)
+            ->disableOriginalConstructor()
+            ->disableOriginalClone()
+            ->getMock();
+
+        $this->messageManagerMock = $this->getMockBuilder(MessageManager::class)
+            ->getMockForAbstractClass();
+
+        $this->requestMock = $this->getMockBuilder(Request::class)
+            ->getMockForAbstractClass();
+
+        $this->cacheTypeListMock = $this->getMockBuilder(CacheTypeList::class)
+            ->getMockForAbstractClass();
+
+        $this->cacheStateMock = $this->getMockBuilder(CacheState::class)
+            ->getMockForAbstractClass();
+
+        $this->redirectMock = $this->getMockBuilder(Redirect::class)
+            ->disableOriginalConstructor()
+            ->disableOriginalClone()
+            ->getMock();
+        $this->redirectMock->expects($this->once())
+            ->method('setPath')
+            ->with('adminhtml/*')
+            ->willReturnSelf();
+        $resultFactoryMock = $this->getMockBuilder(ResultFactory::class)
+            ->disableOriginalConstructor()
+            ->disableOriginalClone()
+            ->getMock();
+        $resultFactoryMock->expects($this->once())
+            ->method('create')
+            ->with(ResultFactory::TYPE_REDIRECT)
+            ->willReturn($this->redirectMock);
+
+        $contextMock = $this->getMockBuilder(Context::class)
+            ->disableOriginalConstructor()
+            ->disableOriginalClone()
+            ->getMock();
+        $contextMock->expects($this->once())
+            ->method('getMessageManager')
+            ->willReturn($this->messageManagerMock);
+        $contextMock->expects($this->once())
+            ->method('getResultFactory')
+            ->willReturn($resultFactoryMock);
+        $contextMock->expects($this->once())
+            ->method('getRequest')
+            ->willReturn($this->requestMock);
+
+        $this->controller = $objectManagerHelper->getObject(
+            MassEnable::class,
+            [
+                'context' => $contextMock,
+                'cacheTypeList' => $this->cacheTypeListMock,
+                'cacheState' => $this->cacheStateMock
+            ]
+        );
+        $objectManagerHelper->setBackwardCompatibleProperty($this->controller, 'state', $this->stateMock);
+    }
+
+    public function testExecuteInProductionMode()
+    {
+        $this->stateMock->expects($this->once())
+            ->method('getMode')
+            ->willReturn(State::MODE_PRODUCTION);
+
+        $this->messageManagerMock->expects($this->once())
+            ->method('addErrorMessage')
+            ->with('You can\'t change status of cache type(s) in production mode', null)
+            ->willReturnSelf();
+
+        $this->assertSame($this->redirectMock, $this->controller->execute());
+    }
+
+    public function testExecuteInvalidTypeCache()
+    {
+        $this->stateMock->expects($this->once())
+            ->method('getMode')
+            ->willReturn(State::MODE_DEVELOPER);
+
+        $this->cacheTypeListMock->expects($this->once())
+            ->method('getTypes')
+            ->willReturn([
+                'pageCache' => [
+                    'id' => 'pageCache',
+                    'label' => 'Cache of Page'
+                ]
+            ]);
+
+        $this->requestMock->expects($this->once())
+            ->method('getParam')
+            ->with('types')
+            ->willReturn(['someCache']);
+
+        $this->messageManagerMock->expects($this->once())
+            ->method('addError')
+            ->with('Specified cache type(s) don\'t exist: someCache')
+            ->willReturnSelf();
+
+        $this->assertSame($this->redirectMock, $this->controller->execute());
+    }
+
+    public function testExecuteWithException()
+    {
+        $exception = new \Exception();
+
+        $this->stateMock->expects($this->once())
+            ->method('getMode')
+            ->willReturn(State::MODE_DEVELOPER);
+
+        $this->requestMock->expects($this->once())
+            ->method('getParam')
+            ->willThrowException($exception);
+
+        $this->messageManagerMock->expects($this->once())
+            ->method('addException')
+            ->with($exception, 'An error occurred while enabling cache.')
+            ->willReturnSelf();
+
+        $this->assertSame($this->redirectMock, $this->controller->execute());
+    }
+
+    public function testExecuteSuccess()
+    {
+        $cacheType = 'pageCache';
+
+        $this->stateMock->expects($this->once())
+            ->method('getMode')
+            ->willReturn(State::MODE_DEVELOPER);
+
+        $this->cacheTypeListMock->expects($this->once())
+            ->method('getTypes')
+            ->willReturn([
+                'pageCache' => [
+                    'id' => 'pageCache',
+                    'label' => 'Cache of Page'
+                ]
+            ]);
+
+        $this->requestMock->expects($this->once())
+            ->method('getParam')
+            ->with('types')
+            ->willReturn([$cacheType]);
+
+        $this->cacheStateMock->expects($this->once())
+            ->method('isEnabled')
+            ->with($cacheType)
+            ->willReturn(false);
+        $this->cacheStateMock->expects($this->once())
+            ->method('setEnabled')
+            ->with($cacheType, true);
+        $this->cacheStateMock->expects($this->once())
+            ->method('persist');
+
+        $this->messageManagerMock->expects($this->once())
+            ->method('addSuccess')
+            ->with('1 cache type(s) enabled.')
+            ->willReturnSelf();
+
+        $this->assertSame($this->redirectMock, $this->controller->execute());
+    }
+}
diff --git a/app/code/Magento/Backend/view/adminhtml/layout/adminhtml_cache_block.xml b/app/code/Magento/Backend/view/adminhtml/layout/adminhtml_cache_block.xml
index decc26f331c8298d16b4a76d4a74d82c5808c651..98f9ca89ba18accc9013c7b0851e39abafa517b2 100644
--- a/app/code/Magento/Backend/view/adminhtml/layout/adminhtml_cache_block.xml
+++ b/app/code/Magento/Backend/view/adminhtml/layout/adminhtml_cache_block.xml
@@ -23,10 +23,12 @@
                             <item name="enable" xsi:type="array">
                                 <item name="label" xsi:type="string" translate="true">Enable</item>
                                 <item name="url" xsi:type="string">adminhtml/*/massEnable</item>
+                                <item name="visible" xsi:type="object">Magento\Backend\Block\Cache\Grid\Massaction\ProductionModeVisibilityChecker</item>
                             </item>
                             <item name="disable" xsi:type="array">
                                 <item name="label" xsi:type="string" translate="true">Disable</item>
                                 <item name="url" xsi:type="string">adminhtml/*/massDisable</item>
+                                <item name="visible" xsi:type="object">Magento\Backend\Block\Cache\Grid\Massaction\ProductionModeVisibilityChecker</item>
                             </item>
                             <item name="refresh" xsi:type="array">
                                 <item name="label" xsi:type="string" translate="true">Refresh</item>
diff --git a/app/etc/di.xml b/app/etc/di.xml
index e9767eccb28114ffa66bc8bc84829d92b1620e99..1b347574f4b2a2d3f010cb9a712da6cd6c7dbec2 100755
--- a/app/etc/di.xml
+++ b/app/etc/di.xml
@@ -433,7 +433,7 @@
     </virtualType>
     <virtualType name="layoutObjectArgumentInterpreter" type="Magento\Framework\View\Layout\Argument\Interpreter\DataObject">
         <arguments>
-            <argument name="expectedClass" xsi:type="string">Magento\Framework\Data\CollectionDataSourceInterface</argument>
+            <argument name="expectedClass" xsi:type="string">Magento\Framework\View\Element\Block\ArgumentInterface</argument>
         </arguments>
     </virtualType>
     <type name="Magento\Framework\View\Layout\Argument\Interpreter\NamedParams">
diff --git a/dev/tests/integration/testsuite/Magento/Backend/Block/Widget/Grid/MassactionTest.php b/dev/tests/integration/testsuite/Magento/Backend/Block/Widget/Grid/MassactionTest.php
index 1bbf40ca6dc72999e4d2bd0c65987d25ee2e6f2a..8c0a7dd201d62abd7e823de4c31c2e9aec57f954 100644
--- a/dev/tests/integration/testsuite/Magento/Backend/Block/Widget/Grid/MassactionTest.php
+++ b/dev/tests/integration/testsuite/Magento/Backend/Block/Widget/Grid/MassactionTest.php
@@ -3,11 +3,10 @@
  * Copyright © 2016 Magento. All rights reserved.
  * See COPYING.txt for license details.
  */
-
-// @codingStandardsIgnoreFile
-
 namespace Magento\Backend\Block\Widget\Grid;
 
+use Magento\TestFramework\App\State;
+
 /**
  * @magentoAppArea adminhtml
  * @magentoComponentsDir Magento/Backend/Block/_files/design
@@ -25,18 +24,43 @@ class MassactionTest extends \PHPUnit_Framework_TestCase
      */
     protected $_layout;
 
+    /**
+     * @var \Magento\Framework\ObjectManagerInterface
+     */
+    private $objectManager;
+
+    /**
+     * @var string
+     */
+    private $mageMode;
+
     protected function setUp()
     {
-        $this->markTestIncomplete('MAGETWO-6406');
-
         parent::setUp();
 
-        $objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
+        $this->objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
+
+        $this->mageMode = $this->objectManager->get(State::class)->getMode();
+
         /** @var \Magento\Theme\Model\Theme\Registration $registration */
-        $registration = $objectManager->get(\Magento\Theme\Model\Theme\Registration::class);
+        $registration = $this->objectManager->get(\Magento\Theme\Model\Theme\Registration::class);
         $registration->register();
-        $objectManager->get(\Magento\Framework\View\DesignInterface::class)->setDesignTheme('BackendTest/test_default');
-        $this->_layout = $objectManager->create(
+        $this->objectManager->get(\Magento\Framework\View\DesignInterface::class)
+            ->setDesignTheme('BackendTest/test_default');
+    }
+
+    protected function tearDown()
+    {
+        $this->objectManager->get(State::class)->setMode($this->mageMode);
+    }
+
+    /**
+     * @param string $mageMode
+     */
+    private function loadLayout($mageMode = State::MODE_DEVELOPER)
+    {
+        $this->objectManager->get(State::class)->setMode($mageMode);
+        $this->_layout = $this->objectManager->create(
             \Magento\Framework\View\LayoutInterface::class,
             ['area' => 'adminhtml']
         );
@@ -48,20 +72,14 @@ class MassactionTest extends \PHPUnit_Framework_TestCase
         $this->assertNotFalse($this->_block, 'Could not load the block for testing');
     }
 
-    /**
-     * @covers \Magento\Backend\Block\Widget\Grid\Massaction::getItems
-     * @covers \Magento\Backend\Block\Widget\Grid\Massaction::getCount
-     * @covers \Magento\Backend\Block\Widget\Grid\Massaction::getItemsJson
-     * @covers \Magento\Backend\Block\Widget\Grid\Massaction::isAvailable
-     */
     public function testMassactionDefaultValues()
     {
+        $this->loadLayout();
+
         /** @var $blockEmpty \Magento\Backend\Block\Widget\Grid\Massaction */
-        $blockEmpty = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->get(
-            \Magento\Framework\View\LayoutInterface::class
-        )->createBlock(
-            \Magento\Backend\Block\Widget\Grid\Massaction::class
-        );
+        $blockEmpty = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()
+            ->get(\Magento\Framework\View\LayoutInterface::class)
+            ->createBlock(\Magento\Backend\Block\Widget\Grid\Massaction::class);
         $this->assertEmpty($blockEmpty->getItems());
         $this->assertEquals(0, $blockEmpty->getCount());
         $this->assertSame('[]', $blockEmpty->getItemsJson());
@@ -71,6 +89,8 @@ class MassactionTest extends \PHPUnit_Framework_TestCase
 
     public function testGetJavaScript()
     {
+        $this->loadLayout();
+
         $javascript = $this->_block->getJavaScript();
 
         $expectedItemFirst = '#"option_id1":{"label":"Option One",' .
@@ -86,6 +106,8 @@ class MassactionTest extends \PHPUnit_Framework_TestCase
 
     public function testGetJavaScriptWithAddedItem()
     {
+        $this->loadLayout();
+
         $input = [
             'id' => 'option_id3',
             'label' => 'Option Three',
@@ -100,20 +122,49 @@ class MassactionTest extends \PHPUnit_Framework_TestCase
         $this->assertRegExp($expected, $this->_block->getJavaScript());
     }
 
-    public function testGetCount()
+    /**
+     * @param string $mageMode
+     * @param int $expectedCount
+     * @dataProvider getCountDataProvider
+     */
+    public function testGetCount($mageMode, $expectedCount)
     {
-        $this->assertEquals(2, $this->_block->getCount());
+        $this->loadLayout($mageMode);
+        $this->assertEquals($expectedCount, $this->_block->getCount());
+    }
+
+    /**
+     * @return array
+     */
+    public function getCountDataProvider()
+    {
+        return [
+            [
+                'mageMode' => State::MODE_DEVELOPER,
+                'expectedCount' => 3,
+            ],
+            [
+                'mageMode' => State::MODE_DEFAULT,
+                'expectedCount' => 3,
+            ],
+            [
+                'mageMode' => State::MODE_PRODUCTION,
+                'expectedCount' => 2,
+            ],
+        ];
     }
 
     /**
-     * @param $itemId
-     * @param $expectedItem
+     * @param string $itemId
+     * @param array $expectedItem
      * @dataProvider getItemsDataProvider
      */
     public function testGetItems($itemId, $expectedItem)
     {
+        $this->loadLayout();
+
         $items = $this->_block->getItems();
-        $this->assertCount(2, $items);
+        $this->assertCount(3, $items);
         $this->assertArrayHasKey($itemId, $items);
 
         $actualItem = $items[$itemId];
@@ -149,19 +200,29 @@ class MassactionTest extends \PHPUnit_Framework_TestCase
                     'selected' => false,
                     'blockname' => ''
                 ]
+            ],
+            [
+                'option_id3',
+                [
+                    'id' => 'option_id3',
+                    'label' => 'Option Three',
+                    'url' => '#http:\/\/localhost\/index\.php\/(?:key\/([\w\d]+)\/)?#',
+                    'selected' => false,
+                    'blockname' => ''
+                ]
             ]
         ];
     }
 
     public function testGridContainsMassactionColumn()
     {
+        $this->loadLayout();
         $this->_layout->getBlock('admin.test.grid')->toHtml();
 
-        $gridMassactionColumn = $this->_layout->getBlock(
-            'admin.test.grid'
-        )->getColumnSet()->getChildBlock(
-            'massaction'
-        );
+        $gridMassactionColumn = $this->_layout->getBlock('admin.test.grid')
+            ->getColumnSet()
+            ->getChildBlock('massaction');
+
         $this->assertNotNull($gridMassactionColumn, 'Massaction column does not exist in the grid column set');
         $this->assertInstanceOf(
             \Magento\Backend\Block\Widget\Grid\Column::class,
diff --git a/dev/tests/integration/testsuite/Magento/Backend/Block/_files/design/adminhtml/Magento/test_default/Magento_Backend/layout/layout_test_grid_handle.xml b/dev/tests/integration/testsuite/Magento/Backend/Block/_files/design/adminhtml/Magento/test_default/Magento_Backend/layout/layout_test_grid_handle.xml
index 5f9a80a5a3dbda9a86915c99aefce1066074ffb6..c072532a1c27c3471602abbb2442611fa49c6a59 100644
--- a/dev/tests/integration/testsuite/Magento/Backend/Block/_files/design/adminhtml/Magento/test_default/Magento_Backend/layout/layout_test_grid_handle.xml
+++ b/dev/tests/integration/testsuite/Magento/Backend/Block/_files/design/adminhtml/Magento/test_default/Magento_Backend/layout/layout_test_grid_handle.xml
@@ -6,60 +6,68 @@
  */
 -->
 <layout xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-    <block class="Magento\Backend\Block\Widget\Grid" name="admin.test.grid" Output="1">
+    <block class="Magento\Backend\Block\Widget\Grid" name="admin.test.grid">
         <arguments>
-            <dataSource type="object">Magento\Framework\Data\Collection</dataSource>
+            <argument name="dataSource" xsi:type="object">Magento\Framework\Data\Collection</argument>
         </arguments>
-        <block class="Magento\Backend\Block\Widget\Grid\ColumnSet" as="grid.columnSet" name="admin.test.grid.columnSet" Output="1">
-            <block class="Magento\Backend\Block\Widget\Grid\Column" as="product_name" Output="1">
+        <block class="Magento\Backend\Block\Widget\Grid\ColumnSet" as="grid.columnSet" name="admin.test.grid.columnSet">
+            <block class="Magento\Backend\Block\Widget\Grid\Column" as="product_name">
                 <arguments>
-                    <header>Product name 1</header>
-                    <index>product_name</index>
-                    <type>text</type>
+                    <argument name="header" xsi:type="string" translate="true">Product name 1</argument>
+                    <argument name="id" xsi:type="string">product_name</argument>
+                    <argument name="index" xsi:type="string">product_name</argument>
+                    <argument name="type" xsi:type="string">text</argument>
                 </arguments>
             </block>
-            <block class="Magento\Backend\Block\Widget\Grid\Column" as="description" output="1">
+            <block class="Magento\Backend\Block\Widget\Grid\Column" as="description">
                 <arguments>
-                    <header>User Description</header>
-                    <index>description</index>
-                    <type>text</type>
+                    <argument name="header" xsi:type="string" translate="true">User Description</argument>
+                    <argument name="id" xsi:type="string">description</argument>
+                    <argument name="index" xsi:type="string">description</argument>
+                    <argument name="type" xsi:type="string">text</argument>
                 </arguments>
             </block>
-            <block class="Magento\Backend\Block\Widget\Grid\Column" as="qty" output="1">
+            <block class="Magento\Backend\Block\Widget\Grid\Column" as="qty">
                 <arguments>
-                    <header>Qty</header>
-                    <index>qty</index>
-                    <type>number</type>
-                    <width>60px</width>
+                    <argument name="header" xsi:type="string" translate="true">Qty</argument>
+                    <argument name="id" xsi:type="string">qty</argument>
+                    <argument name="index" xsi:type="string">qty</argument>
+                    <argument name="type" xsi:type="string">number</argument>
+                    <argument name="width" xsi:type="string">60</argument>
                 </arguments>
             </block>
-            <block class="Magento\Backend\Block\Widget\Grid\Column" as="added_at" output="1">
+            <block class="Magento\Backend\Block\Widget\Grid\Column" as="added_at">
                 <arguments>
-                    <header>Date Added</header>
-                    <index>added_at</index>
-                    <gmtoffset>1</gmtoffset>
-                    <type>date</type>
+                    <argument name="header" xsi:type="string" translate="true">Date Added</argument>
+                    <argument name="id" xsi:type="string">added_at</argument>
+                    <argument name="index" xsi:type="string">added_at</argument>
+                    <argument name="type" xsi:type="string">date</argument>
+                    <argument name="gmtoffset" xsi:type="string">1</argument>
                 </arguments>
             </block>
         </block>
-        <block class="Magento\Backend\Block\Widget\Grid\Massaction" as="grid.massaction" name='admin.test.grid.massaction' output="1">
+        <block class="Magento\Backend\Block\Widget\Grid\Massaction" as="grid.massaction" name='admin.test.grid.massaction'>
             <arguments>
-                <massaction_id_field>test_id</massaction_id_field>
-                <massaction_id_filter>test_id</massaction_id_filter>
-                <form_field_name>test</form_field_name>
-                <use_select_all>1</use_select_all>
-                <options>
-                    <option_id1>
-                        <label>Option One</label>
-                        <url>*/*/option1</url>
-                        <complete>Test</complete>
-                    </option_id1>
-                    <option_id2>
-                        <label>Option Two</label>
-                        <url>*/*/option2</url>
-                        <confirm>Are you sure?</confirm>
-                    </option_id2>
-                </options>
+                <argument name="massaction_id_field" xsi:type="string">test_id</argument>
+                <argument name="form_field_name" xsi:type="string">test_id</argument>
+                <argument name="use_select_all" xsi:type="string">1</argument>
+                <argument name="options" xsi:type="array">
+                    <item name="option_id1" xsi:type="array">
+                        <item name="label" xsi:type="string" translate="true">Option One</item>
+                        <item name="url" xsi:type="string">*/*/option1</item>
+                        <item name="complete" xsi:type="string">Test</item>
+                    </item>
+                    <item name="option_id2" xsi:type="array">
+                        <item name="label" xsi:type="string" translate="true">Option Two</item>
+                        <item name="url" xsi:type="string">*/*/option2</item>
+                        <item name="confirm" xsi:type="string">Are you sure?</item>
+                    </item>
+                    <item name="option_id3" xsi:type="array">
+                        <item name="label" xsi:type="string" translate="true">Option Three</item>
+                        <item name="url" xsi:type="string">*/*/option3</item>
+                        <item name="visible" xsi:type="object">Magento\Backend\Block\Cache\Grid\Massaction\ProductionModeVisibilityChecker</item>
+                    </item>
+                </argument>
             </arguments>
         </block>
     </block>
diff --git a/dev/tests/integration/testsuite/Magento/Backend/Controller/Adminhtml/Cache/MassActionTest.php b/dev/tests/integration/testsuite/Magento/Backend/Controller/Adminhtml/Cache/MassActionTest.php
index e9fbb76f513d545eb4d710423bfd58a0cbb3d03e..a1034643ae3dcd6064caea87cf13f052db967f0f 100644
--- a/dev/tests/integration/testsuite/Magento/Backend/Controller/Adminhtml/Cache/MassActionTest.php
+++ b/dev/tests/integration/testsuite/Magento/Backend/Controller/Adminhtml/Cache/MassActionTest.php
@@ -3,13 +3,13 @@
  * Copyright © 2016 Magento. All rights reserved.
  * See COPYING.txt for license details.
  */
-
 namespace Magento\Backend\Controller\Adminhtml\Cache;
 
 use Magento\Framework\App\Cache\State;
 use Magento\TestFramework\Helper\Bootstrap;
 use Magento\Framework\Config\File\ConfigFilePool;
 use Magento\Framework\App\Filesystem\DirectoryList;
+use Magento\TestFramework\App\State as AppState;
 
 class MassActionTest extends \Magento\TestFramework\TestCase\AbstractBackendController
 {
@@ -20,6 +20,11 @@ class MassActionTest extends \Magento\TestFramework\TestCase\AbstractBackendCont
      */
     private static $typesConfig;
 
+    /**
+     * @var string
+     */
+    private $mageState;
+
     public static function setUpBeforeClass()
     {
         /** @var \Magento\Framework\App\DeploymentConfig $config */
@@ -27,8 +32,15 @@ class MassActionTest extends \Magento\TestFramework\TestCase\AbstractBackendCont
         self::$typesConfig = $config->get(State::CACHE_KEY);
     }
 
+    protected function setUp()
+    {
+        parent::setUp();
+        $this->mageState = Bootstrap::getObjectManager()->get(AppState::class)->getMode();
+    }
+
     protected function tearDown()
     {
+        Bootstrap::getObjectManager()->get(AppState::class)->setMode($this->mageState);
         /** @var $cacheState \Magento\Framework\App\Cache\StateInterface */
         $cacheState = Bootstrap::getObjectManager()->get(\Magento\Framework\App\Cache\StateInterface::class);
         foreach (self::$typesConfig as $type => $value) {
@@ -42,7 +54,7 @@ class MassActionTest extends \Magento\TestFramework\TestCase\AbstractBackendCont
      * @dataProvider massActionsDataProvider
      * @param array $typesToEnable
      */
-    public function testMassEnableAction($typesToEnable = [])
+    public function testMassEnableActionDeveloperMode($typesToEnable = [])
     {
         $this->setAll(false);
 
@@ -53,16 +65,33 @@ class MassActionTest extends \Magento\TestFramework\TestCase\AbstractBackendCont
             if (in_array($cacheType, $typesToEnable)) {
                 $this->assertEquals(1, $cacheState, "Type '{$cacheType}' has not been enabled");
             } else {
-                $this->assertEquals(0, $cacheState, "Type '{$cacheType}' has not been enabled");
+                $this->assertEquals(0, $cacheState, "Type '{$cacheType}' must remain disabled");
             }
         }
     }
 
+    /**
+     * @dataProvider massActionsDataProvider
+     * @param array $typesToEnable
+     */
+    public function testMassEnableActionProductionMode($typesToEnable = [])
+    {
+        Bootstrap::getObjectManager()->get(AppState::class)->setMode(AppState::MODE_PRODUCTION);
+        $this->setAll(false);
+
+        $this->getRequest()->setParams(['types' => $typesToEnable]);
+        $this->dispatch('backend/admin/cache/massEnable');
+
+        foreach ($this->getCacheStates() as $cacheType => $cacheState) {
+            $this->assertEquals(0, $cacheState, "Type '{$cacheType}' must remain disabled");
+        }
+    }
+
     /**
      * @dataProvider massActionsDataProvider
      * @param array $typesToDisable
      */
-    public function testMassDisableAction($typesToDisable = [])
+    public function testMassDisableActionDeveloperMode($typesToDisable = [])
     {
         $this->setAll(true);
 
@@ -78,6 +107,23 @@ class MassActionTest extends \Magento\TestFramework\TestCase\AbstractBackendCont
         }
     }
 
+    /**
+     * @dataProvider massActionsDataProvider
+     * @param array $typesToDisable
+     */
+    public function testMassDisableActionProductionMode($typesToDisable = [])
+    {
+        Bootstrap::getObjectManager()->get(AppState::class)->setMode(AppState::MODE_PRODUCTION);
+        $this->setAll(true);
+
+        $this->getRequest()->setParams(['types' => $typesToDisable]);
+        $this->dispatch('backend/admin/cache/massDisable');
+
+        foreach ($this->getCacheStates() as $cacheType => $cacheState) {
+            $this->assertEquals(1, $cacheState, "Type '{$cacheType}' must remain enabled");
+        }
+    }
+
     /**
      * Retrieve cache states (enabled/disabled) information
      *
diff --git a/lib/internal/Magento/Framework/Data/CollectionDataSourceInterface.php b/lib/internal/Magento/Framework/Data/CollectionDataSourceInterface.php
index eeff60c1f61c887ef87439b680e8d73fbf6791f2..4bdf29fd1c8fc167af98cc79fd1d20c9696c7b50 100644
--- a/lib/internal/Magento/Framework/Data/CollectionDataSourceInterface.php
+++ b/lib/internal/Magento/Framework/Data/CollectionDataSourceInterface.php
@@ -5,9 +5,11 @@
  */
 namespace Magento\Framework\Data;
 
+use Magento\Framework\View\Element\Block\ArgumentInterface;
+
 /**
  * Interface CollectionDataSourceInterface
  */
-interface CollectionDataSourceInterface
+interface CollectionDataSourceInterface extends ArgumentInterface
 {
 }
diff --git a/lib/internal/Magento/Framework/View/Element/Block/ArgumentInterface.php b/lib/internal/Magento/Framework/View/Element/Block/ArgumentInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..123a75946ba775c0e1565e7689201fde8f8c9f0b
--- /dev/null
+++ b/lib/internal/Magento/Framework/View/Element/Block/ArgumentInterface.php
@@ -0,0 +1,14 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Framework\View\Element\Block;
+
+/**
+ * Block argument interface.
+ * All objects that are injected to block arguments should implement this interface.
+ */
+interface ArgumentInterface
+{
+}
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 a8f2374cc0ce11efd32b7c6e0419db5c3a799086..8de579730b154035d02b38fbdb8d07ef3315d194 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
@@ -34,16 +34,11 @@ class ObjectTest extends \PHPUnit_Framework_TestCase
 
     public function testEvaluate()
     {
-        $input = ['value' => self::EXPECTED_CLASS];
-        $this->_objectManager->expects(
-            $this->once()
-        )->method(
-            'create'
-        )->with(
-            self::EXPECTED_CLASS
-        )->will(
-            $this->returnValue($this)
-        );
+        $input = ['name' => 'dataSource', 'value' => self::EXPECTED_CLASS];
+        $this->_objectManager->expects($this->once())
+            ->method('create')
+            ->with(self::EXPECTED_CLASS)
+            ->willReturn($this);
 
         $actual = $this->_model->evaluate($input);
         $this->assertSame($this, $actual);
@@ -56,17 +51,18 @@ class ObjectTest extends \PHPUnit_Framework_TestCase
     {
         $this->setExpectedException($expectedException, $expectedExceptionMessage);
         $self = $this;
-        $this->_objectManager->expects($this->any())->method('create')->will(
-            $this->returnCallback(
-                function ($className) use ($self) {
-                    return $self->getMock($className);
-                }
-            )
+        $this->_objectManager->expects($this->any())->method('create')->willReturnCallback(
+            function ($className) use ($self) {
+                return $self->getMock($className);
+            }
         );
 
         $this->_model->evaluate($input);
     }
 
+    /**
+     * @return array
+     */
     public function evaluateWrongClassDataProvider()
     {
         return [