diff --git a/docs/DEVELOPMENT-CHEATSHEET.md b/docs/DEVELOPMENT-CHEATSHEET.md
index c9389c21..38c6342b 100644
--- a/docs/DEVELOPMENT-CHEATSHEET.md
+++ b/docs/DEVELOPMENT-CHEATSHEET.md
@@ -70,6 +70,7 @@ drush en -y webform\
   webform_test\
   webform_test_element\
   webform_test_handler\
+  webform_test_handler_remote_post\
   webform_test_options\
   webform_test_views\
   webform_test_translation\
@@ -91,6 +92,7 @@ drush features-export -y webform_templates
 drush features-export -y webform_testdrush cr
 drush features-export -y webform_test_element
 drush features-export -y webform_test_handler
+drush features-export -y webform_test_handler_remote_post
 drush features-export -y webform_test_options
 drush features-export -y webform_test_views
 drush features-export -y webform_test_translation
@@ -113,6 +115,7 @@ drush webform-tidy -y --dependencies webform_templates
 drush webform-tidy -y --dependencies webform_test
 drush webform-tidy -y --dependencies webform_test_element
 drush webform-tidy -y --dependencies webform_test_handler
+drush webform-tidy -y --dependencies webform_test_handler_remote_post
 drush webform-tidy -y --dependencies webform_test_options
 drush webform-tidy -y --dependencies webform_test_views
 drush webform-tidy -y --dependencies webform_test_translation
@@ -131,6 +134,7 @@ drush features-import -y webform_templates
 drush features-import -y webform_test
 drush features-import -y webform_test_element
 drush features-import -y webform_test_handler
+drush features-import -y webform_test_handler_remote_post
 drush features-import -y webform_test_options
 drush features-import -y webform_test_views
 drush features-import -y webform_test_translation
diff --git a/modules/webform_example_remote_post/config/install/webform.webform.example_remote_post.yml b/modules/webform_example_remote_post/config/install/webform.webform.example_remote_post.yml
new file mode 100644
index 00000000..a9bff729
--- /dev/null
+++ b/modules/webform_example_remote_post/config/install/webform.webform.example_remote_post.yml
@@ -0,0 +1,177 @@
+langcode: en
+status: open
+dependencies:
+  enforced:
+    module:
+      - webform_example_remote_post
+open: null
+close: null
+uid: null
+template: false
+id: example_remote_post
+title: 'Example: Remote post'
+description: 'An example of a webform submission posted to a remote server.'
+category: Example
+elements: |
+  first_name:
+    '#title': 'First name'
+    '#type': textfield
+    '#required': true
+  last_name:
+    '#title': 'Last name'
+    '#type': textfield
+    '#required': true
+  email:
+    '#title': Email
+    '#type': email
+    '#required': true
+  subject:
+    '#title': Subject
+    '#type': textfield
+    '#required': true
+  message:
+    '#title': Message
+    '#type': textarea
+    '#required': true
+css: ''
+javascript: ''
+settings:
+  ajax: false
+  page: true
+  page_submit_path: ''
+  page_confirm_path: ''
+  form_submit_once: false
+  form_exception_message: ''
+  form_open_message: ''
+  form_close_message: ''
+  form_previous_submissions: true
+  form_confidential: false
+  form_confidential_message: ''
+  form_convert_anonymous: false
+  form_prepopulate: false
+  form_prepopulate_source_entity: false
+  form_prepopulate_source_entity_required: false
+  form_prepopulate_source_entity_type: ''
+  form_reset: false
+  form_disable_autocomplete: false
+  form_novalidate: false
+  form_unsaved: false
+  form_disable_back: false
+  form_autofocus: false
+  form_details_toggle: false
+  submission_label: ''
+  submission_log: false
+  submission_user_columns: {  }
+  wizard_progress_bar: true
+  wizard_progress_pages: false
+  wizard_progress_percentage: false
+  wizard_start_label: ''
+  wizard_complete: true
+  wizard_complete_label: ''
+  preview: 0
+  preview_label: ''
+  preview_title: ''
+  preview_message: ''
+  preview_attributes: {  }
+  preview_excluded_elements: {  }
+  preview_exclude_empty: true
+  draft: none
+  draft_multiple: false
+  draft_auto_save: false
+  draft_saved_message: ''
+  draft_loaded_message: ''
+  confirmation_type: page
+  confirmation_title: ''
+  confirmation_message: ''
+  confirmation_url: ''
+  confirmation_attributes: {  }
+  confirmation_back: true
+  confirmation_back_label: ''
+  confirmation_back_attributes: {  }
+  limit_total: null
+  limit_total_message: ''
+  limit_user: null
+  limit_user_message: ''
+  purge: none
+  purge_days: null
+  entity_limit_total: null
+  entity_limit_user: null
+  results_disabled: false
+  results_disabled_ignore: false
+  token_update: false
+access:
+  create:
+    roles:
+      - anonymous
+      - authenticated
+    users: {  }
+    permissions: {  }
+  view_any:
+    roles: {  }
+    users: {  }
+    permissions: {  }
+  update_any:
+    roles: {  }
+    users: {  }
+    permissions: {  }
+  delete_any:
+    roles: {  }
+    users: {  }
+    permissions: {  }
+  purge_any:
+    roles: {  }
+    users: {  }
+    permissions: {  }
+  view_own:
+    roles: {  }
+    users: {  }
+    permissions: {  }
+  update_own:
+    roles: {  }
+    users: {  }
+    permissions: {  }
+  delete_own:
+    roles: {  }
+    users: {  }
+    permissions: {  }
+handlers:
+  remote_post:
+    id: remote_post
+    label: 'Remote post'
+    handler_id: remote_post
+    status: true
+    weight: 1
+    settings:
+      insert_url: 'http://default/webform_example_remote_post/insert'
+      update_url: 'http://default/webform_example_remote_post/update'
+      delete_url: 'http://default/webform_example_remote_post/delete'
+      type: x-www-form-urlencoded
+      excluded_data:
+        serial: serial
+        sid: sid
+        uuid: uuid
+        token: token
+        uri: uri
+        created: created
+        completed: completed
+        changed: changed
+        in_draft: in_draft
+        current_page: current_page
+        remote_addr: remote_addr
+        uid: uid
+        langcode: langcode
+        webform_id: webform_id
+        entity_type: entity_type
+        entity_id: entity_id
+        sticky: sticky
+        notes: notes
+      custom_data: |
+        custom_all: true
+        custom_title: '[webform:title]: Submission #[webform_submission:serial]'
+      insert_custom_data: |
+        custom_insert: true
+      update_custom_data: |
+        custom_update: true
+      delete_custom_data: |
+        custom_delete: true
+      debug: true
diff --git a/tests/modules/webform_test_handler/src/Controller/WebformTestRemotePostController.php b/modules/webform_example_remote_post/src/Controller/WebformExampleRemotePostController.php
similarity index 86%
rename from tests/modules/webform_test_handler/src/Controller/WebformTestRemotePostController.php
rename to modules/webform_example_remote_post/src/Controller/WebformExampleRemotePostController.php
index 288cce7d..7eadac48 100644
--- a/tests/modules/webform_test_handler/src/Controller/WebformTestRemotePostController.php
+++ b/modules/webform_example_remote_post/src/Controller/WebformExampleRemotePostController.php
@@ -1,15 +1,15 @@
 <?php
 
-namespace Drupal\webform_test_handler\Controller;
+namespace Drupal\webform_example_remote_post\Controller;
 
 use Drupal\Core\Controller\ControllerBase;
 use Symfony\Component\HttpFoundation\JsonResponse;
 use Symfony\Component\HttpFoundation\Request;
 
 /**
- * Provides route responses for remote post tests.
+ * Provides route responses for example remote post.
  */
-class WebformTestRemotePostController extends ControllerBase {
+class WebformExampleRemotePostController extends ControllerBase {
 
   /**
    * Returns a webform confirmation page.
diff --git a/modules/webform_example_remote_post/webform_example_remote_post.info.yml b/modules/webform_example_remote_post/webform_example_remote_post.info.yml
new file mode 100644
index 00000000..16b8716e
--- /dev/null
+++ b/modules/webform_example_remote_post/webform_example_remote_post.info.yml
@@ -0,0 +1,7 @@
+name: 'Webform Remote Post Example'
+type: module
+description: 'Provides an example of a webform submission posted to a remote server.'
+package: 'Webform example'
+core: 8.x
+dependencies:
+  - 'drupal:webform'
diff --git a/tests/modules/webform_test_handler/webform_test_handler.install b/modules/webform_example_remote_post/webform_example_remote_post.install
similarity index 62%
rename from tests/modules/webform_test_handler/webform_test_handler.install
rename to modules/webform_example_remote_post/webform_example_remote_post.install
index 741c9d68..e1b34122 100644
--- a/tests/modules/webform_test_handler/webform_test_handler.install
+++ b/modules/webform_example_remote_post/webform_example_remote_post.install
@@ -2,7 +2,7 @@
 
 /**
  * @file
- * Install, update and uninstall functions for the Webform Test module.
+ * Install, update and uninstall functions for the Webform Example Remote Post module.
  */
 
 use Drupal\webform\Entity\Webform;
@@ -11,22 +11,21 @@ use Drupal\Core\Url;
 /**
  * Implements hook_install().
  */
-function webform_test_handler_install() {
-
-  // Update 'Test: Handler: Remote post' URLs.
+function webform_example_remote_post_handler_install() {
+  // Update 'Example: Remote post' URLs.
   /** @var \Drupal\webform\WebformInterface $remote_post_webform */
-  $remote_post_webform = Webform::load('test_handler_remote_post');
+  $remote_post_webform = Webform::load('example_remote_post');
 
   /** @var \Drupal\webform\Plugin\WebformHandler\RemotePostWebformHandler $remote_post_handler */
   $remote_post_handler = $remote_post_webform->getHandler('remote_post');
   $remote_post_configuration = $remote_post_handler->getConfiguration();
 
-  // ISSUE: $base_url and $base_path are not working correctly so we are just
-  // going to use the front page.
+  // ISSUE: $base_url and $base_path are empty via CLI so we are just going to
+  // use the front page.
   $base_url = Url::fromRoute('<front>', [], ['absolute' => TRUE])->toString();
-  $remote_post_configuration['settings']['insert_url'] = $base_url . 'webform_test/remote_post/insert';
-  $remote_post_configuration['settings']['update_url'] = $base_url . 'webform_test/remote_post/update';
-  $remote_post_configuration['settings']['delete_url'] = $base_url . 'webform_test/remote_post/delete';
+  $remote_post_configuration['settings']['insert_url'] = $base_url . 'webform_example_remote_post/insert';
+  $remote_post_configuration['settings']['update_url'] = $base_url . 'webform_example_remote_post/update';
+  $remote_post_configuration['settings']['delete_url'] = $base_url . 'webform_example_remote_post/delete';
   $remote_post_handler->setConfiguration($remote_post_configuration);
 
   $remote_post_webform->save();
diff --git a/modules/webform_example_remote_post/webform_example_remote_post.routing.yml b/modules/webform_example_remote_post/webform_example_remote_post.routing.yml
new file mode 100644
index 00000000..c46a7ab9
--- /dev/null
+++ b/modules/webform_example_remote_post/webform_example_remote_post.routing.yml
@@ -0,0 +1,7 @@
+webform_example_remote_post.remote_post:
+  path: '/webform_example_remote_post/{type}'
+  defaults:
+    _controller: '\Drupal\webform_example_remote_post\Controller\WebformExampleRemotePostController::index'
+  requirements:
+    # Example remote post handler does not require any access controls.
+    _access: 'TRUE'
diff --git a/src/Tests/Handler/WebformHandlerRemotePostTest.php b/src/Tests/Handler/WebformHandlerRemotePostTest.php
index fae10476..e573c82a 100644
--- a/src/Tests/Handler/WebformHandlerRemotePostTest.php
+++ b/src/Tests/Handler/WebformHandlerRemotePostTest.php
@@ -17,7 +17,7 @@ class WebformHandlerRemotePostTest extends WebformTestBase {
    *
    * @var array
    */
-  public static $modules = ['webform', 'webform_test_handler'];
+  public static $modules = ['webform', 'webform_test_handler_remote_post'];
 
   /**
    * Webforms to load.
@@ -81,22 +81,20 @@ class WebformHandlerRemotePostTest extends WebformTestBase {
     $this->assertNoRaw("message: '{message}'");
     $this->assertRaw("sid: '$sid'");
 
-    // @todo Figure out why the below test is failing on Drupal.org.
     // Check remote post 'create' 500 error handling.
-    // $this->postSubmission($webform_handler_remote, ['first_name' => 'FAIL']);
-    // $this->assertPattern('#<label>Response status code</label>\s+500#ms');
+    $this->postSubmission($webform_handler_remote, ['first_name' => 'FAIL']);
+    $this->assertPattern('#<label>Response status code</label>\s+500#ms');
 
-    // @todo Figure out why the below test is failing on Drupal.org.
     // Update the remote post handlers insert url to return a 404 error.
-    // /** @var \Drupal\webform\Plugin\WebformHandler\RemotePostWebformHandler $handler */
-    // $handler = $webform_handler_remote->getHandler('remote_post');
-    // $configuration = $handler->getConfiguration();
-    // $configuration['settings']['insert_url'] .= '/broken';
-    // $handler->setConfiguration($configuration);
-    // $webform_handler_remote->save();
+    /** @var \Drupal\webform\Plugin\WebformHandler\RemotePostWebformHandler $handler */
+    $handler = $webform_handler_remote->getHandler('remote_post');
+    $configuration = $handler->getConfiguration();
+    $configuration['settings']['insert_url'] .= '/broken';
+    $handler->setConfiguration($configuration);
+    $webform_handler_remote->save();
 
-    // $this->postSubmission($webform_handler_remote, ['first_name' => 'FAIL']);
-    // $this->assertPattern('#<label>Response status code</label>\s+404#ms');
+    $this->postSubmission($webform_handler_remote, ['first_name' => 'FAIL']);
+    $this->assertPattern('#<label>Response status code</label>\s+404#ms');
   }
 
 }
diff --git a/tests/modules/webform_test_handler/webform_test_handler.routing.yml b/tests/modules/webform_test_handler/webform_test_handler.routing.yml
deleted file mode 100644
index be704133..00000000
--- a/tests/modules/webform_test_handler/webform_test_handler.routing.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-webform_test_handler.remote_post:
-  path: '/webform_test/remote_post/{type}'
-  defaults:
-    _controller: '\Drupal\webform_test_handler\Controller\WebformTestRemotePostController::index'
-  requirements:
-    # Remote post mock handler does not require any access controls.
-    _access: 'TRUE'
diff --git a/tests/modules/webform_test_handler/config/install/webform.webform.test_handler_remote_post.yml b/tests/modules/webform_test_handler_remote_post/config/install/webform.webform.test_handler_remote_post.yml
similarity index 94%
rename from tests/modules/webform_test_handler/config/install/webform.webform.test_handler_remote_post.yml
rename to tests/modules/webform_test_handler_remote_post/config/install/webform.webform.test_handler_remote_post.yml
index 643a874a..1d7c369b 100644
--- a/tests/modules/webform_test_handler/config/install/webform.webform.test_handler_remote_post.yml
+++ b/tests/modules/webform_test_handler_remote_post/config/install/webform.webform.test_handler_remote_post.yml
@@ -3,7 +3,7 @@ status: open
 dependencies:
   enforced:
     module:
-      - webform_test_handler
+      - webform_test_handler_remote_post
 open: null
 close: null
 uid: null
@@ -147,9 +147,9 @@ handlers:
     status: true
     weight: 1
     settings:
-      insert_url: 'http://default/webform_test/remote_post/insert'
-      update_url: 'http://default/webform_test/remote_post/update'
-      delete_url: 'http://default/webform_test/remote_post/delete'
+      insert_url: 'http://webform_test_handler_remote_post/insert'
+      update_url: 'http://webform_test_handler_remote_post/update'
+      delete_url: 'http://webform_test_handler_remote_post/delete'
       type: x-www-form-urlencoded
       excluded_data:
         serial: serial
diff --git a/tests/modules/webform_test_handler_remote_post/src/WebformTestHandlerRemotePostClient.php b/tests/modules/webform_test_handler_remote_post/src/WebformTestHandlerRemotePostClient.php
new file mode 100644
index 00000000..6c06bccf
--- /dev/null
+++ b/tests/modules/webform_test_handler_remote_post/src/WebformTestHandlerRemotePostClient.php
@@ -0,0 +1,51 @@
+<?php
+
+namespace Drupal\webform_test_handler_remote_post;
+
+use Drupal\Component\Render\FormattableMarkup;
+use Drupal\Component\Serialization\Json;
+use GuzzleHttp\Client;
+use GuzzleHttp\Psr7\Response;
+
+/**
+ * Extend Guzzle client so that we can override remote posts.
+ */
+class WebformTestHandlerRemotePostClient extends Client {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function request($method, $uri = '', array $options = []) {
+    if (strpos($uri, 'http://webform_test_handler_remote_post/') === 0) {
+      $type = str_replace('http://webform_test_handler_remote_post/', '', $uri);
+
+      // Handle 404 errors.
+      if (strpos($uri, '/broken') !== FALSE) {
+        return new Response(404);
+      }
+
+      // Handle 500 errors.
+      if (strpos(print_r($options['form_params'], TRUE), 'FAIL') !== FALSE) {
+        $status = 500;
+        $headers = ['Content-Type' =>['application/json']];
+        $json = [
+          'status' => 'fail',
+          'message' => (string) new FormattableMarkup('Failed to process @type request.', ['@type' => $type]),
+        ];
+        return new Response($status, $headers, Json::encode($json));
+      }
+
+      // Return success.
+      $status = 200;
+      $headers = ['Content-Type' =>['application/json']];
+      $json = [
+        'status' => 'success',
+        'message' => (string) new FormattableMarkup('Processed @type request.', ['@type' => $type]),
+      ];
+      return new Response($status, $headers, Json::encode($json));
+    }
+
+    return parent::request($method, $uri, $options);
+  }
+
+}
diff --git a/tests/modules/webform_test_handler_remote_post/src/WebformTestHandlerRemotePostClientFactory.php b/tests/modules/webform_test_handler_remote_post/src/WebformTestHandlerRemotePostClientFactory.php
new file mode 100644
index 00000000..aa7bf4ff
--- /dev/null
+++ b/tests/modules/webform_test_handler_remote_post/src/WebformTestHandlerRemotePostClientFactory.php
@@ -0,0 +1,37 @@
+<?php
+
+namespace Drupal\webform_test_handler_remote_post;
+
+use Drupal\Component\Utility\NestedArray;
+use Drupal\Core\Http\ClientFactory;
+use Drupal\Core\Site\Settings;
+
+/**
+ * Extend Drupal client so that we can override Guzzel client.
+ *
+ * @see \Drupal\Core\Http\ClientFactory::fromOptions
+ */
+class WebformTestHandlerRemotePostClientFactory extends ClientFactory {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function fromOptions(array $config = []) {
+    $default_config = [
+      'verify' => TRUE,
+      'timeout' => 30,
+      'headers' => [
+        'User-Agent' => 'Drupal/' . \Drupal::VERSION . ' (+https://www.drupal.org/) ' . \GuzzleHttp\default_user_agent(),
+      ],
+      'handler' => $this->stack,
+      'proxy' => [
+        'http' => NULL,
+        'https' => NULL,
+        'no' => [],
+      ]
+    ];
+    $config = NestedArray::mergeDeep($default_config, Settings::get('http_client_config', []), $config);
+    return new WebformTestHandlerRemotePostClient($config);
+  }
+
+}
diff --git a/tests/modules/webform_test_handler_remote_post/src/WebformTestHandlerRemotePostServiceProvider.php b/tests/modules/webform_test_handler_remote_post/src/WebformTestHandlerRemotePostServiceProvider.php
new file mode 100755
index 00000000..d549c660
--- /dev/null
+++ b/tests/modules/webform_test_handler_remote_post/src/WebformTestHandlerRemotePostServiceProvider.php
@@ -0,0 +1,21 @@
+<?php
+
+namespace Drupal\webform_test_handler_remote_post;
+
+use Drupal\Core\DependencyInjection\ContainerBuilder;
+use Drupal\Core\DependencyInjection\ServiceProviderBase;
+
+/**
+ * Overrides the http client factory service.
+ */
+class WebformTestHandlerRemotePostServiceProvider extends ServiceProviderBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function alter(ContainerBuilder $container) {
+    $definition = $container->getDefinition('http_client_factory');
+    $definition->setClass('Drupal\webform_test_handler_remote_post\WebformTestHandlerRemotePostClientFactory');
+  }
+
+}
diff --git a/tests/modules/webform_test_handler_remote_post/webform_test_handler_remote_post.info.yml b/tests/modules/webform_test_handler_remote_post/webform_test_handler_remote_post.info.yml
new file mode 100644
index 00000000..1a36a80b
--- /dev/null
+++ b/tests/modules/webform_test_handler_remote_post/webform_test_handler_remote_post.info.yml
@@ -0,0 +1,7 @@
+name: 'Webform module remote post tests'
+type: module
+description: 'Support module for Webform module remote post testing.'
+package: Testing
+core: 8.x
+dependencies:
+  - 'drupal:webform'
