diff --git a/shipping/uc_quote/lib/Drupal/uc_quote/Tests/QuoteTest.php b/shipping/uc_quote/lib/Drupal/uc_quote/Tests/QuoteTest.php
index 3820805..db84aa3 100644
--- a/shipping/uc_quote/lib/Drupal/uc_quote/Tests/QuoteTest.php
+++ b/shipping/uc_quote/lib/Drupal/uc_quote/Tests/QuoteTest.php
@@ -169,7 +169,7 @@ class QuoteTest extends UbercartTestBase {
     foreach (array($quote1, $quote2) as $quote) {
       $quote->amount = uc_currency_format($quote->base_rate + $quote->product_rate * $qty);
       $quote->option_text = $quote->label . ': ' . $quote->amount;
-      $quote->total = uc_currency_format($product->sell_price * $qty + $quote->base_rate + $quote->product_rate * $qty);
+      $quote->total = uc_currency_format($product->sell_price->value * $qty + $quote->base_rate + $quote->product_rate * $qty);
     }
 
     // Add product to cart, update qty, and go to checkout page.
diff --git a/uc_attribute/lib/Drupal/uc_attribute/Form/ProductAdjustmentsForm.php b/uc_attribute/lib/Drupal/uc_attribute/Form/ProductAdjustmentsForm.php
index e37eda0..b25d294 100644
--- a/uc_attribute/lib/Drupal/uc_attribute/Form/ProductAdjustmentsForm.php
+++ b/uc_attribute/lib/Drupal/uc_attribute/Form/ProductAdjustmentsForm.php
@@ -29,7 +29,7 @@ class ProductAdjustmentsForm extends FormBase {
     $nid = $node->id();
 
     // Populate table and such.
-    $model = $node->model;
+    $model = $node->model->value;
     $query = db_select('uc_product_attributes', 'pa');
     $query->leftJoin('uc_attributes', 'a', 'pa.aid = a.aid');
     $query->leftJoin('uc_attribute_options', 'ao', 'a.aid = ao.aid');
diff --git a/uc_attribute/lib/Drupal/uc_attribute/Tests/AttributeTest.php b/uc_attribute/lib/Drupal/uc_attribute/Tests/AttributeTest.php
index 0127fd5..c3a1caa 100644
--- a/uc_attribute/lib/Drupal/uc_attribute/Tests/AttributeTest.php
+++ b/uc_attribute/lib/Drupal/uc_attribute/Tests/AttributeTest.php
@@ -374,7 +374,7 @@ class AttributeTest extends UbercartTestBase {
     }
 
     $adjust_price = uc_currency_format($option->price * $qty);
-    $total_price = uc_currency_format(($product->sell_price + $option->price) * $qty);
+    $total_price = uc_currency_format(($product->sell_price->value + $option->price) * $qty);
 
     $raw = array(
       'none' => $option->name . '</option>',
@@ -705,7 +705,7 @@ class AttributeTest extends UbercartTestBase {
     uc_attribute_subject_save($attribute, 'product', $product->id(), TRUE);
 
     $this->drupalGet('node/' . $product->id() . '/edit/adjustments');
-    $this->assertText('Default product SKU: ' . $product->model, 'Default product SKU found');
+    $this->assertText('Default product SKU: ' . $product->model->value, 'Default product SKU found');
     $this->assertRaw('<th>' . $attribute->name . '</th>', 'Attribute name found');
     foreach ($attribute->options as $option) {
       $this->assertRaw('<td>' . $option->name . '</td>', 'Option name found');
@@ -741,7 +741,7 @@ class AttributeTest extends UbercartTestBase {
     $this->assertText($attribute->label . ' field is required', 'Required attribute message found.');
 
     // Cart display.
-    $price = uc_currency_format($product->sell_price + $option->price);
+    $price = uc_currency_format($product->sell_price->value + $option->price);
     $this->addToCart($product, array('attributes[' . $attribute->aid . ']' => $option->oid));
     $this->assertText($attribute->label . ': ' . $option->name, 'Attribute and selected option found in cart');
     $this->assertText($price, 'Adjusted price found in cart');
@@ -805,7 +805,7 @@ class AttributeTest extends UbercartTestBase {
 
       $this->addToCart($product, $edit);
       $this->assertText("$attribute->label: $option->name", t('Option selected on cart item.'));
-      $this->assertText(uc_currency_format($product->sell_price + $option->price), t('Product has adjusted price.'));
+      $this->assertText(uc_currency_format($product->sell_price->value + $option->price), t('Product has adjusted price.'));
     }
   }
 
diff --git a/uc_cart/lib/Drupal/uc_cart/Tests/CartBlockTest.php b/uc_cart/lib/Drupal/uc_cart/Tests/CartBlockTest.php
index eb0b4dc..721eb20 100644
--- a/uc_cart/lib/Drupal/uc_cart/Tests/CartBlockTest.php
+++ b/uc_cart/lib/Drupal/uc_cart/Tests/CartBlockTest.php
@@ -59,9 +59,9 @@ class CartBlockTest extends UbercartTestBase {
     $this->assertNoText('There are no products in your shopping cart.');
     $this->assertText('1 ×');
     $this->assertText($this->product->label());
-    $this->assertNoUniqueText(uc_currency_format($this->product->sell_price));
+    $this->assertNoUniqueText(uc_currency_format($this->product->sell_price->value));
     $this->assertText('1 Item');
-    $this->assertText('Total: ' . uc_currency_format($this->product->sell_price));
+    $this->assertText('Total: ' . uc_currency_format($this->product->sell_price->value));
     $this->assertLink('View cart');
     $this->assertLink('Checkout');
   }
diff --git a/uc_catalog/lib/Drupal/uc_catalog/Tests/CatalogTest.php b/uc_catalog/lib/Drupal/uc_catalog/Tests/CatalogTest.php
index 4fbf11d..265b03f 100644
--- a/uc_catalog/lib/Drupal/uc_catalog/Tests/CatalogTest.php
+++ b/uc_catalog/lib/Drupal/uc_catalog/Tests/CatalogTest.php
@@ -44,8 +44,8 @@ class CatalogTest extends UbercartTestBase {
     $this->clickLink($term->label());
     $this->assertTitle($term->label() . ' | Drupal');
     $this->assertLink($product->label(), 0, 'The product is listed in the catalog.');
-    $this->assertText($product->model, 'The product SKU is shown in the catalog.');
-    $this->assertText(uc_currency_format($product->sell_price), 'The product price is shown in the catalog.');
+    $this->assertText($product->model->value, 'The product SKU is shown in the catalog.');
+    $this->assertText(uc_currency_format($product->sell_price->value), 'The product price is shown in the catalog.');
 
     $this->drupalPostForm(NULL, array(), 'Add to cart');
     $this->assertText($product->label() . ' added to your shopping cart.');
diff --git a/uc_product/lib/Drupal/uc_product/Plugin/Field/FieldFormatter/UcPriceFormatter.php b/uc_product/lib/Drupal/uc_product/Plugin/Field/FieldFormatter/UcPriceFormatter.php
new file mode 100644
index 0000000..d57b5d7
--- /dev/null
+++ b/uc_product/lib/Drupal/uc_product/Plugin/Field/FieldFormatter/UcPriceFormatter.php
@@ -0,0 +1,41 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\uc_product\Plugin\Field\FieldFormatter\UcPriceFormatter.
+ */
+
+namespace Drupal\uc_product\Plugin\Field\FieldFormatter;
+
+use Drupal\Core\Field\FormatterBase;
+use Drupal\Core\Field\FieldItemListInterface;
+
+/**
+ * Plugin implementation of the Ubercart price formatter.
+ *
+ * @FieldFormatter(
+ *   id = "uc_price",
+ *   label = @Translation("Ubercart price"),
+ *   field_types = {
+ *     "integer",
+ *     "decimal",
+ *     "float"
+ *   }
+ * )
+ */
+class UcPriceFormatter extends FormatterBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function viewElements(FieldItemListInterface $items) {
+    $elements = array();
+
+    foreach ($items as $delta => $item) {
+      $elements[$delta] = array('#markup' => uc_currency_format($item->value));
+    }
+
+    return $elements;
+  }
+
+}
diff --git a/uc_product/lib/Drupal/uc_product/Plugin/Field/FieldWidget/UcPriceWidget.php b/uc_product/lib/Drupal/uc_product/Plugin/Field/FieldWidget/UcPriceWidget.php
new file mode 100644
index 0000000..29350d5
--- /dev/null
+++ b/uc_product/lib/Drupal/uc_product/Plugin/Field/FieldWidget/UcPriceWidget.php
@@ -0,0 +1,50 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\uc_product\Plugin\Field\FieldWidget\UcPriceWidget.
+ */
+
+namespace Drupal\uc_product\Plugin\Field\FieldWidget;
+
+use Drupal\Core\Field\FieldItemListInterface;
+use Drupal\Core\Field\WidgetBase;
+use Symfony\Component\Validator\ConstraintViolationInterface;
+
+/**
+ * Plugin implementation of the Ubercart price widget.
+ *
+ * @FieldWidget(
+ *   id = "uc_price",
+ *   label = @Translation("Ubercart price"),
+ *   field_types = {
+ *     "integer",
+ *     "decimal",
+ *     "float"
+ *   }
+ * )
+ */
+class UcPriceWidget extends WidgetBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function formElement(FieldItemListInterface $items, $delta, array $element, array &$form, array &$form_state) {
+    $value = isset($items[$delta]->value) ? $items[$delta]->value : NULL;
+
+    $element += array(
+      '#type' => 'uc_price',
+      '#default_value' => $value,
+    );
+
+    return array('value' => $element);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function errorElement(array $element, ConstraintViolationInterface $error, array $form, array &$form_state) {
+    return $element['value'];
+  }
+
+}
diff --git a/uc_product/lib/Drupal/uc_product/Tests/ProductTest.php b/uc_product/lib/Drupal/uc_product/Tests/ProductTest.php
index f8d818b..9783125 100644
--- a/uc_product/lib/Drupal/uc_product/Tests/ProductTest.php
+++ b/uc_product/lib/Drupal/uc_product/Tests/ProductTest.php
@@ -34,13 +34,13 @@ class ProductTest extends UbercartTestBase {
     $this->assertText('Title');
     $this->assertText($this->product->getTitle());
     $this->assertText('Price');
-    $this->assertText(uc_currency_format($this->product->sell_price));
+    $this->assertText(uc_currency_format($this->product->sell_price->value));
   }
 
   public function testProductNodeForm() {
     $this->drupalGet('node/add/product');
 
-    foreach (array('model', 'list_price', 'cost', 'sell_price', 'shippable', 'weight', 'weight_units', 'dim_length', 'dim_width', 'dim_height', 'length_units', 'pkg_qty', 'ordering') as $field) {
+    foreach (array('model[0][value]', 'list_price', 'cost', 'sell_price[0][value]', 'shippable', 'weight', 'weight_units', 'dim_length', 'dim_width', 'dim_height', 'length_units', 'pkg_qty', 'ordering') as $field) {
       $this->assertFieldByName($field, NULL);
     }
     $this->assertFieldByName('files[uc_product_image_0][]', NULL);
@@ -52,10 +52,10 @@ class ProductTest extends UbercartTestBase {
     $edit = array(
       $title_key => $this->randomName(32),
       $body_key => $this->randomName(64),
-      'model' => $this->randomName(8),
+      'model[0][value]' => $this->randomName(8),
       'list_price' => mt_rand(1, 200),
       'cost' => mt_rand(0, 100),
-      'sell_price' => mt_rand(1, 150),
+      'sell_price[0][value]' => mt_rand(1, 150),
       'shippable' => mt_rand(0, 1),
       'weight' => mt_rand(1, 50),
       'weight_units' => array_rand(array(
@@ -79,10 +79,10 @@ class ProductTest extends UbercartTestBase {
 
     $this->assertText(t('Product @title has been created.', array('@title' => $edit[$title_key])), 'Product created.');
     $this->assertText($edit[$body_key], 'Product body found.');
-    $this->assertText($edit['model'], 'Product model found.');
+    $this->assertText($edit['model[0][value]'], 'Product model found.');
     $this->assertText(uc_currency_format($edit['list_price']), 'Product list price found.');
     $this->assertText(uc_currency_format($edit['cost']), 'Product cost found.');
-    $this->assertNoUniqueText(uc_currency_format($edit['sell_price']), 'Product sell price found.');
+    $this->assertNoUniqueText(uc_currency_format($edit['sell_price[0][value]']), 'Product sell price found.');
     $this->assertText(uc_weight_format($edit['weight'], $edit['weight_units']), 'Product weight found.');
     $this->assertText(uc_length_format($edit['dim_length'], $edit['length_units']), 'Product length found.');
     $this->assertText(uc_length_format($edit['dim_width'], $edit['length_units']), 'Product width found.');
@@ -95,10 +95,10 @@ class ProductTest extends UbercartTestBase {
     $edit = array(
       $title_key => $this->randomName(32),
       $body_key => $this->randomName(64),
-      'model' => $this->randomName(8),
+      'model[0][value]' => $this->randomName(8),
       'list_price' => mt_rand(1, 200),
       'cost' => mt_rand(0, 100),
-      'sell_price' => mt_rand(1, 150),
+      'sell_price[0][value]' => mt_rand(1, 150),
       'shippable' => mt_rand(0, 1),
       'weight' => mt_rand(1, 50),
       'weight_units' => array_rand(array(
@@ -122,10 +122,10 @@ class ProductTest extends UbercartTestBase {
 
     $this->assertText(t('Product @title has been updated.', array('@title' => $edit[$title_key])), 'Product updated.');
     $this->assertText($edit[$body_key], 'Updated product body found.');
-    $this->assertText($edit['model'], 'Updated product model found.');
+    $this->assertText($edit['model[0][value]'], 'Updated product model found.');
     $this->assertText(uc_currency_format($edit['list_price']), 'Updated product list price found.');
     $this->assertText(uc_currency_format($edit['cost']), 'Updated product cost found.');
-    $this->assertNoUniqueText(uc_currency_format($edit['sell_price']), 'Updated product sell price found.');
+    $this->assertNoUniqueText(uc_currency_format($edit['sell_price[0][value]']), 'Updated product sell price found.');
     $this->assertText(uc_weight_format($edit['weight'], $edit['weight_units']), 'Product weight found.');
     $this->assertText(uc_length_format($edit['dim_length'], $edit['length_units']), 'Product length found.');
     $this->assertText(uc_length_format($edit['dim_width'], $edit['length_units']), 'Product width found.');
diff --git a/uc_product/uc_product.module b/uc_product/uc_product.module
index dd332c3..975296f 100644
--- a/uc_product/uc_product.module
+++ b/uc_product/uc_product.module
@@ -10,6 +10,8 @@
 
 use Drupal\Core\Ajax\AjaxResponse;
 use Drupal\Core\Entity\EntityInterface;
+use Drupal\Core\Entity\EntityTypeInterface;
+use Drupal\Core\Field\FieldDefinition;
 use Drupal\Core\Field\FieldDefinitionInterface;
 use Drupal\entity\Entity\EntityViewDisplay;
 use Drupal\node\NodeInterface;
@@ -158,15 +160,15 @@ function uc_product_form_node_form_alter(&$form, &$form_state) {
       '#weight' => 0,
       '#open' => TRUE,
     );
-    $form['base']['model'] = array(
-      '#type' => 'textfield',
-      '#title' => t('SKU'),
-      '#required' => TRUE,
-      '#default_value' => $node->model,
-      '#description' => t('Product SKU/model.'),
-      '#weight' => 0,
-      '#size' => 32,
-    );
+//    $form['base']['model'] = array(
+//      '#type' => 'textfield',
+//      '#title' => t('SKU'),
+//      '#required' => TRUE,
+//      '#default_value' => $node->model,
+//      '#description' => t('Product SKU/model.'),
+//      '#weight' => 0,
+//      '#size' => 32,
+//    );
 
     $form['base']['prices'] = array(
       '#type' => 'container',
@@ -188,14 +190,14 @@ function uc_product_form_node_form_alter(&$form, &$form_state) {
       '#description' => t("Your store's cost."),
       '#weight' => 1,
     );
-    $form['base']['prices']['sell_price'] = array(
-      '#type' => 'uc_price',
-      '#title' => t('Sell price'),
-      '#required' => TRUE,
-      '#default_value' => $node->sell_price,
-      '#description' => t('Customer purchase price.'),
-      '#weight' => 2,
-    );
+//    $form['base']['prices']['sell_price'] = array(
+//      '#type' => 'uc_price',
+//      '#title' => t('Sell price'),
+//      '#required' => TRUE,
+//      '#default_value' => $node->sell_price,
+//      '#description' => t('Customer purchase price.'),
+//      '#weight' => 2,
+//    );
 
     $form['base']['shippable'] = array(
       '#type' => 'checkbox',
@@ -316,6 +318,7 @@ function uc_product_form_node_form_alter(&$form, &$form_state) {
     );
 
     $form['#entity_builders'][] = 'uc_product_node_builder';
+    $form['#pre_render'][] = 'uc_product_pre_render';
   }
 }
 
@@ -325,10 +328,10 @@ function uc_product_form_node_form_alter(&$form, &$form_state) {
  * @todo: Remove this in favor of an entity field.
  */
 function uc_product_node_builder($entity_type, $entity, &$form, &$form_state) {
-  $entity->model = $form_state['values']['model'];
+//  $entity->model = $form_state['values']['model'];
   $entity->list_price = $form_state['values']['list_price'];
   $entity->cost = $form_state['values']['cost'];
-  $entity->sell_price = $form_state['values']['sell_price'];
+//  $entity->sell_price = $form_state['values']['sell_price'];
   $entity->weight = $form_state['values']['weight'];
   $entity->weight_units = $form_state['values']['weight_units'];
   $entity->length = $form_state['values']['dim_length'];
@@ -342,6 +345,21 @@ function uc_product_node_builder($entity_type, $entity, &$form, &$form_state) {
 }
 
 /**
+ * Pre-render callback to move product fields into a fieldset.
+ */
+function uc_product_pre_render($element) {
+  if (isset($element['model'])) {
+    $element['base']['model'] = $element['model'];
+    unset($element['model']);
+  }
+  if (isset($element['sell_price'])) {
+    $element['base']['prices']['sell_price'] = $element['sell_price'];
+    unset($element['sell_price']);
+  }
+  return $element;
+}
+
+/**
  * Implements hook_node_prepare_form().
  */
 function uc_product_node_prepare_form(NodeInterface $node, $form_display, $operation, array &$form_state) {
@@ -351,10 +369,10 @@ function uc_product_node_prepare_form(NodeInterface $node, $form_display, $opera
 
   $settings = entity_load('node_type', $node->getType())->getModuleSettings('uc_product');
   $defaults = array(
-    'model' => '',
+//    'model' => '',
     'list_price' => 0,
     'cost' => 0,
-    'sell_price' => 0,
+//    'sell_price' => 0,
     'weight' => 0,
     'weight_units' => \Drupal::config('uc_store.settings')->get('units.weight'),
     'length' => 0,
@@ -387,7 +405,12 @@ function uc_product_node_insert($node) {
   $record->nid = $node->id();
   $fields = array('model', 'list_price', 'cost', 'sell_price', 'weight', 'weight_units', 'length', 'width', 'height', 'length_units', 'pkg_qty', 'default_qty', 'ordering', 'shippable');
   foreach ($fields as $name) {
-    $record->$name = $node->$name;
+    if (is_object($node->$name)) {
+      $record->$name = $node->$name->value;
+    }
+    else {
+      $record->$name = $node->$name;
+    }
   }
   drupal_write_record('uc_products', $record);
 }
@@ -405,7 +428,12 @@ function uc_product_node_update($node) {
   $record->nid = $node->id();
   $fields = array('model', 'list_price', 'cost', 'sell_price', 'weight', 'weight_units', 'length', 'width', 'height', 'length_units', 'pkg_qty', 'default_qty', 'ordering', 'shippable');
   foreach ($fields as $name) {
-    $record->$name = $node->$name;
+    if (is_object($node->$name)) {
+      $record->$name = $node->$name->value;
+    }
+    else {
+      $record->$name = $node->$name;
+    }
   }
   if ($node->isNewRevision()) {
     drupal_write_record('uc_products', $record);
@@ -432,7 +460,7 @@ function uc_product_node_load($nodes) {
       foreach ($node as $field => $value) {
         $nodes[$node->nid]->$field = $value;
       }
-      $nodes[$node->nid]->price = $nodes[$node->nid]->sell_price;
+      $nodes[$node->nid]->price = $nodes[$node->nid]->sell_price->value;
     }
   }
 }
@@ -600,11 +628,11 @@ function uc_product_view_product(EntityInterface $node, EntityViewDisplay $displ
       ),
     ),
   );
-  $node->content['model'] = array(
-    '#theme' => 'uc_product_model',
-    '#model' => $variant->model,
-    '#view_mode' => $view_mode,
-  );
+//  $node->content['model'] = array(
+//    '#theme' => 'uc_product_model',
+//    '#model' => $variant->model,
+//    '#view_mode' => $view_mode,
+//  );
   $node->content['list_price'] = array(
     '#theme' => 'uc_product_price',
     '#title' => t('List price:'),
@@ -627,16 +655,16 @@ function uc_product_view_product(EntityInterface $node, EntityViewDisplay $displ
     ),
     '#access' => \Drupal::currentUser()->hasPermission('administer products'),
   );
-  $node->content['sell_price'] = array(
-    '#theme' => 'uc_product_price',
-    '#title' => t('Price:'),
-    '#value' => $variant->sell_price,
-    '#attributes' => array(
-      'class' => array(
-        'sell-price',
-      ),
-    ),
-  );
+//  $node->content['sell_price'] = array(
+//    '#theme' => 'uc_product_price',
+//    '#title' => t('Price:'),
+//    '#value' => $variant->sell_price,
+//    '#attributes' => array(
+//      'class' => array(
+//        'sell-price',
+//      ),
+//    ),
+//  );
   $node->content['weight'] = array(
     '#theme' => 'uc_product_weight',
     '#amount' => $variant->weight,
@@ -779,11 +807,11 @@ function uc_product_field_extra_fields() {
           'description' => t('High-visibility sell price.'),
           'weight' => -1,
         ),
-        'model' => array(
-          'label' => t('SKU'),
-          'description' => t('Product SKU/model.'),
-          'weight' => 0,
-        ),
+//        'model' => array(
+//          'label' => t('SKU'),
+//          'description' => t('Product SKU/model.'),
+//          'weight' => 0,
+//        ),
         'list_price' => array(
           'label' => t('List price'),
           'description' => t('The listed MSRP.'),
@@ -794,11 +822,11 @@ function uc_product_field_extra_fields() {
           'description' => t("Your store's cost."),
           'weight' => 3,
         ),
-        'sell_price' => array(
-          'label' => t('Sell price'),
-          'description' => t('Customer purchase price.'),
-          'weight' => 4,
-        ),
+//        'sell_price' => array(
+//          'label' => t('Sell price'),
+//          'description' => t('Customer purchase price.'),
+//          'weight' => 4,
+//        ),
         'weight' => array(
           'label' => t('Weight'),
           'description' => t('Physical weight (lbs, kg, etc.).'),
@@ -822,6 +850,55 @@ function uc_product_field_extra_fields() {
 }
 
 /**
+ * Implements hook_entity_bundle_field_info().
+ */
+function uc_product_entity_bundle_field_info(EntityTypeInterface $entity_type, $bundle, array $base_field_definitions) {
+  if ($entity_type->id() == 'node' && uc_product_is_product($bundle)) {
+    $fields['model'] = FieldDefinition::create('string')
+      ->setLabel(t('SKU'))
+      ->setDescription(t('Product SKU/model.'))
+      ->setRequired(TRUE)
+      ->setSettings(array(
+        'default_value' => '',
+        'max_length' => 255,
+      ))
+      ->setDisplayOptions('form', array(
+        'type' => 'string',
+        'weight' => 0,
+        'settings' => array(
+          'size' => 32,
+        ),
+      ))
+      ->setDisplayOptions('view', array(
+        'type' => 'string',
+        'label' => 'inline',
+        'weight' => 0,
+      ))
+      ->setDisplayConfigurable('view', TRUE);
+
+    $fields['sell_price'] = FieldDefinition::create('float')
+      ->setLabel(t('Sell price'))
+      ->setDescription(t('Customer purchase price.'))
+      ->setRequired(TRUE)
+      ->setSettings(array(
+        'default_value' => '0.00',
+      ))
+      ->setDisplayOptions('form', array(
+        'type' => 'uc_price',
+        'weight' => 2,
+      ))
+      ->setDisplayOptions('view', array(
+        'type' => 'uc_price',
+        'label' => 'inline',
+        'weight' => 4,
+      ))
+      ->setDisplayConfigurable('view', TRUE);
+
+    return $fields;
+  }
+}
+
+/**
  * Implements hook_uc_product_types().
  */
 function uc_product_uc_product_types() {
diff --git a/uc_product_kit/lib/Drupal/uc_product_kit/Tests/ProductKitTest.php b/uc_product_kit/lib/Drupal/uc_product_kit/Tests/ProductKitTest.php
index 44a082f..dfbc5e2 100644
--- a/uc_product_kit/lib/Drupal/uc_product_kit/Tests/ProductKitTest.php
+++ b/uc_product_kit/lib/Drupal/uc_product_kit/Tests/ProductKitTest.php
@@ -60,7 +60,7 @@ class ProductKitTest extends UbercartTestBase {
     $this->assertText('1 × ' . $products[0]->label(), 'Product 1 title found.');
     $this->assertText('1 × ' . $products[1]->label(), 'Product 2 title found.');
     $this->assertText('1 × ' . $products[2]->label(), 'Product 3 title found.');
-    $total = $products[0]->sell_price + $products[1]->sell_price + $products[2]->sell_price;
+    $total = $products[0]->sell_price->value + $products[1]->sell_price->value + $products[2]->sell_price->value;
     $this->assertText(uc_currency_format($total), 'Product kit total found.');
     $this->assertFieldByName('qty', $edit['default_qty']);
   }
@@ -109,7 +109,7 @@ class ProductKitTest extends UbercartTestBase {
     $this->drupalPostForm('node/' . $kit->id() . '/edit', $edit, 'Save');
 
     // Check the discounted total.
-    $total = $products[0]->sell_price + $products[1]->sell_price + $products[2]->sell_price;
+    $total = $products[0]->sell_price->value + $products[1]->sell_price->value + $products[2]->sell_price->value;
     $total += array_sum($discounts);
     $this->assertText(uc_currency_format($total), 'Discounted product kit total found.');
 
@@ -121,7 +121,7 @@ class ProductKitTest extends UbercartTestBase {
     $this->assertFieldByName('items[' . $products[2]->id() . '][discount]', $discounts[2]);
 
     // Set the kit total.
-    $total = 2 * ($products[0]->sell_price + $products[1]->sell_price + $products[2]->sell_price);
+    $total = 2 * ($products[0]->sell_price->value + $products[1]->sell_price->value + $products[2]->sell_price->value);
     $this->drupalPostForm('node/' . $kit->id() . '/edit', array('kit_total' => $total), 'Save');
 
     // Check the fixed total.
@@ -130,9 +130,9 @@ class ProductKitTest extends UbercartTestBase {
     // Check the discounts on the edit page.
     $this->drupalGet('node/' . $kit->id() . '/edit');
     $this->assertFieldByName('kit_total', $total);
-    $this->assertFieldByName('items[' . $products[0]->id() . '][discount]', $products[0]->sell_price);
-    $this->assertFieldByName('items[' . $products[1]->id() . '][discount]', $products[1]->sell_price);
-    $this->assertFieldByName('items[' . $products[2]->id() . '][discount]', $products[2]->sell_price);
+    $this->assertFieldByName('items[' . $products[0]->id() . '][discount]', $products[0]->sell_price->value);
+    $this->assertFieldByName('items[' . $products[1]->id() . '][discount]', $products[1]->sell_price->value);
+    $this->assertFieldByName('items[' . $products[2]->id() . '][discount]', $products[2]->sell_price->value);
   }
 
   public function testProductKitMutability() {
@@ -171,7 +171,7 @@ class ProductKitTest extends UbercartTestBase {
     $this->assertNoText($products[1]->label(), 'Product 2 title not shown.');
     $this->assertNoText($products[2]->label(), 'Product 3 title not shown.');
 
-    $total = $products[0]->sell_price + $products[1]->sell_price + $products[2]->sell_price;
+    $total = $products[0]->sell_price->value + $products[1]->sell_price->value + $products[2]->sell_price->value;
     $this->assertText('Subtotal: ' . uc_currency_format($total), 'Product kit total found.');
 
     $qty = mt_rand(2, 10);
@@ -197,7 +197,7 @@ class ProductKitTest extends UbercartTestBase {
     $this->assertText($products[1]->label(), 'Product 2 title shown.');
     $this->assertText($products[2]->label(), 'Product 3 title shown.');
 
-    $total = $products[0]->sell_price + $products[1]->sell_price + $products[2]->sell_price;
+    $total = $products[0]->sell_price->value + $products[1]->sell_price->value + $products[2]->sell_price->value;
     $this->assertText('Subtotal: ' . uc_currency_format($total), 'Product kit total found.');
 
     $qty = mt_rand(2, 10);
@@ -223,7 +223,7 @@ class ProductKitTest extends UbercartTestBase {
     $this->assertText($products[1]->label(), 'Product 2 title shown.');
     $this->assertText($products[2]->label(), 'Product 3 title shown.');
 
-    $total = $products[0]->sell_price + $products[1]->sell_price + $products[2]->sell_price;
+    $total = $products[0]->sell_price->value + $products[1]->sell_price->value + $products[2]->sell_price->value;
     $this->assertText('Subtotal: ' . uc_currency_format($total), 'Product kit total found.');
 
     $qty = array(mt_rand(2, 10), mt_rand(2, 10), mt_rand(2, 10));
@@ -233,9 +233,9 @@ class ProductKitTest extends UbercartTestBase {
       'items[2][qty]' => $qty[2],
     );
     $this->drupalPostForm(NULL, $edit, 'Update cart');
-    $total = $products[0]->sell_price * $qty[0];
-    $total += $products[1]->sell_price * $qty[1];
-    $total += $products[2]->sell_price * $qty[2];
+    $total = $products[0]->sell_price->value * $qty[0];
+    $total += $products[1]->sell_price->value * $qty[1];
+    $total += $products[2]->sell_price->value * $qty[2];
     $this->assertText('Subtotal: ' . uc_currency_format($total), 'Updated product kit total found.');
 
     $this->drupalPostForm(NULL, array(), 'Remove');
diff --git a/uc_product_kit/uc_product_kit.module b/uc_product_kit/uc_product_kit.module
index 6d1add1..3cc5f56 100644
--- a/uc_product_kit/uc_product_kit.module
+++ b/uc_product_kit/uc_product_kit.module
@@ -194,10 +194,10 @@ function uc_product_kit_node_insert($node) {
 
     drupal_write_record('uc_product_kits', $kit);
 
-    $obj->model .= $product->model . ' / ';
+    $obj->model .= $product->model->value . ' / ';
     $obj->list_price += $product->list_price;
     $obj->cost += $product->cost;
-    $obj->sell_price += $product->sell_price;
+    $obj->sell_price += $product->sell_price->value;
     $obj->weight += $product->weight * uc_weight_conversion($product->weight_units, $obj->weight_units);
     if ($product->shippable) {
       $obj->shippable = TRUE;
@@ -298,7 +298,7 @@ function uc_product_kit_node_update($node) {
         $node->items[$nid]['discount'] = $product->discount;
         $node->items[$nid]['ordering'] = $product->ordering;
       }
-      $base_price += $product->sell_price * $node->items[$nid]['qty'];
+      $base_price += $product->sell_price->value * $node->items[$nid]['qty'];
     }
   }
 
@@ -323,7 +323,7 @@ function uc_product_kit_node_update($node) {
     if ($override_discounts) {
       // After all the algebra that went into finding this formula, it's
       // surprising how simple it is.
-      $discount = ($node->kit_total - $base_price) * $product->sell_price / $base_price;
+      $discount = ($node->kit_total - $base_price) * $product->sell_price->value / $base_price;
     }
     elseif (isset($node->items[$nid]['discount'])) {
       $discount = (float) $node->items[$nid]['discount'];
@@ -350,13 +350,13 @@ function uc_product_kit_node_update($node) {
     // Discounts are always saved, but they are only applied if the kit can't
     // be changed by the customer.
     if ($node->mutable != UC_PRODUCT_KIT_MUTABLE) {
-      $product->sell_price += $discount;
+      $product->sell_price->value += $discount;
     }
 
-    $obj->model .= $product->model . ' / ';
+    $obj->model .= $product->model->value . ' / ';
     $obj->list_price += $product->list_price * $product->qty;
     $obj->cost += $product->cost * $product->qty;
-    $obj->sell_price += $product->sell_price * $product->qty;
+    $obj->sell_price += $product->sell_price->value * $product->qty;
     $obj->weight += $product->weight * $product->qty * uc_weight_conversion($product->weight_units, $obj->weight_units);
     if ($product->shippable) {
       $obj->shippable = TRUE;
@@ -608,12 +608,12 @@ function uc_product_kit_form_node_form_alter(&$form, &$form_state) {
         '#type' => 'textfield',
         '#title' => t('Discount'),
         '#title_display' => 'invisible',
-        '#field_prefix' => uc_currency_format($product->sell_price) . ' + ',
+        '#field_prefix' => uc_currency_format($product->sell_price->value) . ' + ',
         '#default_value' => isset($product->discount) ? number_format($product->discount, 3, '.', '') : 0,
         '#size' => 5,
       );
-      $total += $product->sell_price * $product->qty;
-      $base_total += $product->sell_price * $product->qty;
+      $total += $product->sell_price->value * $product->qty;
+      $base_total += $product->sell_price->value * $product->qty;
       if (isset($product->discount)) {
         $total += $product->discount * $product->qty;
       }
@@ -623,7 +623,7 @@ function uc_product_kit_form_node_form_alter(&$form, &$form_state) {
       // to keep the same total.
       $total = $base_total;
       foreach ($node->products as $i => $product) {
-        $discount = ($node->sell_price - $base_total) * $product->sell_price / $base_total;
+        $discount = ($node->sell_price - $base_total) * $product->sell_price->value / $base_total;
         $total += $discount * $product->qty;
         $form['base']['items'][$i]['discount']['#default_value'] = number_format($discount, 3, '.', '');
       }
diff --git a/uc_stock/lib/Drupal/uc_stock/Tests/StockTest.php b/uc_stock/lib/Drupal/uc_stock/Tests/StockTest.php
index 22410a6..e60e5ea 100644
--- a/uc_stock/lib/Drupal/uc_stock/Tests/StockTest.php
+++ b/uc_stock/lib/Drupal/uc_stock/Tests/StockTest.php
@@ -40,13 +40,14 @@ class StockTest extends UbercartTestBase {
   }
 
   public function testProductStock() {
-    $prefix = 'stock[' . $this->product->model . ']';
+    $sku = $this->product->model->value;
+    $prefix = 'stock[' . $sku . ']';
 
     $this->drupalGet('node/' . $this->product->id() . '/edit/stock');
     $this->assertText($this->product->label());
-    $this->assertText($this->product->model, 'Product SKU found.');
+    $this->assertText($this->product->model->value, 'Product SKU found.');
 
-    $this->assertNoFieldChecked('edit-stock-' . strtolower($this->product->model) . '-active', 'Stock tracking is not active.');
+    $this->assertNoFieldChecked('edit-stock-' . strtolower($sku) . '-active', 'Stock tracking is not active.');
     $this->assertFieldByName($prefix . '[stock]', '0', 'Default stock level found.');
     $this->assertFieldByName($prefix . '[threshold]', '0', 'Default stock threshold found.');
 
@@ -58,17 +59,17 @@ class StockTest extends UbercartTestBase {
     );
     $this->drupalPostForm(NULL, $edit, t('Save changes'));
     $this->assertText('Stock settings saved.');
-    $this->assertTrue(uc_stock_is_active($this->product->model));
-    $this->assertEqual($stock, uc_stock_level($this->product->model));
+    $this->assertTrue(uc_stock_is_active($sku));
+    $this->assertEqual($stock, uc_stock_level($sku));
 
     $stock = rand(1, 1000);
-    uc_stock_set($this->product->model, $stock);
+    uc_stock_set($sku, $stock);
     $this->drupalGet('node/' . $this->product->id() . '/edit/stock');
     $this->assertFieldByName($prefix . '[stock]', (string)$stock, 'Set stock level found.');
   }
 
   public function testStockDecrement() {
-    $prefix = 'stock[' . $this->product->model . ']';
+    $prefix = 'stock[' . $this->product->model->value . ']';
     $stock = rand(100, 1000);
     $edit = array(
       $prefix . '[active]' => 1,
@@ -86,11 +87,11 @@ class StockTest extends UbercartTestBase {
     $this->addToCart($this->product, $edit);
     $this->checkout();
 
-    $this->assertEqual($stock - $qty, uc_stock_level($this->product->model));
+    $this->assertEqual($stock - $qty, uc_stock_level($this->product->model->value));
   }
 
   public function testStockThresholdMail() {
-    $prefix = 'stock[' . $this->product->model . ']';
+    $prefix = 'stock[' . $this->product->model->value . ']';
 
     $edit = array('uc_stock_threshold_notification' => 1);
     $this->drupalPostForm('admin/store/settings/stock', $edit, 'Save configuration');
@@ -111,7 +112,7 @@ class StockTest extends UbercartTestBase {
     $this->assertEqual($mail['to'], uc_store_email(), 'Threshold mail recipient is correct.');
     $this->assertTrue(strpos($mail['subject'], 'Stock threshold limit reached') !== FALSE, 'Threshold mail subject is correct.');
     $this->assertTrue(strpos($mail['body'], $this->product->label()) !== FALSE, 'Mail body contains product title.');
-    $this->assertTrue(strpos($mail['body'], $this->product->model) !== FALSE, 'Mail body contains SKU.');
+    $this->assertTrue(strpos($mail['body'], $this->product->model->value) !== FALSE, 'Mail body contains SKU.');
     $this->assertTrue(strpos($mail['body'], 'has reached ' . $qty) !== FALSE, 'Mail body contains quantity.');
   }
 }
diff --git a/uc_store/lib/Drupal/uc_store/Tests/UbercartTestBase.php b/uc_store/lib/Drupal/uc_store/Tests/UbercartTestBase.php
index 7e071d3..8c21148 100644
--- a/uc_store/lib/Drupal/uc_store/Tests/UbercartTestBase.php
+++ b/uc_store/lib/Drupal/uc_store/Tests/UbercartTestBase.php
@@ -91,6 +91,9 @@ abstract class UbercartTestBase extends WebTestBase {
       'shippable' => TRUE,
     );
 
+    $product['model'] = array(array('value' => $product['model']));
+    $product['sell_price'] = array(array('value' => $product['sell_price']));
+
     return $this->drupalCreateNode($product);
   }
 
diff --git a/uc_taxes/lib/Drupal/uc_taxes/Tests/StoredTaxesTest.php b/uc_taxes/lib/Drupal/uc_taxes/Tests/StoredTaxesTest.php
index cf40923..4c6e80a 100644
--- a/uc_taxes/lib/Drupal/uc_taxes/Tests/StoredTaxesTest.php
+++ b/uc_taxes/lib/Drupal/uc_taxes/Tests/StoredTaxesTest.php
@@ -37,7 +37,7 @@ class StoredTaxesTest extends UbercartTestBase {
 
   protected function assertTaxLineCorrect($line, $rate, $when) {
     $this->assertTrue($line, t('The tax line item was saved to the order ' . $when));
-    $this->assertTrue(number_format($rate * $this->product->sell_price, 2) == number_format($line['amount'], 2), t('Stored tax line item has the correct amount ' . $when));
+    $this->assertTrue(number_format($rate * $this->product->sell_price->value, 2) == number_format($line['amount'], 2), t('Stored tax line item has the correct amount ' . $when));
     $this->assertFieldByName('line_items[' . $line['line_item_id'] . '][li_id]', $line['line_item_id'], t('Found the tax line item ID ' . $when));
     $this->assertText($line['title'], t('Found the tax title ' . $when));
     $this->assertText(uc_currency_format($line['amount']), t('Tax display has the correct amount ' . $when));
@@ -79,14 +79,14 @@ class StoredTaxesTest extends UbercartTestBase {
       t('Viewed cart page: Billing pane has been displayed.')
     );
     $this->assertRaw($rate->name, t('Tax line item displayed.'));
-    $this->assertRaw(uc_currency_format($rate->rate * $this->product->sell_price), t('Correct tax amount displayed.'));
+    $this->assertRaw(uc_currency_format($rate->rate * $this->product->sell_price->value), t('Correct tax amount displayed.'));
 
     // Submit the checkout page.
     $edit = $this->populateCheckoutForm();
     $this->drupalPostForm('cart/checkout', $edit, t('Review order'));
     $this->assertRaw(t('Your order is almost complete.'));
     $this->assertRaw($rate->name, t('Tax line item displayed.'));
-    $this->assertRaw(uc_currency_format($rate->rate * $this->product->sell_price), t('Correct tax amount displayed.'));
+    $this->assertRaw(uc_currency_format($rate->rate * $this->product->sell_price->value), t('Correct tax amount displayed.'));
 
     // Complete the review page.
     $this->drupalPostForm(NULL, array(), t('Submit order'));
