diff --git a/panopoly_magic.js b/panopoly_magic.js
index 4248145..306dc18 100755
--- a/panopoly_magic.js
+++ b/panopoly_magic.js
@@ -28,4 +28,81 @@
 
 })(jQuery);
 
+(function ($) {
+  Drupal.behaviors.panopolyMagicAutosubmit = {
+    attach: function (context, settings) {
+      // 'this' references the form element
+      function triggerSubmit (e) {
+        var $this = $(this);
+        if (!$this.hasClass('ctools-ajaxing')) {
+          $this.find('.ctools-auto-submit-click').click();
+        }
+      }
+
+      function triggerDisable (e) {
+        var $this = $(this);
+        $this.find(':submit:not(.ctools-auto-submit-click)').val(Drupal.t('Submitting')).addClass('form-disabled').attr('disabled', 'disabled');
+      }
+
+
+      // e.keyCode: key
+      var discardKeyCode = [
+        16, // shift
+        17, // ctrl
+        18, // alt
+        20, // caps lock
+        33, // page up
+        34, // page down
+        35, // end
+        36, // home
+        37, // left arrow
+        38, // up arrow
+        39, // right arrow
+        40, // down arrow
+         9, // tab
+        13, // enter
+        27  // esc
+      ];
+
+      // Disable save button and update label on auto submit. 
+      $(':submit.ctools-auto-submit-click', context).bind('click', function (e) {
+        triggerDisable.call(e.target.form);
+      });
+
+      // Handle title fields.
+      var timer;
+      $('.panopoly-title-autosubmit', context).bind('keyup keydown blur', function (e) {
+        var $element;
+
+        $element = $('.widget-preview .pane-title', context);
+
+        // If the title is alredy present, just update the existing value.
+        if ($element.length || !$.inArray(e.keycode, discardKeyCode)) {
 
+          // If all text was removed, remove the existing title markup from the dom.
+          if (!$(e.target).val().length) {
+            $('.widget-preview .pane-title', context).remove();
+          }
+          // Insert as link title text if the title is a link.
+          else if ($('a', $element).length) {
+            $('a', $element).html($(e.target).val());
+          }
+          // Otherwise just insert the form value as-is.
+          else {
+            $element.html($(e.target).val());
+          }
+        } 
+        // Automatically submit the field on blur. This won't happen if title markup is already present.
+        else if (e.type == 'blur') {
+          clearTimeout(timer);
+          triggerSubmit.call(e.target.form)
+        }
+        // If all else fails, just trigger a timer to submit the form a second after the last activity.
+        else {
+          clearTimeout(timer);
+          timer = setTimeout(function () { triggerSubmit.call(e.target.form); }, 1000)
+        }
+      });
+    }
+  }
+})(jQuery);
\ No newline at end of file
diff --git a/panopoly_magic.module b/panopoly_magic.module
index dad5b99..e2477ad 100755
--- a/panopoly_magic.module
+++ b/panopoly_magic.module
@@ -133,7 +133,7 @@ function panopoly_magic_form_alter(&$form, &$form_state, $form_id) {
 
     // Create the preview fieldset
     if ($form_id == 'fieldable_panels_panes_fieldable_panels_pane_content_type_edit_form' || $content) {
-    
+
       // Create the fieldset with appropriate content
       $form['widget_preview'] = array(
         '#type' => 'fieldset',
@@ -221,6 +221,11 @@ function panopoly_magic_form_fieldable_panels_panes_fieldable_panels_pane_conten
   $view_mode = $form['view_mode'];
   unset($form['view_mode']);
 
+
+  if (variable_get('panopoly_magic_live_preview', 1)) {
+    $form['widget_settings']['title']['#attributes']['class'][] = 'ctools-auto-submit-exclude panopoly-title-autosubmit';
+  }
+
   // Add custom validation function
   if ($form_state['clicked_button']['#value'] != 'Update Preview') {
     $form['widget_settings']['reusable']['admin_title']['#element_validate'][] = 'panopoly_magic_reusable_entity_validate';
