diff --git a/modules/ingredient/migrations/recipe713_ingredient.yml b/modules/ingredient/migrations/recipe1x_ingredient.yml
similarity index 70%
rename from modules/ingredient/migrations/recipe713_ingredient.yml
rename to modules/ingredient/migrations/recipe1x_ingredient.yml
index dd89f32..5faa17b 100644
--- a/modules/ingredient/migrations/recipe713_ingredient.yml
+++ b/modules/ingredient/migrations/recipe1x_ingredient.yml
@@ -1,9 +1,10 @@
-id: recipe713_ingredient
+id: recipe1x_ingredient
 label: Ingredients
 migration_tags:
+  - Drupal 6
   - Drupal 7
 source:
-  plugin: recipe713_ingredient
+  plugin: recipe1x_ingredient
 process:
   id: id
   name: name
diff --git a/modules/ingredient/migrations/recipe713_ingredient_settings.yml b/modules/ingredient/migrations/recipe1x_ingredient_settings.yml
similarity index 86%
rename from modules/ingredient/migrations/recipe713_ingredient_settings.yml
rename to modules/ingredient/migrations/recipe1x_ingredient_settings.yml
index ca11aef..be30a0f 100644
--- a/modules/ingredient/migrations/recipe713_ingredient_settings.yml
+++ b/modules/ingredient/migrations/recipe1x_ingredient_settings.yml
@@ -1,6 +1,7 @@
-id: recipe713_ingredient_settings
+id: recipe1x_ingredient_settings
 label: Ingredient configuration
 migration_tags:
+  - Drupal 6
   - Drupal 7
 source:
   plugin: variable
diff --git a/modules/ingredient/src/Plugin/migrate/source/recipe1x/Ingredient.php b/modules/ingredient/src/Plugin/migrate/source/recipe1x/Ingredient.php
new file mode 100644
index 0000000..b38e089
--- /dev/null
+++ b/modules/ingredient/src/Plugin/migrate/source/recipe1x/Ingredient.php
@@ -0,0 +1,43 @@
+<?php
+
+namespace Drupal\ingredient\Plugin\migrate\source\recipe1x;
+
+use Drupal\migrate_drupal\Plugin\migrate\source\DrupalSqlBase;
+
+/**
+ * Recipe 6.x-1.x and 7.x-1.x ingredient source from database.
+ *
+ * @MigrateSource(
+ *   id = "recipe1x_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/ingredient615.php b/modules/ingredient/tests/fixtures/ingredient615.php
new file mode 100644
index 0000000..edfaf1a
--- /dev/null
+++ b/modules/ingredient/tests/fixtures/ingredient615.php
@@ -0,0 +1,605 @@
+<?php
+// @codingStandardsIgnoreFile
+/**
+ * @file
+ * A database agnostic dump for testing purposes.
+ *
+ * This file was generated by the Drupal 8.0 db-tools.php script.
+ */
+
+use Drupal\Core\Database\Database;
+
+$connection = Database::getConnection();
+
+$connection->schema()->createTable('recipe_ingredient', array(
+  'fields' => array(
+    'id' => array(
+      'type' => 'serial',
+      'not null' => TRUE,
+      'size' => 'normal',
+      'unsigned' => TRUE,
+    ),
+    'name' => array(
+      'type' => 'varchar',
+      'not null' => FALSE,
+      'length' => '255',
+    ),
+    'link' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'size' => 'normal',
+      'unsigned' => TRUE,
+    ),
+  ),
+  'primary key' => array(
+    'id',
+  ),
+  'mysql_character_set' => 'utf8',
+));
+
+$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',
+      'not null' => TRUE,
+      'size' => 'normal',
+      'unsigned' => TRUE,
+    ),
+    'nid' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'size' => 'normal',
+      'unsigned' => TRUE,
+    ),
+    'unit_id' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'size' => 'normal',
+      'unsigned' => TRUE,
+    ),
+    'quantity' => array(
+      'type' => 'float',
+      'not null' => FALSE,
+      'size' => 'normal',
+    ),
+    'ingredient_id' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'size' => 'normal',
+      'unsigned' => TRUE,
+    ),
+    'weight' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'size' => 'normal',
+      'default' => '0',
+    ),
+    'note' => array(
+      'type' => 'varchar',
+      'not null' => TRUE,
+      'length' => '255',
+      'default' => '',
+    ),
+  ),
+  'primary key' => array(
+    'id',
+  ),
+  'mysql_character_set' => 'utf8',
+));
+
+$connection->insert('recipe_node_ingredient')
+->fields(array(
+  'id',
+  'nid',
+  'unit_id',
+  'quantity',
+  'ingredient_id',
+  'weight',
+  'note',
+))
+->values(array(
+  'id' => '1',
+  'nid' => '1',
+  'unit_id' => '11',
+  'quantity' => '2',
+  'ingredient_id' => '1',
+  'weight' => '0',
+  'note' => 'cold',
+))
+->values(array(
+  'id' => '2',
+  'nid' => '1',
+  'unit_id' => '12',
+  'quantity' => '1',
+  'ingredient_id' => '2',
+  'weight' => '0',
+  'note' => '',
+))
+->values(array(
+  'id' => '3',
+  'nid' => '2',
+  'unit_id' => '11',
+  'quantity' => '2',
+  'ingredient_id' => '1',
+  'weight' => '0',
+  'note' => 'cold',
+))
+->values(array(
+  'id' => '4',
+  'nid' => '3',
+  'unit_id' => '11',
+  'quantity' => '2',
+  'ingredient_id' => '1',
+  'weight' => '0',
+  'note' => 'cold',
+))
+->execute();
+
+$connection->schema()->createTable('recipe_unit', array(
+  'fields' => array(
+    'id' => array(
+      'type' => 'serial',
+      'not null' => TRUE,
+      'size' => 'normal',
+      'unsigned' => TRUE,
+    ),
+    'name' => array(
+      'type' => 'varchar',
+      'not null' => FALSE,
+      'length' => '255',
+    ),
+    'abbreviation' => array(
+      'type' => 'varchar',
+      'not null' => FALSE,
+      'length' => '8',
+    ),
+    'metric' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'size' => 'normal',
+      'default' => '0',
+      'unsigned' => TRUE,
+    ),
+    'type' => array(
+      'type' => 'varchar',
+      'not null' => TRUE,
+      'length' => '6',
+      'default' => 'Mass',
+    ),
+    'aliases' => array(
+      'type' => 'varchar',
+      'not null' => TRUE,
+      'length' => '128',
+      'default' => '',
+    ),
+  ),
+  'primary key' => array(
+    'id',
+  ),
+  'mysql_character_set' => 'utf8',
+));
+
+$connection->insert('recipe_unit')
+->fields(array(
+  'id',
+  'name',
+  'abbreviation',
+  'metric',
+  'type',
+  'aliases',
+))
+->values(array(
+  'id' => '1',
+  'name' => 'Slice',
+  'abbreviation' => 'sli',
+  'metric' => '0',
+  'type' => 'Unit',
+  'aliases' => '',
+))
+->values(array(
+  'id' => '2',
+  'name' => 'Unit',
+  'abbreviation' => '',
+  'metric' => '0',
+  'type' => 'Unit',
+  'aliases' => 'each,ea,whole',
+))
+->values(array(
+  'id' => '3',
+  'name' => 'Clove',
+  'abbreviation' => 'clv',
+  'metric' => '0',
+  'type' => 'Unit',
+  'aliases' => '',
+))
+->values(array(
+  'id' => '4',
+  'name' => 'Pinch',
+  'abbreviation' => 'pn',
+  'metric' => '0',
+  'type' => 'Unit',
+  'aliases' => '',
+))
+->values(array(
+  'id' => '5',
+  'name' => 'Package',
+  'abbreviation' => 'pk',
+  'metric' => '0',
+  'type' => 'Unit',
+  'aliases' => 'pack',
+))
+->values(array(
+  'id' => '6',
+  'name' => 'Can',
+  'abbreviation' => 'cn',
+  'metric' => '0',
+  'type' => 'Unit',
+  'aliases' => 'jar',
+))
+->values(array(
+  'id' => '7',
+  'name' => 'Drop',
+  'abbreviation' => 'dr',
+  'metric' => '0',
+  'type' => 'Unit',
+  'aliases' => '',
+))
+->values(array(
+  'id' => '8',
+  'name' => 'Bunch',
+  'abbreviation' => 'bn',
+  'metric' => '0',
+  'type' => 'Unit',
+  'aliases' => '',
+))
+->values(array(
+  'id' => '9',
+  'name' => 'Dash',
+  'abbreviation' => 'ds',
+  'metric' => '0',
+  'type' => 'Unit',
+  'aliases' => '',
+))
+->values(array(
+  'id' => '10',
+  'name' => 'Carton',
+  'abbreviation' => 'ct',
+  'metric' => '0',
+  'type' => 'Unit',
+  'aliases' => '',
+))
+->values(array(
+  'id' => '11',
+  'name' => 'Cup',
+  'abbreviation' => 'c',
+  'metric' => '0',
+  'type' => 'Volume',
+  'aliases' => '',
+))
+->values(array(
+  'id' => '12',
+  'name' => 'Tablespoon',
+  'abbreviation' => 'T',
+  'metric' => '0',
+  'type' => 'Volume',
+  'aliases' => 'tbsp,tb',
+))
+->values(array(
+  'id' => '13',
+  'name' => 'Teaspoon',
+  'abbreviation' => 't',
+  'metric' => '0',
+  'type' => 'Volume',
+  'aliases' => 'tsp',
+))
+->values(array(
+  'id' => '14',
+  'name' => 'Pound',
+  'abbreviation' => 'lb',
+  'metric' => '0',
+  'type' => 'Mass',
+  'aliases' => '',
+))
+->values(array(
+  'id' => '15',
+  'name' => 'Ounce',
+  'abbreviation' => 'oz',
+  'metric' => '0',
+  'type' => 'Mass',
+  'aliases' => '',
+))
+->values(array(
+  'id' => '16',
+  'name' => 'Pint',
+  'abbreviation' => 'pt',
+  'metric' => '0',
+  'type' => 'Volume',
+  'aliases' => '',
+))
+->values(array(
+  'id' => '17',
+  'name' => 'Quart',
+  'abbreviation' => 'q',
+  'metric' => '0',
+  'type' => 'Volume',
+  'aliases' => '',
+))
+->values(array(
+  'id' => '18',
+  'name' => 'Gallon',
+  'abbreviation' => 'gal',
+  'metric' => '0',
+  'type' => 'Volume',
+  'aliases' => '',
+))
+->values(array(
+  'id' => '19',
+  'name' => 'Milligram',
+  'abbreviation' => 'mg',
+  'metric' => '1',
+  'type' => 'Mass',
+  'aliases' => '',
+))
+->values(array(
+  'id' => '20',
+  'name' => 'Centigram',
+  'abbreviation' => 'cg',
+  'metric' => '1',
+  'type' => 'Mass',
+  'aliases' => '',
+))
+->values(array(
+  'id' => '21',
+  'name' => 'Gram',
+  'abbreviation' => 'g',
+  'metric' => '1',
+  'type' => 'Mass',
+  'aliases' => '',
+))
+->values(array(
+  'id' => '22',
+  'name' => 'Kilogram',
+  'abbreviation' => 'kg',
+  'metric' => '1',
+  'type' => 'Mass',
+  'aliases' => '',
+))
+->values(array(
+  'id' => '23',
+  'name' => 'Millilitre',
+  'abbreviation' => 'ml',
+  'metric' => '1',
+  'type' => 'Volume',
+  'aliases' => '',
+))
+->values(array(
+  'id' => '24',
+  'name' => 'Centilitre',
+  'abbreviation' => 'cl',
+  'metric' => '1',
+  'type' => 'Volume',
+  'aliases' => '',
+))
+->values(array(
+  'id' => '25',
+  'name' => 'Litre',
+  'abbreviation' => 'l',
+  'metric' => '1',
+  'type' => 'Volume',
+  'aliases' => '',
+))
+->values(array(
+  'id' => '26',
+  'name' => 'Decilitre',
+  'abbreviation' => 'dl',
+  'metric' => '1',
+  'type' => 'Volume',
+  'aliases' => '',
+))
+->values(array(
+  'id' => '27',
+  'name' => 'Tablespoon (Metric)',
+  'abbreviation' => 'tbsp',
+  'metric' => '1',
+  'type' => 'Volume',
+  'aliases' => 'T',
+))
+->values(array(
+  'id' => '28',
+  'name' => 'Teaspoon (Metric)',
+  'abbreviation' => 'tsp',
+  'metric' => '1',
+  'type' => 'Volume',
+  'aliases' => 't',
+))
+->values(array(
+  'id' => '29',
+  'name' => 'Unknown',
+  'abbreviation' => 'Unknown',
+  'metric' => '0',
+  'type' => 'Unit',
+  'aliases' => '',
+))
+->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' => '255',
+      'default' => '',
+    ),
+    'owner' => array(
+      'type' => 'varchar',
+      'not null' => TRUE,
+      'length' => '255',
+      'default' => '',
+    ),
+    'status' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'size' => 'normal',
+      'default' => '0',
+    ),
+    'throttle' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'size' => 'tiny',
+      'default' => '0',
+    ),
+    'bootstrap' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'size' => 'normal',
+      'default' => '0',
+    ),
+    'schema_version' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'size' => 'small',
+      'default' => '-1',
+    ),
+    'weight' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'size' => 'normal',
+      'default' => '0',
+    ),
+    'info' => array(
+      'type' => 'text',
+      'not null' => FALSE,
+      'size' => 'normal',
+    ),
+  ),
+  'primary key' => array(
+    'filename',
+  ),
+  'indexes' => array(
+    'modules' => array(
+      array(
+        'type',
+        '12',
+      ),
+      'status',
+      'weight',
+      'filename',
+    ),
+    'bootstrap' => array(
+      array(
+        'type',
+        '12',
+      ),
+      'status',
+      'bootstrap',
+      'weight',
+      'filename',
+    ),
+    'type_name' => array(
+      array(
+        'type',
+        '12',
+      ),
+      'name',
+    ),
+  ),
+  'mysql_character_set' => 'utf8',
+));
+
+$connection->insert('system')
+->fields(array(
+  'filename',
+  'name',
+  'type',
+  'owner',
+  'status',
+  'throttle',
+  'bootstrap',
+  'schema_version',
+  'weight',
+  'info',
+))
+->values(array(
+  'filename' => 'sites/all/modules/recipe/recipe.module',
+  'name' => 'recipe',
+  'type' => 'module',
+  'owner' => '',
+  'status' => '1',
+  'throttle' => '0',
+  'bootstrap' => '0',
+  'schema_version' => '6104',
+  'weight' => '0',
+  'info' => 'a:8:{s:4:"name";s:6:"Recipe";s:11:"description";s:28:"Collect and display recipes.";s:12:"dependencies";a:1:{i:0;s:8:"taxonomy";}s:7:"package";s:6:"Recipe";s:4:"core";s:3:"6.x";s:10:"dependents";a:0:{}s:7:"version";N;s:3:"php";s:5:"4.3.5";}',
+))
+->execute();
+
+
+$connection->schema()->createTable('variable', array(
+  'fields' => array(
+    'name' => array(
+      'type' => 'varchar',
+      'not null' => TRUE,
+      'length' => '128',
+      'default' => '',
+    ),
+    'value' => array(
+      'type' => 'text',
+      'not null' => TRUE,
+      'size' => 'big',
+    ),
+  ),
+  'primary key' => array(
+    'name',
+  ),
+  'mysql_character_set' => 'utf8',
+));
+
+$connection->insert('variable')
+->fields(array(
+  'name',
+  'value',
+))
+->values(array(
+  'name' => 'recipe_fraction_display',
+  'value' => 's:10:"{%d }%d/%d";',
+))
+->values(array(
+  'name' => 'recipe_ingredient_name_normalize',
+  'value' => 's:1:"1";',
+))
+->values(array(
+  'name' => 'recipe_unit_display',
+  'value' => 's:1:"1";',
+))
+->execute();
diff --git a/modules/ingredient/tests/src/Kernel/Migrate/recipe615/MigrateIngredient615TestBase.php b/modules/ingredient/tests/src/Kernel/Migrate/recipe615/MigrateIngredient615TestBase.php
new file mode 100644
index 0000000..247069b
--- /dev/null
+++ b/modules/ingredient/tests/src/Kernel/Migrate/recipe615/MigrateIngredient615TestBase.php
@@ -0,0 +1,19 @@
+<?php
+
+namespace Drupal\Tests\ingredient\Kernel\Migrate\recipe615;
+
+use Drupal\Tests\migrate_drupal\Kernel\d6\MigrateDrupal6TestBase;
+
+/**
+ * Provides a base class for Ingredient migrations from Recipe 6.x-1.5.
+ */
+abstract class MigrateIngredient615TestBase extends MigrateDrupal6TestBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function getFixtureFilePath() {
+    return __DIR__ . '/../../../../fixtures/ingredient615.php';
+  }
+
+}
diff --git a/modules/ingredient/tests/src/Kernel/Migrate/recipe615/MigrateIngredientSettingsTest.php b/modules/ingredient/tests/src/Kernel/Migrate/recipe615/MigrateIngredientSettingsTest.php
new file mode 100644
index 0000000..5bf63a4
--- /dev/null
+++ b/modules/ingredient/tests/src/Kernel/Migrate/recipe615/MigrateIngredientSettingsTest.php
@@ -0,0 +1,34 @@
+<?php
+
+namespace Drupal\Tests\ingredient\Kernel\Migrate\recipe615;
+
+/**
+ * Tests migration of Recipe's ingredient variables to configuration.
+ *
+ * @group recipe
+ */
+class MigrateIngredientSettingsTest extends MigrateIngredient615TestBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public static $modules = ['ingredient'];
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp() {
+    parent::setUp();
+    $this->installConfig(static::$modules);
+    $this->executeMigrations(['recipe1x_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/recipe615/MigrateIngredientTest.php b/modules/ingredient/tests/src/Kernel/Migrate/recipe615/MigrateIngredientTest.php
new file mode 100644
index 0000000..88085ce
--- /dev/null
+++ b/modules/ingredient/tests/src/Kernel/Migrate/recipe615/MigrateIngredientTest.php
@@ -0,0 +1,60 @@
+<?php
+
+namespace Drupal\Tests\ingredient\Kernel\Migrate\recipe615;
+
+use Drupal\Core\Database\Database;
+use Drupal\ingredient\Entity\Ingredient;
+use Drupal\ingredient\IngredientInterface;
+
+/**
+ * Ingredients migration.
+ *
+ * @group recipe
+ */
+class MigrateIngredientTest extends MigrateIngredient615TestBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public static $modules = ['ingredient'];
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp() {
+    parent::setUp();
+    $this->installEntitySchema('ingredient');
+    $this->executeMigrations(['recipe1x_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/modules/ingredient/tests/src/Kernel/Migrate/recipe713/MigrateIngredientSettingsTest.php b/modules/ingredient/tests/src/Kernel/Migrate/recipe713/MigrateIngredientSettingsTest.php
index ed74568..22234da 100644
--- a/modules/ingredient/tests/src/Kernel/Migrate/recipe713/MigrateIngredientSettingsTest.php
+++ b/modules/ingredient/tests/src/Kernel/Migrate/recipe713/MigrateIngredientSettingsTest.php
@@ -20,7 +20,7 @@ class MigrateIngredientSettingsTest extends MigrateIngredient713TestBase {
   protected function setUp() {
     parent::setUp();
     $this->installConfig(static::$modules);
-    $this->executeMigrations(['recipe713_ingredient_settings']);
+    $this->executeMigrations(['recipe1x_ingredient_settings']);
   }
 
   /**
diff --git a/modules/ingredient/tests/src/Kernel/Migrate/recipe713/MigrateIngredientTest.php b/modules/ingredient/tests/src/Kernel/Migrate/recipe713/MigrateIngredientTest.php
index a90bf53..078dab3 100644
--- a/modules/ingredient/tests/src/Kernel/Migrate/recipe713/MigrateIngredientTest.php
+++ b/modules/ingredient/tests/src/Kernel/Migrate/recipe713/MigrateIngredientTest.php
@@ -24,7 +24,7 @@ class MigrateIngredientTest extends MigrateIngredient713TestBase {
   protected function setUp() {
     parent::setUp();
     $this->installEntitySchema('ingredient');
-    $this->executeMigrations(['recipe713_ingredient']);
+    $this->executeMigrations(['recipe1x_ingredient']);
   }
 
   /**
