diff --git a/clientside_validation.info.yml b/clientside_validation.info.yml
index e095244..e1e3171 100644
--- a/clientside_validation.info.yml
+++ b/clientside_validation.info.yml
@@ -3,6 +3,6 @@ name: Clientside Validation
 description: 'Add client side validation to forms.'
 package: Clientside Validation
 core: 8.x
-
+configure: clientside_validation.settings_form
 test_dependencies:
  - clientside_validation:clientside_validation_demo
diff --git a/clientside_validation.links.menu.yml b/clientside_validation.links.menu.yml
new file mode 100644
index 0000000..0803f80
--- /dev/null
+++ b/clientside_validation.links.menu.yml
@@ -0,0 +1,5 @@
+clientside_validation.settings_form:
+  title: 'Clientside Validation Settings'
+  description: 'Configure clientside validation settings.'
+  route_name: clientside_validation.settings_form
+  parent: system.admin_config_ui
diff --git a/clientside_validation.module b/clientside_validation.module
index f9f46bd..5ab7437 100644
--- a/clientside_validation.module
+++ b/clientside_validation.module
@@ -12,7 +12,21 @@ use Drupal\Core\Render\Element;
  * Implements hook_form_alter().
  */
 function clientside_validation_form_alter(&$form, FormStateInterface &$form_state, $form_id) {
-  $form['#after_build'][] = 'clientside_validation_form_after_build';
+  $form['#cache']['tags'][] = 'config:clientside_validation.settings';
+
+  $enable_all_forms = \Drupal::config('clientside_validation.settings')
+    ->get('enable_all_forms');
+  if ($enable_all_forms) {
+    $form['#after_build'][] = 'clientside_validation_form_after_build';
+  }
+  elseif ($enabled_forms = clientside_validation_get_enabled_forms()) {
+    foreach ($enabled_forms as $enabled_form_id) {
+      // For most forms, do a straight check on the form ID.
+      if ($form_id == $enabled_form_id) {
+        $form['#after_build'][] = 'clientside_validation_form_after_build';
+      }
+    }
+  }
 }
 
 /**
@@ -80,3 +94,88 @@ function clientside_validation_should_validate($element, FormStateInterface &$fo
 
   return TRUE;
 }
+
+/**
+ * Implements hook_webform_third_party_settings_form_alter().
+ */
+function clientside_validation_webform_third_party_settings_form_alter(&$form, FormStateInterface $form_state) {
+  /** @var \Drupal\webform\WebformInterface $webform */
+  $webform = $form_state->getFormObject()->getEntity();
+
+  $clientside_validation = $webform->getThirdPartySetting('clientside_validation', 'clientside_validation');
+
+  $form['third_party_settings']['clientside_validation'] = [
+    '#type' => 'details',
+    '#title' => t('Clientside Validation'),
+    '#open' => TRUE,
+    '#description' => t('Add client side validation to form.'),
+  ];
+  $form['third_party_settings']['clientside_validation']['clientside_validation'] = [
+    '#type' => 'checkbox',
+    '#title' => t('Enable Clientside Validation'),
+    '#default_value' => $clientside_validation,
+    '#return_value' => TRUE,
+  ];
+
+  if (\Drupal::config('clientside_validation.settings')->get('enable_all_forms')) {
+    $form['third_party_settings']['clientside_validation']['clientside_validation']['#default_value'] = 1;
+    $form['third_party_settings']['clientside_validation']['clientside_validation']['#description'] = t('Clientside validation is enabled for all forms.');
+  }
+}
+
+/**
+ * Implements hook_webform_submission_form_alter().
+ */
+function clientside_validation_webform_submission_form_alter(&$form, FormStateInterface $form_state, $form_id) {
+  // Only add Clientside Validation when a webform is initially load.
+  // We can skip adding it after a webform is submitted.
+  if ($form_state->isSubmitted()) {
+    return;
+  }
+
+  /** @var \Drupal\webform\WebformThirdPartySettingsManagerInterface $third_party_settings_manager */
+  $third_party_settings_manager = \Drupal::service('webform.third_party_settings_manager');
+
+  /** @var \Drupal\webform\WebformSubmissionInterface $webform_submission */
+  $webform_submission = $form_state->getFormObject()->getEntity();
+  $webform = $webform_submission->getWebform();
+
+  $clientside_validation = $third_party_settings_manager->getThirdPartySetting('clientside_validation', 'clientside_validation') ?:
+    $webform->getThirdPartySetting('clientside_validation', 'clientside_validation');
+  if ($clientside_validation) {
+    $form['#after_build'][] = 'clientside_validation_form_after_build';
+  }
+}
+
+/**
+ * Build an array of all the enabled forms on the site, by form_id.
+ */
+function clientside_validation_get_enabled_forms() {
+  $forms = &drupal_static(__FUNCTION__);
+
+  // If the data isn't already in memory, get from cache or look it up fresh.
+  if (!isset($forms)) {
+    if ($cache = \Drupal::cache()->get('clientside_validation_enabled_forms')) {
+      $forms = $cache->data;
+    }
+    else {
+      $form_settings = \Drupal::config('clientside_validation.settings')->get('form_settings');
+      if (!empty($form_settings)) {
+        // Add each form that's enabled to the $forms array.
+        foreach ($form_settings as $form_id => $enabled) {
+          if ($enabled) {
+            $forms[] = $form_id;
+          }
+        }
+      }
+      else {
+        $forms = [];
+      }
+
+      // Save the cached data.
+      \Drupal::cache()->set('clientside_validation_enabled_forms', $forms);
+    }
+  }
+
+  return $forms;
+}
diff --git a/clientside_validation.routing.yml b/clientside_validation.routing.yml
new file mode 100644
index 0000000..c4414e5
--- /dev/null
+++ b/clientside_validation.routing.yml
@@ -0,0 +1,7 @@
+clientside_validation.settings_form:
+  path: '/admin/config/user-interface/clientside-validation'
+  defaults:
+    _form: '\Drupal\clientside_validation\Form\ClientsideValidationSettingsForm'
+    _title: 'Clientside Validation Settings'
+  requirements:
+    _permission: 'administer site configuration'
diff --git a/src/Form/ClientsideValidationSettingsForm.php b/src/Form/ClientsideValidationSettingsForm.php
new file mode 100644
index 0000000..762ca36
--- /dev/null
+++ b/src/Form/ClientsideValidationSettingsForm.php
@@ -0,0 +1,257 @@
+<?php
+
+namespace Drupal\clientside_validation\Form;
+
+use Drupal\Core\Cache\CacheBackendInterface;
+use Drupal\Core\Config\ConfigFactoryInterface;
+use Drupal\Core\Extension\ModuleHandlerInterface;
+use Drupal\Core\Entity\EntityTypeManagerInterface;
+use Drupal\Core\Entity\EntityTypeBundleInfoInterface;
+use Drupal\Core\Form\ConfigFormBase;
+use Drupal\Core\Form\FormStateInterface;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+use Drupal\comment\Entity\CommentType;
+
+/**
+ * Class ClientsideValidationjQuerySettingsForm.
+ */
+class ClientsideValidationSettingsForm extends ConfigFormBase {
+
+  /**
+   * The module handler service.
+   *
+   * @var \Drupal\Core\Extension\ModuleHandlerInterface
+   */
+  protected $moduleHandler;
+
+  /**
+   * The entity type manager.
+   *
+   * @var \Drupal\Core\Entity\EntityTypeManagerInterface
+   */
+  protected $entityTypeManager;
+
+  /**
+   * The entity type bundle info service.
+   *
+   * @var \Drupal\Core\Entity\EntityTypeBundleInfoInterface
+   */
+  protected $entityTypeBundleInfo;
+
+  /**
+   * A cache backend interface.
+   *
+   * @var \Drupal\Core\Cache\CacheBackendInterface
+   */
+  protected $cache;
+
+  /**
+   * Constructs a settings controller.
+   *
+   * @param \Drupal\Core\Config\ConfigFactoryInterface $config_factory
+   *   The factory for configuration objects.
+   * @param \Drupal\Core\Extension\ModuleHandlerInterface $module_handler
+   *   The module handler.
+   * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager
+   *   The entity type manager.
+   * @param \Drupal\Core\Entity\EntityTypeBundleInfoInterface $entity_type_bundle_info
+   *   The entity type bundle info service.
+   * @param \Drupal\Core\Cache\CacheBackendInterface $cache_backend
+   *   The cache backend interface.
+   */
+  public function __construct(ConfigFactoryInterface $config_factory, ModuleHandlerInterface $module_handler, EntityTypeManagerInterface $entity_type_manager, EntityTypeBundleInfoInterface $entity_type_bundle_info, CacheBackendInterface $cache_backend) {
+    parent::__construct($config_factory);
+    $this->moduleHandler = $module_handler;
+    $this->entityTypeManager = $entity_type_manager;
+    $this->entityTypeBundleInfo = $entity_type_bundle_info;
+    $this->cache = $cache_backend;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function create(ContainerInterface $container) {
+    return new static(
+      $container->get('config.factory'),
+      $container->get('module_handler'),
+      $container->get('entity_type.manager'),
+      $container->get('entity_type.bundle.info'),
+      $container->get('cache.default')
+    );
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getFormId() {
+    return 'clientside_validation_settings_form';
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getEditableConfigNames() {
+    return ['clientside_validation.settings'];
+  }
+
+  /**
+   * Get a value from the retrieved form settings array.
+   */
+  public function getFormSettingsValue($form_settings, $form_id) {
+    // If there are settings in the array and the form ID already has a setting,
+    // return the saved setting for the form ID.
+    if (!empty($form_settings) && isset($form_settings[$form_id])) {
+      return $form_settings[$form_id];
+    }
+    // Default to false.
+    else {
+      return 0;
+    }
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function buildForm(array $form, FormStateInterface $form_state) {
+    $form = parent::buildForm($form, $form_state);
+
+    // Module configuration.
+    $form['configuration'] = [
+      '#type' => 'fieldset',
+      '#title' => $this->t('Clientside Validation Configuration'),
+      '#collapsible' => TRUE,
+      '#collapsed' => FALSE,
+    ];
+    $form['configuration']['enable_all_forms'] = [
+      '#type' => 'checkbox',
+      '#title' => $this->t('Use Clientside Validation in all forms'),
+      '#description' => $this->t('Enable Clientside Validation for ALL forms on this site.'),
+      '#default_value' => $this->config('clientside_validation.settings')->get('enable_all_forms'),
+    ];
+
+    // Enabled forms.
+    $form_settings = $this->config('clientside_validation.settings')->get('form_settings');
+    $form['form_settings'] = [
+      '#type' => 'fieldset',
+      '#title' => $this->t('Clientside Validation Enabled Forms'),
+      '#description' => $this->t("Check the boxes next to individual forms on which you'd like Clientside validation enabled."),
+      '#collapsible' => TRUE,
+      '#collapsed' => FALSE,
+      '#tree' => TRUE,
+      '#states' => [
+        // Hide this fieldset when all forms are enabled.
+        'invisible' => [
+          'input[name="enable_all_forms"]' => ['checked' => TRUE],
+        ],
+      ],
+    ];
+
+    // Generic forms.
+    $form['form_settings']['general_forms'] = ['#markup' => '<h5>' . $this->t('General Forms') . '</h5>'];
+    // User register form.
+    $form['form_settings']['user_register_form'] = [
+      '#type' => 'checkbox',
+      '#title' => $this->t('User Registration form'),
+      '#default_value' => $this->getFormSettingsValue($form_settings, 'user_register_form'),
+    ];
+    // User password form.
+    $form['form_settings']['user_pass'] = [
+      '#type' => 'checkbox',
+      '#title' => $this->t('User Password Reset form'),
+      '#default_value' => $this->getFormSettingsValue($form_settings, 'user_pass'),
+    ];
+
+    // If contact.module enabled, add contact forms.
+    if ($this->moduleHandler->moduleExists('contact')) {
+      $form['form_settings']['contact_forms'] = ['#markup' => '<h5>' . $this->t('Contact Forms') . '</h5>'];
+
+      $bundles = $this->entityTypeBundleInfo->getBundleInfo('contact_message');
+      $formController = $this->entityTypeManager->getFormObject('contact_message', 'default');
+
+      foreach ($bundles as $bundle_key => $bundle) {
+        $stub = $this->entityTypeManager->getStorage('contact_message')->create([
+          'contact_form' => $bundle_key,
+        ]);
+        $formController->setEntity($stub);
+        $form_id = $formController->getFormId();
+
+        $form['form_settings'][$form_id] = [
+          '#type' => 'checkbox',
+          '#title' => Html::escape($bundle['label']),
+          '#default_value' => $this->getFormSettingsValue($form_settings, $form_id),
+        ];
+      }
+    }
+
+    // Node types for node forms.
+    if ($this->moduleHandler->moduleExists('node')) {
+      $types = $this->entityTypeManager->getStorage('node_type')->loadMultiple();
+      if (!empty($types)) {
+        // Node forms.
+        $form['form_settings']['node_forms'] = ['#markup' => '<h5>' . $this->t('Node Forms') . '</h5>'];
+        foreach ($types as $type) {
+          $id = 'node_' . $type->get('type') . '_form';
+          $form['form_settings'][$id] = [
+            '#type' => 'checkbox',
+            '#title' => $this->t('@name node form', ['@name' => $type->label()]),
+            '#default_value' => $this->getFormSettingsValue($form_settings, $id),
+          ];
+        }
+      }
+    }
+
+    // Comment types for comment forms.
+    if ($this->moduleHandler->moduleExists('comment')) {
+      $types = CommentType::loadMultiple();
+      if (!empty($types)) {
+        $form['form_settings']['comment_forms'] = ['#markup' => '<h5>' . $this->t('Comment Forms') . '</h5>'];
+        foreach ($types as $type) {
+          $id = 'comment_' . $type->id() . '_form';
+          $form['form_settings'][$id] = [
+            '#type' => 'checkbox',
+            '#title' => $this->t('@name comment form', ['@name' => $type->label()]),
+            '#default_value' => $this->getFormSettingsValue($form_settings, $id),
+          ];
+        }
+      }
+    }
+
+    // Store the keys we want to save in configuration when form is submitted.
+    $keys_to_save = array_keys($form['configuration']);
+    foreach ($keys_to_save as $key => $key_to_save) {
+      if (strpos($key_to_save, '#') !== FALSE) {
+        unset($keys_to_save[$key]);
+      }
+    }
+    $form_state->setStorage(['keys' => $keys_to_save]);
+
+    return $form;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function submitForm(array &$form, FormStateInterface $form_state) {
+    $config = $this->config('clientside_validation.settings');
+    $storage = $form_state->getStorage();
+
+    // Save all the configuration items from $form_state.
+    foreach ($form_state->getValues() as $key => $value) {
+      if (in_array($key, $storage['keys'])) {
+        $config->set($key, $value);
+      }
+    }
+
+    // Save the forms from $form_state into a 'form_settings' array.
+    $config->set('form_settings', $form_state->getValue('form_settings'));
+
+    $config->save();
+
+    // Clear the enabled forms cache.
+    $this->cache->delete('clientside_validation_enabled_forms');
+
+    // Tell the user the settings have been saved.
+    drupal_set_message($this->t('The configuration options have been saved.'));
+  }
+
+}
