diff --git a/includes/admin.inc b/includes/admin.inc
index f59b855..798ef5d 100644
--- a/includes/admin.inc
+++ b/includes/admin.inc
@@ -286,7 +286,7 @@ function views_ui_preview($view, $display_id, $args = array()) {
  * AJAX callback that returns the preview section of the edit form.
  */
 function views_ui_preview_callback($form, $form_state) {
-  return $form['displays']['preview'];
+  return $form['preview'];
 }
 
 /**
@@ -860,21 +860,6 @@ function views_ui_break_lock_confirm_submit(&$form, &$form_state) {
 }
 
 /**
- * Page callback for the Edit View page.
- */
-function views_ui_edit_page($view, $display_id = NULL) {
-  $display_id = views_ui_edit_page_display($view, $display_id);
-  if (!in_array($display_id, array(MENU_ACCESS_DENIED, MENU_NOT_FOUND))) {
-    $build = drupal_get_form('views_ui_edit_form', $view, $display_id);
-  }
-  else {
-    $build = $display_id;
-  }
-
-  return $build;
-}
-
-/**
  * Helper function to return the used display_id for the edit page
  *
  * This function handles access to the display.
@@ -910,6 +895,23 @@ function views_ui_edit_page_display($view, $display_id) {
 }
 
 /**
+ * Page callback for the Edit View page.
+ */
+function views_ui_edit_page($view, $display_id = NULL) {
+  $display_id = views_ui_edit_page_display($view, $display_id);
+  if (!in_array($display_id, array(MENU_ACCESS_DENIED, MENU_NOT_FOUND))) {
+    $build = array();
+    $build['edit_form'] = drupal_get_form('views_ui_edit_form', $view, $display_id);
+    $build['preview'] = drupal_get_form('views_ui_preview_form', $view, $display_id);
+  }
+  else {
+    $build = $display_id;
+  }
+
+  return $build;
+}
+
+/**
  * Form builder callback for editing a View.
  *
  * @todo Remove as many #prefix/#suffix lines as possible. Use #theme_wrappers
@@ -1074,88 +1076,6 @@ function views_ui_edit_form($form, &$form_state, $view, $display_id = NULL) {
       $form['displays']['settings']['settings_content']['tab_content']['#attributes']['class'][] = 'views-display-deleted';
     }
 
-    // Add preview controls
-    $form['#attached']['js'][] = ctools_attach_js('auto-submit');
-    $form['displays']['settings']['settings_content']['preview_controls'] = array(
-      '#theme_wrappers' => array('container'),
-      '#attributes' => array(
-        'class' => array(
-          'clearfix',
-        ),
-      ),
-      '#id' => 'edit-display-preview-controls',
-    );
-
-    // Add a checkbox controlling whether or not this display auto-previews.
-    $form['displays']['settings']['settings_content']['preview_controls']['live_preview'] = array(
-      '#type' => 'checkbox',
-      '#id' => 'edit-displays-live-preview',
-      '#title' => t('Auto preview'),
-      '#default_value' => variable_get('views_ui_always_live_preview', TRUE),
-    );
-
-    // Add the arguments textfield
-    $form['displays']['settings']['settings_content']['preview_controls']['view_args'] = array(
-      '#type' => 'textfield',
-      '#title' => t('Preview with contextual filters:'),
-      '#description' => t('Separate contextual filter values with a "/". For example, %example.', array('%example' => '40/12/10')),
-      '#id' => 'preview-args',
-//      '#attributes' => array('class' => array('ctools-auto-submit')),
-    );
-
-    // Add the preview button
-    $form['displays']['settings']['settings_content']['preview_controls']['button'] = array(
-      '#type' => 'submit',
-      '#value' => t('Update preview'),
-      '#attributes' => array('class' => array('arguments-preview', 'ctools-auto-submit-click')),
-      '#pre_render' => array('ctools_dependent_pre_render'),
-      '#prefix' => '<div id="preview-submit-wrapper">',
-      '#suffix' => '</div>',
-      '#id' => 'preview-submit',
-      '#submit' => array('views_ui_edit_form_submit_preview'),
-      '#ajax' => array(
-        'path' => 'admin/structure/views/view/' . $view->name . '/edit/' . $display_id . '/ajax',
-        'callback' => 'views_ui_preview_callback',
-        'wrapper' => 'views-live-preview',
-        'event' => 'click',
-        'progress' => array('type' => 'throbber'),
-      ),
-      // Make ENTER in arguments textfield (and other controls) submit the form
-      // as this button, not the Save button.
-      // @todo This only works for JS users. To make this work for nojs users,
-      //   we may need to split Preview into a separate form.
-      '#process' => array_merge(array('views_ui_default_button'), element_info_property('submit', '#process', array())),
-    );
-
-    // Hide the button on the autopreview checkbox, but only based on a setting.
-//    if (!variable_get('views_ui_always_live_preview_button', FALSE)) {
-//      $form['displays']['settings']['settings_content']['preview_controls']['button']['#dependency'] = array(
-//        'edit-displays-live-preview' => array(0),
-//      );
-//    }
-
-    // The live preview.
-    // @todo: Figure out whether $view->preview and $view->editing might be enough already.
-    $view->views_ui_context = TRUE;
-
-    $form['displays']['preview'] = array(
-      '#theme_wrappers' => array('container'),
-      '#id' => 'views-live-preview',
-    );
-
-    $form['displays']['preview']['preview'] = array();
-    if (variable_get('views_ui_always_live_preview', TRUE) || !empty($form_state['show_preview']) || !empty($form_state['values']['displays']['settings']['settings_content']['preview_controls']['live_preview'])) {
-      $preview_args = isset($form_state['values']['displays']['settings']['settings_content']['preview_controls']['view_args']) ? $form_state['values']['displays']['settings']['settings_content']['preview_controls']['view_args'] : '';
-      $preview_args = ($preview_args !== '') ? explode('/', $preview_args) : array();
-      $form['displays']['preview']['preview'] += array(
-        '#type' => 'markup',
-        '#pre_render' => array_merge(array('views_ui_pre_render_preview'), element_info_property('markup', '#pre_render', array())),
-        '#view' => $view,
-        '#display_id' => $display_id,
-        '#preview_args' => $preview_args,
-      );
-    }
-
     // The content of the popup dialog.
     $form['ajax-area'] = array(
       '#theme_wrappers' => array('container'),
@@ -1182,6 +1102,97 @@ function views_ui_edit_form($form, &$form_state, $view, $display_id = NULL) {
 }
 
 /**
+ * Provide the preview formulas and the preview output, too.
+ */
+function views_ui_preview_form($form, &$form_state, $view, $display_id = NULL) {
+  $form_state['no_cache'] = TRUE;
+  $form_state['view'] = clone($view);
+
+  // Add preview controls
+  $form['preview_controls'] = array(
+    '#theme_wrappers' => array('container'),
+    '#attributes' => array(
+      'class' => array(
+        'clearfix',
+      ),
+    ),
+    '#id' => 'edit-display-preview-controls',
+  );
+
+  // Add a checkbox controlling whether or not this display auto-previews.
+  $form['preview_controls']['live_preview'] = array(
+    '#type' => 'checkbox',
+    '#id' => 'edit-displays-live-preview',
+    '#title' => t('Auto preview'),
+    '#default_value' => variable_get('views_ui_always_live_preview', TRUE),
+  );
+
+  // Add the arguments textfield
+  $form['preview_controls']['view_args'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Preview with contextual filters:'),
+    '#description' => t('Separate contextual filter values with a "/". For example, %example.', array('%example' => '40/12/10')),
+    '#id' => 'preview-args',
+//      '#attributes' => array('class' => array('ctools-auto-submit')),
+  );
+
+  // Add the preview button
+  $form['button'] = array(
+    '#type' => 'submit',
+      '#value' => t('Update preview'),
+      '#attributes' => array('class' => array('arguments-preview', 'ctools-auto-submit-click')),
+    '#pre_render' => array('ctools_dependent_pre_render'),
+    '#prefix' => '<div id="preview-submit-wrapper">',
+    '#suffix' => '</div>',
+    '#id' => 'preview-submit',
+    '#submit' => array('views_ui_edit_form_submit_preview'),
+    '#ajax' => array(
+      'path' => 'admin/structure/views/view/' . $view->name . '/preview/' . $display_id . '/ajax',
+      'callback' => 'views_ui_preview_callback',
+      'wrapper' => 'views-live-preview',
+      'event' => 'click',
+      'progress' => array('type' => 'throbber'),
+    ),
+    // Make ENTER in arguments textfield (and other controls) submit the form
+    // as this button, not the Save button.
+    // @todo This only works for JS users. To make this work for nojs users,
+    //   we may need to split Preview into a separate form.
+    '#process' => array_merge(array('views_ui_default_button'), element_info_property('submit', '#process', array())),
+  );
+
+  // Hide the button on the autopreview checkbox, but only based on a setting.
+//    if (!variable_get('views_ui_always_live_preview_button', FALSE)) {
+//      $form['displays']['settings']['settings_content']['preview_controls']['button']['#dependency'] = array(
+//        'edit-displays-live-preview' => array(0),
+//      );
+//    }
+
+  // The live preview.
+  // @todo: Figure out whether $view->preview and $view->editing might be enough already.
+  $view->views_ui_context = TRUE;
+
+  $form['preview'] = array(
+    '#theme_wrappers' => array('container'),
+    '#id' => 'views-live-preview',
+  );
+
+  $form['preview']['preview'] = array();
+  if (variable_get('views_ui_always_live_preview', TRUE) || !empty($form_state['show_preview']) || !empty($form_state['values']['preview_controls']['live_preview'])) {
+    $preview_args = isset($form_state['values']['preview_controls']['view_args']) ? $form_state['values']['preview_controls']['view_args'] : '';
+    $preview_args = ($preview_args !== '') ? explode('/', $preview_args) : array();
+    $form['preview']['preview'] += array(
+      '#type' => 'markup',
+      '#pre_render' => array_merge(array('views_ui_pre_render_preview'), element_info_property('markup', '#pre_render', array())),
+      '#view' => $view,
+      '#display_id' => $display_id,
+      '#preview_args' => $preview_args,
+    );
+  }
+
+  return $form;
+}
+
+/**
  * Render the top of the display so it can be updated during ajax operations.
  */
 function views_ui_render_display_top($view, $display_id) {
@@ -1680,7 +1691,7 @@ function template_preprocess_views_ui_display_tab_setting(&$variables) {
 
   // Put the main link to the left side
   array_unshift($variables['settings_links'], $variables['link']);
-  $variables['settings_links'] = implode('<span class="views-ajax-link">&nbsp;|&nbsp;</span>', $variables['settings_links']);
+  $variables['settings_links'] = implode('<span>&nbsp;|&nbsp;</span>', $variables['settings_links']);
 
   // Add classes associated with this display tab to the overall list.
   $variables['classes_array'] = array_merge($variables['classes_array'], $variables['class']);
diff --git a/js/ajax.js b/js/ajax.js
index f4c56db..b654381 100644
--- a/js/ajax.js
+++ b/js/ajax.js
@@ -145,7 +145,7 @@
         'progress': { 'type': 'throbber' }
       };
       // Bind AJAX behaviors to all items showing the class.
-      $('.views-ajax-link', context).once('views-ajax-processed').each(function () {
+      $('a.views-ajax-link', context).once('views-ajax-processed').each(function () {
         var element_settings = base_element_settings;
         // Set the URL to go to the anchor.
         if ($(this).attr('href')) {
diff --git a/views_ui.module b/views_ui.module
index 90a97a7..a193657 100644
--- a/views_ui.module
+++ b/views_ui.module
@@ -89,6 +89,13 @@ function views_ui_menu() {
     'theme callback' => 'ajax_base_page_theme',
     'type' => MENU_CALLBACK,
   ) + $base;
+  $items['admin/structure/views/view/%views_ui_cache/preview/%/ajax'] = array(
+    'page callback' => 'views_ui_ajax_get_form',
+    'page arguments' => array('views_ui_preview_form', 4, 6),
+    'delivery callback' => 'ajax_deliver',
+    'theme callback' => 'ajax_base_page_theme',
+    'type' => MENU_CALLBACK,
+  ) + $base;
 
   // Additional pages for acting on a View.
   $items['admin/structure/views/view/%views_ui_cache/analyze'] = array(
