diff --git a/modules/ds_extras/ds_extras.admin.inc b/modules/ds_extras/ds_extras.admin.inc
index 354c6d8..26181a9 100644
--- a/modules/ds_extras/ds_extras.admin.inc
+++ b/modules/ds_extras/ds_extras.admin.inc
@@ -119,6 +119,13 @@ function ds_extras_settings($form) {
     '#default_value' => variable_get('ds_extras_switch_field', FALSE),
   );
 
+  $form['additional_settings']['fs4']['ds_extras_revision_view_mode'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Revision view mode'),
+    '#description' => t('Make new view mode "Revision" available which can be used to style the revision of a node.'),
+    '#default_value' => variable_get('ds_extras_revision_view_mode', FALSE),
+  );
+
   if (module_exists('contextual') && module_exists('field_ui')) {
     $form['additional_settings']['fs4']['ds_extras_contextual'] = array(
       '#type' => 'checkbox',
diff --git a/modules/ds_extras/ds_extras.install b/modules/ds_extras/ds_extras.install
index cde157f..cea50e1 100644
--- a/modules/ds_extras/ds_extras.install
+++ b/modules/ds_extras/ds_extras.install
@@ -125,6 +125,7 @@ function ds_extras_uninstall() {
   variable_del('ds_extras_switch_field');
   variable_del('ds_extras_panel_view_modes');
   variable_del('ds_extras_editor_switch');
+  variable_del('ds_extras_revision_view_mode');
   variable_del('ft-default');
   variable_del('ft-kill');
   variable_del('ds_extras_contextual');
diff --git a/modules/ds_extras/ds_extras.module b/modules/ds_extras/ds_extras.module
index a128279..0c417e9 100644
--- a/modules/ds_extras/ds_extras.module
+++ b/modules/ds_extras/ds_extras.module
@@ -22,6 +22,14 @@ function ds_extras_entity_info() {
 }
 
 /**
+ * Implements hook_entity_info_alter().
+ */
+function ds_extras_entity_info_alter(&$entity_info) {
+  module_load_include('inc', 'ds_extras', 'ds_extras.registry');
+  return _ds_extras_entity_info_alter($entity_info);
+}
+
+/**
  * Implements hook_permission().
  */
 function ds_extras_permission() {
diff --git a/modules/ds_extras/ds_extras.pages.inc b/modules/ds_extras/ds_extras.pages.inc
index 835f18d..85eb740 100644
--- a/modules/ds_extras/ds_extras.pages.inc
+++ b/modules/ds_extras/ds_extras.pages.inc
@@ -8,10 +8,7 @@
 /**
  * Menu callback: show an individual node with the Switch field.
  */
-function ds_extras_node_show($node, $message = NULL) {
-  if ($message) {
-    drupal_set_title(t('Revision of %title from %date', array('%title' => $node->title, '%date' => format_date($node->revision_timestamp))), PASS_THROUGH);
-  }
+function ds_extras_node_page_view($node) {
 
   // If there is a menu link to this node, the link becomes the last part
   // of the active trail, and the link name becomes the page title.
@@ -33,6 +30,27 @@ function ds_extras_node_show($node, $message = NULL) {
 }
 
 /**
+ * Menu callback: show an individual revision node using the revision view mode.
+ */
+function ds_extras_revision_node_show($node, $message = NULL) {
+  if ($message) {
+    drupal_set_title(t('Revision of %title from %date', array('%title' => $node->title, '%date' => format_date($node->revision_timestamp))), PASS_THROUGH);
+  }
+
+  // FIXME add tests.
+
+  // Update the history table, stating that this user viewed this node.
+  node_tag_new($node);
+
+  // Determine view mode.
+  $layout = ds_get_layout('node', $node->type, 'revision', FALSE);
+  $view_mode = ($layout) ? 'revision' : 'full';
+
+  // For markup consistency with other pages, use node_view_multiple() rather than node_view().
+  return node_view_multiple(array($node->nid => $node), $view_mode);
+}
+
+/**
  * Menu callback: switches to another view mode inline.
  */
 function ds_switch_view_mode_inline() {
diff --git a/modules/ds_extras/ds_extras.registry.inc b/modules/ds_extras/ds_extras.registry.inc
index b459772..eb3d495 100644
--- a/modules/ds_extras/ds_extras.registry.inc
+++ b/modules/ds_extras/ds_extras.registry.inc
@@ -105,11 +105,18 @@ function _ds_extras_menu_alter(&$items) {
 
   // Switch view mode.
   if (variable_get('ds_extras_switch_view_mode', FALSE)) {
-    $items['node/%node']['page callback'] = 'ds_extras_node_show';
+    $items['node/%node']['page callback'] = 'ds_extras_node_page_view';
     $items['node/%node']['file'] = 'ds_extras.pages.inc';
     $items['node/%node']['file path'] = drupal_get_path('module', 'ds_extras');
   }
 
+  // Revision view mode.
+  if (variable_get('ds_extras_revision_view_mode', FALSE)) {
+    $items['node/%node/revisions/%/view']['page callback'] = 'ds_extras_revision_node_show';
+    $items['node/%node/revisions/%/view']['file'] = 'ds_extras.pages.inc';
+    $items['node/%node/revisions/%/view']['file path'] = drupal_get_path('module', 'ds_extras');
+  }
+
   // Panel view modes.
   if (variable_get('ds_extras_panel_view_modes')) {
 
@@ -189,6 +196,16 @@ function _ds_extras_entity_info() {
   return $return;
 }
 
+/**
+ * Implements hook_entity_info_alter().
+ */
+function _ds_extras_entity_info_alter(&$entity_info) {
+  $revision = array(
+    'label' => 'Revision',
+    'custom settings' => FALSE,
+  );
+  $entity_info['node']['view modes']['revision'] = $revision;
+}
 
 /**
  * Implements hook_theme_registry_alter().
@@ -285,6 +302,14 @@ function _ds_extras_module_implements_alter(&$implementations, $hook) {
     unset($implementations['ds_extras']);
   }
 
+  // Revision view mode.
+  $revision_hooks = array(
+    'entity_info_alter',
+  );
+  if (!variable_get('ds_extras_revision_view_mode', FALSE) && in_array($hook, $revision_hooks)) {
+    unset($implementations['ds_extras']);
+  }
+
   // Fivestar
   $fivestar_hooks = array(
     'form_fivestar_node_type_tag_form_alter',
diff --git a/tests/ds.entities.test b/tests/ds.entities.test
index 33f519b..b35cb3b 100644
--- a/tests/ds.entities.test
+++ b/tests/ds.entities.test
@@ -191,6 +191,44 @@ class dsNodeTests extends dsBaseTest {
     $this->drupalGet('node/' . $node->nid);
     $this->assertNoRaw('<h1 class="title" id="page-title">
           '. $node->title . '        </h1>');
+
+    // Test revisions. Enable the revision view mode
+    $edit = array('additional_settings[modes][view_modes_custom][revision]' => '1');
+    $this->drupalPost('admin/structure/types/manage/article/display', $edit, t('Save'));
+
+    // Select layout and configure fields.
+    $edit = array(
+      'additional_settings[layout]' => 'ds_2col',
+    );
+    $assert = array(
+      'regions' => array(
+        'left' => '<td colspan="8">' . t('Left') . '</td>',
+        'right' => '<td colspan="8">' . t('Right') . '</td>',
+      ),
+    );
+    $this->dsSelectLayout($edit, $assert, 'admin/structure/types/manage/article/display/revision');
+    $edit = array(
+      'fields[body][region]' => 'left',
+      'fields[links][region]' => 'right',
+      'fields[author][region]' => 'right',
+    );
+    $this->dsConfigureUI($edit, 'admin/structure/types/manage/article/display/revision');
+
+    // Create revision of the node.
+    $edit = array(
+      'revision' => TRUE,
+      'log' => 'Test revision',
+    );
+    $this->drupalPost('node/' . $node->nid . '/edit', $edit, t('Save'));
+    $this->assertText('Revisions');
+
+    // Assert revision is using 2 col template.
+    $this->drupalGet('node/' . $node->nid . '/revisions/1/view');
+    $this->assertText('Body:', 'Body label');
+
+    // Assert full view is using stacked template.
+    $this->drupalGet('node/' . $node->nid);
+    $this->assertNoText('Body:', 'Body label');
   }
 
   /**
diff --git a/tests/ds_test.module b/tests/ds_test.module
index b45799e..052eb1b 100644
--- a/tests/ds_test.module
+++ b/tests/ds_test.module
@@ -13,8 +13,12 @@ function ds_test_install() {
   variable_set('ds_extras_switch_view_mode', TRUE);
   variable_set('ds_extras_hide_page_title', TRUE);
   variable_set('ds_extras_field_template', TRUE);
+  variable_set('ds_extras_revision_view_mode', TRUE);
 }
 
+/**
+ * Implements hook_ctools_plugin_directory().
+ */
 function ds_test_ctools_plugin_directory($module, $plugin) {
   // Safety: go away if CTools is not at an appropriate version.
   if (!module_invoke('ctools', 'api_version', PANELS_REQUIRED_CTOOLS_API)) {
@@ -52,6 +56,9 @@ function ds_test_ds_fields_info($entity_type) {
   }
 }
 
+/**
+ * Render the test code field.
+ */
 function dstest_render_test_field($field) {
   return 'Test code field on node ' . $field['entity']->nid;
 }
