diff --git a/migration_templates/d6_ubercart_order.yml b/migration_templates/d6_ubercart_order.yml
index e939cd7..8be3ca0 100644
--- a/migration_templates/d6_ubercart_order.yml
+++ b/migration_templates/d6_ubercart_order.yml
@@ -40,8 +40,11 @@ process:
   created: created
   changed: modified
   placed: modified
+  adjustments:
+    plugin: d6_ubercart_line_item
+    source: adjustments
 destination:
-  plugin: 'entity:commerce_order'
+  plugin: entity:commerce_order
 migration_dependencies:
   required:
     - d6_ubercart_store
diff --git a/src/Plugin/migrate/process/ubercart/d6/UbercartLineItem.php b/src/Plugin/migrate/process/ubercart/d6/UbercartLineItem.php
new file mode 100644
index 0000000..79c4f90
--- /dev/null
+++ b/src/Plugin/migrate/process/ubercart/d6/UbercartLineItem.php
@@ -0,0 +1,46 @@
+<?php
+
+namespace Drupal\commerce_migrate\Plugin\migrate\process\ubercart\d6;
+
+use Drupal\commerce_order\Adjustment;
+use Drupal\commerce_price\Price;
+use Drupal\migrate\MigrateExecutableInterface;
+use Drupal\migrate\ProcessPluginBase;
+use Drupal\migrate\Row;
+
+/**
+ * Transforms an array of data into an Commerce Adjustment.
+ *
+ * @MigrateProcessPlugin(
+ *   id = "d6_ubercart_line_item",
+ *   handle_multiples = TRUE
+ * )
+ */
+class UbercartLineItem extends ProcessPluginBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function transform($value, MigrateExecutableInterface $migrate_executable, Row $row, $destination_property) {
+    if (is_array($value)) {
+      $adjustments = [];
+      $i = 0;
+      foreach ($value as $adjustment) {
+        $adjust = [];
+        $adjust['delta'] = $i++;
+        $adjust['type'] = $row->getSourceProperty('commerce_shipping') ? 'shipping' : 'custom';
+        $adjust['label'] = $adjustment['title'];
+        $adjust['amount'] =
+          [
+            'number' => $adjustment['amount'],
+            'currency_code' => $adjustment['currency_code'],
+          ];
+        $adjust['amount'] = new Price($adjust['amount']['number'], $adjust['amount']['currency_code']);
+        $adjustments[] = new Adjustment($adjust);
+      }
+      return $adjustments;
+    }
+    return $value;
+  }
+
+}
diff --git a/src/Plugin/migrate/source/ubercart/d6/Order.php b/src/Plugin/migrate/source/ubercart/d6/Order.php
index 6e39f9c..45e6453 100644
--- a/src/Plugin/migrate/source/ubercart/d6/Order.php
+++ b/src/Plugin/migrate/source/ubercart/d6/Order.php
@@ -2,8 +2,13 @@
 
 namespace Drupal\commerce_migrate\Plugin\migrate\source\ubercart\d6;
 
-use Drupal\migrate\Plugin\migrate\source\SqlBase;
+use Drupal\Core\Entity\EntityManagerInterface;
+use Drupal\Core\Extension\ModuleHandlerInterface;
+use Drupal\migrate_drupal\Plugin\migrate\source\DrupalSqlBase;
 use Drupal\migrate\Row;
+use Drupal\Core\State\StateInterface;
+use Drupal\migrate\Plugin\MigrationInterface;
+use Symfony\Component\DependencyInjection\ContainerInterface;
 
 /**
  * Provides migration source for orders.
@@ -12,14 +17,46 @@ use Drupal\migrate\Row;
  *   id = "d6_ubercart_order"
  * )
  */
-class Order extends SqlBase {
+class Order extends DrupalSqlBase {
+
+  /**
+   * The module handler.
+   *
+   * @var \Drupal\Core\Extension\ModuleHandlerInterface
+   */
+  protected $moduleHandler;
+
+  /**
+   * {@inheritdoc}
+   */
+  public function __construct(array $configuration, $plugin_id, $plugin_definition, MigrationInterface $migration, StateInterface $state, EntityManagerInterface $entity_manager, ModuleHandlerInterface $module_handler) {
+    parent::__construct($configuration, $plugin_id, $plugin_definition, $migration, $state, $entity_manager);
+    $this->state = $state;
+    $this->moduleHandler = $module_handler;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition, MigrationInterface $migration = NULL) {
+    return new static(
+      $configuration,
+      $plugin_id,
+      $plugin_definition,
+      $migration,
+      $container->get('state'),
+      $container->get('entity.manager'),
+      $container->get('module_handler')
+    );
+  }
 
   /**
    * {@inheritdoc}
    */
   public function query() {
-    return $this->select('uc_orders', 'uo')
-      ->fields('uo', array_keys($this->fields()));
+    $query = $this->select('uc_orders', 'uo')
+      ->fields('uo');
+    return $query;
   }
 
   /**
@@ -44,20 +81,45 @@ class Order extends SqlBase {
    * {@inheritdoc}
    */
   public function prepareRow(Row $row) {
-
-    // The Migrate API automatically serializes arrays for storage in longblob
-    // fields so we unserialize them here.
     $data = unserialize($row->getSourceProperty('data'));
     // Ubercart 6 stores credit card information in a hash. Since this probably
     // isn't necessary so I removed it here.
     unset($data['cc_data']);
 
-    $row->setSourceProperty('data', serialize($data));
-
+    // The line item type depends on whether commerce_shipping is installed.
+    // Save the state here for the UbercartLineItem process plugin.
+    $row->setSourceProperty('commerce_shipping', $this->moduleHandler->moduleExists('commerce_shipping'));
+    $row->setSourceProperty('adjustments', $this->getAdjustmentData($row));
     return parent::prepareRow($row);
   }
 
   /**
+   * Retrieves adjustment data for an order.
+   *
+   * @param \Drupal\migrate\Row $row
+   *   The row.
+   *
+   * @return array
+   *   The field values, keyed by delta.
+   */
+  protected function getAdjustmentData(Row $row) {
+    $order_id = $row->getSourceProperty('order_id');
+    $query = $this->select('uc_order_line_items', 'uol')
+      ->fields('uol')
+      ->fields('uo', ['order_id'])
+      ->orderBy('weight', 'ASC')
+      ->condition('uol.order_id', $order_id);
+    $query->innerJoin('uc_orders', 'uo', 'uol.order_id = uo.order_id');
+    $adjustments = $query->execute()->fetchAll();
+
+    $currency_code = $this->variableGet('uc_currency_code', 'USD');
+    foreach ($adjustments as &$adjustment) {
+      $adjustment['currency_code'] = $currency_code;
+    }
+    return $adjustments;
+  }
+
+  /**
    * {@inheritdoc}
    */
   public function getIds() {
diff --git a/tests/src/Kernel/d6/Ubercart/OrderTest.php b/tests/src/Kernel/d6/Ubercart/OrderShippingTest.php
similarity index 62%
copy from tests/src/Kernel/d6/Ubercart/OrderTest.php
copy to tests/src/Kernel/d6/Ubercart/OrderShippingTest.php
index 1eb740a..4d4d633 100644
--- a/tests/src/Kernel/d6/Ubercart/OrderTest.php
+++ b/tests/src/Kernel/d6/Ubercart/OrderShippingTest.php
@@ -2,15 +2,17 @@
 
 namespace Drupal\Tests\commerce_migrate\Kernel\d6\Ubercart;
 
+use Drupal\commerce_order\Adjustment;
+use Drupal\commerce_price\Price;
 use Drupal\commerce_order\Entity\Order;
 use Drupal\Tests\commerce_migrate\Kernel\CommerceMigrateTestTrait;
 
 /**
- * Tests billing profile migration.
+ * Tests order migration.
  *
  * @group commerce_migrate
  */
-class OrderTest extends Ubercart6TestBase {
+class OrderShippingTest extends Ubercart6TestBase {
 
   use CommerceMigrateTestTrait;
 
@@ -23,6 +25,8 @@ class OrderTest extends Ubercart6TestBase {
     'path',
     'commerce_product',
     'commerce_migrate_ubercart',
+    'commerce_shipping',
+    'physical',
   ];
 
   /**
@@ -54,9 +58,30 @@ class OrderTest extends Ubercart6TestBase {
     /** @var \Drupal\commerce_order\Entity\OrderInterface $order */
     $order = Order::load(1);
     $this->assertNotNull($order->getBillingProfile());
-    $this->assertNull($order->getData('cc_data'));  $order = Order::load(2);
+    $this->assertNull($order->getData('cc_data'));
+    $adjustments[] = new Adjustment([
+      'type' => 'shipping',
+      'label' => 'Shipping',
+      'amount' => new Price('2.99', 'NZD'),
+      'sourceId' => NULL,
+      'included' => FALSE,
+    ]);
+    $this->assertCount(1, $order->getAdjustments());
+    $this->assertEquals($adjustments, $order->getAdjustments());
+
+    $order = Order::load(2);
     $this->assertNotNull($order->getBillingProfile());
     $this->assertNull($order->getData('cc_data'));
+    $adjustments = [];
+    $adjustments[] = new Adjustment([
+      'type' => 'shipping',
+      'label' => 'Shipping',
+      'amount' => new Price('1000.00', 'NZD'),
+      'sourceId' => NULL,
+      'included' => FALSE,
+    ]);
+    $this->assertCount(1, $order->getAdjustments());
+    $this->assertEquals($adjustments, $order->getAdjustments());
   }
 
 }
diff --git a/tests/src/Kernel/d6/Ubercart/OrderTest.php b/tests/src/Kernel/d6/Ubercart/OrderTest.php
index 1eb740a..ff18bbf 100644
--- a/tests/src/Kernel/d6/Ubercart/OrderTest.php
+++ b/tests/src/Kernel/d6/Ubercart/OrderTest.php
@@ -2,11 +2,13 @@
 
 namespace Drupal\Tests\commerce_migrate\Kernel\d6\Ubercart;
 
+use Drupal\commerce_order\Adjustment;
+use Drupal\commerce_price\Price;
 use Drupal\commerce_order\Entity\Order;
 use Drupal\Tests\commerce_migrate\Kernel\CommerceMigrateTestTrait;
 
 /**
- * Tests billing profile migration.
+ * Tests order migration.
  *
  * @group commerce_migrate
  */
@@ -54,9 +56,30 @@ class OrderTest extends Ubercart6TestBase {
     /** @var \Drupal\commerce_order\Entity\OrderInterface $order */
     $order = Order::load(1);
     $this->assertNotNull($order->getBillingProfile());
-    $this->assertNull($order->getData('cc_data'));  $order = Order::load(2);
+    $this->assertNull($order->getData('cc_data'));
+    $adjustments[] = new Adjustment([
+      'type' => 'custom',
+      'label' => 'Shipping',
+      'amount' => new Price('2.99', 'NZD'),
+      'sourceId' => NULL,
+      'included' => FALSE,
+    ]);
+    $this->assertCount(1, $order->getAdjustments());
+    $this->assertEquals($adjustments, $order->getAdjustments());
+
+    $order = Order::load(2);
     $this->assertNotNull($order->getBillingProfile());
     $this->assertNull($order->getData('cc_data'));
+    $adjustments = [];
+    $adjustments[] = new Adjustment([
+      'type' => 'custom',
+      'label' => 'Shipping',
+      'amount' => new Price('1000.00', 'NZD'),
+      'sourceId' => NULL,
+      'included' => FALSE,
+    ]);
+    $this->assertCount(1, $order->getAdjustments());
+    $this->assertEquals($adjustments, $order->getAdjustments());
   }
 
 }
