diff --git a/mollom.admin.inc b/mollom.admin.inc
index 303905c..0db3f00 100644
--- a/mollom.admin.inc
+++ b/mollom.admin.inc
@@ -846,10 +846,10 @@ function mollom_admin_settings($form, &$form_state) {
 
   $form['access-keys'] = array(
     '#type' => 'fieldset',
-    '#title' => t('Access keys'),
-    '#description' => t('To use Mollom, you need a public and private key. To obtain Mollom API keys, <a href="@mollom-login-url">register and login on mollom.com</a>, create a subscription for your site, and copy the API keys from your <a href="@mollom-manager-url">site manager</a> into the fields below.', array(
-      '@mollom-login-url' => 'https://mollom.com/user',
-      '@mollom-manager-url' => 'https://mollom.com/site-manager',
+    '#title' => t('Mollom API keys'),
+    '#description' => t('To obtain API keys, <a href="@signup-url">sign up</a> or log in to your <a href="@site-manager-url">Site manager</a>, register this site, and copy the keys into the fields below.', array(
+      '@signup-url' => 'https://mollom.com/pricing',
+      '@site-manager-url' => 'https://mollom.com/site-manager',
     )),
     '#collapsible' => TRUE,
     // Only show key configuration fields if they are not configured or invalid.
@@ -869,21 +869,25 @@ function mollom_admin_settings($form, &$form_state) {
     '#title' => t('Private key'),
     '#default_value' => variable_get('mollom_private_key'),
     '#element_validate' => array('mollom_admin_settings_validate_key'),
-    '#description' => t('Used to prevent someone else from hijacking your requests. Similar to a password, it should never be shared with anyone.'),
+    '#description' => t('Used for authentication. Similar to a password, the private key should not be shared with anyone.'),
   );
 
   $form['mollom_fallback'] = array(
     '#type' => 'radios',
-    '#title' => t('When Mollom is down or unreachable'),
-    // Default to treating everything as inappropriate.
-    '#default_value' => variable_get('mollom_fallback', MOLLOM_FALLBACK_BLOCK),
+    '#title' => t('When the Mollom service is unavailable'),
+    '#default_value' => variable_get('mollom_fallback', MOLLOM_FALLBACK_ACCEPT),
     '#options' => array(
-      MOLLOM_FALLBACK_BLOCK => t('Block all form submissions'),
       MOLLOM_FALLBACK_ACCEPT => t('Accept all form submissions'),
+      MOLLOM_FALLBACK_BLOCK => t('Block all form submissions'),
     ),
-    '#description' => t('In case Mollom services are unreachable, no text analysis can be performed and no CAPTCHAs can be generated. Customers on <a href="@pricing-url">paid plans</a> have access to <a href="@sla-url">Mollom\'s high-availability backend infrastructure</a>, not available to free users, reducing potential downtime.', array(
+    '#description' => t('Service availability can be increased by upgrading to <a href="@pricing-url">paid plans</a>.', array(
+      '@pricing-url' => 'https://mollom.com/pricing',
+    )),
+    '#description' => t('Customers on <a href="@pricing-url">paid plans</a> have access to Mollom\'s high-availability infrastructure, reducing potential downtime.', array(
+      '@pricing-url' => 'https://mollom.com/pricing',
+    )),
+    '#description' => t('Mollom offers a <a href="@pricing-url">high-availability</a> infrastructure for users on paid plans to reduce potential downtime.', array(
       '@pricing-url' => 'https://mollom.com/pricing',
-      '@sla-url' => 'https://mollom.com/standard-service-level-agreement',
     )),
   );
 
@@ -924,31 +928,105 @@ function mollom_admin_settings($form, &$form_state) {
 
   $form['mollom_privacy_link'] = array(
     '#type' => 'checkbox',
-    '#title' => t("Link to Mollom's privacy policy on forms protected by textual analysis"),
+    '#title' => t("Show a link to Mollom's privacy policy"),
     '#return_value' => 1,
     '#default_value' => variable_get('mollom_privacy_link', 1),
-    '#description' => t('Displays a link to the recommended <a href="@privacy-policy-url">privacy policy on mollom.com</a> on all forms that are protected via <a href="@help-url">textual analysis</a>. When disabling this option, you are required to inform visitors about data privacy through other means, as stated in the <a href="@terms-of-service-url">terms of service</a>.', array(
-      '@privacy-policy-url' => 'https://mollom.com/web-service-privacy-policy',
-      '@help-url' => url('admin/help/mollom'),
-      '@terms-of-service-url' => 'https://mollom.com/terms-of-service',
-    )),
+    '#description' => t('Only applies to forms protected with text analysis. When disabling this option, you should inform visitors about the privacy of their data through other means.'),
   );
 
   $form['mollom_testing_mode'] = array(
     '#type' => 'checkbox',
     '#title' => t('Enable testing mode'),
     '#default_value' => variable_get('mollom_testing_mode', 0),
-    '#description' => t('Submitting "ham", "unsure", or "spam" on a protected form will trigger the corresponding behavior. Image CAPTCHAs will only respond to "correct" and audio CAPTCHAs only respond to "demo". This option should be disabled in production environments.'),
+    '#description' => t('Submitting "ham", "unsure", or "spam" triggers the corresponding behavior; image CAPTCHAs only respond to "correct" and audio CAPTCHAs only respond to "demo". Do not enable this option if this site is publicly accessible.'),
   );
 
+  $form['mollom_advanced'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('Advanced configuration'),
+    '#collapsible' => TRUE,
+    '#collapsed' => TRUE,
+  );
   $min_severity = variable_get('mollom_log_minimum_severity', WATCHDOG_WARNING);
-  $form['mollom_log_minimum_severity'] = array(
+  $form['mollom_advanced']['mollom_log_minimum_severity'] = array(
+    '#type' => 'radios',
+    '#title' => t('Mollom logging level warning'),
+    '#options' => array(
+      WATCHDOG_WARNING => t('Only log warnings and errors'),
+      WATCHDOG_DEBUG => t('Log all Mollom messages'),
+    ),
+    '#default_value' => variable_get('mollom_log_minimum_severity', WATCHDOG_WARNING),
+  );
+  $form['mollom_advanced']['mollom_audio_captcha_enabled'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Enable audio CAPTCHAs.'),
+    '#description' => t('Allows users to switch to an audio verification using the <a href="!faq-url">NATO alphabet</a>.  This may not be appropriate for non-English language sites.', array(
+      '!faq-url' => 'https://mollom.com/faq/mollom-audible-captcha-language',
+    )),
+    '#default_value' => variable_get('mollom_audio_captcha_enabled', 1),
+  );
+  $form['mollom_advanced']['mollom_connection_timeout'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Time-out when attempting to contact Mollom servers.'),
+    '#description' => t('This is the length of time that a call to Mollom will wait before timing out.'),
+    '#default_value' => variable_get('mollom_connection_timeout', 3),
+    '#size' => 5,
+    '#field_suffix' => t('seconds'),
+    '#required' => TRUE,
+  );
+  $form['mollom_advanced']['mollom_fba_enabled'] = array(
     '#type' => 'checkbox',
-    '#title' => t('Only log warnings and errors'),
-    '#return_value' => WATCHDOG_WARNING,
-    '#default_value' => $min_severity <= WATCHDOG_WARNING ? WATCHDOG_WARNING : 0,
-    '#description' => t('Disable to see all Mollom interactions in log messages.'),
+    '#title' => t('Enable form behavior analysis.'),
+    '#description' => t('This will place a small tracking image from Mollom on each form protected by textural analysis to help Mollom determine if the form is filled out by a bot.  <a href="!fba-url">Learn more</a>.', array(
+      '!fba-url' => 'https://mollom.com/faq/form-behavior-analysis',
+    )),
+    '#default_value' => variable_get('mollom_fba_enabled', 1),
+  );
+  // Available entity types are those entities that have a report access
+  // callback defined.  This is limited by type even though multiple forms
+  // can be for the same entity type.
+  $forms = mollom_form_list();
+  $options = array();
+  foreach($forms as $info) {
+    if (!empty($info['entity']) && !empty($info['entity report access callback'])) {
+      $options[] = $info['entity'];
+    }
+  };
+  sort($options);
+  $form['mollom_advanced']['mollom_fai_entity_types'] = array(
+    '#type' => 'checkboxes',
+    '#title' => t('Allow users to  "Flag as Inappropriate" for the following:'),
+    '#description' => t('"Flag as inappropriate" will only appear on protected forms for users who have permission to the content type and have the permission to "Report to Mollom".  <a href="!fai-url">Learn more</a>.', array(
+      '!fai-url' => 'https://mollom.com/faq/flag-as-inappropriate',
+    )),
+    '#options' => drupal_map_assoc($options),
+    '#default_value' => variable_get('mollom_fai_entity_types', array()),
   );
+  // Only display dialog options if the user has at least one integrated
+  // module installed and enabled.
+  module_load_include('inc', 'mollom', 'mollom.flag');
+  $implemented = mollom_flag_dialog_info();
+  $available = array_intersect_key($implemented, module_list());
+  $options = array();
+  foreach($available as $module => $info) {
+    $options[$module] = $info['title'];
+  }
+  if (count($options) > 0) {
+    $options['mollom'] = 'Mollom custom dialog';
+    $form['mollom_advanced']['mollom_fai_dialog'] = array(
+      '#type' => 'radios',
+      '#title' => t('Flag as inappropriate dialog type'),
+      '#options' => $options,
+      '#default_value' => variable_get('mollom_fai_dialog', 'mollom'),
+    );
+  }
+  else {
+    // Reset to use the Mollom dialog if no integrated modules are available.
+    $form['mollom_advanced']['mollom_fai_dialog'] = array(
+      '#type' => 'value',
+      '#value' => 'mollom',
+    );
+  }
 
   $form['#submit'][] = 'mollom_admin_settings_prepare_submit';
   $form = system_settings_form($form);
diff --git a/mollom.drupal.inc b/mollom.drupal.inc
index 556cb95..7b61436 100644
--- a/mollom.drupal.inc
+++ b/mollom.drupal.inc
@@ -9,6 +9,17 @@
  * Drupal Mollom client implementation.
  */
 class MollomDrupal extends Mollom {
+
+  /**
+   * Overrides the connection timeout based on module configuration.
+   *
+   * @see Mollom::__construct().
+   */
+  public function __construct() {
+    parent::__construct();
+    $requestTimeout = variable_get('mollom_connection_timeout', 3);
+  }
+
   /**
    * Mapping of configuration names to Drupal variables.
    *
@@ -170,11 +181,6 @@ class MollomDrupalTest extends MollomDrupal {
   public $server = 'dev.mollom.com';
 
   /**
-   * Overrides Mollom:$requestTimeout.
-   */
-  public $requestTimeout = 10.0;
-
-  /**
    * Flag indicating whether to verify and automatically create testing API keys upon class instantiation.
    *
    * @var bool
@@ -323,11 +329,6 @@ class MollomDrupalTest extends MollomDrupal {
 class MollomDrupalTestLocal extends MollomDrupalTest {
 
   /**
-   * Overrides Mollom:$requestTimeout.
-   */
-  public $requestTimeout = 10.0;
-
-  /**
    * Overrides MollomDrupalTest::__construct().
    */
   function __construct() {
@@ -395,11 +396,6 @@ class MollomDrupalTestLocal extends MollomDrupalTest {
 class MollomDrupalTestInvalid extends MollomDrupalTest {
 
   /**
-   * Overrides Mollom:$requestTimeout.
-   */
-  public $requestTimeout = 10.0;
-
-  /**
    * Overrides MollomDrupalTest::$createKeys.
    *
    * Do not attempt to verify API keys against invalid server.
diff --git a/mollom.flag.inc b/mollom.flag.inc
index 033eb20..cdb2730 100644
--- a/mollom.flag.inc
+++ b/mollom.flag.inc
@@ -597,11 +597,16 @@ function mollom_flag_details($type, $entity, $id) {
 }
 
 /**
- * Checks for a loaded module to handle dialogs.  A dialog implementation may
- * provide one or more of the callbacks in order to affect the dialog output.
- * The hooks needed will vary by dialog implementation.  If a callback is not
- * found for a particular step in the process, the default Mollom functionality
- * will be used.  The following callback information can be set:
+ * Defines the integrated dialog modules.
+ *
+ * A dialog implementation may provide one or more of the callbacks in order to
+ * affect the dialog output.  The hooks needed will vary by dialog
+ * implementation.  If a callback is not found for a particular step in the
+ * process, the default Mollom functionality will be used.
+ *
+ * The following information can be set:
+ * - title: (required) the title of the dialog solution that is displayed
+ *   to site administrator within the advanced configuration settings area.
  * - link prepare callback: callback function to prepare links to use the dialog
  *   solution from hook_entity_view.  This callback returns an array of
  *   classes for any links that should be opened in the dialog solution.
@@ -609,17 +614,40 @@ function mollom_flag_details($type, $entity, $id) {
  *   This callback receives the form to display and the title for the dialog.
  * - close callback: callback to close the dialog window
  *
- * This is not set as a hook because there really can be only one dialog system
- * used by Mollom.  It may be best to move into a configuration to allow users
- * to choose from supported systems (or to use Mollom's default look).
+ * The site administrator can select to use one of the following in the
+ * Mollom advanced settings if the module is installed and enabled for their
+ * site.
+ *
+ * @todo: Move this into a hook implementation to allow others to extend.
  */
-function mollom_flag_dialog_check() {
- if (module_exists('ctools')) {
-    return array(
+function mollom_flag_dialog_info() {
+  $modules = array(
+    'ctools' => array(
+      'title' => 'CTools (used by CTools Automodal and Modal Forms)',
       'link prepare callback' => 'mollom_ctools_link_prepare',
       'display form callback' => 'mollom_ctools_display_form',
       'close callback' => 'mollom_ctools_close',
-    );
+    )
+  );
+  return $modules;
+}
+
+/**
+ * Checks to see what dialog option to use based on the user's configuration.
+ *
+ * @return mixed
+ *   Returns an array of dialog information for the selected dialog or FALSE
+ *   if the Mollom custom dialog should be used.
+ *
+ * @see mollom_flag_dialog_info()
+ */
+function mollom_flag_dialog_check() {
+  // Return dialog information for dialog selected in settings if it is
+  // still enabled.
+  $modules = mollom_flag_dialog_info();
+  $configured_dialog = variable_get('mollom_fai_dialog', '');
+  if (isset($modules[$configured_dialog]) && module_exists($configured_dialog)) {
+    return $modules[$configured_dialog];
   }
   return FALSE;
 }
diff --git a/mollom.module b/mollom.module
index 785fb2f..5d318bd 100644
--- a/mollom.module
+++ b/mollom.module
@@ -1679,11 +1679,18 @@ function mollom_theme() {
  *   An array of entity bundles to check.
  */
 function mollom_flag_entity_type_access($type, $bundles = array()) {
-    // First check to see if there are protected forms for this content type.
+  // Check to see if flag as inappropriate is enabled for this entity type.
+  $allowed = variable_get('mollom_fai_entity_types', array('comment' => 1));
+  if (empty($allowed[$type])) {
+    return;
+  }
+
+  // Check to see if there are protected forms for this content type.
   $protected = _mollom_get_entity_forms_protected($type, $bundles);
   if (empty($protected)) {
     return FALSE;
   }
+
   // Make sure that flag as inappropriate is active for this type.
   // If any form for this entity type is reportable, then show data.
   $forms = mollom_form_list();
@@ -3512,9 +3519,6 @@ function mollom_form_node_multiple_delete_confirm_submit($form, &$form_state) {
  *   Optional entity object to check access to a specific entity.
  */
 function node_mollom_entity_report_access($entity = NULL) {
-  // Remove the folloing line to enable flag as inappropriate for nodes.
-  return FALSE;
-
   // All nodes can be reported as long as the user has access to view.
   if (!empty($entity) && isset($entity->nid)) {
     return node_access('view', $entity->nid);
