diff --git a/modules/crm_core_contact/config/schema/crm_core_contact.schema.yml b/modules/crm_core_contact/config/schema/crm_core_contact.schema.yml
index 5ce7c66..630103b 100644
--- a/modules/crm_core_contact/config/schema/crm_core_contact.schema.yml
+++ b/modules/crm_core_contact/config/schema/crm_core_contact.schema.yml
@@ -17,8 +17,12 @@ crm_core_contact.type.*:
       type: boolean
       label: 'Whether or not this type is locked.'
     primary_fields:
-      type: sequence
+      type: mapping
       label: 'The fields the contact uses primarily'
-      sequence:
-        type: string
-        label: 'Field'
+      mapping:
+        email:
+          type: string
+        address:
+          type: string
+        phone:
+          type: string
diff --git a/modules/crm_core_contact/src/ContactTypeInterface.php b/modules/crm_core_contact/src/ContactTypeInterface.php
index dd640f6..b066066 100644
--- a/modules/crm_core_contact/src/ContactTypeInterface.php
+++ b/modules/crm_core_contact/src/ContactTypeInterface.php
@@ -2,10 +2,12 @@
 
 namespace Drupal\crm_core_contact;
 
+use Drupal\Core\Config\Entity\ConfigEntityInterface;
+
 /**
  * Defines methods for CRM Contact Type entities.
  */
-interface ContactTypeInterface {
+interface ContactTypeInterface extends ConfigEntityInterface {
 
   /**
    * Returns the human readable name of any or all contact types.
@@ -15,4 +17,12 @@ interface ContactTypeInterface {
    */
   public static function getNames();
 
+  /**
+   * Get the name of the field for a primary field.
+   *
+   * @return string|NULL
+   *   Name of the primary field, or NULL.
+   */
+  public function getPrimaryField($field);
+
 }
diff --git a/modules/crm_core_contact/src/Entity/Contact.php b/modules/crm_core_contact/src/Entity/Contact.php
index 2a6e1bc..9ea845f 100644
--- a/modules/crm_core_contact/src/Entity/Contact.php
+++ b/modules/crm_core_contact/src/Entity/Contact.php
@@ -248,9 +248,9 @@ class Contact extends ContentEntityBase implements ContactInterface {
    *   If the configured primary field does not exist.
    */
   public function getPrimaryField($field) {
-    $type = $this->get('type')->entity;
-    $name = empty($type->primary_fields[$field]) ? '' : $type->primary_fields[$field];
-    return $this->get($name);
+    /** @var \Drupal\crm_core_contact\ContactTypeInterface $contact_type */
+    $contact_type = $this->get('type')->entity;
+    return $this->get($contact_type->getPrimaryField($field));
   }
 
   /**
diff --git a/modules/crm_core_contact/src/Entity/ContactType.php b/modules/crm_core_contact/src/Entity/ContactType.php
index a67616a..d9fbe80 100644
--- a/modules/crm_core_contact/src/Entity/ContactType.php
+++ b/modules/crm_core_contact/src/Entity/ContactType.php
@@ -183,4 +183,11 @@ class ContactType extends ConfigEntityBundleBase implements ContactTypeInterface
     return $this;
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public function getPrimaryField($field) {
+    return isset($this->primary_fields[$field]) ? $this->primary_fields[$field] : NULL;
+  }
+
 }
diff --git a/modules/crm_core_contact/src/Form/ContactTypeForm.php b/modules/crm_core_contact/src/Form/ContactTypeForm.php
index f32240f..851497a 100644
--- a/modules/crm_core_contact/src/Form/ContactTypeForm.php
+++ b/modules/crm_core_contact/src/Form/ContactTypeForm.php
@@ -22,6 +22,13 @@ class ContactTypeForm extends EntityForm {
 
   /**
    * {@inheritdoc}
+   *
+   * @var \Drupal\crm_core_contact\ContactTypeInterface
+   */
+  protected $entity;
+
+  /**
+   * {@inheritdoc}
    */
   public function form(array $form, FormStateInterface $form_state) {
     $form = parent::form($form, $form_state);
@@ -58,9 +65,11 @@ class ContactTypeForm extends EntityForm {
 
     // Primary fields section.
     $form['primary_fields_container'] = array(
-      '#type' => 'fieldset',
+      '#type' => 'details',
       '#title' => $this->t('Primary Fields'),
       '#description' => $this->t('Primary fields are used to tell other modules what fields to use for common communications tasks such as sending an email, addressing an envelope, etc. Use the fields below to indicate the primary fields for this contact type.'),
+      '#open' => TRUE,
+      '#tree' => TRUE,
     );
 
     // @todo Move primary fields array to some hook. This Would allow extend this
@@ -69,10 +78,10 @@ class ContactTypeForm extends EntityForm {
 //    $primary_fields = variable_get('crm_core_contact_default_primary_fields', $default_primary_fields);
     $primary_fields = $default_primary_fields;
     $options = array();
-    if (isset($type->type)) {
+    if (!$this->entity->isNew()) {
       /* @var \Drupal\Core\Field\FieldDefinitionInterface[] $instances */
-      $instances = \Drupal::service('entity_field.manager')->getFieldDefinitions('crm_core_contact', $type->type);
-      $instances = isset($instances[$type->type]) ? $instances[$type->type] : array();
+      $instances = \Drupal::service('entity_field.manager')
+        ->getFieldDefinitions('crm_core_contact', $this->entity->id());
       foreach ($instances as $instance) {
         $options[$instance->getName()] = $instance->getLabel();
       }
@@ -81,9 +90,9 @@ class ContactTypeForm extends EntityForm {
       $form['primary_fields_container'][$primary_field] = array(
         '#type' => 'select',
         '#title' => $this->t('Primary @field field', array('@field' => $primary_field)),
-        '#default_value' => empty($type->primary_fields[$primary_field]) ? '' : $type->primary_fields[$primary_field],
+        '#default_value' => $this->entity->getPrimaryField($primary_field),
         '#empty_value' => '',
-        '#empty_option' => $this->t('--Please Select--'),
+        '#empty_option' => $this->t('- Select -'),
         '#options' => $options,
       );
     }
@@ -120,6 +129,11 @@ class ContactTypeForm extends EntityForm {
   public function save(array $form, FormStateInterface $form_state) {
     $type = $this->entity;
 
+    $default_primary_fields = ['email', 'address', 'phone'];
+    foreach ($default_primary_fields as $primary_field) {
+      $type->primary_fields[$primary_field] = $form_state->getValue(['primary_fields_container', $primary_field]);
+    }
+
     $status = $type->save();
 
     $t_args = array('%name' => $type->label(), 'link' => \Drupal::url('entity.crm_core_contact_type.collection'));
