diff --git a/form_builder.js b/form_builder.js
index 1557fe0..fdc3523 100644
--- a/form_builder.js
+++ b/form_builder.js
@@ -56,7 +56,7 @@ Drupal.behaviors.formBuilderElement.attach = function(context) {
 Drupal.behaviors.formBuilderFields = {};
 Drupal.behaviors.formBuilderFields.attach = function(context) {
   // Bind a function to all elements to update the preview on change.
-  var $configureForm = $('#form-builder-field-configure');
+  var $configureForm = $('.form-builder-field-configure', context);
 
   $configureForm.find('input, textarea, select')
     .not('.form-builder-field-change')
@@ -147,7 +147,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);
@@ -249,7 +249,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,
 };
 
 /**
@@ -314,6 +316,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.
@@ -326,6 +329,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',
@@ -373,7 +380,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
@@ -386,9 +402,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;
 };
@@ -443,7 +459,7 @@ Drupal.formBuilder.elementPendingChange = function(e) {
  * After submitting the change to the server, display the updated element.
  */
 Drupal.formBuilder.updateElement = function(response) {
-  var $configureForm = $('#form-builder-field-configure');
+  var $configureForm = $('.form-builder-field-configure');
 
   // Do not let older requests replace newer updates.
   if (response.time < Drupal.formBuilder.lastUpdateTime) {
@@ -746,12 +762,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 195667b..a2956aa 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 4665348..1785608 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';
@@ -371,6 +378,34 @@ function theme_form_builder_empty_fieldset($variables) {
 }
 
 /**
+ * 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;
+}
+
+/**
  * Block for adding new fields.
  *
  * @param $vars['fields']
