diff --git a/core/modules/workflows/src/Form/WorkflowStateEditForm.php b/core/modules/workflows/src/Form/WorkflowStateEditForm.php
index dea6f74..7a77f63 100644
--- a/core/modules/workflows/src/Form/WorkflowStateEditForm.php
+++ b/core/modules/workflows/src/Form/WorkflowStateEditForm.php
@@ -5,6 +5,7 @@
 use Drupal\Core\Entity\EntityForm;
 use Drupal\Core\Entity\EntityInterface;
 use Drupal\Core\Form\FormStateInterface;
+use Drupal\Core\Form\SubformState;
 use Drupal\Core\Url;
 
 /**
@@ -125,11 +126,6 @@ protected function copyFormValuesToEntity(EntityInterface $entity, array $form,
     /** @var \Drupal\workflows\WorkflowInterface $entity */
     $values = $form_state->getValues();
     $entity->setStateLabel($values['id'], $values['label']);
-    if (isset($values['type_settings'])) {
-      $configuration = $entity->getTypePlugin()->getConfiguration();
-      $configuration['states'][$values['id']] += $values['type_settings'][$entity->getTypePlugin()->getPluginId()];
-      $entity->set('type_settings', $configuration);
-    }
   }
 
   /**
@@ -138,6 +134,11 @@ protected function copyFormValuesToEntity(EntityInterface $entity, array $form,
   public function save(array $form, FormStateInterface $form_state) {
     /** @var \Drupal\workflows\WorkflowInterface $workflow */
     $workflow = $this->entity;
+
+    $state = $workflow->getState($form_state->getValue('id'));
+    $subform_state = SubformState::createForSubform($form['type_settings'][$workflow->getTypePlugin()->getPluginId()], $form, $form_state);
+    $workflow->getTypePlugin()->submitStateConfigurationForm($form['type_settings'][$workflow->getTypePlugin()->getPluginId()], $subform_state, $state);
+
     $workflow->save();
     drupal_set_message($this->t('Saved %label state.', [
       '%label' => $workflow->getState($this->stateId)->label(),
diff --git a/core/modules/workflows/src/Form/WorkflowTransitionEditForm.php b/core/modules/workflows/src/Form/WorkflowTransitionEditForm.php
index e3ba52d..e396c46 100644
--- a/core/modules/workflows/src/Form/WorkflowTransitionEditForm.php
+++ b/core/modules/workflows/src/Form/WorkflowTransitionEditForm.php
@@ -5,6 +5,7 @@
 use Drupal\Core\Entity\EntityForm;
 use Drupal\Core\Entity\EntityInterface;
 use Drupal\Core\Form\FormStateInterface;
+use Drupal\Core\Form\SubformState;
 use Drupal\Core\Url;
 use Drupal\workflows\State;
 
@@ -128,11 +129,6 @@ protected function copyFormValuesToEntity(EntityInterface $entity, array $form,
     $form_state->set('created_transition', FALSE);
     $entity->setTransitionLabel($values['id'], $values['label']);
     $entity->setTransitionFromStates($values['id'], array_filter($values['from']));
-    if (isset($values['type_settings'])) {
-      $configuration = $entity->getTypePlugin()->getConfiguration();
-      $configuration['transitions'][$values['id']] += $values['type_settings'][$entity->getTypePlugin()->getPluginId()];
-      $entity->set('type_settings', $configuration);
-    }
   }
 
   /**
@@ -141,6 +137,11 @@ protected function copyFormValuesToEntity(EntityInterface $entity, array $form,
   public function save(array $form, FormStateInterface $form_state) {
     /** @var \Drupal\workflows\WorkflowInterface $workflow */
     $workflow = $this->entity;
+
+    $transition = $workflow->getTransition($form_state->getValue('id'));
+    $subform_state = SubformState::createForSubform($form['type_settings'][$workflow->getTypePlugin()->getPluginId()], $form, $form_state);
+    $workflow->getTypePlugin()->submitTransitionConfigurationForm($form['type_settings'][$workflow->getTypePlugin()->getPluginId()], $subform_state, $transition);
+
     $workflow->save();
     drupal_set_message($this->t('Saved %label transition.', [
       '%label' => $workflow->getTransition($this->transitionId)->label(),
diff --git a/core/modules/workflows/src/Plugin/WorkflowTypeBase.php b/core/modules/workflows/src/Plugin/WorkflowTypeBase.php
index ebe089a..51cccb2 100644
--- a/core/modules/workflows/src/Plugin/WorkflowTypeBase.php
+++ b/core/modules/workflows/src/Plugin/WorkflowTypeBase.php
@@ -5,6 +5,7 @@
 use Drupal\Component\Plugin\PluginBase;
 use Drupal\Core\Access\AccessResult;
 use Drupal\Core\Form\FormStateInterface;
+use Drupal\Core\Form\SubformStateInterface;
 use Drupal\Core\Session\AccountInterface;
 use Drupal\workflows\State;
 use Drupal\workflows\StateInterface;
@@ -92,6 +93,22 @@ public function buildTransitionConfigurationForm(FormStateInterface $form_state,
   /**
    * {@inheritdoc}
    */
+  public function submitStateConfigurationForm(array &$form, SubformStateInterface $form_state, StateInterface $state) {
+    $values = $form_state->getValues();
+    $this->configuration['states'][$state->id()] = $values + $this->configuration['states'][$state->id()];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function submitTransitionConfigurationForm(array &$form, SubformStateInterface $form_state, TransitionInterface $transition) {
+    $values = $form_state->getValues();
+    $this->configuration['transitions'][$transition->id()] = $values + $this->configuration['transitions'][$transition->id()];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   public function getConfiguration() {
     return $this->configuration;
   }
diff --git a/core/modules/workflows/src/WorkflowTypeInterface.php b/core/modules/workflows/src/WorkflowTypeInterface.php
index d84d1a7..c82ff2f 100644
--- a/core/modules/workflows/src/WorkflowTypeInterface.php
+++ b/core/modules/workflows/src/WorkflowTypeInterface.php
@@ -6,6 +6,7 @@
 use Drupal\Component\Plugin\DerivativeInspectionInterface;
 use Drupal\Component\Plugin\PluginInspectionInterface;
 use Drupal\Core\Form\FormStateInterface;
+use Drupal\Core\Form\SubformStateInterface;
 use Drupal\Core\Session\AccountInterface;
 
 /**
@@ -108,6 +109,18 @@ public function getInitialState(WorkflowInterface $workflow);
   public function buildStateConfigurationForm(FormStateInterface $form_state, WorkflowInterface $workflow, StateInterface $state = NULL);
 
   /**
+   * Handle the submission of the state configuration form.
+   *
+   * @param array $form
+   *   The form returned by ::buildStateConfigurationForm.
+   * @param \Drupal\Core\Form\SubformStateInterface $form_state
+   *   The subform state of the form returned by ::buildStateConfigurationForm.
+   * @param \Drupal\workflows\StateInterface $state
+   *   The state being edited.
+   */
+  public function submitStateConfigurationForm(array &$form, SubformStateInterface $form_state, StateInterface $state);
+
+  /**
    * Builds a form to be added to the Workflow transition edit form.
    *
    * @param \Drupal\Core\Form\FormStateInterface $form_state
@@ -128,6 +141,18 @@ public function buildStateConfigurationForm(FormStateInterface $form_state, Work
   public function buildTransitionConfigurationForm(FormStateInterface $form_state, WorkflowInterface $workflow, TransitionInterface $transition = NULL);
 
   /**
+   * Handle the submission of the transition configuration form.
+   *
+   * @param array $form
+   *   The form returned by ::buildTransitionConfigurationForm.
+   * @param \Drupal\Core\Form\SubformStateInterface $form_state
+   *   The subform state of the form returned by ::buildTransitionConfigurationForm.
+   * @param \Drupal\workflows\TransitionInterface $transition
+   *   The transition being edited.
+   */
+  public function submitTransitionConfigurationForm(array &$form, SubformStateInterface $form_state, TransitionInterface $transition);
+
+  /**
    * Gets the required states of workflow type.
    *
    * This are usually configured in the workflow type annotation.
