diff --git a/src/Plugin/WebformHandler/SalesforceWebToLeadPostWebformHandler.php b/src/Plugin/WebformHandler/SalesforceWebToLeadPostWebformHandler.php
index ede0b99..858634a 100644
--- a/src/Plugin/WebformHandler/SalesforceWebToLeadPostWebformHandler.php
+++ b/src/Plugin/WebformHandler/SalesforceWebToLeadPostWebformHandler.php
@@ -3,22 +3,19 @@
 namespace Drupal\sfweb2lead_webform\Plugin\WebformHandler;
 
 use Drupal\Core\Form\FormStateInterface;
-use Drupal\Core\Serialization\Yaml;
-use Drupal\webform\Element\WebformOtherBase;
 use Drupal\webform\Plugin\WebformHandler\RemotePostWebformHandler;
 use Drupal\webform\WebformSubmissionInterface;
-use GuzzleHttp\Exception\RequestException;
 
 /**
- * Webform submission remote post handler.
+ * Salesforce Web-to-Lead Post Webform Handler.
  *
  * @WebformHandler(
  *   id = "sfweb2lead_post",
  *   label = @Translation("Salesforce Web-to-Lead post"),
  *   category = @Translation("External"),
  *   description = @Translation("Posts webform submissions to a Salesforce.com URL."),
- *   cardinality = \Drupal\webform\WebformHandlerInterface::CARDINALITY_UNLIMITED,
- *   results = \Drupal\webform\WebformHandlerInterface::RESULTS_PROCESSED,
+ *   cardinality = \Drupal\webform\Plugin\WebformHandlerInterface::CARDINALITY_UNLIMITED,
+ *   results = \Drupal\webform\Plugin\WebformHandlerInterface::RESULTS_PROCESSED,
  * )
  */
 class SalesforceWebToLeadPostWebformHandler extends RemotePostWebformHandler {
@@ -134,114 +131,47 @@ class SalesforceWebToLeadPostWebformHandler extends RemotePostWebformHandler {
   }
 
   /**
-   * Execute a remote post.
-   *
-   * @param string $operation
-   *   The type of webform submission operation to be posted. Can be 'insert',
-   *   'update', or 'delete'.
-   * @param \Drupal\webform\WebformSubmissionInterface $webform_submission
-   *   The webform submission to be posted.
+   * {@inheritdoc}
    */
-  protected function remotePost($operation, WebformSubmissionInterface $webform_submission) {
-
-    if ($operation != 'insert') {
-      // Not an insert, don't bother.
-      return;
-    }
-
-    $request_url = $this->configuration['salesforce_url'];
-    if (empty($request_url)) {
-      return;
-    }
-
-    $request_type = 'x-www-form-urlencoded';
-    $request_post_data = $this->getPostData($operation, $webform_submission);
-
-    try {
-      $response = $this->httpClient->post($request_url, ['form_params' => $request_post_data]);
-    }
-    catch (RequestException $request_exception) {
-      $message = $request_exception->getMessage();
-      $response = $request_exception->getResponse();
-
-      // Encode HTML entities to prevent broken markup from breaking the page.
-      $message = nl2br(htmlentities($message));
-
-      // If debugging is enabled, display the error message on screen.
-      $this->debug($message, $operation, $request_url, $request_type, $request_post_data, $response, 'error');
-
-      // Log error message.
-      $context = [
-        '@form' => $this->getWebform()->label(),
-        '@operation' => $operation,
-        '@type' => $request_type,
-        '@url' => $request_url,
-        '@message' => $message,
-        'link' => $this->getWebform()
-          ->toLink(t('Edit'), 'handlers-form')
-          ->toString(),
-      ];
-      $this->logger->error('@form webform remote @type post (@operation) to @url failed. @message', $context);
-      return;
-    }
-
-    // If debugging is enabled, display the request and response.
-    $this->debug(t('Remote post successful!'), $operation, $request_url, $request_type, $request_post_data, $response, 'warning');
+  protected function remotePost($state, WebformSubmissionInterface $webform_submission) {
+    $this->setStateUrl($state);
+    return parent::remotePost($state, $webform_submission);
   }
 
   /**
-   * Get a webform submission's post data.
-   *
-   * @param string $operation
-   *   The type of webform submission operation to be posted. Can be 'insert',
-   *   'update', or 'delete'.
-   * @param \Drupal\webform\WebformSubmissionInterface $webform_submission
-   *   The webform submission to be posted.
-   *
-   * @return array
-   *   A webform submission converted to an associative array.
+   * {@inheritdoc}
    */
-  protected function getPostData($operation, WebformSubmissionInterface $webform_submission) {
+  protected function getRequestData($state, WebformSubmissionInterface $webform_submission) {
+    $data = parent::getRequestData($state, $webform_submission);
     $salesforce_data = [
       'oid' => $this->configuration['salesforce_oid'],
     ];
-    $data = $webform_submission->toArray(TRUE);
-    $data = $data['data'] + $data;
-    unset($data['data']);
-    // Get data from parent.
-    // Well the idea is that only mapped data and custom data are passed to salesforce.
-    // Also curation is best handled only at salesforce_mapping.
-    // Unable to make use of parent getPostData logic.
-    // $data = parent::getPostData($operation, $webform_submission); .
+
     // Get Salesforce field mappings.
     $salesforce_mapping = $this->configuration['salesforce_mapping'];
     foreach ($data as $key => $value) {
-      $salesforce_campaign_field = '';
-      $select_or_other_values = $salesforce_mapping[$key];
-      if (!empty($select_or_other_values['select']) && $select_or_other_values['select'] != WebformOtherBase::OTHER_OPTION) {
-        $salesforce_campaign_field = $select_or_other_values['select'];
-      }
-      elseif (!empty($select_or_other_values['select']) && $select_or_other_values['select'] == WebformOtherBase::OTHER_OPTION && !empty($select_or_other_values['other'])) {
-        $salesforce_campaign_field = $select_or_other_values['other'];
+      if (array_key_exists($key, $salesforce_mapping)) {
+        $salesforce_data[$salesforce_mapping[$key]] = $value;
       }
-      if (!empty($value) && !empty($salesforce_campaign_field)) {
-        $salesforce_data[$salesforce_campaign_field] = $value;
-      }
-    }
-    // Append custom data.
-    if (!empty($this->configuration['custom_data'])) {
-      $salesforce_data = Yaml::decode($this->configuration['custom_data']) + $salesforce_data;
-    }
-    // Append operation data.
-    if (!empty($this->configuration[$operation . '_custom_data'])) {
-      $salesforce_data = Yaml::decode($this->configuration[$operation . '_custom_data']) + $salesforce_data;
     }
-    // Replace tokens.
-    $salesforce_data = $this->tokenManager->replace($salesforce_data, $webform_submission);
+
     // Allow modification of data by other modules.
     \Drupal::moduleHandler()->alter('sfweb2lead_webform_posted_data', $salesforce_data, $this->webform, $webform_submission);
     return $salesforce_data;
+  }
 
+  /**
+   * Set state URL when appropriate.
+   *
+   * @param string $state
+   *   The state of the webform submission.
+   *   Either STATE_NEW, STATE_DRAFT, STATE_COMPLETED, STATE_UPDATED, or
+   *   STATE_CONVERTED depending on the last save operation performed.
+   */
+  protected function setStateUrl($state) {
+    if (!empty($this->configuration['salesforce_url']) && $state === WebformSubmissionInterface::STATE_COMPLETED) {
+      $this->configuration[$state . '_url'] = $this->configuration['salesforce_url'];
+    }
   }
 
 }
diff --git a/tests/src/Kernel/Plugin/WebformHandler/SalesforceWebToLeadPostWebformHandlerTest.php b/tests/src/Kernel/Plugin/WebformHandler/SalesforceWebToLeadPostWebformHandlerTest.php
new file mode 100644
index 0000000..1d3e9f9
--- /dev/null
+++ b/tests/src/Kernel/Plugin/WebformHandler/SalesforceWebToLeadPostWebformHandlerTest.php
@@ -0,0 +1,185 @@
+<?php
+
+namespace Drupal\Tests\sfweb2lead_webform\Kernel\Plugin\WebformHandler;
+
+use Drupal\KernelTests\Core\Entity\EntityKernelTestBase;
+use Drupal\sfweb2lead_webform\Plugin\WebformHandler\SalesforceWebToLeadPostWebformHandler;
+use Drupal\webform\WebformSubmissionInterface;
+
+/**
+ * SalesforceWebToLeadPostWebformHandler unit tests.
+ *
+ * @group SalesforceWebToLeadWebform
+ */
+class SalesforceWebToLeadPostWebformHandlerTest extends EntityKernelTestBase {
+
+  /**
+   * Modules to enable.
+   *
+   * @var array
+   */
+  public static $modules = ['webform', 'sfweb2lead_webform'];
+
+  /**
+   * Tests getRequestData().
+   */
+  public function testGetRequestData() {
+    // Get contructor args and mocks.
+    $configuration = [
+      'settings' => [
+        'salesforce_mapping' => [
+          'my_form_element_2' => 'first_name'
+        ],
+        'salesforce_oid' => 'XXX1234567890',
+      ]
+    ];
+    $plugin_id = 'sfweb2lead_post';
+    $plugin_definition = '';
+    $logger_factory = $this->getMockLoggerChannelFactory();
+    $config_factory = $this->getMockConfigFactory();
+    $entity_type_manager = $this->getMockEntityTypeManager();
+    $conditions_validator = $this->getMockWebformSubmissionConditionsValidator();
+    $module_handler = $this->getMockModuleHandler();
+    $http_client = $this->getMockHttpClient();
+    $message_manager = $this->getMockWebformMessageManager();
+
+    // Mock toekn manager and replace method.
+    $token_manager = $this->getMockTokenManager();
+    $token_manager->expects($this->any())
+      ->method('replace')
+      ->will($this->returnArgument(0));
+
+    // Instantiate handler.
+    $handler = new TestSalesforceWebToLeadPostWebformHandler($configuration, $plugin_id, $plugin_definition, $logger_factory, $config_factory, $entity_type_manager, $conditions_validator, $module_handler, $http_client, $token_manager, $message_manager);
+
+    // Mock webform submission.
+    $webform_submission_array = [
+      'my_form_element_1' => 'foo',
+      'my_form_element_2' => 'bar',
+    ];
+    $webform_submission = $this->getMockBuilder('\Drupal\webform\WebformSubmissionInterface')
+      ->getMock();
+    $webform_submission->expects($this->any())
+      ->method('toArray')
+      ->will($this->returnValue(['data' => $webform_submission_array]));
+
+    // Check the output.
+    $expected_salesforce_data = [
+      'oid' => 'XXX1234567890',
+      'first_name' => 'bar',
+    ];
+    $actual_salesforce_data = $handler->getRequestData('', $webform_submission);
+    $this->assertEquals($expected_salesforce_data, $actual_salesforce_data);
+  }
+
+  /**
+   * Tests setStateUrl().
+   */
+  public function testSetStateUrl() {
+    // Get contructor args and mocks.
+    $configuration = [
+      'settings' => [
+        'salesforce_mapping' => [
+          'my_form_element_2' => 'first_name'
+        ],
+        'salesforce_oid' => 'XXX1234567890',
+        'salesforce_url' => 'foo',
+      ]
+    ];
+    $plugin_id = 'sfweb2lead_post';
+    $plugin_definition = '';
+    $logger_factory = $this->getMockLoggerChannelFactory();
+    $config_factory = $this->getMockConfigFactory();
+    $entity_type_manager = $this->getMockEntityTypeManager();
+    $conditions_validator = $this->getMockWebformSubmissionConditionsValidator();
+    $module_handler = $this->getMockModuleHandler();
+    $http_client = $this->getMockHttpClient();
+    $message_manager = $this->getMockWebformMessageManager();
+    $token_manager = $this->getMockTokenManager();
+    // Instantiate handler.
+    $handler = new TestSalesforceWebToLeadPostWebformHandler($configuration, $plugin_id, $plugin_definition, $logger_factory, $config_factory, $entity_type_manager, $conditions_validator, $module_handler, $http_client, $token_manager, $message_manager);
+    $handler->setLabel($plugin_id);
+    $handler->setStateUrl(WebformSubmissionInterface::STATE_DRAFT);
+    $this->assertArrayNotHasKey(WebformSubmissionInterface::STATE_DRAFT . '_url', $handler->getConfiguration()['settings']);
+    $this->assertArrayNotHasKey(WebformSubmissionInterface::STATE_COMPLETED . '_url', $handler->getConfiguration()['settings']);
+    $handler->setStateUrl(WebformSubmissionInterface::STATE_COMPLETED);
+    $this->assertArrayHasKey(WebformSubmissionInterface::STATE_COMPLETED . '_url', $handler->getConfiguration()['settings']);
+  }
+
+  /**
+   * Get a mock logger channel factory.
+   */
+  protected function getMockLoggerChannelFactory() {
+    return $this->getMockBuilder('\Drupal\Core\Logger\LoggerChannelFactoryInterface')->getMock();
+  }
+
+  /**
+   * Get a mock config factory.
+   */
+  protected function getMockConfigFactory() {
+    return $this->getMockBuilder('Drupal\Core\Config\ConfigFactoryInterface')->getMock();
+  }
+
+  /**
+   * Get a mock entity type manager.
+   */
+  protected function getMockEntityTypeManager() {
+    return $this->getMockBuilder('Drupal\Core\Entity\EntityTypeManagerInterface')->getMock();
+  }
+
+  /**
+   * Get a mock webform submission conditions validator.
+   */
+  protected function getMockWebformSubmissionConditionsValidator() {
+    return $this->getMockBuilder('Drupal\webform\WebformSubmissionConditionsValidatorInterface')->getMock();
+  }
+
+  /**
+   * Get a mock module handler.
+   */
+  protected function getMockModuleHandler() {
+    return $this->getMockBuilder('\Drupal\Core\Extension\ModuleHandlerInterface')->getMock();
+  }
+
+  /**
+   * Get a mock HTTP client.
+   */
+  protected function getMockHttpClient() {
+    return $this->getMockBuilder('\GuzzleHttp\ClientInterface')->getMock();
+  }
+
+  /**
+   * Get a mock token manager.
+   */
+  protected function getMockTokenManager() {
+    return $this->getMockBuilder('\Drupal\webform\WebformTokenManagerInterface')->getMock();
+  }
+
+  /**
+   * Get a mock webform message manager.
+   */
+  protected function getMockWebformMessageManager() {
+    return $this->getMockBuilder('\Drupal\webform\WebformMessageManagerInterface')->getMock();
+  }
+
+}
+
+/**
+ * Test class extending SalesforceWebToLeadPostWebformHandler to aid testing.
+ */
+class TestSalesforceWebToLeadPostWebformHandler extends SalesforceWebToLeadPostWebformHandler {
+
+  /**
+   * Public wrapper method for SalesforceWebToLeadPostWebformHandler::getRequestData().
+   */
+  public function getRequestData($state, WebformSubmissionInterface $webform_submission) {
+    return parent::getRequestData($state, $webform_submission);
+  }
+
+  /**
+   * Public wrapper method for SalesforceWebToLeadPostWebformHandler::setStateUrl().
+   */
+  public function setStateUrl($state) {
+    return parent::setStateUrl($state);
+  }
+}
