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..e0b3a25 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');
   }
 
+  // Revisison 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',
