diff --git a/core/lib/Drupal/Core/Database/Driver/pgsql/Insert.php b/core/lib/Drupal/Core/Database/Driver/pgsql/Insert.php
index fba74da..1b13a77 100644
--- a/core/lib/Drupal/Core/Database/Driver/pgsql/Insert.php
+++ b/core/lib/Drupal/Core/Database/Driver/pgsql/Insert.php
@@ -124,7 +124,7 @@ public function __toString() {
       return $comments . 'INSERT INTO {' . $this->table . '}' . $insert_fields_string . $this->fromQuery;
     }
 
-    $query = $comments . 'INSERT INTO {' . $this->table . '} (' . implode(', ', $insert_fields) . ') VALUES ';
+    $query = $comments . 'INSERT INTO {' . $this->table . '} (' . implode(', ', array_map('Drupal\Core\Database\Driver\pgsql\Insert::escape', $insert_fields)) . ') VALUES ';
 
     $max_placeholder = 0;
     $values = array();
@@ -154,4 +154,12 @@ public function __toString() {
 
     return $query;
   }
+
+  /**
+   * Surrounds a column name with double quotes to support reserved words.
+   */
+  private static function escape($column) {
+    return '"' . $column . '"';
+  }
+
 }
diff --git a/core/modules/system/src/Tests/Database/DatabaseTestBase.php b/core/modules/system/src/Tests/Database/DatabaseTestBase.php
index 524e0e8..5bd5b56 100644
--- a/core/modules/system/src/Tests/Database/DatabaseTestBase.php
+++ b/core/modules/system/src/Tests/Database/DatabaseTestBase.php
@@ -30,6 +30,7 @@ protected function setUp() {
       'test_task',
       'test_null',
       'test_serialized',
+      'test_special_columns',
     ));
     self::addSampleData();
   }
@@ -138,5 +139,12 @@ static function addSampleData() {
         'priority' => 3,
       ))
       ->execute();
+
+    db_insert('test_special_columns')
+      ->fields(array(
+        'id' => 1,
+        'offset' => 'Offset value 1',
+      ))
+      ->execute();
   }
 }
diff --git a/core/modules/system/src/Tests/Database/DeleteTruncateTest.php b/core/modules/system/src/Tests/Database/DeleteTruncateTest.php
index 5c7b977..794d620 100644
--- a/core/modules/system/src/Tests/Database/DeleteTruncateTest.php
+++ b/core/modules/system/src/Tests/Database/DeleteTruncateTest.php
@@ -70,4 +70,20 @@ function testTruncate() {
     $num_records_after = db_query("SELECT COUNT(*) FROM {test}")->fetchField();
     $this->assertEqual(0, $num_records_after, 'Truncate really deletes everything.');
   }
+
+  /**
+   * Confirms that we can delete a single special column name record
+   * successfully.
+   */
+  function testSpecialColumnDelete() {
+    $num_records_before = db_query('SELECT COUNT(*) FROM {test_special_columns}')->fetchField();
+
+    $num_deleted = db_delete('test_special_columns')
+      ->condition('id', 1)
+      ->execute();
+    $this->assertIdentical($num_deleted, 1, 'Deleted 1 special column record.');
+
+    $num_records_after = db_query('SELECT COUNT(*) FROM {test_special_columns}')->fetchField();
+    $this->assertEqual($num_records_before, $num_records_after + $num_deleted, 'Deletion adds up.');
+  }
 }
diff --git a/core/modules/system/src/Tests/Database/InsertTest.php b/core/modules/system/src/Tests/Database/InsertTest.php
index 75b24db..86f69d7 100644
--- a/core/modules/system/src/Tests/Database/InsertTest.php
+++ b/core/modules/system/src/Tests/Database/InsertTest.php
@@ -182,4 +182,17 @@ function testInsertSelectAll() {
     $this->assertIdentical($saved_age, '30', 'Can retrieve after inserting.');
   }
 
+  /**
+   * Tests that we can INSERT INTO a special named column.
+   */
+  function testSpecialColumnInsert() {
+    $id = db_insert('test_special_columns')
+      ->fields(array(
+        'id' => 2,
+        'offset' => 'Offset value 2',
+      ))
+      ->execute();
+    $saved_value = db_query('SELECT "offset" FROM {test_special_columns} WHERE id = :id', array(':id' => 2))->fetchField();
+    $this->assertIdentical($saved_value, 'Offset value 2', 'Can retrieve special column name value after inserting.');
+  }
 }
diff --git a/core/modules/system/src/Tests/Database/UpdateTest.php b/core/modules/system/src/Tests/Database/UpdateTest.php
index d48b706..61550e2 100644
--- a/core/modules/system/src/Tests/Database/UpdateTest.php
+++ b/core/modules/system/src/Tests/Database/UpdateTest.php
@@ -145,4 +145,18 @@ function testPrimaryKeyUpdate() {
     $saved_name= db_query('SELECT name FROM {test} WHERE id = :id', array(':id' => 42))->fetchField();
     $this->assertIdentical($saved_name, 'John', 'Updated primary key successfully.');
   }
+
+  /**
+   * Confirm that we can update values in a column with special name.
+   */
+  function testSpecialColumnUpdate() {
+    $num_updated = db_update('test_special_columns')
+      ->fields(array('offset' => 'New offset value'))
+      ->condition('id', 1)
+      ->execute();
+    $this->assertIdentical($num_updated, 1, 'Updated 1 special column record.');
+
+    $saved_value = db_query('SELECT "offset" FROM {test_special_columns} WHERE id = :id', array(':id' => 1))->fetchField();
+    $this->assertIdentical($saved_value, 'New offset value', 'Updated special column name value successfully.');
+  }
 }
diff --git a/core/modules/system/tests/modules/database_test/database_test.install b/core/modules/system/tests/modules/database_test/database_test.install
index 7c74c1c..4fcdb97 100644
--- a/core/modules/system/tests/modules/database_test/database_test.install
+++ b/core/modules/system/tests/modules/database_test/database_test.install
@@ -274,5 +274,21 @@ function database_test_schema() {
     'primary key' => array('name', 'age'),
   );
 
+  $schema['test_special_columns'] = array(
+    'description' => 'A simple test table with special column names.',
+    'fields' => array(
+      'id' => array(
+        'description' => 'Simple unique ID.',
+        'type' => 'int',
+        'not null' => TRUE,
+      ),
+      'offset' => array(
+        'description' => 'A column with preserved name.',
+        'type' => 'text',
+      ),
+    ),
+    'primary key' => array('id'),
+  );
+
   return $schema;
 }
