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..fa516a1
--- /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 = {
+ *     "number_integer",
+ *     "number_decimal",
+ *     "number_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..21cac12
--- /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 = {
+ *     "number_integer",
+ *     "number_decimal",
+ *     "number_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/uc_product.module b/uc_product/uc_product.module
index dd332c3..75b5d61 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('number_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() {
