diff --git a/modules/sms_user/sms_user.module b/modules/sms_user/sms_user.module
index 4978ac7..cbe2e2b 100644
--- a/modules/sms_user/sms_user.module
+++ b/modules/sms_user/sms_user.module
@@ -17,6 +17,7 @@ use Drupal\user\Entity\User;
 use Drupal\user\UserInterface;
 use Drupal\Core\Entity\Display\EntityViewDisplayInterface;
 use Drupal\sms\Entity\SmsMessage as SmsMessageEntity;
+use Drupal\sms\Message\SmsMessage;
 
 define('SMS_USER_BLOCKED', 0);
 define('SMS_USER_PENDING', 1);
@@ -235,7 +236,14 @@ function sms_user_send_confirmation($account, $number, array $options) {
 
   $account->sms_user = $data;
   $account->save();
-  sms_send($number, _sms_user_confirm_message($code), $options);
+
+  $sms_message = (new SmsMessage())
+    ->addRecipient($number)
+    ->setMessage(_sms_user_confirm_message($code));
+
+  /** @var \Drupal\sms\Provider\SmsProviderInterface $provider */
+  $provider = \Drupal::service('sms_provider');
+  $provider->queueOut($sms_message);
 }
 
 /**
diff --git a/sms.module b/sms.module
index da2b719..752188f 100644
--- a/sms.module
+++ b/sms.module
@@ -6,6 +6,7 @@
  * sending and receiving SMS messages.
  */
 
+use Drupal\sms\Entity\SmsMessage as SmsMessageEntity;
 use Drupal\sms\Exception\PhoneNumberSettingsException;
 use Drupal\Core\Form\FormState;
 use Drupal\Core\Form\FormStateInterface;
@@ -133,45 +134,6 @@ function _sms_entity_postsave(EntityInterface $entity) {
 }
 
 /**
- * Sends a message using the active gateway.
- *
- * @param string $number
- *   The destination number.
- * @param string $message
- *   The text of the message to send.
- * @param array $options
- *   An array of additional properties as defined by gateway modules.
- *
- * @return bool
- *   true if the message was sent to the server, false otherwise.
- *
- * @see \Drupal\sms\Provider\DefaultSmsProvider::handleResult().
- */
-function sms_send($number, $message, array $options = array()) {
-  $sender = isset($options['sender']) ? $options['sender'] : '';
-  $sms = new SmsMessage($sender, explode(',', $number), $message, $options, \Drupal::currentUser()->id());
-  /** @var \Drupal\sms\Message\SmsMessageResultInterface $result */
-  $result = \Drupal::service('sms_provider')->send($sms, $options);
-  if ($result instanceof SmsMessageResultInterface) {
-    if ($result->getStatus()) {
-      return TRUE;
-    }
-    else {
-      // @todo Review all of this.
-      $error_message = t('Sending SMS to %number failed.', ['%number' => implode(',', $sms->getRecipients())]);
-      if ($message = $result->getErrorMessage()) {
-        $error_message .= t(' The gateway said %message.', ['%message' => $message]);
-      }
-      \Drupal::logger('sms')->error($message);
-      throw new SmsException($error_message);
-    }
-  }
-  else {
-    return FALSE;
-  }
-}
-
-/**
  * Queue worker callback for queued incoming messages.
  *
  * @param array $item
@@ -278,7 +240,18 @@ function sms_send_form_validate($form, FormStateInterface $form_state) {
  * @see sms_send_form_validate()
  */
 function sms_send_form_submit($form, FormStateInterface $form_state) {
-  sms_send(sms_formatter($form_state->getValue('number')), $form_state->getValue('message'), $form_state->getValue('gateway', array()));
+  $sms_message = SmsMessageEntity::create()
+    ->addRecipient(sms_formatter($form_state->getValue('number')))
+    ->setMessage($form_state->getValue('message'));
+
+  // Gateway plugin form options
+  foreach ($form_state->getValue('gateway', []) as $key => $value) {
+    $sms_message->setOption($key, $value);
+  }
+
+  /** @var \Drupal\sms\Provider\SmsProviderInterface $provider */
+  $provider = \Drupal::service('sms_provider');
+  $provider->queue($sms_message);
 }
 
 /******************************************************************************
diff --git a/tests/src/Kernel/SmsFrameworkSmsSendTest.php b/tests/src/Kernel/SmsFrameworkSmsSendTest.php
index 6c84f5e..8c83300 100644
--- a/tests/src/Kernel/SmsFrameworkSmsSendTest.php
+++ b/tests/src/Kernel/SmsFrameworkSmsSendTest.php
@@ -8,6 +8,8 @@
 namespace Drupal\Tests\sms\Kernel;
 
 use Drupal\sms\Entity\SmsGateway;
+use Drupal\sms\Message\SmsMessageResultInterface;
+use Drupal\sms\Message\SmsMessage;
 
 /**
  * Tests sending SMS messages.
@@ -65,7 +67,12 @@ class SmsFrameworkSmsSendTest extends SmsFrameworkKernelBase {
     for ($a = 0; $a < 3; $a++) {
       foreach ($gateways as $i => &$gateway) {
         $this->defaultSmsProvider->setDefaultGateway($gateway);
-        sms_send('+123123123', $this->randomString());
+
+        $sms_message = (new SmsMessage())
+          ->addRecipients($this->randomPhoneNumbers(1))
+          ->setMessage($this->randomString());
+        $this->defaultSmsProvider->queueOut($sms_message);
+
         $message_counts[$i]++;
         foreach ($gateways as $k => $gateway2) {
           $this->assertEquals($message_counts[$k], count($this->getTestMessages($gateway2)));
@@ -84,23 +91,15 @@ class SmsFrameworkSmsSendTest extends SmsFrameworkKernelBase {
     $test_gateway2 = $this->createMemoryGateway(['skip_queue' => TRUE]);
     $this->defaultSmsProvider->setDefaultGateway($test_gateway1);
 
-    // Test message goes to default gateway.
-    $message = $this->randomString();
-    $number = '+123123123';
-    $options['sender'] = 'Sender';
-
-    $result = sms_send($number, $message, $options);
-    $this->assertTrue($result, 'Message successfully sent.');
-
-    $this->assertEquals(1, count($this->getTestMessages($test_gateway1)), 'Message sent to default gateway.');
-    $this->assertEquals(0, count($this->getTestMessages($test_gateway2)), 'Message not sent to extra gateway.');
+    $sms_message = (new SmsMessage())
+      ->addRecipients($this->randomPhoneNumbers(1))
+      ->setMessage($this->randomString());
 
-    // Test message goes to specified gateway.
     $options['gateway'] = $test_gateway2->id();
-    $result = sms_send($number, $message, $options);
-    $this->assertTrue($result, 'Message successfully sent.');
+    $result = $this->defaultSmsProvider->send($sms_message, $options);
+    $this->assertTrue($result instanceof SmsMessageResultInterface, 'Message successfully sent.');
+    $this->assertEquals(0, count($this->getTestMessages($test_gateway1)), 'Message not sent to the default gateway.');
     $this->assertEquals(1, count($this->getTestMessages($test_gateway2)), 'Message sent to the specified gateway.');
-    $this->assertEquals(1, count($this->getTestMessages($test_gateway1)), 'Message not sent to the default gateway.');
   }
 
 }
