diff --git a/modules/currency_denominations/src/Entity/CurrencyDenominations.php b/modules/currency_denominations/src/Entity/CurrencyDenominations.php
index 9735d83..0b8e524 100644
--- a/modules/currency_denominations/src/Entity/CurrencyDenominations.php
+++ b/modules/currency_denominations/src/Entity/CurrencyDenominations.php
@@ -77,8 +77,8 @@ class CurrencyDenominations extends ConfigEntityBase implements CurrencyDenomina
    */
   public function getDenominations() {
     $denominations = [];
-    foreach ($this->denominations as $denomination) {
-      $denominations[] = new CurrencyDenomination($denomination);
+    if (!empty($this->denominations)) {
+      $denominations = $this->denominations;
     }
     return $denominations;
   }
diff --git a/modules/currency_denominations/src/Form/CurrencyDenominationsForm.php b/modules/currency_denominations/src/Form/CurrencyDenominationsForm.php
index ea64aee..10df1eb 100644
--- a/modules/currency_denominations/src/Form/CurrencyDenominationsForm.php
+++ b/modules/currency_denominations/src/Form/CurrencyDenominationsForm.php
@@ -54,9 +54,117 @@ class CurrencyDenominationsForm extends EntityForm {
       '#required' => TRUE,
     ];
 
+    // Gather the number of denoms in the form already.
+    $denoms = $form_state->get('denoms');
+    // We have to ensure that there is at least one name field.
+    if ($denoms === NULL) {
+      // While editing.
+      $denom = $currency_denominations->getDenominations();
+      if (count($denom) > 1) {
+        $name_field = $form_state->set('denoms', (count($denom) - 1));
+        $denoms = count($denom) - 1;
+      }
+      else {
+        $name_field = $form_state->set('denoms', 1);
+        $denoms = 1;
+      }
+    }
+
+    $form['#tree'] = TRUE;
+    $form['denominations'] = [
+      '#type' => 'fieldset',
+      '#title' => $this->t('Add Denominations.'),
+      '#prefix' => '<div id="denoms-fieldset-wrapper">',
+      '#suffix' => '</div>',
+    ];
+
+    for ($i = 0; $i < $denoms; $i++) {
+      $form['denominations'][$i] = [
+        '#type' => 'fieldset',
+      ];
+      $default_label = [];
+      $default_amount = [];
+      if (!empty($denom)) {
+        $default_label = $denom[$i]['label'];
+        $default_amount = $denom[$i]['amount'];
+      }
+      $form['denominations'][$i]['label'] = [
+        '#type' => 'textfield',
+        '#title' => $this->t('Name'),
+        '#maxlength' => 255,
+        '#default_value' => $default_label,
+      ];
+      $form['denominations'][$i]['amount'] = [
+        '#type' => 'textfield',
+        '#title' => $this->t('Amount'),
+        '#maxlength' => 255,
+        '#default_value' => $default_amount,
+      ];
+    }
+    $form['denominations']['actions'] = [
+      '#type' => 'actions',
+    ];
+    $form['denominations']['actions']['add_denom'] = [
+      '#type' => 'submit',
+      '#value' => t('Add one more'),
+      '#submit' => ['::addOne'],
+      '#ajax' => [
+        'callback' => '::addmoreCallback',
+        'wrapper' => 'denoms-fieldset-wrapper',
+      ],
+    ];
+    // If there is more than one denomination, add the remove button.
+    if ($denoms > 1) {
+      $form['denominations']['actions']['remove_denom'] = [
+        '#type' => 'submit',
+        '#value' => t('Remove one'),
+        '#submit' => ['::removeCallback'],
+        '#ajax' => [
+          'callback' => '::addmoreCallback',
+          'wrapper' => 'denoms-fieldset-wrapper',
+        ],
+      ];
+    }
+
     return $form;
   }
 
+  /**
+   * Callback for both ajax-enabled buttons.
+   *
+   * Selects and returns the fieldset with the names in it.
+   */
+  public function addmoreCallback(array &$form, FormStateInterface $form_state) {
+    $name_field = $form_state->get('denoms');
+    return $form['denominations'];
+  }
+
+  /**
+   * Submit handler for the "add-one-more" button.
+   *
+   * Increments the max counter and causes a rebuild.
+   */
+  public function addOne(array &$form, FormStateInterface $form_state) {
+    $name_field = $form_state->get('denoms');
+    $add_button = $name_field + 1;
+    $form_state->set('denoms', $add_button);
+    $form_state->setRebuild();
+  }
+
+  /**
+   * Submit handler for the "remove one" button.
+   *
+   * Decrements the max counter and causes a form rebuild.
+   */
+  public function removeCallback(array &$form, FormStateInterface $form_state) {
+    $name_field = $form_state->get('denoms');
+    if ($name_field > 1) {
+      $remove_button = $name_field - 1;
+      $form_state->set('denoms', $remove_button);
+    }
+    $form_state->setRebuild();
+  }
+
   /**
    * Validates the currency code.
    */
