diff --git a/form_builder.js b/form_builder.js
index 01b7a22..32ab259 100644
--- a/form_builder.js
+++ b/form_builder.js
@@ -153,7 +153,7 @@ Drupal.behaviors.formBuilderTabs.attach = function(context) {
  */
 Drupal.behaviors.formBuilderDeleteConfirmation = {};
 Drupal.behaviors.formBuilderDeleteConfirmation.attach = function(context) {
-  var $confirmForm = $('form.confirmation');
+  var $confirmForm = $('form.confirmation', context);
   if ($confirmForm.length) {
     $confirmForm.submit(Drupal.formBuilder.deleteField);
     $confirmForm.find('a').click(Drupal.formBuilder.clickCancel);
@@ -255,7 +255,9 @@ Drupal.formBuilder = {
   // replacing newer updates.
   lastUpdateTime: 0,
   // Status of mouse click.
-  mousePressed: 0
+  mousePressed: 0,
+  // Selector for a custom field configuration form.
+  fieldConfigureForm: false
 };
 
 /**
@@ -320,6 +322,7 @@ Drupal.formBuilder.editField = function() {
     return false;
   }
 
+  // Show loading indicators.
   $link.addClass('progress');
 
   // If clicking on the link a second time, close the form instead of open.
@@ -332,6 +335,10 @@ Drupal.formBuilder.editField = function() {
   }
 
   var getForm = function() {
+    if (Drupal.formBuilder.fieldConfigureForm) {
+      $(Drupal.formBuilder.fieldConfigureForm).html(Drupal.settings.formBuilder.fieldLoading);
+    }
+
     $.ajax({
       url: $link.attr('href'),
       type: 'GET',
@@ -379,7 +386,16 @@ Drupal.formBuilder.displayForm = function(response) {
   }
 
   var $preview = $('#form-builder-element-' + response.elementId);
-  var $form = $(response.html).insertAfter($preview).css('display', 'none');
+  var $form = $(response.html);
+
+  if (Drupal.formBuilder.fieldConfigureForm) {
+    $(Drupal.formBuilder.fieldConfigureForm).html($form);
+    $form.css('display', 'none');
+  }
+  else {
+    $form.insertAfter($preview).css('display', 'none');
+  }
+
   Drupal.attachBehaviors($form.get(0));
 
   $form
@@ -392,9 +408,9 @@ Drupal.formBuilder.displayForm = function(response) {
     .find('fieldset:visible:first').prepend(response.messages);
 
   $form.slideDown(function() {
-    $form.parents('div.form-builder-wrapper:first').find('a.progress').removeClass('progress');
+    $preview.parents('div.form-builder-wrapper:first').find('a.progress').removeClass('progress');
+    $form.find('input:visible:first').focus();
   });
-  //Drupal.unfreezeHeight();
 
   Drupal.formBuilder.updatingElement = false;
 };
@@ -752,12 +768,16 @@ Drupal.formBuilder.unsetActive = function() {
 
 Drupal.formBuilder.closeActive = function(callback) {
   if (Drupal.formBuilder.activeElement) {
-    var $activeForm = $(Drupal.formBuilder.activeElement).find('form');
+    var $activeForm = Drupal.formBuilder.fieldConfigureForm ? $(Drupal.formBuilder.fieldConfigureForm).find('form') : $(Drupal.formBuilder.activeElement).find('form');
 
     if ($activeForm.length) {
       Drupal.freezeHeight();
       $activeForm.slideUp(function(){
         $(this).remove();
+        // Set a message in the custom configure form location if it exists.
+        if (Drupal.formBuilder.fieldConfigureForm) {
+          $(Drupal.formBuilder.fieldConfigureForm).html(Drupal.settings.formBuilder.noFieldSelected);
+        }
         if (callback) {
           callback.call();
         }
diff --git a/form_builder.module b/form_builder.module
index b339fb7..1f9ac34 100644
--- a/form_builder.module
+++ b/form_builder.module
@@ -77,6 +77,14 @@ function form_builder_theme() {
       'variables' => array(),
       'file' => 'includes/form_builder.admin.inc',
     ),
+    'form_builder_no_field_selected' => array(
+      'variables' => array(),
+      'file' => 'includes/form_builder.admin.inc',
+    ),
+    'form_builder_field_loading' => array(
+      'variables' => array(),
+      'file' => 'includes/form_builder.admin.inc',
+    ),
     'form_builder_field_palette' => array(
       'variables' => array('fields' => NULL, 'groups' => NULL, 'form_type' => NULL, 'form_id' => NULL),
       'file' => 'includes/form_builder.admin.inc',
diff --git a/includes/form_builder.admin.inc b/includes/form_builder.admin.inc
index 28ff0dd..6ae7830 100644
--- a/includes/form_builder.admin.inc
+++ b/includes/form_builder.admin.inc
@@ -198,7 +198,14 @@ function form_builder_preview($f, &$form_state, $form, $form_type, $form_id) {
   $form['#attached']['library'][] = array('system', 'form');
   $form['#attached']['js'][] = 'misc/form.js';
   $form['#attached']['js'][] = 'misc/collapse.js';
-  $form['#attached']['js'][] = array('data' => array('formBuilder' => array('emptyFieldset' => theme('form_builder_empty_fieldset'))), 'type' => 'setting');
+
+  $settings = array(
+    'emptyFieldset' => theme('form_builder_empty_fieldset'),
+    'noFieldSelected' => theme('form_builder_no_field_selected'),
+    'fieldLoading' => theme('form_builder_field_loading'),
+  );
+
+  $form['#attached']['js'][] = array('data' => array('formBuilder' => $settings), 'type' => 'setting');
 
   $form['#attached']['css'][] = drupal_get_path('module', 'form_builder') .'/form_builder.css';
   $form['#attached']['css'][] = drupal_get_path('module', 'options_element') .'/options_element.css';
@@ -365,7 +372,35 @@ function theme_form_builder_element_wrapper($variables) {
 function theme_form_builder_empty_fieldset($variables) {
   $output = '';
   $output .= '<div class="form-builder-wrapper form-builder-empty-placeholder">';
-  $output .= '<span>' . t('This fieldset is empty. Drag a form element into it.') .'</span>';
+  $output .= '<span>' . t('This fieldset is empty. Drag a form element into it.') . '</span>';
+  $output .= '</div>';
+  return $output;
+}
+
+/**
+ * Message shown in custom field configure forms when no field is selected.
+ *
+ * Note that this message is not displayed using the default field presentation.
+ * Modules or themes can set a custom field configuration form location by
+ * specifying a Drupal.settings.formBuilder.configureFormSelector value.
+ */
+function theme_form_builder_no_field_selected($variables) {
+  $output = '';
+  $output .= '<div class="field-settings-message">';
+  $output .= t('No field selected');
+  $output .= '</div>';
+  return $output;
+}
+
+/**
+ * Message shown in custom field configure forms when a field is loading.
+ *
+ * @see theme_form_builder_no_field_selected().
+ */
+function theme_form_builder_field_loading($variables) {
+  $output = '';
+  $output .= '<div class="field-settings-message">';
+  $output .= t('Loading...');
   $output .= '</div>';
   return $output;
 }
