diff --git a/app/code/Magento/AdminNotification/Setup/InstallSchema.php b/app/code/Magento/AdminNotification/Setup/InstallSchema.php
index 31b8842ee72e5502ff200716c3761e519c378a45..f8118f245e8ff3cebc4cdf1e2adfc5ee3075a4ba 100644
--- a/app/code/Magento/AdminNotification/Setup/InstallSchema.php
+++ b/app/code/Magento/AdminNotification/Setup/InstallSchema.php
@@ -45,7 +45,7 @@ class InstallSchema implements InstallSchemaInterface
             'date_added',
             \Magento\Framework\DB\Ddl\Table::TYPE_TIMESTAMP,
             null,
-            ['nullable' => false],
+            ['nullable' => false, 'default' => \Magento\Framework\DB\Ddl\Table::TIMESTAMP_INIT],
             'Create date'
         )->addColumn(
             'title',
@@ -112,7 +112,7 @@ class InstallSchema implements InstallSchemaInterface
             'created_at',
             \Magento\Framework\DB\Ddl\Table::TYPE_TIMESTAMP,
             null,
-            ['nullable' => false],
+            ['nullable' => false, 'default' => \Magento\Framework\DB\Ddl\Table::TIMESTAMP_INIT],
             'Create date'
         )->setComment(
             'Admin System Messages'
diff --git a/app/code/Magento/Cron/Setup/InstallSchema.php b/app/code/Magento/Cron/Setup/InstallSchema.php
index cc7b419fa4e66bbbfbb9468768fde123f37f1d03..e3368c677742fe41a016adc40ed7293e3e072dcf 100644
--- a/app/code/Magento/Cron/Setup/InstallSchema.php
+++ b/app/code/Magento/Cron/Setup/InstallSchema.php
@@ -57,7 +57,7 @@ class InstallSchema implements InstallSchemaInterface
             'created_at',
             \Magento\Framework\DB\Ddl\Table::TYPE_TIMESTAMP,
             null,
-            ['nullable' => false],
+            ['nullable' => false, 'default' => \Magento\Framework\DB\Ddl\Table::TIMESTAMP_INIT],
             'Created At'
         )->addColumn(
             'scheduled_at',
diff --git a/app/code/Magento/Customer/Setup/InstallSchema.php b/app/code/Magento/Customer/Setup/InstallSchema.php
index 6f6750f3797043f4f25cfb78b4fd5e83bd0f0b6a..e74309026a57bd6f342c9d09c4276cb64e1857e9 100644
--- a/app/code/Magento/Customer/Setup/InstallSchema.php
+++ b/app/code/Magento/Customer/Setup/InstallSchema.php
@@ -81,13 +81,13 @@ class InstallSchema implements InstallSchemaInterface
             'created_at',
             \Magento\Framework\DB\Ddl\Table::TYPE_TIMESTAMP,
             null,
-            ['nullable' => false],
+            ['nullable' => false, 'default' => \Magento\Framework\DB\Ddl\Table::TIMESTAMP_INIT],
             'Created At'
         )->addColumn(
             'updated_at',
             \Magento\Framework\DB\Ddl\Table::TYPE_TIMESTAMP,
             null,
-            ['nullable' => false],
+            ['nullable' => false, 'default' => \Magento\Framework\DB\Ddl\Table::TIMESTAMP_INIT_UPDATE],
             'Updated At'
         )->addColumn(
             'is_active',
@@ -134,7 +134,7 @@ class InstallSchema implements InstallSchemaInterface
             'Customer Entity'
         );
         $installer->getConnection()->createTable($table);
-        
+
         /**
          * Create table 'customer_address_entity'
          */
@@ -174,13 +174,13 @@ class InstallSchema implements InstallSchemaInterface
             'created_at',
             \Magento\Framework\DB\Ddl\Table::TYPE_TIMESTAMP,
             null,
-            ['nullable' => false],
+            ['nullable' => false, 'default' => \Magento\Framework\DB\Ddl\Table::TIMESTAMP_INIT],
             'Created At'
         )->addColumn(
             'updated_at',
             \Magento\Framework\DB\Ddl\Table::TYPE_TIMESTAMP,
             null,
-            ['nullable' => false],
+            ['nullable' => false, 'default' => \Magento\Framework\DB\Ddl\Table::TIMESTAMP_INIT_UPDATE],
             'Updated At'
         )->addColumn(
             'is_active',
@@ -202,7 +202,7 @@ class InstallSchema implements InstallSchemaInterface
             'Customer Address Entity'
         );
         $installer->getConnection()->createTable($table);
-        
+
         /**
          * Create table 'customer_address_entity_datetime'
          */
@@ -287,7 +287,7 @@ class InstallSchema implements InstallSchemaInterface
             'Customer Address Entity Datetime'
         );
         $installer->getConnection()->createTable($table);
-        
+
         /**
          * Create table 'customer_address_entity_decimal'
          */
@@ -372,7 +372,7 @@ class InstallSchema implements InstallSchemaInterface
             'Customer Address Entity Decimal'
         );
         $installer->getConnection()->createTable($table);
-        
+
         /**
          * Create table 'customer_address_entity_int'
          */
@@ -447,7 +447,7 @@ class InstallSchema implements InstallSchemaInterface
             'Customer Address Entity Int'
         );
         $installer->getConnection()->createTable($table);
-        
+
         /**
          * Create table 'customer_address_entity_text'
          */
@@ -524,7 +524,7 @@ class InstallSchema implements InstallSchemaInterface
             'Customer Address Entity Text'
         );
         $installer->getConnection()->createTable($table);
-        
+
         /**
          * Create table 'customer_address_entity_varchar'
          */
@@ -609,7 +609,7 @@ class InstallSchema implements InstallSchemaInterface
             'Customer Address Entity Varchar'
         );
         $installer->getConnection()->createTable($table);
-        
+
         /**
          * Create table 'customer_entity_datetime'
          */
@@ -684,7 +684,7 @@ class InstallSchema implements InstallSchemaInterface
             'Customer Entity Datetime'
         );
         $installer->getConnection()->createTable($table);
-        
+
         /**
          * Create table 'customer_entity_decimal'
          */
@@ -759,7 +759,7 @@ class InstallSchema implements InstallSchemaInterface
             'Customer Entity Decimal'
         );
         $installer->getConnection()->createTable($table);
-        
+
         /**
          * Create table 'customer_entity_int'
          */
@@ -834,7 +834,7 @@ class InstallSchema implements InstallSchemaInterface
             'Customer Entity Int'
         );
         $installer->getConnection()->createTable($table);
-        
+
         /**
          * Create table 'customer_entity_text'
          */
@@ -906,7 +906,7 @@ class InstallSchema implements InstallSchemaInterface
             'Customer Entity Text'
         );
         $installer->getConnection()->createTable($table);
-        
+
         /**
          * Create table 'customer_entity_varchar'
          */
@@ -981,7 +981,7 @@ class InstallSchema implements InstallSchemaInterface
             'Customer Entity Varchar'
         );
         $installer->getConnection()->createTable($table);
-        
+
         /**
          * Create table 'customer_group'
          */
@@ -1009,7 +1009,7 @@ class InstallSchema implements InstallSchemaInterface
             'Customer Group'
         );
         $installer->getConnection()->createTable($table);
-        
+
         /**
          * Create table 'customer_eav_attribute'
          */
@@ -1073,7 +1073,7 @@ class InstallSchema implements InstallSchemaInterface
             'Customer Eav Attribute'
         );
         $installer->getConnection()->createTable($table);
-        
+
         /**
          * Create table 'customer_form_attribute'
          */
@@ -1104,7 +1104,7 @@ class InstallSchema implements InstallSchemaInterface
             'Customer Form Attribute'
         );
         $installer->getConnection()->createTable($table);
-        
+
         /**
          * Create table 'customer_eav_attribute_website'
          */
@@ -1165,7 +1165,7 @@ class InstallSchema implements InstallSchemaInterface
             'Customer Eav Attribute Website'
         );
         $installer->getConnection()->createTable($table);
-        
+
         /**
          * Create table 'customer_visitor'
          */
@@ -1193,8 +1193,8 @@ class InstallSchema implements InstallSchemaInterface
             'Visitor Table'
         );
         $installer->getConnection()->createTable($table);
-        
+
         $installer->endSetup();
-        
+
     }
 }
diff --git a/app/code/Magento/Downloadable/Setup/InstallSchema.php b/app/code/Magento/Downloadable/Setup/InstallSchema.php
index e7043312e7a49331987f862339b2d8463041f45f..f377662176a55473a8bd1461f7db95c44a440043 100644
--- a/app/code/Magento/Downloadable/Setup/InstallSchema.php
+++ b/app/code/Magento/Downloadable/Setup/InstallSchema.php
@@ -216,14 +216,14 @@ class InstallSchema implements InstallSchemaInterface
                 'created_at',
                 \Magento\Framework\DB\Ddl\Table::TYPE_TIMESTAMP,
                 null,
-                ['nullable' => false],
+                ['nullable' => false, 'default' => \Magento\Framework\DB\Ddl\Table::TIMESTAMP_INIT],
                 'Date of creation'
             )
             ->addColumn(
                 'updated_at',
                 \Magento\Framework\DB\Ddl\Table::TYPE_TIMESTAMP,
                 null,
-                ['nullable' => false],
+                ['nullable' => false, 'default' => \Magento\Framework\DB\Ddl\Table::TIMESTAMP_INIT_UPDATE],
                 'Date of modification'
             )
             ->addColumn(
@@ -390,14 +390,14 @@ class InstallSchema implements InstallSchemaInterface
                 'created_at',
                 \Magento\Framework\DB\Ddl\Table::TYPE_TIMESTAMP,
                 null,
-                ['nullable' => false],
+                ['nullable' => false, 'default' => \Magento\Framework\DB\Ddl\Table::TIMESTAMP_INIT],
                 'Creation Time'
             )
             ->addColumn(
                 'updated_at',
                 \Magento\Framework\DB\Ddl\Table::TYPE_TIMESTAMP,
                 null,
-                ['nullable' => false],
+                ['nullable' => false, 'default' => \Magento\Framework\DB\Ddl\Table::TIMESTAMP_INIT_UPDATE],
                 'Update Time'
             )
             ->addIndex(
diff --git a/app/code/Magento/Eav/Setup/InstallSchema.php b/app/code/Magento/Eav/Setup/InstallSchema.php
index 244cfe2d85e9e56e0e5771ef30b4c3b8888fbc0f..24c041c7e2c05bd1365bfb0166cae0f253d3c0c5 100644
--- a/app/code/Magento/Eav/Setup/InstallSchema.php
+++ b/app/code/Magento/Eav/Setup/InstallSchema.php
@@ -179,13 +179,13 @@ class InstallSchema implements InstallSchemaInterface
             'created_at',
             \Magento\Framework\DB\Ddl\Table::TYPE_TIMESTAMP,
             null,
-            ['nullable' => false],
+            ['nullable' => false, 'default' => \Magento\Framework\DB\Ddl\Table::TIMESTAMP_INIT],
             'Created At'
         )->addColumn(
             'updated_at',
             \Magento\Framework\DB\Ddl\Table::TYPE_TIMESTAMP,
             null,
-            ['nullable' => false],
+            ['nullable' => false, 'default' => \Magento\Framework\DB\Ddl\Table::TIMESTAMP_INIT_UPDATE],
             'Updated At'
         )->addColumn(
             'is_active',
diff --git a/app/code/Magento/Integration/Setup/InstallSchema.php b/app/code/Magento/Integration/Setup/InstallSchema.php
index 7c6bfda56692ba91f7ceb1170b00f28b055c88a4..9588da6905210f53b0c47aaecc05c1f483d30107 100644
--- a/app/code/Magento/Integration/Setup/InstallSchema.php
+++ b/app/code/Magento/Integration/Setup/InstallSchema.php
@@ -316,13 +316,13 @@ class InstallSchema implements InstallSchemaInterface
             'created_at',
             \Magento\Framework\DB\Ddl\Table::TYPE_TIMESTAMP,
             null,
-            ['nullable' => false],
+            ['nullable' => false, 'default' => \Magento\Framework\DB\Ddl\Table::TIMESTAMP_INIT],
             'Creation Time'
         )->addColumn(
             'updated_at',
             \Magento\Framework\DB\Ddl\Table::TYPE_TIMESTAMP,
             null,
-            ['nullable' => false],
+            ['nullable' => false, 'default' => \Magento\Framework\DB\Ddl\Table::TIMESTAMP_UPDATE],
             'Update Time'
         )->addColumn(
             'setup_type',
diff --git a/app/code/Magento/Log/Setup/InstallSchema.php b/app/code/Magento/Log/Setup/InstallSchema.php
index 1cf4f0832bf5032958659da8bc0b55f24b244371..372d41188ca9e537430493c40e5342e5e89fadbf 100644
--- a/app/code/Magento/Log/Setup/InstallSchema.php
+++ b/app/code/Magento/Log/Setup/InstallSchema.php
@@ -95,7 +95,7 @@ class InstallSchema implements InstallSchemaInterface
             'created_at',
             \Magento\Framework\DB\Ddl\Table::TYPE_TIMESTAMP,
             null,
-            ['nullable' => false],
+            ['nullable' => false, 'default' => \Magento\Framework\DB\Ddl\Table::TIMESTAMP_INIT],
             'Creation Time'
         )->addColumn(
             'deleted_at',
@@ -147,7 +147,7 @@ class InstallSchema implements InstallSchemaInterface
             'add_date',
             \Magento\Framework\DB\Ddl\Table::TYPE_TIMESTAMP,
             null,
-            ['nullable' => false],
+            ['nullable' => false, 'default' => \Magento\Framework\DB\Ddl\Table::TIMESTAMP_INIT],
             'Date'
         )->setComment(
             'Log Summary Table'
diff --git a/app/code/Magento/ProductAlert/Setup/InstallSchema.php b/app/code/Magento/ProductAlert/Setup/InstallSchema.php
index 8ccda0176f7682591e0a283f97287450c331ae2d..9926f11ef1196ec4729cdb8c68a56c64ab5be4e5 100644
--- a/app/code/Magento/ProductAlert/Setup/InstallSchema.php
+++ b/app/code/Magento/ProductAlert/Setup/InstallSchema.php
@@ -63,7 +63,7 @@ class InstallSchema implements InstallSchemaInterface
             'add_date',
             \Magento\Framework\DB\Ddl\Table::TYPE_TIMESTAMP,
             null,
-            ['nullable' => false],
+            ['nullable' => false, 'default' => \Magento\Framework\DB\Ddl\Table::TIMESTAMP_INIT],
             'Product alert add date'
         )->addColumn(
             'last_send_date',
@@ -148,7 +148,7 @@ class InstallSchema implements InstallSchemaInterface
             'add_date',
             \Magento\Framework\DB\Ddl\Table::TYPE_TIMESTAMP,
             null,
-            ['nullable' => false],
+            ['nullable' => false, 'default' => \Magento\Framework\DB\Ddl\Table::TIMESTAMP_INIT],
             'Product alert add date'
         )->addColumn(
             'send_date',
diff --git a/app/code/Magento/Reports/Setup/InstallSchema.php b/app/code/Magento/Reports/Setup/InstallSchema.php
index 707597f5a747a2192ff1cb20072745c0a6e21ff4..7e619a704833f703ce6f0c9f97e4a37333e1912e 100644
--- a/app/code/Magento/Reports/Setup/InstallSchema.php
+++ b/app/code/Magento/Reports/Setup/InstallSchema.php
@@ -73,7 +73,7 @@ class InstallSchema implements InstallSchemaInterface
                 'added_at',
                 \Magento\Framework\DB\Ddl\Table::TYPE_TIMESTAMP,
                 null,
-                ['nullable' => false],
+                ['nullable' => false, 'default' => \Magento\Framework\DB\Ddl\Table::TIMESTAMP_INIT],
                 'Added At'
             )
             ->addIndex(
@@ -181,7 +181,7 @@ class InstallSchema implements InstallSchemaInterface
                 'added_at',
                 \Magento\Framework\DB\Ddl\Table::TYPE_TIMESTAMP,
                 null,
-                ['nullable' => false],
+                ['nullable' => false, 'default' => \Magento\Framework\DB\Ddl\Table::TIMESTAMP_INIT],
                 'Added At'
             )
             ->addIndex(
@@ -288,7 +288,7 @@ class InstallSchema implements InstallSchemaInterface
                 'logged_at',
                 \Magento\Framework\DB\Ddl\Table::TYPE_TIMESTAMP,
                 null,
-                ['nullable' => false],
+                ['nullable' => false, 'default' => \Magento\Framework\DB\Ddl\Table::TIMESTAMP_INIT],
                 'Logged At'
             )
             ->addColumn(
@@ -411,7 +411,7 @@ class InstallSchema implements InstallSchemaInterface
                     'added_at',
                     \Magento\Framework\DB\Ddl\Table::TYPE_TIMESTAMP,
                     null,
-                    ['nullable' => false],
+                    ['nullable' => false, 'default' => \Magento\Framework\DB\Ddl\Table::TIMESTAMP_INIT],
                     'Added At'
                 )
                 ->addIndex(
@@ -517,7 +517,7 @@ class InstallSchema implements InstallSchemaInterface
                     'added_at',
                     \Magento\Framework\DB\Ddl\Table::TYPE_TIMESTAMP,
                     null,
-                    ['nullable' => false],
+                    ['nullable' => false, 'default' => \Magento\Framework\DB\Ddl\Table::TIMESTAMP_INIT],
                     'Added At'
                 )
                 ->addIndex(
diff --git a/app/code/Magento/Review/Setup/InstallSchema.php b/app/code/Magento/Review/Setup/InstallSchema.php
index 276b7389bff8fd84a89d735d65747ae079a59320..147688bdf15e3b7dbab52eefab5c1104c547a77a 100644
--- a/app/code/Magento/Review/Setup/InstallSchema.php
+++ b/app/code/Magento/Review/Setup/InstallSchema.php
@@ -84,7 +84,7 @@ class InstallSchema implements InstallSchemaInterface
                 'created_at',
                 \Magento\Framework\DB\Ddl\Table::TYPE_TIMESTAMP,
                 null,
-                ['nullable' => false],
+                ['nullable' => false, 'default' => \Magento\Framework\DB\Ddl\Table::TIMESTAMP_INIT],
                 'Review create date'
             )
             ->addColumn(
diff --git a/app/code/Magento/Sales/Setup/InstallSchema.php b/app/code/Magento/Sales/Setup/InstallSchema.php
index fd517941e38a02bb475a13e56ab6100dd531a911..93192e49bb663de74eaf6f9c87948ed058a649a4 100644
--- a/app/code/Magento/Sales/Setup/InstallSchema.php
+++ b/app/code/Magento/Sales/Setup/InstallSchema.php
@@ -1308,13 +1308,13 @@ class InstallSchema implements InstallSchemaInterface
             'created_at',
             \Magento\Framework\DB\Ddl\Table::TYPE_TIMESTAMP,
             null,
-            ['nullable' => false],
+            ['nullable' => false, 'default' => \Magento\Framework\DB\Ddl\Table::TIMESTAMP_INIT],
             'Created At'
         )->addColumn(
             'updated_at',
             \Magento\Framework\DB\Ddl\Table::TYPE_TIMESTAMP,
             null,
-            ['nullable' => false],
+            ['nullable' => false, 'default' => \Magento\Framework\DB\Ddl\Table::TIMESTAMP_INIT_UPDATE],
             'Updated At'
         )->addColumn(
             'product_id',
diff --git a/app/code/Magento/Search/Setup/InstallSchema.php b/app/code/Magento/Search/Setup/InstallSchema.php
index 3c20f81310ed0b9ecc5c0bd6cbb08c82eafcce28..d58c0da9a8946015c721e96229746d6beae6703a 100644
--- a/app/code/Magento/Search/Setup/InstallSchema.php
+++ b/app/code/Magento/Search/Setup/InstallSchema.php
@@ -104,7 +104,7 @@ class InstallSchema implements InstallSchemaInterface
                 'updated_at',
                 \Magento\Framework\DB\Ddl\Table::TYPE_TIMESTAMP,
                 null,
-                ['nullable' => false],
+                ['nullable' => false, 'default' => \Magento\Framework\DB\Ddl\Table::TIMESTAMP_INIT_UPDATE],
                 'Updated at'
             )
             ->addIndex(
diff --git a/lib/internal/Magento/Framework/DB/Ddl/Table.php b/lib/internal/Magento/Framework/DB/Ddl/Table.php
index eee5ed9bc320a574eec14163bcf05fa4b21fd353..a623ba4c0fb3398a107d72140fe711adfa19b946 100644
--- a/lib/internal/Magento/Framework/DB/Ddl/Table.php
+++ b/lib/internal/Magento/Framework/DB/Ddl/Table.php
@@ -59,7 +59,7 @@ class Table
     const MAX_VARBINARY_SIZE = 2147483648;
 
     /**
-     * Default values for timestampses - fill with current timestamp on inserting record, on changing and both cases
+     * Default values for timestamps - fill with current timestamp on inserting record, on changing and both cases
      */
     const TIMESTAMP_INIT_UPDATE = 'TIMESTAMP_INIT_UPDATE';
 
diff --git a/lib/internal/Magento/Framework/Model/AbstractModel.php b/lib/internal/Magento/Framework/Model/AbstractModel.php
index 43223069055fdaab1fe7decf6754233bf990ab5a..fcd03252a4160d16805909a3bc45492f896f2e85 100644
--- a/lib/internal/Magento/Framework/Model/AbstractModel.php
+++ b/lib/internal/Magento/Framework/Model/AbstractModel.php
@@ -127,6 +127,13 @@ abstract class AbstractModel extends \Magento\Framework\Object
      */
     protected $_actionValidator;
 
+    /**
+     * Array to store object's original data
+     *
+     * @var array
+     */
+    protected $storedData = [];
+
     /**
      * @param \Magento\Framework\Model\Context $context
      * @param \Magento\Framework\Registry $registry
@@ -301,6 +308,7 @@ abstract class AbstractModel extends \Magento\Framework\Object
         $this->_afterLoad();
         $this->setOrigData();
         $this->_hasDataChanges = false;
+        $this->updateStoredData();
         return $this;
     }
 
@@ -354,6 +362,7 @@ abstract class AbstractModel extends \Magento\Framework\Object
     {
         $this->getResource()->afterLoad($this);
         $this->_afterLoad();
+        $this->updateStoredData();
         return $this;
     }
 
@@ -566,6 +575,7 @@ abstract class AbstractModel extends \Magento\Framework\Object
         $this->_eventManager->dispatch('model_save_after', ['object' => $this]);
         $this->_eventManager->dispatch('clean_cache_by_tags', ['object' => $this]);
         $this->_eventManager->dispatch($this->_eventPrefix . '_save_after', $this->_getEventData());
+        $this->updateStoredData();
         return $this;
     }
 
@@ -611,6 +621,7 @@ abstract class AbstractModel extends \Magento\Framework\Object
         $this->_eventManager->dispatch('model_delete_after', ['object' => $this]);
         $this->_eventManager->dispatch('clean_cache_by_tags', ['object' => $this]);
         $this->_eventManager->dispatch($this->_eventPrefix . '_delete_after', $this->_getEventData());
+        $this->storedData = [];
         return $this;
     }
 
@@ -689,4 +700,29 @@ abstract class AbstractModel extends \Magento\Framework\Object
     {
         return $this;
     }
+
+    /**
+     * Synchronize object's stored data with the actual data
+     *
+     * @return $this
+     */
+    private function updateStoredData()
+    {
+        if (isset($this->_data)) {
+            $this->storedData = $this->_data;
+        } else {
+            $this->storedData = [];
+        }
+        return $this;
+    }
+
+    /**
+     * Model StoredData getter
+     *
+     * @return array
+     */
+    public function getStoredData()
+    {
+        return $this->storedData;
+    }
 }
diff --git a/lib/internal/Magento/Framework/Model/Resource/Db/AbstractDb.php b/lib/internal/Magento/Framework/Model/Resource/Db/AbstractDb.php
index 393c90be8e000891cad8ca84d83e6e8cbcf3ccc7..351365b08d9eb57d45b6b65a50c53edbb93d482c 100644
--- a/lib/internal/Magento/Framework/Model/Resource/Db/AbstractDb.php
+++ b/lib/internal/Magento/Framework/Model/Resource/Db/AbstractDb.php
@@ -417,9 +417,10 @@ abstract class AbstractDb extends \Magento\Framework\Model\Resource\AbstractReso
                      * Not auto increment primary key support
                      */
                     if ($this->_isPkAutoIncrement) {
-                        $data = $this->_prepareDataForSave($object);
-                        unset($data[$this->getIdFieldName()]);
-                        $this->_getWriteAdapter()->update($this->getMainTable(), $data, $condition);
+                        $data = $this->prepareDataForUpdate($object);
+                        if (!empty($data)) {
+                            $this->_getWriteAdapter()->update($this->getMainTable(), $data, $condition);
+                        }
                     } else {
                         $select = $this->_getWriteAdapter()->select()->from(
                             $this->getMainTable(),
@@ -428,8 +429,7 @@ abstract class AbstractDb extends \Magento\Framework\Model\Resource\AbstractReso
                             $condition
                         );
                         if ($this->_getWriteAdapter()->fetchOne($select) !== false) {
-                            $data = $this->_prepareDataForSave($object);
-                            unset($data[$this->getIdFieldName()]);
+                            $data = $this->prepareDataForUpdate($object);
                             if (!empty($data)) {
                                 $this->_getWriteAdapter()->update($this->getMainTable(), $data, $condition);
                             }
@@ -770,4 +770,27 @@ abstract class AbstractDb extends \Magento\Framework\Model\Resource\AbstractReso
         }
         return $checksum;
     }
+
+    /**
+     * Get the array of data fields that was changed or added
+     *
+     * @param \Magento\Framework\Model\AbstractModel $object
+     * @return array
+     */
+    protected function prepareDataForUpdate($object)
+    {
+        $data = $object->getData();
+        foreach ($object->getStoredData() as $key => $value) {
+            if (array_key_exists($key, $data) && $data[$key] === $value) {
+                unset($data[$key]);
+            }
+        }
+        $dataObject = clone $object;
+        $dataObject->setData($data);
+        $data = $this->_prepareDataForTable($dataObject, $this->getMainTable());
+        unset($data[$this->getIdFieldName()]);
+        unset($dataObject);
+
+        return $data;
+    }
 }
diff --git a/lib/internal/Magento/Framework/Model/Test/Unit/AbstractModelTest.php b/lib/internal/Magento/Framework/Model/Test/Unit/AbstractModelTest.php
index 49b76a75b8ac30215540f4ebee497986fa232d84..71df4ee8ed9475b92e10972758dc62b3b5926bb3 100644
--- a/lib/internal/Magento/Framework/Model/Test/Unit/AbstractModelTest.php
+++ b/lib/internal/Magento/Framework/Model/Test/Unit/AbstractModelTest.php
@@ -108,4 +108,22 @@ class AbstractModelTest extends \PHPUnit_Framework_TestCase
         $this->resourceMock->expects($this->once())->method('delete')->with($this->model);
         $this->model->delete();
     }
+
+    public function testUpdateStoredData()
+    {
+        $this->model->setData(
+            [
+                'id'   => 1000,
+                'name' => 'Test Name'
+            ]
+        );
+        $this->assertEmpty($this->model->getStoredData());
+        $this->model->afterLoad();
+        $this->assertEquals($this->model->getData(), $this->model->getStoredData());
+        $this->model->setData('value', 'Test Value');
+        $this->model->afterSave();
+        $this->assertEquals($this->model->getData(), $this->model->getStoredData());
+        $this->model->afterDelete();
+        $this->assertEmpty($this->model->getStoredData());
+    }
 }
diff --git a/lib/internal/Magento/Framework/Model/Test/Unit/Resource/Db/AbstractDbTest.php b/lib/internal/Magento/Framework/Model/Test/Unit/Resource/Db/AbstractDbTest.php
index 66e49e079e7f0f340db69bf355c973c1b894e9a9..6745f6d62c7412089519d0bd6569d0ef29624cbd 100644
--- a/lib/internal/Magento/Framework/Model/Test/Unit/Resource/Db/AbstractDbTest.php
+++ b/lib/internal/Magento/Framework/Model/Test/Unit/Resource/Db/AbstractDbTest.php
@@ -61,7 +61,12 @@ class AbstractDbTest extends \PHPUnit_Framework_TestCase
 
         $this->_model = $this->getMockForAbstractClass(
             'Magento\Framework\Model\Resource\Db\AbstractDb',
-            [$contextMock]
+            [$contextMock],
+            '',
+            true,
+            true,
+            true,
+            ['_prepareDataForTable']
         );
     }
 
@@ -422,4 +427,85 @@ class AbstractDbTest extends \PHPUnit_Framework_TestCase
             [null, false]
         ];
     }
+
+    public function testPrepareDataForUpdate()
+    {
+        $adapterInterfaceMock = $this->getMock('\Magento\Framework\DB\Adapter\AdapterInterface', [], [], '', false);
+        $context = (new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this))->getObject(
+                'Magento\Framework\Model\Context'
+        );
+        $registryMock = $this->getMock('\Magento\Framework\Registry', [], [], '', false);
+        $resourceMock = $this->getMock(
+            'Magento\Framework\Model\Resource\Db\AbstractDb',
+            [
+                '_construct',
+                '_getReadAdapter',
+                '_getWriteAdapter',
+                '__wakeup',
+                'getIdFieldName'
+            ],
+            [],
+            '',
+            false
+        );
+        $adapterMock = $this->getMock('Magento\Framework\DB\Adapter\AdapterInterface', [], [], '', false);
+        $resourceMock->expects($this->any())
+            ->method('_getWriteAdapter')
+            ->will($this->returnValue($adapterMock));
+        $resourceCollectionMock = $this->getMock('Magento\Framework\Data\Collection\Db', [], [], '', false);
+        $abstractModelMock = $this->getMockForAbstractClass(
+            'Magento\Framework\Model\AbstractModel',
+            [$context, $registryMock, $resourceMock, $resourceCollectionMock]
+        );
+        $data = 'tableName';
+        $this->_resourcesMock->expects($this->any())
+            ->method('getConnection')
+            ->will($this->returnValue($adapterInterfaceMock)
+        );
+        $this->_resourcesMock->expects($this->any())->method('getTableName')->with($data)->will(
+            $this->returnValue('tableName')
+        );
+        $this->_resourcesMock->expects($this->any())
+            ->method('_getWriteAdapter')
+            ->will($this->returnValue($adapterInterfaceMock));
+        $mainTableReflection = new \ReflectionProperty(
+            'Magento\Framework\Model\Resource\Db\AbstractDb',
+            '_mainTable'
+        );
+        $mainTableReflection->setAccessible(true);
+        $mainTableReflection->setValue($this->_model, 'tableName');
+        $idFieldNameReflection = new \ReflectionProperty(
+            'Magento\Framework\Model\Resource\Db\AbstractDb',
+            '_idFieldName'
+        );
+        $idFieldNameReflection->setAccessible(true);
+        $idFieldNameReflection->setValue($this->_model, 'idFieldName');
+        $adapterInterfaceMock->expects($this->any())->method('save')->with('tableName', 'idFieldName');
+        $adapterInterfaceMock->expects($this->any())->method('quoteInto')->will($this->returnValue('idFieldName'));
+
+        $abstractModelMock->setIdFieldName('id');
+        $abstractModelMock->setData(
+            [
+                'id'    => 12345,
+                'name'  => 'Test Name',
+                'value' => 'Test Value'
+            ]
+        );
+        $abstractModelMock->afterLoad();
+        $this->assertEquals($abstractModelMock->getData(), $abstractModelMock->getStoredData());
+        $newData = ['value' => 'Test Value New'];
+        $this->_model->expects($this->once())->method('_prepareDataForTable')->will($this->returnValue($newData));
+        $abstractModelMock->addData($newData);
+        $this->assertNotEquals($abstractModelMock->getData(), $abstractModelMock->getStoredData());
+        $abstractModelMock->isObjectNew(false);
+        $adapterInterfaceMock->expects($this->once())
+            ->method('update')
+            ->with(
+                'tableName',
+                $newData,
+                'idFieldName'
+            );
+
+        $this->_model->save($abstractModelMock);
+    }
 }