diff --git a/uc_country/src/Controller/CountryController.php b/uc_country/src/Controller/CountryController.php
index f1eb199..842e40e 100644
--- a/uc_country/src/Controller/CountryController.php
+++ b/uc_country/src/Controller/CountryController.php
@@ -66,13 +66,13 @@ class CountryController extends ControllerBase {
    */
   public static function zoneOptionsCallback() {
     $options = array();
-    $countries = $this->entityManager()->getStorage('uc_country')->loadByProperties(['status' => TRUE]);
+    $countries = \Drupal::entityTypeManager()->getStorage('uc_country')->loadByProperties(['status' => TRUE]);
     foreach ($countries as $country) {
-      if (!empty($country->getZones())) {
-        $options[$this->t($country->name)] = $country->getZones();
+      foreach ($country->getZones() as $id => $zone) {
+        $options[$id] = $country->label() . ': ' . $zone;
       }
     }
-    uksort($options, 'strnatcasecmp');
+    uasort($options, 'strnatcasecmp');
 
     return $options;
   }
diff --git a/uc_country/src/Plugin/views/field/Country.php b/uc_country/src/Plugin/views/field/Country.php
new file mode 100644
index 0000000..b0e76fb
--- /dev/null
+++ b/uc_country/src/Plugin/views/field/Country.php
@@ -0,0 +1,66 @@
+<?php
+
+namespace Drupal\uc_country\Plugin\views\field;
+
+use Drupal\Core\Config\Entity\ConfigEntityStorageInterface;
+use Drupal\views\Plugin\views\field\FieldPluginBase;
+use Drupal\views\ResultRow;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+
+/**
+ * A handler to provide proper displays for country.
+ *
+ * @ingroup views_field_handlers
+ *
+ * @ViewsField("uc_country")
+ */
+class Country extends FieldPluginBase {
+
+  /**
+   * The country storage.
+   *
+   * @var \Drupal\Core\Config\Entity\ConfigEntityStorageInterface.
+   */
+  protected $countryStorage;
+
+  /**
+   * Constructs a Counntry object.
+   *
+   * @param array $configuration
+   *   A configuration array containing information about the plugin instance.
+   * @param string $plugin_id
+   *   The plugin_id for the plugin instance.
+   * @param mixed $plugin_definition
+   *   The plugin implementation definition.
+   * @param \Drupal\Core\Config\Entity\ConfigEntityStorageInterface $country_storage
+   *   The country storage.
+   */
+  public function __construct(array $configuration, $plugin_id, $plugin_definition, ConfigEntityStorageInterface $country_storage) {
+    parent::__construct($configuration, $plugin_id, $plugin_definition);
+    $this->countryStorage = $country_storage;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
+    return new static(
+      $configuration,
+      $plugin_id,
+      $plugin_definition,
+      $container->get('entity.manager')->getStorage('uc_country')
+    );
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function render(ResultRow $values) {
+    $value = $this->getValue($values);
+    if ($value && $country = $this->countryStorage->load($value)) {
+      return $country->label();
+    }
+    return '';
+  }
+
+}
diff --git a/uc_country/src/Plugin/views/field/Zone.php b/uc_country/src/Plugin/views/field/Zone.php
new file mode 100644
index 0000000..4df3c9a
--- /dev/null
+++ b/uc_country/src/Plugin/views/field/Zone.php
@@ -0,0 +1,71 @@
+<?php
+
+namespace Drupal\uc_country\Plugin\views\field;
+
+use Drupal\Core\Config\Entity\ConfigEntityStorageInterface;
+use Drupal\views\Plugin\views\display\DisplayPluginBase;
+use Drupal\views\Plugin\views\field\FieldPluginBase;
+use Drupal\views\ResultRow;
+use Drupal\views\ViewExecutable;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+
+/**
+ * A handler to provide proper displays for zone.
+ *
+ * @ingroup views_field_handlers
+ *
+ * @ViewsField("uc_zone")
+ */
+class Zone extends FieldPluginBase {
+
+  /**
+   * The country storage.
+   *
+   * @var \Drupal\Core\Config\Entity\ConfigEntityStorageInterface.
+   */
+  protected $countryStorage;
+
+  /**
+   * Constructs a Zone object.
+   *
+   * @param array $configuration
+   *   A configuration array containing information about the plugin instance.
+   * @param string $plugin_id
+   *   The plugin_id for the plugin instance.
+   * @param mixed $plugin_definition
+   *   The plugin implementation definition.
+   * @param \Drupal\Core\Config\Entity\ConfigEntityStorageInterface $country_storage
+   *   The country storage.
+   */
+  public function __construct(array $configuration, $plugin_id, $plugin_definition, ConfigEntityStorageInterface $country_storage) {
+    parent::__construct($configuration, $plugin_id, $plugin_definition);
+    $this->countryStorage = $country_storage;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
+    return new static(
+      $configuration,
+      $plugin_id,
+      $plugin_definition,
+      $container->get('entity.manager')->getStorage('uc_country')
+    );
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function render(ResultRow $values) {
+    $country_value = $this->getValue($values, 'country');
+    if ($country_value && $country = $this->countryStorage->load($country_value)) {
+      $zone_value = $this->getValue($values);
+      if ($zone_value) {
+        return $country->getZones()[$zone_value];
+      }
+    }
+    return '';
+  }
+
+}
diff --git a/uc_order/config/install/views.view.uc_customers.yml b/uc_order/config/install/views.view.uc_customers.yml
index 87a73ce..aaf200a 100644
--- a/uc_order/config/install/views.view.uc_customers.yml
+++ b/uc_order/config/install/views.view.uc_customers.yml
@@ -4,6 +4,7 @@ dependencies:
   config:
     - system.menu.admin
   module:
+    - uc_country
     - uc_order
     - user
 id: uc_customers
@@ -16,31 +17,19 @@ base_field: uid
 core: 8.x
 display:
   default:
-    display_plugin: default
-    id: default
-    display_title: Master
-    position: 1
     display_options:
       access:
         type: perm
         options:
           perm: 'view customers'
-        perm: 'access user profiles'
       cache:
         type: none
-        options: {  }
       query:
         type: views_query
-        options:
-          disable_sql_rewrite: false
-          distinct: false
-          slave: false
-          query_comment: ''
-          query_tags: {  }
       exposed_form:
         type: basic
         options:
-          submit_button: Apply
+          submit_button: Filter
           reset_button: false
           reset_button_label: Reset
           exposed_sorts_label: 'Sort by'
@@ -51,23 +40,11 @@ display:
         type: full
         options:
           items_per_page: 30
-          offset: 0
-          id: 0
-          total_pages: null
-          expose:
-            items_per_page: false
-            items_per_page_label: 'Items per page'
-            items_per_page_options: '5, 10, 20, 40, 60'
-            items_per_page_options_all: false
-            items_per_page_options_all_label: '- All -'
-            offset: false
-            offset_label: Offset
           tags:
             previous: '‹ previous'
             next: 'next ›'
             first: '« first'
             last: 'last »'
-          quantity: 9
       style:
         type: table
         options:
@@ -85,8 +62,8 @@ display:
             billing_full_name: billing_full_name
             primary_email: primary_email
             billing_city: billing_city
-            zone_code: billing_city
-            country_name: billing_city
+            billing_zone_name: billing_city
+            billing_country_name: billing_city
             order_id: order_id
             order_total: order_total
           info:
@@ -125,14 +102,14 @@ display:
               separator: ', '
               empty_column: false
               responsive: ''
-            zone_code:
+            billing_zone_name:
               sortable: false
               default_sort_order: asc
               align: ''
               separator: ''
               empty_column: false
               responsive: ''
-            country_name:
+            billing_country_name:
               sortable: false
               default_sort_order: asc
               align: ''
@@ -160,7 +137,7 @@ display:
       fields:
         uid:
           id: uid
-          table: users
+          table: users_field_data
           field: uid
           relationship: none
           group_type: group
@@ -184,7 +161,7 @@ display:
             suffix: ''
             target: ''
             nl2br: false
-            max_length: null
+            max_length: 0
             word_boundary: true
             ellipsis: true
             more_link: false
@@ -206,12 +183,27 @@ display:
           hide_empty: false
           empty_zero: false
           hide_alter_empty: true
-          link_to_user: false
-          plugin_id: user
-          provider: user
+          click_sort_column: value
+          type: number_integer
+          settings:
+            thousand_separator: ''
+            prefix_suffix: true
+          group_column: value
+          group_columns: {  }
+          group_rows: true
+          delta_limit: 0
+          delta_offset: 0
+          delta_reversed: false
+          delta_first_last: false
+          multi_type: separator
+          separator: ', '
+          field_api_classes: false
+          entity_type: user
+          entity_field: uid
+          plugin_id: field
         name:
           id: name
-          table: users
+          table: users_field_data
           field: name
           relationship: none
           group_type: group
@@ -235,7 +227,7 @@ display:
             suffix: ''
             target: ''
             nl2br: false
-            max_length: null
+            max_length: 0
             word_boundary: false
             ellipsis: false
             more_link: false
@@ -257,11 +249,13 @@ display:
           hide_empty: false
           empty_zero: false
           hide_alter_empty: true
-          link_to_user: 1
-          overwrite_anonymous: 0
-          anonymous_text: ''
-          format_username: 1
-          provider: user
+          click_sort_column: value
+          type: user_name
+          settings:
+            link_to_entity: true
+          entity_type: user
+          entity_field: name
+          plugin_id: field
         billing_full_name:
           id: billing_full_name
           table: uc_orders
@@ -310,10 +304,8 @@ display:
           hide_empty: false
           empty_zero: false
           hide_alter_empty: true
-          link_to_user: 0
           format: first_last
           plugin_id: uc_order_full_name
-          provider: uc_order
         primary_email:
           id: primary_email
           table: uc_orders
@@ -340,7 +332,7 @@ display:
             suffix: ''
             target: ''
             nl2br: false
-            max_length: null
+            max_length: 0
             word_boundary: true
             ellipsis: true
             more_link: false
@@ -362,9 +354,22 @@ display:
           hide_empty: false
           empty_zero: false
           hide_alter_empty: true
-          link_to_user: true
-          plugin_id: user_mail
-          provider: user
+          click_sort_column: value
+          type: email_mailto
+          settings: {  }
+          group_column: value
+          group_columns: {  }
+          group_rows: true
+          delta_limit: 0
+          delta_offset: 0
+          delta_reversed: false
+          delta_first_last: false
+          multi_type: separator
+          separator: ', '
+          field_api_classes: false
+          entity_type: uc_order
+          entity_field: primary_email
+          plugin_id: field
         billing_city:
           id: billing_city
           table: uc_orders
@@ -414,11 +419,10 @@ display:
           empty_zero: false
           hide_alter_empty: true
           plugin_id: standard
-          provider: views
-        zone_code:
-          id: zone_code
-          table: billing_zones
-          field: zone_code
+        billing_zone_name:
+          id: billing_zone_name
+          table: uc_orders
+          field: billing_zone_name
           relationship: uc_orders
           group_type: group
           admin_label: ''
@@ -463,12 +467,12 @@ display:
           hide_empty: false
           empty_zero: false
           hide_alter_empty: true
-          plugin_id: standard
-          provider: views
-        country_name:
-          id: country_name
-          table: billing_countries
-          field: country_name
+          entity_type: uc_order
+          plugin_id: uc_zone
+        billing_country_name:
+          id: billing_country_name
+          table: uc_orders
+          field: billing_country_name
           relationship: uc_orders
           group_type: group
           admin_label: ''
@@ -513,8 +517,8 @@ display:
           hide_empty: false
           empty_zero: false
           hide_alter_empty: true
-          plugin_id: standard
-          provider: views
+          entity_type: uc_order
+          plugin_id: uc_country
         order_id:
           id: order_id
           table: uc_orders
@@ -527,8 +531,8 @@ display:
           alter:
             alter_text: false
             text: ''
-            make_link: false
-            path: ''
+            make_link: true
+            path: 'admin/store/customers/orders/{{ uid }}'
             absolute: false
             external: false
             replace_spaces: false
@@ -563,9 +567,16 @@ display:
           hide_empty: false
           empty_zero: false
           hide_alter_empty: true
+          set_precision: false
+          precision: 0
+          decimal: .
+          separator: ','
+          format_plural: 0
+          format_plural_string: "1\x03@count"
+          prefix: ''
+          suffix: ''
           link_to_order: 0
           plugin_id: uc_order
-          provider: uc_order
         order_total:
           id: order_total
           table: uc_orders
@@ -625,11 +636,10 @@ display:
           suffix: ''
           format: uc_price
           plugin_id: uc_price
-          provider: uc_store
       filters:
         uid_raw:
           id: uid_raw
-          table: users
+          table: users_field_data
           field: uid_raw
           relationship: none
           group_type: group
@@ -665,40 +675,39 @@ display:
             default_group: All
             default_group_multiple: {  }
             group_items: {  }
+          entity_type: user
           plugin_id: numeric
-          provider: views
       sorts: {  }
       title: Customers
-      header: {  }
-      footer: {  }
       empty: {  }
+      arguments: {  }
       relationships:
         uc_orders:
           id: uc_orders
-          table: users
+          table: users_field_data
           field: uc_orders
-          relationship: none
-          group_type: group
           admin_label: Orders
           required: true
           plugin_id: standard
-          provider: views
-      arguments: {  }
       filter_groups:
         operator: AND
         groups: {  }
       group_by: true
       display_extenders: {  }
+    display_plugin: default
+    display_title: Master
+    id: default
+    position: 0
     cache_metadata:
       contexts:
         - 'languages:language_content'
         - 'languages:language_interface'
+        - url.query_args
+        - user.permissions
       cacheable: false
+      max-age: 0
+      tags: {  }
   admin_page:
-    display_plugin: page
-    id: admin_page
-    display_title: Page
-    position: 1
     display_options:
       path: admin/store/customers/view
       menu:
@@ -710,8 +719,16 @@ display:
         weight: -10
         context: '0'
       display_extenders: {  }
+    display_plugin: page
+    display_title: Page
+    id: admin_page
+    position: 1
     cache_metadata:
       contexts:
         - 'languages:language_content'
         - 'languages:language_interface'
+        - url.query_args
+        - user.permissions
       cacheable: false
+      max-age: 0
+      tags: {  }
diff --git a/uc_order/src/OrderViewsData.php b/uc_order/src/OrderViewsData.php
index ae8322d..a107747 100644
--- a/uc_order/src/OrderViewsData.php
+++ b/uc_order/src/OrderViewsData.php
@@ -21,302 +21,109 @@ class OrderViewsData extends EntityViewsData {
   public function getViewsData() {
     $data = parent::getViewsData();
 
-    // Orders table.
-    $data['uc_orders']['table']['group'] = t('Order');
-    $data['uc_orders']['table']['base'] = array(
-      'field' => 'order_id',
-      'title' => t('Orders'),
-      'help' => t('Orders placed in your Ubercart store.'),
-    );
+    $data['uc_orders']['order_status']['filter']['id'] = 'uc_order_status';
 
-    // Order ID field.
-    $data['uc_orders']['order_id'] = array(
-      'title' => t('Order ID'),
-      'help' => t('The order ID.'),
+    $data['uc_orders']['uid']['help'] = t('The user ID that the order belongs to.');
+    $data['uc_orders']['uid']['filter']['id'] = 'user_name';
+    $data['uc_orders']['uid']['relationship']['title'] = t('Customer');
+    $data['uc_orders']['uid']['relationship']['help'] = t('Relate an order to the user who placed it.');
+    $data['uc_orders']['uid']['relationship']['label'] = t('customer');
+
+    $data['uc_orders']['order_total']['field']['id'] = 'uc_price';
+
+    $data['uc_orders']['actions'] = array(
+      'title' => t('Actions'),
+      'help' => t('Clickable links to actions a user may perform on an order.'),
       'field' => array(
-        'id' => 'uc_order_id',
-        'click sortable' => TRUE,
-      ),
-      'sort' => array(
-        'id' => 'standard',
-      ),
-      'filter' => array(
-        'id' => 'numeric',
-      ),
-      'argument' => array(
-        'id' => 'numeric',
-        'name field' => 'title',
-        'numeric' => TRUE,
-        'validate type' => 'order_id',
+        'id' => 'uc_order_actions',
+        'real field' => 'order_id',
+        'click sortable' => FALSE,
       ),
     );
 
-    // Order status field.
-    $data['uc_orders']['order_status'] = array(
-      'title' => t('Order status'),
-      'help' => t('The order status.'),
+    $data['uc_orders']['billing_country']['filter']['id'] = 'in_operator';
+    $data['uc_orders']['billing_country']['filter']['options callback'] = 'Drupal\uc_country\Controller\CountryController::countryOptionsCallback';
+    $data['uc_orders']['delivery_country']['filter']['id'] = 'in_operator';
+    $data['uc_orders']['delivery_country']['filter']['options callback'] = 'Drupal\uc_country\Controller\CountryController::countryOptionsCallback';
+
+    $data['uc_orders']['billing_country_name'] = array(
+      'title' => t('Billing country name'),
+      'help' =>  t('The country name where the bill will be sent.'),
       'field' => array(
-        'id' => 'uc_order_status',
-        'click sortable' => TRUE,
-      ),
-      'sort' => array(
-        'id' => 'standard',
-      ),
-      'filter' => array(
-        'id' => 'uc_order_status',
+        'id' => 'uc_country',
+        'real field' => 'billing_country',
       ),
     );
 
-    $data['uc_orders']['uid'] = array(
-      'title' => t('Uid'),
-      'help' => t('The user ID that the order belongs to.'),
+    $data['uc_orders']['delivery_country_name'] = array(
+      'title' => t('Delivery country name'),
+      'help' =>  t('The country name of the delivery location.'),
       'field' => array(
-        'id' => 'user',
-        'click sortable' => TRUE,
-      ),
-      'argument' => array(
-        'id' => 'user_uid',
-        'name field' => 'name', // display this field in the summary
-      ),
-      'filter' => array(
-        'title' => t('Name'),
-        'id' => 'user_name',
-      ),
-      'sort' => array(
-        'id' => 'standard',
-      ),
-      'relationship' => array(
-        'title' => t('Customer'),
-        'help' => t('Relate an order to the user who placed it.'),
-        'base' => 'users',
-        'field' => 'uid',
-        'id' => 'standard',
-        'label' => t('customer'),
+        'id' => 'uc_country',
+        'real field' => 'delivery_country',
       ),
     );
 
-    // Expose the uid as a relationship to users.
-    $data['users']['uc_orders'] = array(
-      'title' => t('Orders'),
-      'help' => t('Relate a user to the orders they have placed. This relationship will create one record for each order placed by the user.'),
-      'relationship' => array(
-        'base' => 'uc_orders',
-        'base field' => 'uid',
-        'relationship field' => 'uid',
-        'id' => 'standard',
-        'label' => t('orders'),
-      ),
-    );
+    $data['uc_orders']['billing_zone']['filter']['id'] = 'in_operator';
+    $data['uc_orders']['billing_zone']['filter']['options callback'] = 'Drupal\uc_country\Controller\CountryController::zoneOptionsCallback';
+    $data['uc_orders']['delivery_zone']['filter']['id'] = 'in_operator';
+    $data['uc_orders']['delivery_zone']['filter']['options callback'] = 'Drupal\uc_country\Controller\CountryController::zoneOptionsCallback';
 
-    // Changed field handler to display as a price
-    $data['uc_orders']['order_total'] = array(
-      'title' => t('Order total'),
-      'help' => t('The total amount to be paid for the order.'),
+    $data['uc_orders']['billing_zone_name'] = array(
+      'title' => t('Billing state/province name'),
+      'help' =>  t('The state/zone/province ID where the bill will be sent.'),
       'field' => array(
-        'id' => 'uc_price',
-        'click sortable' => TRUE,
-      ),
-      'sort' => array(
-        'id' => 'standard',
-      ),
-      'filter' => array(
-        'id' => 'numeric',
+        'id' => 'uc_zone',
+        'real field' => 'billing_zone',
+        'additional fields' => array(
+          'country' => array(
+            'field' => 'billing_country'
+          ),
+        ),
       ),
     );
 
-    $data['uc_orders']['product_count'] = array(
-      'title' => t('Product count'),
-      'help' => t('The total number of products in the order.'),
+    $data['uc_orders']['delivery_zone_name'] = array(
+      'title' => t('Delivery state/province name'),
+      'help' =>  t('The state/zone/province ID of the delivery location.'),
       'field' => array(
-        'id' => 'numeric',
-        'click sortable' => TRUE,
-      ),
-      'sort' => array(
-        'id' => 'standard',
-      ),
-      'filter' => array(
-        'id' => 'numeric',
+        'id' => 'uc_zone',
+        'real field' => 'delivery_zone',
+        'additional fields' => array(
+          'country' => array(
+            'field' => 'delivery_country'
+          ),
+        ),
       ),
     );
 
-    $data['uc_orders']['actions'] = array(
-      'title' => t('Actions'),
-      'help' => t('Clickable links to actions a user may perform on an order.'),
+    $data['uc_orders']['billing_full_name'] = array(
+      'title' => t('Billing full name'),
+      'help' => t('The full name of the person paying for the order.'),
       'field' => array(
-        'id' => 'uc_order_actions',
-        'real field' => 'order_id',
-        'click sortable' => FALSE,
+        'id' => 'uc_order_full_name',
+        'real field' => 'billing_first_name',
+        'additional fields' => array(
+          'last_name' => array(
+            'field' => 'billing_last_name'
+          ),
+        ),
       ),
     );
 
-    $data['uc_orders']['primary_email'] = array(
-      'title' => t('Email address'),
-      'help' => t('The email address of the customer.'),
+    $data['uc_orders']['delivery_full_name'] = array(
+      'title' => t('Delivery full name'),
+      'help' => t('The full name of the person receiving shipment.'),
       'field' => array(
-        'id' => 'user_mail',
-        'click sortable' => TRUE,
-      ),
-      'sort' => array(
-        'id' => 'standard',
-      ),
-      'filter' => array(
-        'id' => 'string',
-      ),
-    );
-
-    $addresses = array(
-      'billing' => t('Billing address'),
-      'delivery' => t('Delivery address'),
-    );
-
-    $fields = array(
-      'first_name' => t('First name'),
-      'last_name' => t('Last name'),
-      'phone' => t('Phone number'),
-      'company' => t('Company'),
-      'street1' => t('Street address 1'),
-      'street2' => t('Street address 2'),
-      'city' => t('City'),
-      'postal_code' => t('Postal code'),
-    );
-
-    foreach ($addresses as $prefix => $address) {
-      $group = t('Order') . ': ' . $address;
-
-      foreach ($fields as $field => $label) {
-        $data['uc_orders'][$prefix . '_' . $field] = array(
-          'group' => $group,
-          'title' => $label,
-          'help' => t('The @field of the @address of the order.', ['@field' => Unicode::strtolower($label), '@address' => Unicode::strtolower($address)]),
-          'field' => array(
-            'id' => 'standard',
-            'click sortable' => TRUE,
-          ),
-          'sort' => array(
-            'id' => 'standard',
-          ),
-          'filter' => array(
-            'id' => 'string',
-          ),
-        );
-      }
-
-      $data['uc_orders'][$prefix . '_full_name'] = array(
-        'group' => $group,
-        'title' => t('Full name'),
-        'help' => t('The @field of the @address of the order.', ['@field' => t('full name'), '@address' => Unicode::strtolower($address)]),
-        'field' => array(
-          'id' => 'uc_order_full_name',
-          'real field' => $prefix . '_first_name',
-          'additional fields' => array(
-            'last_name' => array(
-              'field' => $prefix . '_last_name'
-            ),
+        'id' => 'uc_order_full_name',
+        'real field' => 'delivery_first_name',
+        'additional fields' => array(
+          'last_name' => array(
+            'field' => 'delivery_last_name'
           ),
         ),
-      );
-
-      $data[$prefix . '_countries']['table']['group'] = $group;
-      $data[$prefix . '_countries']['table']['join']['uc_orders'] = array(
-        'table' => 'uc_countries',
-        'left_field' => $prefix . '_country',
-        'field' => 'country_id',
-      );
-      $data[$prefix . '_countries']['country_id'] = array(
-        'title' => t('ISO country code (numeric)'),
-        'help' => t('The @field of the @address of the order.', ['@field' => t('numeric ISO country code'), '@address' => Unicode::strtolower($address)]),
-        'argument' => array(
-          'id' => 'numeric',
-          'name field' => 'country_iso_code_2',
-          'numeric' => TRUE,
-          'validate type' => 'country_id',
-        ),
-        'filter' => array(
-          'id' => 'numeric',
-        ),
-      );
-      $data[$prefix . '_countries']['country_name'] = array(
-        'title' => t('Country'),
-        'help' => t('The @field of the @address of the order.', ['@field' => t('country name'), '@address' => Unicode::strtolower($address)]),
-        'field' => array(
-          'id' => 'standard',
-          'click sortable' => TRUE,
-        ),
-        'sort' => array(
-          'id' => 'standard',
-        ),
-        'filter' => array(
-          'id' => 'in_operator',
-          'real field' => 'country_id',
-          'options callback' => 'Drupal\uc_country\Controller\CountryController::countryOptionsCallback',
-        ),
-      );
-      $data[$prefix . '_countries']['country_iso_code_2'] = array(
-        'title' => t('ISO country code (2 characters)'),
-        'help' => t('The @field of the @address of the order.', ['@field' => t('ISO country code'), '@address' => Unicode::strtolower($address)]),
-        'field' => array(
-          'id' => 'standard',
-          'click sortable' => TRUE,
-        ),
-        'sort' => array(
-          'id' => 'standard',
-        ),
-        'filter' => array(
-          'id' => 'string',
-        ),
-      );
-      $data[$prefix . '_countries']['country_iso_code_3'] = array(
-        'title' => t('ISO country code (3 characters)'),
-        'help' => t('The @field of the @address of the order.', ['@field' => t('ISO country code'), '@address' => Unicode::strtolower($address)]),
-        'field' => array(
-          'id' => 'standard',
-          'click sortable' => TRUE,
-        ),
-        'sort' => array(
-          'id' => 'standard',
-        ),
-        'filter' => array(
-          'id' => 'string',
-        ),
-      );
-
-      $data[$prefix . '_zones']['table']['group'] = $group;
-      $data[$prefix . '_zones']['table']['join']['uc_orders'] = array(
-        'table' => 'uc_countries_zones',
-        'left_field' => $prefix . '_zone',
-        'field' => 'zone_id',
-      );
-      $data[$prefix . '_zones']['zone_name'] = array(
-        'title' => t('State/Province'),
-        'help' => t('The @field of the @address of the order.', ['@field' => t('state or province'), '@address' => Unicode::strtolower($address)]),
-        'field' => array(
-          'id' => 'standard',
-          'click sortable' => TRUE,
-        ),
-        'sort' => array(
-          'id' => 'standard',
-        ),
-        'filter' => array(
-          'id' => 'in_operator',
-          'real field' => 'zone_code',
-          'options callback' => 'Drupal\uc_country\Controller\CountryController::zoneOptionsCallback',
-        ),
-      );
-      $data[$prefix . '_zones']['zone_code'] = array(
-        'title' => t('State/Province code'),
-        'help' => t('The @field of the @address of the order.', ['@field' => t('state or province code'), '@address' => Unicode::strtolower($address)]),
-        'field' => array(
-          'id' => 'standard',
-          'click sortable' => TRUE,
-        ),
-        'sort' => array(
-          'id' => 'standard',
-        ),
-        'filter' => array(
-          'id' => 'string',
-        ),
-      );
-    }
+      ),
+    );
 
     $data['uc_orders']['total_weight'] = array(
       'title' => t('Total weight'),
@@ -330,6 +137,20 @@ class OrderViewsData extends EntityViewsData {
       ),
     );
 
+    // Expose the uid as a relationship to users.
+    $data['users_field_data']['uc_orders'] = array(
+      'title' => t('Orders'),
+      'help' => t('Relate a user to the orders they have placed. This relationship will create one record for each order placed by the user.'),
+      'relationship' => array(
+        'title' => t('Order'),
+        'label' => t('Order'),
+        'base' => 'uc_orders',
+        'base field' => 'uid',
+        'relationship field' => 'uid',
+        'id' => 'standard',
+      ),
+    );
+
     // Ordered products.
     // Get the standard EntityAPI Views data table.
     // $data['uc_order_products'] =  entity_views_table_definition('uc_order_product');
diff --git a/uc_order/src/Plugin/views/field/Id.php b/uc_order/src/Plugin/views/field/Id.php
deleted file mode 100644
index 1645cd1..0000000
--- a/uc_order/src/Plugin/views/field/Id.php
+++ /dev/null
@@ -1,94 +0,0 @@
-<?php
-
-/**
- * @file
- * Contains \Drupal\uc_order\Plugin\views\field\Id.
- */
-
-namespace Drupal\uc_order\Plugin\views\field;
-
-use Drupal\Core\Form\FormStateInterface;
-use Drupal\views\Plugin\views\field\FieldPluginBase;
-use Drupal\views\Plugin\views\display\DisplayPluginBase;
-use Drupal\views\ResultRow;
-use Drupal\views\ViewExecutable;
-
-/**
- * Field handler to provide simple renderer that allows linking to an order.
- *
- * @ingroup views_field_handlers
- *
- * @ViewsField("uc_order_id")
- */
-class Id extends FieldPluginBase {
-
-  /**
-   * Override init function to provide generic option to link to user.
-   */
-  public function init(ViewExecutable $view, DisplayPluginBase $display, array &$options = NULL) {
-    parent::init($view, $display, $options);
-    if (!empty($this->options['link_to_order'])) {
-      $this->additional_fields['order_id'] = array('table' => 'uc_orders', 'field' => 'order_id');
-      $this->additional_fields['uid'] = array('table' => 'uc_orders', 'field' => 'uid');
-    }
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  protected function defineOptions() {
-    $options = parent::defineOptions();
-    $options['link_to_order'] = array('default' => FALSE, 'bool' => TRUE);
-    return $options;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function buildOptionsForm(&$form, FormStateInterface $form_state) {
-    $form['link_to_order'] = array(
-      '#title' => t('Link this field to the order view page'),
-      '#description' => t("Enable to override this field's links."),
-      '#type' => 'checkbox',
-      '#default_value' => $this->options['link_to_order'],
-    );
-    parent::buildOptionsForm($form, $form_state);
-  }
-
-  /**
-   * Renders whatever the data is as a link to the order.
-   *
-   * Data should be made XSS safe prior to calling this function.
-   */
-  protected function render_link($data, $values) {
-    $account = \Drupal::currentUser();
-    if (!empty($this->options['link_to_order'])) {
-      $this->options['alter']['make_link'] = FALSE;
-
-      if ($account->hasPermission('view all orders')) {
-        $path = 'admin/store/orders/' . $this->getValue($values, 'order_id');
-      }
-      elseif ($account->hasPermission('view own orders') && $this->getValue($values, 'uid') == $GLOBALS['user']->id()) {
-        $path = 'user/' . $GLOBALS['user']->id() . '/orders/' . $this->getValue($values, 'order_id');
-      }
-      else {
-        $path = FALSE;
-      }
-
-      if ($path && $data !== NULL && $data !== '') {
-        $this->options['alter']['make_link'] = TRUE;
-        $this->options['alter']['path'] = $path;
-      }
-    }
-    return $data;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function render(ResultRow $values) {
-    $value = $this->getValue($values);
-    return $this->render_link($this->sanitizeValue($value), $values);
-  }
-
-}
diff --git a/uc_order/src/Plugin/views/field/Status.php b/uc_order/src/Plugin/views/field/Status.php
deleted file mode 100644
index 5fe2689..0000000
--- a/uc_order/src/Plugin/views/field/Status.php
+++ /dev/null
@@ -1,31 +0,0 @@
-<?php
-
-/**
- * @file
- * Contains \Drupal\uc_order\Plugin\views\field\Status.
- */
-
-namespace Drupal\uc_order\Plugin\views\field;
-
-use Drupal\uc_order\Entity\OrderStatus;
-use Drupal\views\Plugin\views\field\FieldPluginBase;
-use Drupal\views\ResultRow;
-
-/**
- * Field handler to provide order status.
- *
- * @ingroup views_field_handlers
- *
- * @ViewsField("uc_order_status")
- */
-class Status extends FieldPluginBase {
-
-  /**
-   * {@inheritdoc}
-   */
-  public function render(ResultRow $values) {
-    $status = OrderStatus::load($this->getValue($values));
-    return $this->sanitizeValue($status->getName());
-  }
-
-}
diff --git a/uc_order/src/Tests/CustomerAdminTest.php b/uc_order/src/Tests/CustomerAdminTest.php
new file mode 100644
index 0000000..bf32746
--- /dev/null
+++ b/uc_order/src/Tests/CustomerAdminTest.php
@@ -0,0 +1,72 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\uc_order\Tests\CustomerAdminTest.
+ */
+
+namespace Drupal\uc_order\Tests;
+
+use Drupal\uc_country\Entity\Country;
+use Drupal\uc_order\Entity\Order;
+use Drupal\uc_store\Tests\UbercartTestBase;
+
+/**
+ * Tests customer administration page functionality.
+ *
+ * @group Ubercart
+ */
+class CustomerAdminTest extends UbercartTestBase {
+
+  /**
+   * A user with permission to view customers.
+   *
+   * @var \Drupal\user\UserInterface
+   */
+  protected $adminUser;
+
+  /**
+   * A user created the order.
+   *
+   * @var \Drupal\user\UserInterface
+   */
+  protected $customer;
+
+  /**
+   * Modules to enable.
+   *
+   * @var array
+   */
+  public static $modules = array('views');
+
+  protected function setUp() {
+    parent::setUp();
+
+    $this->adminUser = $this->drupalCreateUser(array(
+      'access user profiles',
+      'view customers',
+    ));
+    $this->customer = $this->drupalCreateUser();
+  }
+
+  /**
+   * Tests customer overview.
+   */
+  public function testCustomerAdminPages() {
+    $this->drupalLogin($this->adminUser);
+
+    $country = Country::load('US');
+    Order::create(array(
+      'uid' => $this->customer->id(),
+      'billing_country' => $country->id(),
+      'billing_zone' => 'AK',
+    ))->save();
+
+    $this->drupalGet('admin/store/customers/view');
+    $this->assertResponse(200);
+    $this->assertLinkByHref('user/' . $this->customer->id());
+    $this->assertText($country->getZones()['AK']);
+    $this->assertText($country->label());
+  }
+
+}
diff --git a/uc_store/src/Tests/UbercartTestBase.php b/uc_store/src/Tests/UbercartTestBase.php
index bb58427..5d2c33a 100644
--- a/uc_store/src/Tests/UbercartTestBase.php
+++ b/uc_store/src/Tests/UbercartTestBase.php
@@ -53,9 +53,9 @@ abstract class UbercartTestBase extends WebTestBase {
   protected $product;
 
   /**
-   * Overrides WebTestBase::setUp().
+   * {@inheritdoc}
    */
-  public function setUp() {
+  protected function setUp() {
     parent::setUp();
 
     // Place the tabs and actions blocks as various tests use them.
