diff --git a/src/Plugin/migrate/process/EntityGenerate.php b/src/Plugin/migrate/process/EntityGenerate.php
new file mode 100644
index 0000000..9b0f767
--- /dev/null
+++ b/src/Plugin/migrate/process/EntityGenerate.php
@@ -0,0 +1,172 @@
+<?php
+
+/**
+ * @file
+ * Contains Drupal\migrate_plus\Plugin\migrate\process\EntityGenerate.
+ */
+
+namespace Drupal\migrate_plus\Plugin\migrate\process;
+
+use Drupal\Core\Entity\EntityManagerInterface;
+use Drupal\migrate\Entity\MigrationInterface;
+use Drupal\migrate\MigrateException;
+use Drupal\migrate\MigrateExecutableInterface;
+use Drupal\migrate\ProcessPluginBase;
+use Drupal\migrate\Row;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+
+/**
+ * This plugin generates entity stubs.
+ *
+ * @MigrateProcessPlugin(
+ *   id = "entity_generate"
+ * )
+ */
+class EntityGenerate extends ProcessPluginBase {
+
+  /** @var \Drupal\Core\Entity\EntityManagerInterface */
+  protected $entityManager;
+
+  /** @var \Drupal\migrate\Entity\MigrationInterface */
+  protected $migration;
+
+  /** @var string */
+  protected $entityType;
+
+  /**
+   * The entity bundle key.
+   *
+   * @var string|bool
+   */
+  protected $bundleKey;
+
+  /**
+   * {@inheritdoc}
+   */
+  public function __construct(array $configuration, $pluginId, $pluginDefinition, MigrationInterface $migration, EntityManagerInterface $entityManager) {
+    parent::__construct($configuration, $pluginId, $pluginDefinition);
+    $this->migration = $migration;
+    $this->entityManager = $entityManager;
+    $this->entityType = substr($this->getPluginId(), 7);
+    $this->bundleKey = !empty($this->entityManager->getBundleInfo($this->entityType)['bundle']) ?: $this->entityManager->getBundleInfo($this->entityType)['bundle'];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function create(ContainerInterface $container, array $configuration, $pluginId, $pluginDefinition, MigrationInterface $migration = NULL) {
+    return new static(
+      $configuration,
+      $pluginId,
+      $pluginDefinition,
+      $migration,
+      $container->get('entity.manager')
+    );
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function transform($value, MigrateExecutableInterface $migrateExecutable, Row $row, $destinationProperty) {
+    if (!isset($this->configuration['value_key']) || !is_string($this->configuration['value_key'])) {
+      throw new MigrateException(sprintf('The entity_generate plugin requires a "value_key" configuration setting which should be a string that represents a entity property or field name to search on, such as "title". Configuration is: %s', var_export($this->configuration, TRUE)));
+    }
+
+    $bundle = FALSE;
+    if (!empty($this->configuration['bundle'])) {
+      $bundle = $this->configuration['bundle'];
+    }
+    elseif (!$bundle && !empty($this->migration->getProcess()[$this->bundleKey]['default_value'])) {
+      $bundle = $this->migration->getProcess()[$this->bundleKey]['default_value'];
+    }
+    if ($this->bundleKey && !$bundle) {
+      throw new MigrateException('The entity_generate plugin found no bundle but destination entity requires one.');
+    }
+
+    // Creates a stub entity if one doesn't exist.
+    if (!($result = $this->query($value, $bundle))) {
+      return $this->generateEntity($value, $bundle);
+    }
+
+    return $result;
+  }
+
+
+  /**
+   * Checks for the existence of some value.
+   *
+   * @param $value
+   * The value to query.
+   *
+   * @param $bundle
+   * The bundle value of the entity.
+   *
+   * @return mixed|bool
+   *   Entity id if the queried entity exists. Otherwise FALSE.
+   */
+  protected function query($value, $bundle) {
+    $ignoreCase = isset($this->configuration['ignore_case']) ?: FALSE;
+
+    $query = $this->entityManager->getStorage($this->entityType)
+      ->getQuery()
+      ->condition($this->configuration['value_key'], $value);
+    if ($this->bundleKey) {
+      $query->condition($this->bundleKey, $bundle);
+    }
+    $results = $query->execute();
+
+    if ($ignoreCase) {
+      // Returns the entity's identifier.
+      $valueLower = strtolower($value);
+      $identifiers = $this->entityManager->getStorage($this->entityType)->loadMultiple($results);
+
+      foreach ($identifiers as $identifier  => $entity) {
+        if ($valueLower == strtolower($entity->{$this->configuration['value_key']}->value())) {
+          return $identifier;
+        }
+      }
+    }
+
+    return reset($results);
+  }
+
+  /**
+   * Generates stub entity for a given value.
+   *
+   * @param string $value
+   *   Value to use in creation of stub entity.
+   * @param string $bundle
+   *   The bundle for the stub entity.
+   *
+   * @return int|string
+   *   The entity id of the generated entity.
+   */
+  protected function generateEntity($value, $bundle) {
+    return $this->entityManager
+      ->getStorage($this->entityType)
+      ->create($this->stub($value))
+      ->save()
+      ->id();
+  }
+
+  /**
+   * Fabricate a stub entity.
+   *
+   * @param $value
+   *   Value to use in creation of stub entity.
+   *
+   * @return array
+   *   The stub entity.
+   */
+  protected function stub($value, $bundle) {
+    $stub = array(
+      $this->configuration['value_key'] => $value,
+    );
+    if ($this->bundleKey) {
+      $stub[$this->bundleKey] = $bundle;
+    }
+
+    return $stub;
+  }
+
+}
