diff --git a/migrations/recipe713_recipe.yml b/migrations/recipe713_recipe.yml
new file mode 100644
index 0000000..a872314
--- /dev/null
+++ b/migrations/recipe713_recipe.yml
@@ -0,0 +1,33 @@
+id: recipe713_recipe
+label: Recipe data
+migration_tags:
+  - Drupal 7
+source:
+  plugin: recipe713_recipe
+  constants:
+    bundle: recipe
+process:
+  nid: nid
+  recipe_cook_time: cooktime
+  recipe_description: description
+  recipe_ingredient:
+    plugin: iterator
+    source: ingredients
+    process:
+      delta: weight
+      target_id: ingredient_id
+      unit_key: unit_key
+      quantity: quantity
+      note: note
+  recipe_instructions: instructions
+  recipe_notes: notes
+  recipe_prep_time: preptime
+  recipe_source: source
+  recipe_yield_amount: yield
+  recipe_yield_unit: yield_unit
+destination:
+  plugin: entity:node
+migration_dependencies:
+  required:
+    - d7_node
+    - recipe713_ingredient
diff --git a/modules/ingredient/migrations/recipe713_ingredient.yml b/modules/ingredient/migrations/recipe713_ingredient.yml
new file mode 100644
index 0000000..dd89f32
--- /dev/null
+++ b/modules/ingredient/migrations/recipe713_ingredient.yml
@@ -0,0 +1,12 @@
+id: recipe713_ingredient
+label: Ingredients
+migration_tags:
+  - Drupal 7
+source:
+  plugin: recipe713_ingredient
+process:
+  id: id
+  name: name
+destination:
+  plugin: entity:ingredient
+migration_dependencies: {  }
diff --git a/modules/ingredient/migrations/recipe713_ingredient_settings.yml b/modules/ingredient/migrations/recipe713_ingredient_settings.yml
new file mode 100644
index 0000000..ca11aef
--- /dev/null
+++ b/modules/ingredient/migrations/recipe713_ingredient_settings.yml
@@ -0,0 +1,14 @@
+id: recipe713_ingredient_settings
+label: Ingredient configuration
+migration_tags:
+  - Drupal 7
+source:
+  plugin: variable
+  variables:
+    - recipe_ingredient_name_normalize
+  source_module: recipe
+process:
+  ingredient_name_normalize: recipe_ingredient_name_normalize
+destination:
+  plugin: config
+  config_name: ingredient.settings
diff --git a/modules/ingredient/src/Plugin/migrate/destination/EntityIngredient.php b/modules/ingredient/src/Plugin/migrate/destination/EntityIngredient.php
new file mode 100644
index 0000000..68548c5
--- /dev/null
+++ b/modules/ingredient/src/Plugin/migrate/destination/EntityIngredient.php
@@ -0,0 +1,12 @@
+<?php
+
+namespace Drupal\ingredient\Plugin\migrate\destination;
+
+use Drupal\migrate\Plugin\migrate\destination\EntityContentBase;
+
+/**
+ * @MigrateDestination(
+ *   id = "entity:ingredient"
+ * )
+ */
+class EntityIngredient extends EntityContentBase {}
diff --git a/modules/ingredient/src/Plugin/migrate/source/recipe713/Ingredient.php b/modules/ingredient/src/Plugin/migrate/source/recipe713/Ingredient.php
new file mode 100644
index 0000000..4d5b890
--- /dev/null
+++ b/modules/ingredient/src/Plugin/migrate/source/recipe713/Ingredient.php
@@ -0,0 +1,43 @@
+<?php
+
+namespace Drupal\ingredient\Plugin\migrate\source\recipe713;
+
+use Drupal\migrate_drupal\Plugin\migrate\source\DrupalSqlBase;
+
+/**
+ * Drupal 7 ingredient source from database.
+ *
+ * @MigrateSource(
+ *   id = "recipe713_ingredient",
+ *   source_module = "recipe"
+ * )
+ */
+class Ingredient extends DrupalSqlBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function query() {
+    return $this->select('recipe_ingredient', 'i')
+      ->fields('i', ['id', 'name'])
+      ->orderBy('i.id');
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function fields() {
+    return [
+      'id' => $this->t('Ingredient ID'),
+      'name' => $this->t('Ingredient name'),
+    ];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getIds() {
+    return ['id' => ['type' => 'integer']];
+  }
+
+}
diff --git a/modules/ingredient/tests/fixtures/ingredient713.php b/modules/ingredient/tests/fixtures/ingredient713.php
new file mode 100644
index 0000000..0b9b9b8
--- /dev/null
+++ b/modules/ingredient/tests/fixtures/ingredient713.php
@@ -0,0 +1,263 @@
+<?php
+// @codingStandardsIgnoreFile
+/**
+ * @file
+ * Filled installation of Recipe 7.x-1.3, for test purposes.
+ *
+ * This file was originally generated by the dump-database-d7.sh tool, from an
+ * installation of Drupal 7:
+ */
+
+use Drupal\Core\Database\Database;
+
+$connection = Database::getConnection();
+
+$connection->schema()->createTable('recipe_ingredient', array(
+  'fields' => array(
+    'id' => array(
+      'type' => 'serial',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+    ),
+    'name' => array(
+      'type' => 'varchar',
+      'length' => 255,
+    ),
+    'link' => array(
+      'type' => 'int',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+    ),
+  ),
+  'primary key' => array(
+    'id',
+  ),
+  'module' => 'recipe',
+  'name' => 'recipe_ingredient',
+));
+$connection->insert('recipe_ingredient')->fields(array(
+  'id',
+  'name',
+  'link',
+))
+  ->values(array(
+    'id' => '1',
+    'name' => 'water',
+    'link' => '0',
+  ))
+  ->values(array(
+    'id' => '2',
+    'name' => 'salt',
+    'link' => '0',
+  ))
+  ->execute();
+
+$connection->schema()->createTable('recipe_node_ingredient', array(
+  'fields' => array(
+    'id' => array(
+      'type' => 'serial',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+    ),
+    'nid' => array(
+      'type' => 'int',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+    ),
+    'unit_key' => array(
+      'type' => 'varchar',
+      'length' => 255,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'quantity' => array(
+      'type' => 'float',
+      'not null' => FALSE,
+    ),
+    'ingredient_id' => array(
+      'type' => 'int',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+    ),
+    'weight' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'note' => array(
+      'type' => 'varchar',
+      'length' => 255,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+  ),
+  'primary key' => array(
+    'id',
+  ),
+  'module' => 'recipe',
+  'name' => 'recipe_node_ingredient',
+));
+$connection->insert('recipe_node_ingredient')->fields(array(
+  'id',
+  'nid',
+  'unit_key',
+  'quantity',
+  'ingredient_id',
+  'weight',
+  'note',
+))
+  ->values(array(
+    'id' => '1',
+    'nid' => '1',
+    'unit_key' => 'cup',
+    'quantity' => '2',
+    'ingredient_id' => '1',
+    'weight' => '0',
+    'note' => 'cold',
+  ))
+  ->values(array(
+    'id' => '2',
+    'nid' => '1',
+    'unit_key' => 'tablespoon',
+    'quantity' => '1',
+    'ingredient_id' => '2',
+    'weight' => '1',
+    'note' => '',
+  ))
+  ->execute();
+
+$connection->schema()->createTable('system', array(
+  'fields' => array(
+    'filename' => array(
+      'type' => 'varchar',
+      'not null' => TRUE,
+      'length' => '255',
+      'default' => '',
+    ),
+    'name' => array(
+      'type' => 'varchar',
+      'not null' => TRUE,
+      'length' => '255',
+      'default' => '',
+    ),
+    'type' => array(
+      'type' => 'varchar',
+      'not null' => TRUE,
+      'length' => '12',
+      'default' => '',
+    ),
+    'owner' => array(
+      'type' => 'varchar',
+      'not null' => TRUE,
+      'length' => '255',
+      'default' => '',
+    ),
+    'status' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'size' => 'normal',
+      'default' => '0',
+    ),
+    'bootstrap' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'size' => 'normal',
+      'default' => '0',
+    ),
+    'schema_version' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'size' => 'normal',
+      'default' => '-1',
+    ),
+    'weight' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'size' => 'normal',
+      'default' => '0',
+    ),
+    'info' => array(
+      'type' => 'blob',
+      'not null' => FALSE,
+      'size' => 'normal',
+    ),
+  ),
+  'primary key' => array(
+    'filename',
+  ),
+  'mysql_character_set' => 'utf8',
+));
+
+$connection->insert('system')->fields(array(
+  'filename',
+  'name',
+  'type',
+  'owner',
+  'status',
+  'bootstrap',
+  'schema_version',
+  'weight',
+  'info',
+))
+  ->values(array(
+    'filename' => 'sites/default/modules/recipe/recipe.module',
+    'name' => 'recipe',
+    'type' => 'module',
+    'owner' => '',
+    'status' => '1',
+    'bootstrap' => '0',
+    'schema_version' => '7004',
+    'weight' => '0',
+    'info' => 'a:11:{s:4:"name";s:6:"Recipe";s:11:"description";s:28:"Collect and display recipes.";s:7:"package";s:6:"Recipe";s:4:"core";s:3:"7.x";s:7:"version";s:7:"7.x-1.3";s:7:"project";s:6:"recipe";s:9:"datestamp";s:10:"1335415286";s:12:"dependencies";a:0:{}s:3:"php";s:5:"5.2.4";s:5:"files";a:0:{}s:9:"bootstrap";i:0;}',
+  ))
+  ->execute();
+
+$connection->schema()->createTable('variable', array(
+  'fields' => array(
+    'name' => array(
+      'type' => 'varchar',
+      'not null' => TRUE,
+      'length' => '128',
+      'default' => '',
+    ),
+    'value' => array(
+      'type' => 'blob',
+      'not null' => TRUE,
+      'size' => 'normal',
+    ),
+  ),
+  'primary key' => array(
+    'name',
+  ),
+  'mysql_character_set' => 'utf8',
+));
+
+$connection->insert('variable')->fields(array(
+  'name',
+  'value',
+))
+  ->values(array(
+    'name' => 'recipe_default_unit',
+    'value' => 's:0:"";',
+  ))
+  ->values(array(
+    'name' => 'recipe_fraction_display',
+    'value' => 's:16:"{%d }%d&frasl;%d";',
+  ))
+  ->values(array(
+    'name' => 'recipe_ingredient_name_normalize',
+    'value' => 's:1:"1";',
+  ))
+  ->values(array(
+    'name' => 'recipe_preferred_system_of_measure',
+    'value' => 's:1:"0";',
+  ))
+  ->values(array(
+    'name' => 'recipe_preferred_system_of_measure_limit',
+    'value' => 'i:0;',
+  ))
+  ->values(array(
+    'name' => 'recipe_unit_display',
+    'value' => 's:1:"0";',
+  ))
+  ->execute();
diff --git a/modules/ingredient/tests/src/Kernel/Migrate/recipe713/MigrateIngredient713TestBase.php b/modules/ingredient/tests/src/Kernel/Migrate/recipe713/MigrateIngredient713TestBase.php
new file mode 100644
index 0000000..49624b6
--- /dev/null
+++ b/modules/ingredient/tests/src/Kernel/Migrate/recipe713/MigrateIngredient713TestBase.php
@@ -0,0 +1,19 @@
+<?php
+
+namespace Drupal\Tests\ingredient\Kernel\Migrate\recipe713;
+
+use Drupal\Tests\migrate_drupal\Kernel\d7\MigrateDrupal7TestBase;
+
+/**
+ * Provides a base class for Ingredient migrations from Recipe 7.x-1.3.
+ */
+abstract class MigrateIngredient713TestBase extends MigrateDrupal7TestBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function getFixtureFilePath() {
+    return __DIR__ . '/../../../../fixtures/ingredient713.php';
+  }
+
+}
diff --git a/modules/ingredient/tests/src/Kernel/Migrate/recipe713/MigrateIngredientSettingsTest.php b/modules/ingredient/tests/src/Kernel/Migrate/recipe713/MigrateIngredientSettingsTest.php
new file mode 100644
index 0000000..ed74568
--- /dev/null
+++ b/modules/ingredient/tests/src/Kernel/Migrate/recipe713/MigrateIngredientSettingsTest.php
@@ -0,0 +1,34 @@
+<?php
+
+namespace Drupal\Tests\ingredient\Kernel\Migrate\recipe713;
+
+/**
+ * Tests migration of Recipe's ingredient variables to configuration.
+ *
+ * @group recipe
+ */
+class MigrateIngredientSettingsTest extends MigrateIngredient713TestBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public static $modules = ['ingredient'];
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp() {
+    parent::setUp();
+    $this->installConfig(static::$modules);
+    $this->executeMigrations(['recipe713_ingredient_settings']);
+  }
+
+  /**
+   * Tests migration of ingredient variables to configuration.
+   */
+  public function testMigration() {
+    $config = \Drupal::config('ingredient.settings')->get();
+    $this->assertSame(1, $config['ingredient_name_normalize']);
+  }
+
+}
diff --git a/modules/ingredient/tests/src/Kernel/Migrate/recipe713/MigrateIngredientTest.php b/modules/ingredient/tests/src/Kernel/Migrate/recipe713/MigrateIngredientTest.php
new file mode 100644
index 0000000..a90bf53
--- /dev/null
+++ b/modules/ingredient/tests/src/Kernel/Migrate/recipe713/MigrateIngredientTest.php
@@ -0,0 +1,60 @@
+<?php
+
+namespace Drupal\Tests\ingredient\Kernel\Migrate\recipe713;
+
+use Drupal\Core\Database\Database;
+use Drupal\ingredient\Entity\Ingredient;
+use Drupal\ingredient\IngredientInterface;
+
+/**
+ * Ingredients migration.
+ *
+ * @group recipe
+ */
+class MigrateIngredientTest extends MigrateIngredient713TestBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public static $modules = ['ingredient'];
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp() {
+    parent::setUp();
+    $this->installEntitySchema('ingredient');
+    $this->executeMigrations(['recipe713_ingredient']);
+  }
+
+  /**
+   * Asserts various aspects of an ingredient.
+   *
+   * @param string $id
+   *   The ingredient ID.
+   * @param string $label
+   *   The ingredient name.
+   */
+  protected function assertEntity($id, $label) {
+    /** @var \Drupal\ingredient\IngredientInterface $ingredient */
+    $ingredient = Ingredient::load($id);
+    $this->assertTrue($ingredient instanceof IngredientInterface);
+    $this->assertSame($label, $ingredient->label());
+  }
+
+  /**
+   * Tests the Drupal 7 ingredient to Drupal 8 migration.
+   */
+  public function testIngredient() {
+    $ingredients = Database::getConnection('default', 'migrate')
+      ->select('recipe_ingredient', 'i')
+      ->fields('i')
+      ->execute()
+      ->fetchAll();
+
+    foreach ($ingredients as $source) {
+      $this->assertEntity($source->id, $source->name);
+    }
+  }
+
+}
diff --git a/src/Plugin/migrate/source/recipe713/Recipe.php b/src/Plugin/migrate/source/recipe713/Recipe.php
new file mode 100644
index 0000000..f8e617c
--- /dev/null
+++ b/src/Plugin/migrate/source/recipe713/Recipe.php
@@ -0,0 +1,71 @@
+<?php
+
+namespace Drupal\recipe\Plugin\migrate\source\recipe713;
+
+use Drupal\migrate\Row;
+use Drupal\migrate_drupal\Plugin\migrate\source\DrupalSqlBase;
+
+/**
+ * Drupal 7 recipe source from database.
+ *
+ * @MigrateSource(
+ *   id = "recipe713_recipe",
+ *   source_module = "recipe"
+ * )
+ */
+class Recipe extends DrupalSqlBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function query() {
+    return $this->select('recipe', 'r')
+      ->fields('r')
+      ->orderBy('r.nid');
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function prepareRow(Row $row) {
+    // Select the ingredient reference data and add it to the row.
+    $query = $this->select('recipe_node_ingredient', 'i')
+      ->fields('i')
+      ->condition('nid', $row->getSourceProperty('nid'))
+      ->orderBy('weight', 'ASC');
+    $results = $query->execute();
+    $ingredients = [];
+    foreach ($results as $result) {
+      $ingredients[] = $result;
+    }
+    $row->setSourceProperty('ingredients', $ingredients);
+
+    return parent::prepareRow($row);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function fields() {
+    return [
+      'nid' => $this->t('Recipe node ID'),
+      'source' => $this->t('Recipe source'),
+      'yield' => $this->t('Recipe yield amount'),
+      'yield_unit' => $this->t('Units of the recipe yield'),
+      'description' => $this->t('Recipe description'),
+      'instructions' => $this->t('Recipe instructions'),
+      'notes' => $this->t('Recipe notes'),
+      'preptime' => $this->t('Recipe preparation time'),
+      'cooktime' => $this->t('Recipe cook time'),
+      'ingredients' => $this->t('Recipe ingredients, measures, and notes')
+    ];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getIds() {
+    return ['nid' => ['type' => 'integer']];
+  }
+
+}
diff --git a/tests/upgrade/drupal-7.recipe.database.php b/tests/fixtures/recipe713.php
similarity index 88%
rename from tests/upgrade/drupal-7.recipe.database.php
rename to tests/fixtures/recipe713.php
index 8622e25..c011792 100644
--- a/tests/upgrade/drupal-7.recipe.database.php
+++ b/tests/fixtures/recipe713.php
@@ -1,5 +1,5 @@
 <?php
-
+// @codingStandardsIgnoreFile
 /**
  * @file
  * Filled installation of Recipe 7.x-1.3, for test purposes.
@@ -8,7 +8,17 @@
  * installation of Drupal 7:
  */
 
-db_insert('node')->fields(array(
+use Drupal\Core\Database\Database;
+
+$connection = Database::getConnection();
+
+// Delete nodes from core's fixture.
+$connection->delete('node')->execute();
+$connection->delete('node_comment_statistics')->execute();
+$connection->delete('node_revision')->execute();
+
+$connection->insert('node')
+->fields(array(
   'nid',
   'vid',
   'type',
@@ -42,7 +52,8 @@ db_insert('node')->fields(array(
 ))
 ->execute();
 
-db_insert('node_comment_statistics')->fields(array(
+$connection->insert('node_comment_statistics')
+->fields(array(
   'nid',
   'cid',
   'last_comment_timestamp',
@@ -60,7 +71,8 @@ db_insert('node_comment_statistics')->fields(array(
 ))
 ->execute();
 
-db_insert('node_revision')->fields(array(
+$connection->insert('node_revision')
+->fields(array(
   'nid',
   'vid',
   'uid',
@@ -86,7 +98,8 @@ db_insert('node_revision')->fields(array(
 ))
 ->execute();
 
-db_insert('node_type')->fields(array(
+$connection->insert('node_type')
+->fields(array(
   'type',
   'name',
   'base',
@@ -118,7 +131,7 @@ db_insert('node_type')->fields(array(
 ))
 ->execute();
 
-db_create_table('recipe', array(
+$connection->schema()->createTable('recipe', array(
   'fields' => array(
     'nid' => array(
       'type' => 'serial',
@@ -167,7 +180,8 @@ db_create_table('recipe', array(
   'module' => 'recipe',
   'name' => 'recipe',
 ));
-db_insert('recipe')->fields(array(
+$connection->insert('recipe')
+->fields(array(
   'nid',
   'source',
   'yield',
@@ -191,7 +205,7 @@ db_insert('recipe')->fields(array(
 ))
 ->execute();
 
-db_create_table('recipe_ingredient', array(
+$connection->schema()->createTable('recipe_ingredient', array(
   'fields' => array(
     'id' => array(
       'type' => 'serial',
@@ -214,7 +228,8 @@ db_create_table('recipe_ingredient', array(
   'module' => 'recipe',
   'name' => 'recipe_ingredient',
 ));
-db_insert('recipe_ingredient')->fields(array(
+$connection->insert('recipe_ingredient')
+->fields(array(
   'id',
   'name',
   'link',
@@ -231,7 +246,7 @@ db_insert('recipe_ingredient')->fields(array(
 ))
 ->execute();
 
-db_create_table('recipe_node_ingredient', array(
+$connection->schema()->createTable('recipe_node_ingredient', array(
   'fields' => array(
     'id' => array(
       'type' => 'serial',
@@ -276,7 +291,8 @@ db_create_table('recipe_node_ingredient', array(
   'module' => 'recipe',
   'name' => 'recipe_node_ingredient',
 ));
-db_insert('recipe_node_ingredient')->fields(array(
+$connection->insert('recipe_node_ingredient')
+->fields(array(
   'id',
   'nid',
   'unit_key',
@@ -305,7 +321,8 @@ db_insert('recipe_node_ingredient')->fields(array(
 ))
 ->execute();
 
-db_insert('system')->fields(array(
+$connection->insert('system')
+->fields(array(
   'filename',
   'name',
   'type',
@@ -329,7 +346,8 @@ db_insert('system')->fields(array(
 ))
 ->execute();
 
-db_insert('variable')->fields(array(
+$connection->insert('variable')
+->fields(array(
   'name',
   'value',
 ))
diff --git a/tests/src/Kernel/Migrate/recipe713/MigrateRecipe713TestBase.php b/tests/src/Kernel/Migrate/recipe713/MigrateRecipe713TestBase.php
new file mode 100644
index 0000000..3e2d92b
--- /dev/null
+++ b/tests/src/Kernel/Migrate/recipe713/MigrateRecipe713TestBase.php
@@ -0,0 +1,34 @@
+<?php
+
+namespace Drupal\Tests\recipe\Kernel\Migrate\recipe713;
+
+use Drupal\Tests\migrate_drupal\Kernel\d7\MigrateDrupal7TestBase;
+
+/**
+ * Provides a base class for Recipe migrations from Recipe 7.x-1.3.
+ */
+abstract class MigrateRecipe713TestBase extends MigrateDrupal7TestBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp() {
+    parent::setUp();
+    $this->loadFixture($this->getRecipeFixtureFilePath());
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function getFixtureFilePath() {
+    return $this->getDrupalRoot() . '/core/modules/migrate_drupal/tests/fixtures/drupal7.php';
+  }
+
+  /**
+   * Gets the path to Recipe's fixture file.
+   */
+  protected function getRecipeFixtureFilePath() {
+    return __DIR__ . '/../../../../fixtures/recipe713.php';
+  }
+
+}
diff --git a/tests/src/Kernel/Migrate/recipe713/MigrateRecipeTest.php b/tests/src/Kernel/Migrate/recipe713/MigrateRecipeTest.php
new file mode 100644
index 0000000..d379c82
--- /dev/null
+++ b/tests/src/Kernel/Migrate/recipe713/MigrateRecipeTest.php
@@ -0,0 +1,126 @@
+<?php
+
+namespace Drupal\Tests\recipe\Kernel\Migrate\recipe713;
+
+use Drupal\Core\Database\Database;
+use Drupal\node\Entity\Node;
+use Drupal\node\NodeInterface;
+
+/**
+ * Tests migration of recipe node fields.
+ *
+ * @group recipe
+ */
+class MigrateRecipeTest extends MigrateRecipe713TestBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public static $modules = [
+    'ingredient',
+    'menu_ui',
+    'node',
+    'rdf',
+    'recipe',
+    'text',
+  ];
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp() {
+    parent::setUp();
+    $this->installEntitySchema('ingredient');
+    $this->installEntitySchema('node');
+    $this->installConfig(static::$modules);
+    $this->installSchema('node', ['node_access']);
+    $this->executeMigrations([
+      'd7_user_role',
+      'd7_user',
+      'd7_node_type',
+      'd7_node',
+      'recipe713_ingredient',
+      'recipe713_recipe',
+    ]);
+  }
+
+  /**
+   * Asserts various aspects of a recipe.
+   *
+   * @param string $id
+   *   The recipe node ID.
+   * @param int $cooktime
+   *   The cooking time in minutes.
+   * @param string $description
+   *   A short description of the recipe.
+   * @param array $ingredients
+   *   An array of ingredients for the recipe.
+   * @param string $instructions
+   *   Instructions on how to prepare and cook the recipe.
+   * @param string $notes
+   *   Other notes about this recipe.
+   * @param int $preptime
+   *   The preparation time in minutes.
+   * @param string $source
+   *   Who deserves credit for this recipe.
+   * @param int $yield
+   *   A measure of how much this recipe will produce.
+   * @param string $yield_unit
+   *   The unit that $yield is expressed in.
+   */
+  protected function assertRecipeFields($id, $cooktime, $description, array $ingredients, $instructions, $notes, $preptime, $source, $yield, $yield_unit) {
+    /** @var \Drupal\node\NodeInterface $recipe */
+    $recipe = Node::load($id);
+    $this->assertEquals($cooktime, $recipe->recipe_cook_time->value);
+    $this->assertSame($description, $recipe->recipe_description->value);
+    $this->assertSame($instructions, $recipe->recipe_instructions->value);
+    $this->assertSame($notes, $recipe->recipe_notes->value);
+    $this->assertEquals($preptime, $recipe->recipe_prep_time->value);
+    $this->assertSame($source, $recipe->recipe_source->value);
+    $this->assertEquals($yield, $recipe->recipe_yield_amount->value);
+    $this->assertSame($yield_unit, $recipe->recipe_yield_unit->value);
+
+    for ($i = 0; $i < count($ingredients); $i++) {
+      $this->assertEquals($ingredients[$i]->quantity, $recipe->recipe_ingredient[$i]->quantity);
+      $this->assertEquals($ingredients[$i]->unit_key, $recipe->recipe_ingredient[$i]->unit_key);
+      $this->assertEquals($ingredients[$i]->ingredient_id, $recipe->recipe_ingredient[$i]->target_id);
+      $this->assertEquals($ingredients[$i]->note, $recipe->recipe_ingredient[$i]->note);
+    }
+  }
+
+  /**
+   * Tests the Drupal 7 recipe to Drupal 8 migration.
+   */
+  public function testRecipeFields() {
+    $database_connection = Database::getConnection('default', 'migrate');
+
+    $recipes = $database_connection
+      ->select('recipe', 'r')
+      ->fields('r')
+      ->execute()
+      ->fetchAll();
+
+    foreach ($recipes as $source) {
+      // Get a list of ingredient IDs from the old database.
+      $ingredients = $database_connection->select('recipe_node_ingredient', 'rni')
+        ->fields('rni')
+        ->condition('rni.nid', $source->nid)
+        ->execute()
+        ->fetchAll();
+
+      $this->assertRecipeFields(
+        $source->nid,
+        $source->cooktime,
+        $source->description,
+        $ingredients,
+        $source->instructions,
+        $source->notes,
+        $source->preptime,
+        $source->source,
+        $source->yield,
+        $source->yield_unit
+      );
+    }
+  }
+
+}
