diff --git a/ds.field_ui.inc b/ds.field_ui.inc
index de0330d..25f9c8e 100644
--- a/ds.field_ui.inc
+++ b/ds.field_ui.inc
@@ -9,6 +9,7 @@
  * Adds the Display Suite fields and layouts to the form.
  */
 function ds_field_ui_fields_layouts(&$form, &$form_state) {
+  global $base_url, $base_path;
 
   // Get the entity_type, bundle and view mode.
   $entity_type = $form['#entity_type'];
@@ -32,6 +33,28 @@ function ds_field_ui_fields_layouts(&$form, &$form_state) {
   // Add process function to add the regions.
   $form['#process'][] = 'ds_field_ui_regions';
 
+  // Add a destination so we can get back if layout has been changed.
+  $form['ds_source'] = array(
+    '#type' => 'hidden',
+    '#value' => $base_url . $base_path,
+  );
+  $form['ds_destination'] = array(
+    '#type' => 'hidden',
+    '#value' => drupal_get_destination(),
+  );
+  $form['ds_entity_type'] = array(
+    '#type' => 'hidden',
+    '#value' => $entity_type,
+  );
+  $form['ds_bundle'] = array(
+    '#type' => 'hidden',
+    '#value' => $bundle,
+  );
+  $form['ds_view_mode'] = array(
+    '#type' => 'hidden',
+    '#value' => $view_mode,
+  );
+
   // Alter the text of the custom display settings.
   if (isset($form['modes'])) {
     $form['modes']['view_modes_custom']['#description'] = t('<a href="!url">Manage view modes</a>', array('!url' => url('admin/structure/ds/view_modes')));
@@ -206,6 +229,128 @@ function ds_field_ui_layouts_validate($form, &$form_state) {
 }
 
 /**
+ * Get a layout for a given entity.
+ *
+ * @param $entity_type
+ *   The name of the entity.
+ * @param $bundle
+ *   The name of the bundle.
+ * @param $view_mode
+ *   The name of the view mode.
+ */
+function ds_field_ui_layout_change($form, $form_state, $entity_type = '', $bundle = '', $view_mode = '', $new_layout = '') {
+
+  $layout = NULL;
+  if (!empty($entity_type) && !empty($bundle) && !empty($view_mode)) {
+    $layout = ds_get_layout($entity_type, $bundle, $view_mode, FALSE);
+  }
+  $all_layouts = ds_get_layout_info();
+
+  if ($layout && isset($all_layouts[$new_layout])) {
+
+    $new_layout_key = $new_layout;
+    $new_layout = $all_layouts[$new_layout];
+
+    $form['#entity_type'] = $entity_type;
+    $form['#bundle'] = $bundle;
+    $form['#view_mode'] = $view_mode;
+    $form['#layout'] = $layout;
+    $form['#new_layout'] = $new_layout;
+    $form['#new_layout_key'] = $new_layout_key;
+    $form['#export_id'] = $entity_type . '|' . $bundle . '|' . $view_mode;
+
+    $form['info'] = array(
+      '#markup' => t('You are changing from !old to %new layout for !bundle in !view_mode view mode. On this screen, you can move the fields to the new regions.', array('!old' => $layout['label'], '%new' => $new_layout['label'], '!bundle' => $bundle, '!view_mode' => $view_mode)),
+    );
+
+    // New region options.
+    $regions = array();
+    foreach ($new_layout['regions'] as $key => $title) {
+      $regions[$key] = $title;
+    }
+
+    // Create field selects. Use their previous region as default value.
+    foreach ($layout['settings']['fields'] as $field => $region) {
+      $form['ds_' . $field] = array(
+        '#type' => 'select',
+        '#title' => ucfirst(str_replace('_', ' ', $field)),
+        '#options' => $regions,
+        '#default_value' => $region,
+      );
+    }
+
+    $form['actions'] = array('#type' => 'actions');
+    $form['actions']['submit'] = array(
+      '#type' => 'submit',
+      '#value' => t('Save'),
+    );
+    $form['actions']['cancel'] = array(
+      '#type' => 'link',
+      '#title' => t('Cancel'),
+      '#href' => isset($_REQUEST['destination']) ? $_REQUEST['destination'] : '',
+    );
+  }
+  else {
+    $form['nothing'] = array('#markup' => t('No valid configuration found.'));
+  }
+
+  return $form;
+}
+
+/**
+ * Submit callback: save the layout change.
+ */
+function ds_field_ui_layout_change_submit($form, &$form_state) {
+
+  // Prepare some variables.
+  $layout = $form['#layout'];
+  $new_layout = $form['#new_layout'];
+  $new_layout_key = $form['#new_layout_key'];
+  $entity_type = $form['#entity_type'];
+  $bundle = $form['#bundle'];
+  $view_mode = $form['#view_mode'];
+
+  // Create new record.
+  $record = new stdClass();
+  $record->id = $form['#export_id'];
+  $record->entity_type = $entity_type;
+  $record->bundle = $bundle;
+  $record->view_mode = $view_mode;
+  $record->layout = $new_layout_key;
+  $record->settings = $layout['settings'];
+  unset($record->settings['regions']);
+  unset($record->settings['fields']);
+
+  // Set the field configuration.
+  foreach ($layout['settings']['fields'] as $field => $region) {
+
+    $region_value = $form_state['values']['ds_' . $field];
+
+    if (!isset($record->settings['regions'][$region_value])) {
+      $record->settings['regions'][$region_value] = array();
+    }
+    $record->settings['regions'][$region_value][] = $field;
+    $record->settings['fields'][$field] = $region_value;
+  }
+
+  // Remove old record.
+  db_delete('ds_layout_settings')
+    ->condition('entity_type', $entity_type)
+    ->condition('bundle', $bundle)
+    ->condition('view_mode', $view_mode)
+    ->execute();
+
+  // Save new record.
+  drupal_write_record('ds_layout_settings', $record);
+
+  // Clear entity info cache.
+  cache_clear_all('entity_info', 'cache', TRUE);
+
+  // Show message.
+  drupal_set_message(t('The layout change has been saved.'));
+}
+
+/**
  * Save the layout settings from the 'Manage display' screen.
  */
 function ds_field_ui_layouts_save($form, &$form_state) {
diff --git a/ds.install b/ds.install
index 433101d..72d59b5 100644
--- a/ds.install
+++ b/ds.install
@@ -305,3 +305,8 @@ function ds_update_7001() {
     ->condition('name', 'ds')
     ->execute();
 }
+
+/**
+ * Implements hook_update_N().
+ */
+function ds_update_7002() {}
diff --git a/ds.module b/ds.module
index 70356c9..529b8e6 100644
--- a/ds.module
+++ b/ds.module
@@ -207,10 +207,12 @@ function ds_get_layout_info() {
  *   The name of the bundle.
  * @param $view_mode
  *   The name of the view mode.
+ * @param $fallback
+ *   Whether to fallback to default or not.
  * @return $layout
  *   Array of layout variables for the regions.
  */
-function ds_get_layout($entity_type, $bundle, $view_mode) {
+function ds_get_layout($entity_type, $bundle, $view_mode, $fallback = TRUE) {
 
   static $layouts = array();
   $layout_key = $entity_type . '_' . $bundle . '_' . $view_mode;
@@ -229,7 +231,7 @@ function ds_get_layout($entity_type, $bundle, $view_mode) {
 
     // In case $view_mode is not form and not found, check if we have a default layout,
     // but only if the view mode settings aren't overridden for this view mode.
-    if ($view_mode != 'default' && !$overriden && isset($entity_info[$entity_type]['bundles'][$bundle]['layouts']['default'])) {
+    if ($view_mode != 'default' && !$overriden && $fallback && isset($entity_info[$entity_type]['bundles'][$bundle]['layouts']['default'])) {
       $layouts[$layout_key] = $entity_info[$entity_type]['bundles'][$bundle]['layouts']['default'];
     }
 
diff --git a/ds.registry.inc b/ds.registry.inc
index 7889b81..8cbf088 100644
--- a/ds.registry.inc
+++ b/ds.registry.inc
@@ -40,6 +40,17 @@ function _ds_menu() {
     'access arguments' => array('admin_display_suite'),
   );
 
+  // Change layout.
+  $items['admin/structure/ds/change-layout'] = array(
+    'title' => 'Change layout',
+    'description' => 'Act on layout change to move fields elsewhere',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('ds_field_ui_layout_change'),
+    'access arguments' => array('admin_display_suite'),
+    'file' => 'ds.field_ui.inc',
+    'type' => MENU_VISIBLE_IN_BREADCRUMB,
+  );
+
   // Revert layout.
   $items['admin/structure/ds/revert-layout'] = array(
     'title' => 'Revert layout',
diff --git a/js/ds.js b/js/ds.js
index 0b66e8d..1753a51 100644
--- a/js/ds.js
+++ b/js/ds.js
@@ -3,7 +3,29 @@
 
 Drupal.DisplaySuite = Drupal.DisplaySuite || {};
 Drupal.DisplaySuite.fieldopened = '';
-  
+Drupal.DisplaySuite.layout_original = '';
+
+/**
+ * Layout change.
+ */
+Drupal.behaviors.layoutChange = {
+  attach: function (context) {  
+    if ($('#edit-additional-settings-layout').length > 0) {
+      Drupal.DisplaySuite.layout_original = $('#edit-additional-settings-layout').val();
+      $('#edit-additional-settings-layout').change(function() {
+        layout = $('#edit-additional-settings-layout').val();
+        if (layout != '' && Drupal.DisplaySuite.layout_original != '' && Drupal.DisplaySuite.layout_original != layout) {
+          entity_type = $('input[name="ds_entity_type"]').val();
+          bundle = $('input[name="ds_bundle"]').val();
+          view_mode = $('input[name="ds_view_mode"]').val();
+          args = entity_type + '/' + bundle + '/' + view_mode + '/' + layout;
+          window.location = $('input[name="ds_source"]').val() + 'admin/structure/ds/change-layout/' + args + '?destination=' + $('input[name="ds_destination"]').val();
+        }
+      });
+    }
+  }
+};
+
 /**
  * Field template.
  */
diff --git a/tests/ds.base.test b/tests/ds.base.test
index fbbdc81..380bdcd 100644
--- a/tests/ds.base.test
+++ b/tests/ds.base.test
@@ -464,6 +464,31 @@ class dsLayoutsStylesTests extends dsBaseTest {
     $this->drupalGet('node/' . $node->nid);
     $this->assertRaw('<h2>Block region</h2>', 'Block region found');
     $this->assertText('Test code field on node ' . $node->nid, 'Post date in block');
+
+    // Change layout via admin/structure/ds/layout-change.
+    // Verify new regions.
+    $this->drupalGet('admin/structure/types/manage/article/display/full');
+    $this->assertNoRaw('<td colspan="8">' . t('Header') . '</td>', 'Header region not found');
+    $this->assertNoRaw('<td colspan="8">' . t('Footer') . '</td>', 'Footer region not found');
+
+    $edit = array(
+      'ds_title' => 'right',
+      'ds_links' => 'header',
+      'ds_body' => 'footer',
+      'ds_ds_test_field' => 'left',
+    );
+    $this->drupalPost('admin/structure/ds/change-layout/node/article/full/ds_2col_stacked?destination=admin/structure/types/manage/article/display/full', $edit, t('Save'));
+
+    // Verify new regions.
+    $this->assertRaw('<td colspan="8">' . t('Header') . '</td>', 'Header region found');
+    $this->assertRaw('<td colspan="8">' . t('Footer') . '</td>', 'Footer region found');
+
+    // Verify settings.
+    $data = unserialize(db_query("SELECT settings FROM {ds_layout_settings} WHERE entity_type = 'node' AND bundle = 'article' AND view_mode = 'full'")->fetchField());
+    $this->assertTrue(in_array('title', $data['regions']['right']), t('Title is in right'));
+    $this->assertTrue(in_array('links', $data['regions']['header']), t('Links field is in header'));
+    $this->assertTrue(in_array('body', $data['regions']['footer']), t('Body field is in footer'));
+    $this->assertTrue(in_array('ds_test_field', $data['regions']['left']), t('Test field is in left'));
   }
 }
 
