diff --git a/src/Plugin/Commerce/PaymentGateway/AuthorizeNet.php b/src/Plugin/Commerce/PaymentGateway/AuthorizeNet.php
index ced72d7..6d78cac 100644
--- a/src/Plugin/Commerce/PaymentGateway/AuthorizeNet.php
+++ b/src/Plugin/Commerce/PaymentGateway/AuthorizeNet.php
@@ -2,11 +2,10 @@
 
 namespace Drupal\commerce_authnet\Plugin\Commerce\PaymentGateway;
 
-use CommerceGuys\AuthNet\DataTypes\LineItem;
-// use CommerceGuys\AuthNet\DataTypes\Tax;
-use Drupal\commerce_authnet\DataTypes\Tax;
-use CommerceGuys\AuthNet\Response\ResponseInterface;
 use Drupal\commerce_order\Entity\OrderInterface;
+use Drupal\commerce_payment\CreditCard;
+// @todo Change this to: use CommerceGuys\AuthNet\DataTypes\Tax;
+use Drupal\commerce_authnet\DataTypes\Tax;
 use Drupal\commerce_payment\Entity\PaymentInterface;
 use Drupal\commerce_payment\Entity\PaymentMethodInterface;
 use Drupal\commerce_payment\Exception\HardDeclineException;
@@ -26,14 +25,17 @@ use CommerceGuys\AuthNet\CreateCustomerProfileRequest;
 use CommerceGuys\AuthNet\CreateTransactionRequest;
 use CommerceGuys\AuthNet\DataTypes\BillTo;
 use CommerceGuys\AuthNet\DataTypes\CreditCard as CreditCardDataType;
+use CommerceGuys\AuthNet\DataTypes\LineItem;
 use CommerceGuys\AuthNet\DataTypes\MerchantAuthentication;
 use CommerceGuys\AuthNet\DataTypes\Order as OrderDataType;
 use CommerceGuys\AuthNet\DataTypes\OpaqueData;
 use CommerceGuys\AuthNet\DataTypes\PaymentProfile;
 use CommerceGuys\AuthNet\DataTypes\Profile;
 use CommerceGuys\AuthNet\DataTypes\TransactionRequest;
+use CommerceGuys\AuthNet\DataTypes\ShipTo;
 use CommerceGuys\AuthNet\DeleteCustomerPaymentProfileRequest;
 use CommerceGuys\AuthNet\Request\XmlRequest;
+use CommerceGuys\AuthNet\Response\ResponseInterface;
 use Psr\Log\LoggerInterface;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 
@@ -261,6 +263,54 @@ class AuthorizeNet extends OnsitePaymentGatewayBase implements AuthorizeNetInter
         ],
       ];
       $transaction_request->addData('payment', $payment_data);
+
+      /** @var \Drupal\address\AddressInterface $address */
+      $address = $payment_method->getBillingProfile()->address->first();
+      $bill_to = [
+        // @todo how to allow customizing this.
+        'firstName' => $address->getGivenName(),
+        'lastName' => $address->getFamilyName(),
+        'company' => $address->getOrganization(),
+        'address' => substr($address->getAddressLine1() . ' ' . $address->getAddressLine2(), 0, 60),
+        'country' => $address->getCountryCode(),
+        // @todo support adding phone and fax
+      ];
+      if ($address->getLocality() != '') {
+        $bill_to['city'] = $address->getLocality();
+      }
+      if ($address->getAdministrativeArea() != '') {
+        $bill_to['state'] = $address->getAdministrativeArea();
+      }
+      if ($address->getPostalCode() != '') {
+        $bill_to['zip'] = $address->getPostalCode();
+      }
+      $transaction_request->addDataType(new BillTo($bill_to));
+
+    }
+    if (\Drupal::moduleHandler()->moduleExists('commerce_shipping') && $order->hasField('shipments') && !($order->get('shipments')->isEmpty())) {
+      /** @var \Drupal\commerce_shipping\Entity\ShipmentInterface[] $shipments */
+      $shipments = $payment->getOrder()->get('shipments')->referencedEntities();
+      $first_shipment = reset($shipments);
+      /** @var \Drupal\address\Plugin\Field\FieldType\AddressItem $shipping_address */
+      $shipping_address = $first_shipment->getShippingProfile()->address->first();
+      $ship_data = [
+        // @todo how to allow customizing this.
+        'firstName' => $shipping_address->getGivenName(),
+        'lastName' => $shipping_address->getFamilyName(),
+        'address' => substr($shipping_address->getAddressLine1() . ' ' . $shipping_address->getAddressLine2(), 0, 60),
+        'country' => $shipping_address->getCountryCode(),
+        'company' => $shipping_address->getOrganization(),
+      ];
+      if ($shipping_address->getLocality() != '') {
+        $ship_data['city'] = $shipping_address->getLocality();
+      }
+      if ($shipping_address->getAdministrativeArea() != '') {
+        $ship_data['state'] = $shipping_address->getAdministrativeArea();
+      }
+      if ($shipping_address->getPostalCode() != '') {
+        $ship_data['zip'] = $shipping_address->getPostalCode();
+      }
+      $transaction_request->addDataType(new ShipTo($ship_data));
     }
 
     // Adding order information to the transaction.
@@ -363,6 +413,12 @@ class AuthorizeNet extends OnsitePaymentGatewayBase implements AuthorizeNetInter
    * {@inheritdoc}
    */
   public function refundPayment(PaymentInterface $payment, Price $amount = NULL) {
+    /** @var \Drupal\commerce_payment\Entity\PaymentMethod $payment_method */
+    $payment_method = $payment->getPaymentMethod();
+    $payment_method_type = $payment_method->getType()->getPluginId();
+    if ($payment_method_type === 'authnet_echeck') {
+      throw new PaymentGatewayException($this->t('Echeck transactions cannot be refunded.'));
+    }
     $this->assertPaymentState($payment, ['completed', 'partially_refunded']);
     // If not specified, refund the entire amount.
     $amount = $amount ?: $payment->getAmount();
@@ -374,11 +430,14 @@ class AuthorizeNet extends OnsitePaymentGatewayBase implements AuthorizeNetInter
       'amount' => $amount->getNumber(),
       'refTransId' => $payment->getRemoteId(),
     ]);
-    /** @var \Drupal\commerce_payment\Entity\PaymentMethod $payment_method */
-    $payment_method = $payment->getPaymentMethod();
+    // Adding order information to the transaction.
+    $order = $payment->getOrder();
+    $transaction_request->addOrder(new OrderDataType([
+      'invoiceNumber' => $order->getOrderNumber() ?: $order->id(),
+    ]));
     $transaction_request->addPayment(new CreditCardDataType([
       'cardNumber' => $payment_method->card_number->value,
-      'expirationDate' => $payment_method->card_exp_month->value . $payment_method->card_exp_year->value,
+      'expirationDate' => str_pad($payment_method->card_exp_month->value, 2, '0', STR_PAD_LEFT) . str_pad($payment_method->card_exp_year->value, 2, '0', STR_PAD_LEFT),
     ]));
     $request->setTransactionRequest($transaction_request);
     $response = $request->execute();
@@ -426,7 +485,8 @@ class AuthorizeNet extends OnsitePaymentGatewayBase implements AuthorizeNetInter
         $payment_method->card_exp_month = $remote_payment_method['expiration_month'];
         $payment_method->card_exp_year = $remote_payment_method['expiration_year'];
         $payment_method->setRemoteId($remote_payment_method['remote_id']);
-        $payment_method->setExpiresTime(0);
+        $expires = CreditCard::calculateExpirationTimestamp($remote_payment_method['expiration_month'], $remote_payment_method['expiration_year']);
+        $payment_method->setExpiresTime($expires);
         break;
 
       case 'authnet_echeck':
@@ -763,7 +823,7 @@ class AuthorizeNet extends OnsitePaymentGatewayBase implements AuthorizeNetInter
    * @param \Drupal\commerce_order\Entity\OrderInterface $order
    *   The order.
    *
-   * @return \Drupal\commerce_authnet\DataTypes\Tax $tax
+   * @return \Drupal\commerce_authnet\DataTypes\Tax
    *   The total tax.
    */
   protected function getTax(OrderInterface $order) {
@@ -775,7 +835,7 @@ class AuthorizeNet extends OnsitePaymentGatewayBase implements AuthorizeNetInter
         continue;
       }
       $amount += $adjustment->getAmount()->getNumber();
-      $labels[] =  $adjustment->getLabel();
+      $labels[] = $adjustment->getLabel();
     }
 
     // Determine whether multiple tax types are present.
@@ -797,6 +857,13 @@ class AuthorizeNet extends OnsitePaymentGatewayBase implements AuthorizeNetInter
     $name = (strlen($name) > 31) ? substr($name, 0, 28) . '...' : $name;
     $description = (strlen($description) > 255) ? substr($description, 0, 252) . '...' : $description;
 
+    // If amount is negative, do not transmit any information.
+    if ($amount < 0) {
+      $amount = 0;
+      $name = '';
+      $description = '';
+    }
+
     return new Tax([
       'amount' => $amount,
       'name' => $name,
