diff --git a/core/modules/migrate/src/Plugin/migrate/process/Callback.php b/core/modules/migrate/src/Plugin/migrate/process/Callback.php
index 618e05d..c931c4e 100644
--- a/core/modules/migrate/src/Plugin/migrate/process/Callback.php
+++ b/core/modules/migrate/src/Plugin/migrate/process/Callback.php
@@ -7,15 +7,41 @@
 use Drupal\migrate\Row;
 
 /**
- * This plugin allows source value to be passed to a callback.
+ * Passes the source value to a callback.
  *
- * The current value is passed to a callable that returns the processed value.
- * This plugin allows simple processing of the value, such as strtolower(). The
- * callable takes the value as the single mandatory argument. No additional
- * arguments can be passed to the callback as this would make the migration YAML
- * file too complex.
+ * The callback process plugin allows simple processing of the value, such as
+ * strtolower(). The callable takes the source value as the single mandatory
+ * argument. No additional arguments can be passed to the callback as this would
+ * make the migration YAML file too complex.
  *
- * @link https://www.drupal.org/node/2181783 Online handbook documentation for callback process plugin @endlink
+ * Available configuration keys
+ *   - callable: The name of the callable method.
+ *
+ * Examples:
+ *
+ * @code
+ * process:
+ *   destination_field:
+ *   -
+ *     plugin: callback
+ *     callable: strtolower
+ *     source: source_field
+ * @endcode
+ *
+ * An example where the callable is a static method in a class.
+ *
+ * @code
+ * process:
+ *   destination_field:
+ *   -
+ *     plugin: callback
+ *     callable:
+ *       - '\Drupal\Component\Utility\Unicode'
+ *       - strtolower
+ *     source: source_field
+ * @endcode
+ *
+ * @see \Drupal\migrate\Plugin\MigrateProcessInterface
  *
  * @MigrateProcessPlugin(
  *   id = "callback"
diff --git a/core/modules/migrate/src/Plugin/migrate/process/Concat.php b/core/modules/migrate/src/Plugin/migrate/process/Concat.php
index c013bdc..350e7e8 100644
--- a/core/modules/migrate/src/Plugin/migrate/process/Concat.php
+++ b/core/modules/migrate/src/Plugin/migrate/process/Concat.php
@@ -8,9 +8,43 @@
 use Drupal\migrate\Row;
 
 /**
- * Concatenates the strings in the current value.
+ * Concatenates the strings in the source.
  *
- * @link https://www.drupal.org/node/2345927 Online handbook documentation for concat process plugin @endlink
+ * The concat process plugin is used to concatenate strings in the source. An
+ * example use case would be when the source data contains an array of strings
+ * that should be imploded into a single value.
+ *
+ * Available configuration keys
+ *   - delimiter: (optional) A delimiter to insert between the strings.
+ *
+ * Examples:
+ *
+ * @code
+ * process:
+ *   new_text_field:
+ *     plugin: concat
+ *     source:
+ *       - foo
+ *       - bar
+ * @endcode
+ *
+ * This will set new_text_field to foobar.
+ *
+ * You can also specify a delimiter.
+ *
+ * @code
+ * process:
+ *   new_text_field:
+ *     plugin: concat
+ *     source:
+ *       - foo
+ *       - bar
+ *     delimiter: /
+ * @endcode
+ *
+ * This will set new_text_field to foo/bar.
+ *
+ * @see \Drupal\migrate\Plugin\MigrateProcessInterface
  *
  * @MigrateProcessPlugin(
  *   id = "concat",
@@ -20,9 +54,22 @@
 class Concat extends ProcessPluginBase {
 
   /**
-   * {@inheritdoc}
+   * Concatenates the strings in the source value.
+   *
+   * @param array $value
+   *   The input array.
+   * @param \Drupal\migrate\MigrateExecutableInterface $migrate_executable
+   *   The migration in which this process is being executed.
+   * @param \Drupal\migrate\Row $row
+   *   The row from the source to process.
+   * @param string $destination_property
+   *   The destination property currently worked on. This is only used together
+   *   with the $row above.
+   *
+   * @return string
+   *   The imploded value.
    *
-   * Concatenates the strings in the current value.
+   * @throws \Drupal\migrate\MigrateException
    */
   public function transform($value, MigrateExecutableInterface $migrate_executable, Row $row, $destination_property) {
     if (is_array($value)) {
diff --git a/core/modules/migrate/src/Plugin/migrate/process/DedupeBase.php b/core/modules/migrate/src/Plugin/migrate/process/DedupeBase.php
index adaf720..54bc04d 100644
--- a/core/modules/migrate/src/Plugin/migrate/process/DedupeBase.php
+++ b/core/modules/migrate/src/Plugin/migrate/process/DedupeBase.php
@@ -9,19 +9,40 @@
 use Drupal\Component\Utility\Unicode;
 
 /**
- * This abstract base contains the dedupe logic.
+ * Provides deduplication logic.
  *
- * These plugins avoid duplication at the destination. For example, when
- * creating filter format names, the current value is checked against the
- * existing filter format names and if it exists, a numeric postfix is added
- * and incremented until a unique value is created.
+ * The default_value process plugin is used to avoid duplication at the
+ * destination. For example, when creating filter format names, the source
+ * value is checked against the existing filter format names and if it exists,
+ * a numeric postfix is added and incremented until a unique value is created.
+ * An optional postfix string can be insert before the numeric postfix.
  *
- * @link https://www.drupal.org/node/2345929 Online handbook documentation for dedupebase process plugin @endlink
+ * Available configuration keys
+ *   - start: (optional) The returned string will start at the start'th position in string.
+ *   - length: (optional) The maximum number of characters in the returned string.
+ *   - postfix: (optional) A string to insert before the numeric postfix.
+ *
+ * @see \Drupal\migrate\Plugin\MigrateProcessInterface
  */
 abstract class DedupeBase extends ProcessPluginBase {
 
   /**
-   * {@inheritdoc}
+   * Creates a deduplicated value.
+   *
+   * @param string $value
+   *   The input string.
+   * @param \Drupal\migrate\MigrateExecutableInterface $migrate_executable
+   *   The migration in which this process is being executed.
+   * @param \Drupal\migrate\Row $row
+   *   The row from the source to process.
+   * @param string $destination_property
+   *   The destination property currently worked on. This is only used together
+   *   with the $row above.
+   *
+   * @return string
+   *   The imploded value.
+   *
+   * @throws \Drupal\migrate\MigrateException
    */
   public function transform($value, MigrateExecutableInterface $migrate_executable, Row $row, $destination_property) {
     $i = 1;
diff --git a/core/modules/migrate/src/Plugin/migrate/process/DedupeEntity.php b/core/modules/migrate/src/Plugin/migrate/process/DedupeEntity.php
index d2afe8f..8faef21 100644
--- a/core/modules/migrate/src/Plugin/migrate/process/DedupeEntity.php
+++ b/core/modules/migrate/src/Plugin/migrate/process/DedupeEntity.php
@@ -8,9 +8,41 @@
 use Symfony\Component\DependencyInjection\ContainerInterface;
 
 /**
- * Ensures value is not duplicated against an entity field.
+ * Ensures the source value is not duplicated against an entity field.
  *
- * @link https://www.drupal.org/node/2135325 Online handbook documentation for dedupe_entity process plugin @endlink
+ * The dedupe_entity process plugin has two configuration keys, entity_type and
+ * field. It's typically used with an entity destination, making sure that after
+ * saving the entity, the field value is unique. For example, if the value is
+ * foo and there is already an entity where the field value is foo, then the
+ * plugin will return foo1. A third, optional configuration key is postfix which
+ * will be added between the number and the original value, for example, foo_1
+ * for postfix: _. Note that the value of postfix is ignored if the value is not
+ * changed, if it was already unique.
+ *
+ * Available configuration keys
+ *   - entity_type:
+ *   - field:
+ *   - postfix: (optional) A string to insert before the numeric postfix.
+ *
+ * Examples:
+ *
+ * @code
+ * process:
+ *   format:
+ *   -
+ *     plugin: machine_name
+ *     source: name
+ *   -
+ *     plugin: dedupe_entity
+ *     entity_type: filter_format
+ *     field: format
+ * @endcode
+ *
+ * This will create a format machine name out the human readable name and make
+ * sure it's unique.
+ *
+ * @see \Drupal\migrate\Plugin\migrate\process\DedupeBase
+ * @see \Drupal\migrate\Plugin\MigrateProcessInterface
  *
  * @MigrateProcessPlugin(
  *   id = "dedupe_entity"
diff --git a/core/modules/migrate/src/Plugin/migrate/process/DefaultValue.php b/core/modules/migrate/src/Plugin/migrate/process/DefaultValue.php
index db216f6..f28aba6 100644
--- a/core/modules/migrate/src/Plugin/migrate/process/DefaultValue.php
+++ b/core/modules/migrate/src/Plugin/migrate/process/DefaultValue.php
@@ -7,9 +7,38 @@
 use Drupal\migrate\Row;
 
 /**
- * This plugin sets missing values on the destination.
+ * Sets a default value.
  *
- * @link https://www.drupal.org/node/2135313 Online handbook documentation for default_value process plugin @endlink
+ * The default_value process plugin provides the ability to set a fixed default
+ * value. The plugin sets the pipeline to the default value if the pipeline has
+ * no value (NULL, zero or empty string). The strict configuration key can be
+ * used to set the default only when the pipeline value is NULL.
+ *
+ * Available configuration keys
+ *   - default_value: The fixed default value to apply.
+ *   - strict: (optional) Use strict value checking. Defaults to false.
+ *     - false = apply default when pipeline value is empty().
+ *     - true = apply default when value is NULL.
+ * Note that the pipeline starts with value NULL.
+ *
+ * Example:
+ *
+ * @code
+ * process:
+ *   uid:
+ *     -
+ *       plugin: migration
+ *       migration: users
+ *       source: author
+ *     -
+ *       plugin: default_value
+ *       default_value: 44
+ * @endcode
+ *
+ * This will look up the source value of author in the users migration and if
+ * not found, set the destination property uid to 44.
+ *
+ * @see \Drupal\migrate\Plugin\MigrateProcessInterface
  *
  * @MigrateProcessPlugin(
  *   id = "default_value"
diff --git a/core/modules/migrate/src/Plugin/migrate/process/Explode.php b/core/modules/migrate/src/Plugin/migrate/process/Explode.php
index fd3cc9c..7d61aad 100644
--- a/core/modules/migrate/src/Plugin/migrate/process/Explode.php
+++ b/core/modules/migrate/src/Plugin/migrate/process/Explode.php
@@ -8,9 +8,39 @@
 use Drupal\migrate\Row;
 
 /**
- * This plugin explodes a delimited string into an array of values.
+ * Explodes the source value into an array of values.
  *
- * @link https://www.drupal.org/node/2674504 Online handbook documentation for explode process plugin @endlink
+ * The explode process plugin creates an array of strings, each of which is a
+ * substring formed by splitting the source on boundaries formed by the string
+ * delimiter. One use case is for building the theme and color configuration
+ * setting name from the Drupal 7 variable name. For example, to convert
+ * theme_bartik_settings to bartik.settings.
+ *
+ * Available configuration keys
+ *   - source: The source string.
+ *   - limit: (optional)
+ *     - If limit is set and positive, the returned array will contain a maximum of limit elements with the last element containing the rest of string.
+ *     - If the limit parameter is negative, all components except the last -limit are returned.
+ *     - If the limit parameter is zero, then this is treated as 1.
+ *   - delimiter: (optional) The boundary string.
+ *
+ * Example:
+ *
+ * @code
+ * process:
+ *   new_text_field:
+ *     plugin: explode
+ *       source: some_text_field
+ *       limit: 100
+ *       delimiter: _
+ * @endcode
+ *
+ * If limit is > PHP_INT_MAX it will be set to PHP_INT_MAX.
+ *
+ * The PHP equivalent of this would be:
+ * $destination['new_text_field'] = explode('_', $source['some_text_field'], 100)
+ *
+ * @see \Drupal\migrate\Plugin\MigrateProcessInterface
  *
  * @MigrateProcessPlugin(
  *   id = "explode"
@@ -19,7 +49,23 @@
 class Explode extends ProcessPluginBase {
 
   /**
-   * {@inheritdoc}
+   * Performs the associated process.
+   *
+   * @param string $value
+   *   The input string.
+   * @param \Drupal\migrate\MigrateExecutableInterface $migrate_executable
+   *   The migration in which this process is being executed.
+   * @param \Drupal\migrate\Row $row
+   *   The row from the source to process.
+   * @param string $destination_property
+   *   The destination property currently worked on. This is only used together
+   *   with the $row above.
+   *
+   * @return array
+   *   The array of sub strings created by splitting the input on boundaries
+   *   formed by the string delimiter.
+   *
+   * @throws \Drupal\migrate\MigrateException
    */
   public function transform($value, MigrateExecutableInterface $migrate_executable, Row $row, $destination_property) {
     if (is_string($value)) {
diff --git a/core/modules/migrate/src/Plugin/migrate/process/Extract.php b/core/modules/migrate/src/Plugin/migrate/process/Extract.php
index 81671d8..7c210c3 100644
--- a/core/modules/migrate/src/Plugin/migrate/process/Extract.php
+++ b/core/modules/migrate/src/Plugin/migrate/process/Extract.php
@@ -9,9 +9,51 @@
 use Drupal\migrate\Row;
 
 /**
- * This plugin extracts a value from an array.
+ * Extracts a value from the source value array.
  *
- * @link https://www.drupal.org/node/2152731 Online handbook documentation for extract process plugin @endlink
+ * The extract process plugin is used to pull data from potentially multi-level
+ * arrays in the source. One use case is extracting data from field arrays in
+ * previous versions of Drupal - for example, in Drupal 7 a field array would be
+ * indexed first by language, then by delta, and finally by a key such as
+ * 'value'.
+ *
+ * Available configuration keys
+ *   - source: The source value.
+ *   - index: An array of indices.
+ *   - default: (optional) A default value to assing to the destination if the key does not exist.
+ *
+ * Examples:
+ *
+ * @code
+ * process:
+ *   new_text_field:
+ *   plugin: extract
+ *     source: some_text_field
+ *     index:
+ *       - und
+ *       - 0
+ *       - value
+ * @endcode
+ *
+ * The PHP equivalent of this would be:
+ * $destination['new_text_field'] = $source['some_text_field']['und'][0]['value'].
+ *
+ * In addition, there is a default configuration option for this plugin. When a
+ * default is specified, if the key doesn't exist, then the plugin will return
+ * the value of default.
+ *
+ * @code
+ * plugin: extract
+ * source: some_text_field
+ * default: 'Default title'
+ * index:
+ *   - title
+ * @endcode
+ *
+ * If $source['some_text_field']['title'] doesn't exist, then the plugin will
+ * return "Default title".
+ *
+ * @see \Drupal\migrate\Plugin\MigrateProcessInterface
  *
  * @MigrateProcessPlugin(
  *   id = "extract"
@@ -20,7 +62,22 @@
 class Extract extends ProcessPluginBase {
 
   /**
-   * {@inheritdoc}
+   * Performs the associated process.
+   *
+   * @param string $value
+   *   The input string.
+   * @param \Drupal\migrate\MigrateExecutableInterface $migrate_executable
+   *   The migration in which this process is being executed.
+   * @param \Drupal\migrate\Row $row
+   *   The row from the source to process.
+   * @param string $destination_property
+   *   The destination property currently worked on. This is only used together
+   *   with the $row above.
+   *
+   * @return string
+   *   The sub string of $value.
+   *
+   * @throws \Drupal\migrate\MigrateException
    */
   public function transform($value, MigrateExecutableInterface $migrate_executable, Row $row, $destination_property) {
     if (!is_array($value)) {
diff --git a/core/modules/migrate/src/Plugin/migrate/process/FileCopy.php b/core/modules/migrate/src/Plugin/migrate/process/FileCopy.php
index 4759146..db62c8e 100644
--- a/core/modules/migrate/src/Plugin/migrate/process/FileCopy.php
+++ b/core/modules/migrate/src/Plugin/migrate/process/FileCopy.php
@@ -13,7 +13,31 @@
 use Symfony\Component\DependencyInjection\ContainerInterface;
 
 /**
- * Copy a file from one place into another.
+ * Copies or moves a local file from one place into another.
+ *
+ * The file_copy process plugin ...
+ *
+ * The source value is an array of two values
+ *   - source: The source path or URI.
+ *   - destination: The destination path or URI.
+ *
+ * Available configuration keys
+ *   - move: (optional) If set the move the file otherwise copy the file.
+ *   - rename: (optional) If set rename the file.
+ *
+ * Examples:
+ *
+ * @code
+ * process:
+ *   new_text_field:
+ *     plugin: concat
+ *     source:
+ *       - foo
+ *       - bar
+ *     delimiter: /
+ * @endcode
+ *
+ * @see \Drupal\migrate\Plugin\MigrateProcessInterface
  *
  * @MigrateProcessPlugin(
  *   id = "file_copy"
@@ -73,7 +97,22 @@ public static function create(ContainerInterface $container, array $configuratio
   }
 
   /**
-   * {@inheritdoc}
+   * Performs the associated process.
+   *
+   * @param string $value
+   *   The input string.
+   * @param \Drupal\migrate\MigrateExecutableInterface $migrate_executable
+   *   The migration in which this process is being executed.
+   * @param \Drupal\migrate\Row $row
+   *   The row from the source to process.
+   * @param string $destination_property
+   *   The destination property currently worked on. This is only used together
+   *   with the $row above.
+   *
+   * @return string
+   *   The sub string of $value.
+   *
+   * @throws \Drupal\migrate\MigrateException
    */
   public function transform($value, MigrateExecutableInterface $migrate_executable, Row $row, $destination_property) {
     // If we're stubbing a file entity, return a URI of NULL so it will get
diff --git a/core/modules/migrate/src/Plugin/migrate/process/Flatten.php b/core/modules/migrate/src/Plugin/migrate/process/Flatten.php
index f663e4d..18db143 100644
--- a/core/modules/migrate/src/Plugin/migrate/process/Flatten.php
+++ b/core/modules/migrate/src/Plugin/migrate/process/Flatten.php
@@ -6,13 +6,39 @@
 use Drupal\migrate\Row;
 
 /**
- * This plugin flattens the current value.
+ * Flattens the source value.
  *
- * During some types of processing (e.g. user permission splitting), what was
- * once a single value gets transformed into multiple values. This plugin will
- * flatten them back down to single values again.
+ * The flatten process plugin converts a nested array into a flat array. For
+ * example array(array(1, 2, array(3, 4)), array(5), 6) becomes
+ * array(1, 2, 3, 4, 5, 6). During some types of processing (e.g. user permission
+ * splitting), what was once a single value gets transformed into multiple
+ * values. This plugin will flatten them back down to single values again.
  *
- * @link https://www.drupal.org/node/2154215 Online handbook documentation for flatten process plugin @endlink
+ * Example:
+ *
+ * @code
+ * process:
+ *   tags:
+ *      -
+ *        plugin: static_map
+ *        source: keywords
+ *        map:
+ *          foo: bar
+ *          baz:
+ *            - qux
+ *            - quux
+ *      -
+ *        plugin: flatten
+ * @endcode
+ *
+ * In this example, items in the source field keywords are mapped to items for
+ * the destination field tags. Given [foo, baz] at the input, the static_map
+ * process results in [bar, [qux, quux]]. At this point, Migrate would try to
+ * import two items: bar and [qux, quux]. The latter is not a valid one and
+ * won't be imported. We need to pass the values through the flatten processor
+ * to obtain a three items array [bar, qux, quux], suitable for import.
+ *
+ * @see \Drupal\migrate\Plugin\MigrateProcessInterface
  *
  * @MigrateProcessPlugin(
  *   id = "flatten",
diff --git a/core/modules/migrate/src/Plugin/migrate/process/Get.php b/core/modules/migrate/src/Plugin/migrate/process/Get.php
index f6b3c34..16ee2a8 100644
--- a/core/modules/migrate/src/Plugin/migrate/process/Get.php
+++ b/core/modules/migrate/src/Plugin/migrate/process/Get.php
@@ -7,9 +7,74 @@
 use Drupal\migrate\Row;
 
 /**
- * This plugin copies from the source to the destination.
+ * Gets the source value.
  *
- * @link https://www.drupal.org/node/2135307 Online handbook documentation for get process plugin @endlink
+ * Typically, the get plugin is the start of every process pipeline, typically
+ * shorthanded by adding a source key to another plugin.
+ *
+ * It has a single configuration key, the source. The value typically is a
+ * source property and after running this plugin, the pipeline value will be set
+ * to the value of that property.
+ *
+ * Available configuration keys
+ *   - source: Source property.
+ *
+ * Examples:
+ *
+ * @code
+ * process:
+ *   bar:
+ *     plugin: get
+ *     source: foo
+ * @endcode
+ *
+ * This copies the source value of foo to the destination property bar. Since
+ * get is the default process plugin, it can be shorthanded as such:
+ *
+ * @code
+ * process:
+ *   bar: foo
+ * @endcode
+ *
+ * get also supports a list of source properties. If this list contains an empty
+ * element then the current value will be used. This makes it impossible to
+ * reach a source property with an empty string as its name.
+ *
+ * get also supports copying destination values. These are indicated by a
+ * starting @ sign. Values using @ must be wrapped in quotes.
+ *
+ * @code
+ * process:
+ *   foo:
+ *     plugin: machine_name
+ *     source: baz
+ *   bar:
+ *     plugin: get
+ *   source: '@foo'
+ * @endcode
+ *
+ * This will simply copy the destination value of foo to the destination
+ * property bar. foo configuration is included for illustration purposes.
+ *
+ * Because of this, if your source or destination property actually starts with
+ * a @ you need to double those starting characters up. This means that if a
+ * destination property happens to start with a @ and you want to refer it,
+ * you'll need to start with three @ characters -- one to indicate the
+ * destination and two for escaping the real @.
+ *
+ * @code
+ * process:
+ * @foo:
+ *   plugin: machine_name
+ *   source: baz
+ * bar:
+ *   plugin: get
+ *   source: '@@@foo'
+ * @endcode
+ *
+ * This should occur extremely rarely.
+ *
+ * @see \Drupal\migrate\Plugin\MigrateProcessInterface
  *
  * @MigrateProcessPlugin(
  *   id = "get"
diff --git a/core/modules/migrate/src/Plugin/migrate/process/Iterator.php b/core/modules/migrate/src/Plugin/migrate/process/Iterator.php
index 70df9ba..4768b46 100644
--- a/core/modules/migrate/src/Plugin/migrate/process/Iterator.php
+++ b/core/modules/migrate/src/Plugin/migrate/process/Iterator.php
@@ -7,9 +7,116 @@
 use Drupal\migrate\Row;
 
 /**
- * This plugin iterates and processes an array.
+ * Iterates and processes an array.
  *
- * @link https://www.drupal.org/node/2135345 Online handbook documentation for iterator process plugin @endlink
+ * The iterator process plugin allows processing of a list of associative arrays
+ * (for simple lists see handling multiple values). Often source data will
+ * logically include multiple-value properties as associative arrays. For
+ * example, for filter formats on Drupal 6, the filters property contains a
+ * list of filters belonging to that format, identified by a numeric delta
+ * (a delta of 2 indicates the URL filter, a delta of 1 indicates automatic
+ * breaking, etc.):
+ *
+ * Available configuration keys
+ *   - process:
+ *
+ * Examples:
+ *
+ * @code
+ * source: Array
+ * (
+ *   [format] => 1
+ *   [name] => Filtered HTML
+ * ...
+ *   [filters] => Array
+ *     (
+ *       [0] => Array
+ *         (
+ *           [module] => filter
+ *           [delta] => 2
+ *           [weight] => 0
+ *         )
+ *       [1] => Array
+ *         (
+ *           [module] => filter
+ *           [delta] => 0
+ *           [weight] => 1
+ *         )
+ * ...
+ * @endcode
+ *
+ * The iterator process plugin will take these arrays one at a time and run its
+ * own process over each one:
+ *
+ * @code
+ * process:
+ *   filters:
+ *     plugin: iterator
+ *     source: filters
+ *     process:
+ *       id:
+ *         plugin: static_map
+ *         source:
+ *           - module
+ *           - delta
+ *         map:
+ *     filter:
+ *       0: filter_html_escape
+ *       1: filter_autop
+ *       2: filter_url
+ *       3: filter_htmlcorrector
+ *       4: filter_html_escape
+ *     php:
+ *       0: php_code
+ * @endcode
+ *
+ * So, plugin: iterator and source: filters means we take each array
+ * element [0], [1], etc. in the source filters field, and apply the static_map
+ * plugin to it. We take the first ([0]) array:
+ *
+ * @code
+ * Array
+ * (
+ *     [module] => filter
+ *     [delta] => 2
+ *     [weight] => 0
+ * )
+ * @endcode
+ *
+ * The map source keys are module and delta, so in the map key, since the
+ * [module] value is filter, we index the array using the delta value of 2 and
+ * arrive at filter_url as our value - this will be the first value in the array
+ * assigned to the destination filters. Similarly, we will take the 0 value for
+ * the weight in the second array to generate a second value of filter_html_escape.
+ *
+ * There's one more problem that needs to be solved: often the key of the arrays
+ * need to be changed. In this case, the new id property needs to be the key.
+ * It'd be possible to just add key: "@id" to the iterator process but that
+ * would require special casing the key property and somehow escape it when
+ * there is actually a destination called key. Instead, it is moved out of the
+ * process and key is in the configuration of iterator itself:
+ *
+ * @code
+ * process:
+ *   filters:
+ *     plugin: iterator
+ *     source: filters
+ *     key: "@id"
+ *     process:
+ *       id:
+ *         plugin: static_map
+ * @endcode
+ *
+ * The process pipeline for key is special in two ways: first, it runs after
+ * the normal process is done. Because of this, key: "@key" is also valid.
+ * Second, the pipeline does not start with NULL but the value of the current key.
+ * This way, the value of key can come from the other properties or the current
+ * key. For the latter, omit the source from the first plugin in the pipeline
+ * for key.
+ *
+ * An example of the input and output data is attached.
+ *
+ * @see \Drupal\migrate\Plugin\MigrateProcessInterface
  *
  * @MigrateProcessPlugin(
  *   id = "iterator",
diff --git a/core/modules/migrate/src/Plugin/migrate/process/MachineName.php b/core/modules/migrate/src/Plugin/migrate/process/MachineName.php
index 15ed356..412eeb5 100644
--- a/core/modules/migrate/src/Plugin/migrate/process/MachineName.php
+++ b/core/modules/migrate/src/Plugin/migrate/process/MachineName.php
@@ -11,13 +11,26 @@
 use Symfony\Component\DependencyInjection\ContainerInterface;
 
 /**
- * This plugin creates a machine name.
+ * Creates a machine name.
  *
- * The current value gets transliterated, non-alphanumeric characters removed
- * and replaced by an underscore and multiple underscores are collapsed into
- * one.
+ * The machine_name process plugin takes the source value, runs it over the
+ * transliteration service, lowercases it, replaces anything that's not a number
+ * or a letter with an underscore and removes duplicate underscores. It's very
+ * often followed by one of the deduplication plugins.
  *
- * @link https://www.drupal.org/node/2135323 Online handbook documentation for machine_name process plugin @endlink
+ * Example:
+ *
+ * @code
+ * process:
+ *   bar:
+ *     plugin: machine_name
+ *     source: foo
+ * @endcode
+ *
+ * If the value of foo in the source is áéí! then the destination value of bar
+ * will be aei_.
+ *
+ * @see \Drupal\migrate\Plugin\MigrateProcessInterface
  *
  * @MigrateProcessPlugin(
  *   id = "machine_name"
diff --git a/core/modules/migrate/src/Plugin/migrate/process/MenuLinkParent.php b/core/modules/migrate/src/Plugin/migrate/process/MenuLinkParent.php
index 0cb7c68..487f6ec 100644
--- a/core/modules/migrate/src/Plugin/migrate/process/MenuLinkParent.php
+++ b/core/modules/migrate/src/Plugin/migrate/process/MenuLinkParent.php
@@ -15,7 +15,28 @@
 use Symfony\Component\DependencyInjection\ContainerInterface;
 
 /**
- * This plugin figures out menu link parent plugin IDs.
+ * Determines the menu link parent plugin IDs.
+ *
+ * The menu_link_parent process plugin figures out menu link parent plugin IDs.
+ *
+ * The source is an array of three values:
+ *   - parent_id: The parent link ID (plid) is the mlid of the link above in the hierarchy, or zero if the link is at the top level in its menu.
+ *   - menu_name: The menu name. All links with the same menu name (such as 'navigation') are part of the same menu.
+ *   - parent_link_path: The Drupal path or external path this link points to.
+ *
+ * Example:
+ *
+ * @code
+ * process:
+ *   parent:
+ *     plugin: menu_link_parent
+ *     source:
+ *       - plid
+ *       - menu_name
+ *       - parent_link_path
+ * @endcode
+ *
+ * @see \Drupal\migrate\Plugin\MigrateProcessInterface
  *
  * @MigrateProcessPlugin(
  *   id = "menu_link_parent"
@@ -64,9 +85,24 @@ public static function create(ContainerInterface $container, array $configuratio
   }
 
   /**
-   * {@inheritdoc}
    *
    * Find the parent link GUID.
+   * Performs the associated process.
+   *
+   * @param string $value
+   *   The input string.
+   * @param \Drupal\migrate\MigrateExecutableInterface $migrate_executable
+   *   The migration in which this process is being executed.
+   * @param \Drupal\migrate\Row $row
+   *   The row from the source to process.
+   * @param string $destination_property
+   *   The destination property currently worked on. This is only used together
+   *   with the $row above.
+   *
+   * @return string
+   *   The sub string of $value.
+   *
+   * @throws \Drupal\migrate\MigrateSkipRowException
    */
   public function transform($value, MigrateExecutableInterface $migrate_executable, Row $row, $destination_property) {
     $parent_id = array_shift($value);
diff --git a/core/modules/migrate/src/Plugin/migrate/process/Migration.php b/core/modules/migrate/src/Plugin/migrate/process/Migration.php
index a8d5b60..37eaf5a 100644
--- a/core/modules/migrate/src/Plugin/migrate/process/Migration.php
+++ b/core/modules/migrate/src/Plugin/migrate/process/Migration.php
@@ -16,7 +16,120 @@
 /**
  * Calculates the value of a property based on a previous migration.
  *
- * @link https://www.drupal.org/node/2149801 Online handbook documentation for migration process plugin @endlink
+ * It is important to maintain relationships among content coming from the
+ * source site, but in most instances the unique identifiers of the content
+ * change in the process of migration. For example, on the source site a given
+ * user account may have an "author" ID of 123, but the Drupal user account
+ * created from it may have a uid of 456. The migration process maintains the
+ * relationships between source and destination identifiers in map tables, and
+ * this information is leveraged by the migration process plugin.
+ *
+ * Available configuration keys
+ *   - migration: An array of migration ids.
+ *   - source_ids:
+ *   - stub_id:
+ *
+ * Examples:
+ *
+ * Consider a node migration, where you want to maintain authorship. If you have
+ * migrated the user accounts in a migration named users, you would specify the
+ * following:
+ *
+ * @code
+ * process:
+ *   uid:
+ *     plugin: migration
+ *     migration: users
+ *     source: author
+ * @endcode
+ *
+ * This takes the value of the author property in the source data, and looks it
+ * up in the map table associated with the users migration, returning the
+ * resulting user ID and assigning it to the destination uid property.
+ *
+ * The value of migration can be a list of migration ids. When using multiple
+ * migrations it is possible each use different source identifiers. In this
+ * case one can use source_ids which is an array keyed by the migration ids
+ * and the value is a list of source properties with the same features as normal
+ * source (see the get plugin for more on this).
+ *
+ * @code
+ * process:
+ *   uid:
+ *   plugin: migration
+ *   migration:
+ *     - users
+ *     - members
+ *   source_ids:
+ *     users:
+ *       - author
+ *     members:
+ *       - author
+ * @endcode
+ *
+ * If the migration does not find the source ID in the migration map it will
+ * create a stub entity for the relationship to use. This stub is generated by
+ * the migration provided. In the case of multiple migrations the first value of
+ * migration list will be used, but you can select the migration you wish to
+ * use to create the stub:
+ *
+ * @code
+ * process:
+ *   uid:
+ *     plugin: migration
+ *     migration:
+ *       - users
+ *       - members
+ *     source_ids:
+ *       users:
+ *         - author
+ *       members:
+ *         - author
+ *     stub_id: members
+ * @endcode
+ *
+ * Here, the value of stub_id selects the members migration to create any stub
+ * entities, overriding the default of the users migration.
+ *
+ * To prevent the creation of a stub entity when no relationship is found in the
+ * migration map, use no_stub. It can be set to any non-empty value:
+ *
+ * @code
+ * process:
+ *   uid:
+ *   plugin: migration
+ *   migration: users
+ *   no_stub: true
+ *   source: author
+ * @endcode
+ *
+ * Scenario:
+ *   - field_drupal6_pages is a drupal 6 node reference field.
+ *   - field_drupal8_pages is a drupal 8 entity reference field.
+ *
+ * @code
+ * field_drupal8_pages:
+ *   plugin: migration
+ *   migration: ya_node_page
+ *   source: field_drupal6_pages
+ * @endcode
+ *
+ * Scenario:
+ *   - field_drupal7_pages is a drupal 7 entity reference field.
+ *   - field_drupal8_pages is a drupal 8 entity reference field.
+ *
+ * @code
+ * field_drupal8_pages:
+ *   plugin: iterator
+ *   source: field_drupal7_pages
+ *   process:
+ *     target_id:
+ *       plugin: migration
+ *       migration: ya_node_page
+ *       source: target_id
+ * @endcode
+ * 
+ * @see \Drupal\migrate\Plugin\MigrateProcessInterface
  *
  * @MigrateProcessPlugin(
  *   id = "migration"
diff --git a/core/modules/migrate/src/Plugin/migrate/process/Route.php b/core/modules/migrate/src/Plugin/migrate/process/Route.php
index 2c0144b..f8696af 100644
--- a/core/modules/migrate/src/Plugin/migrate/process/Route.php
+++ b/core/modules/migrate/src/Plugin/migrate/process/Route.php
@@ -11,10 +11,27 @@
 use Drupal\migrate\Row;
 
 /**
+ * Sets the destination route information based on the source link_path.
  *
- * @link https://www.drupal.org/node/2750777 Online handbook documentation for route process plugin @endlink
+ * The route process plugin ...
  *
- * * @MigrateProcessPlugin(
+ * The source value is an array of two values
+ *   - link_path:
+ *   - options:
+ *
+ * Example:
+ *
+ * @code
+ * process:
+ *   route:
+ *     source:
+ *       - link_path
+ *       - options
+ * @endcode
+ *
+ * @see \Drupal\migrate\Plugin\MigrateProcessInterface
+ *
+ * @MigrateProcessPlugin(
  *   id = "route"
  * )
  */
diff --git a/core/modules/migrate/src/Plugin/migrate/process/SkipOnEmpty.php b/core/modules/migrate/src/Plugin/migrate/process/SkipOnEmpty.php
index 28b6df0..08dd7f6 100644
--- a/core/modules/migrate/src/Plugin/migrate/process/SkipOnEmpty.php
+++ b/core/modules/migrate/src/Plugin/migrate/process/SkipOnEmpty.php
@@ -9,9 +9,89 @@
 use Drupal\migrate\MigrateSkipRowException;
 
 /**
- * If the source evaluates to empty, we skip processing or the whole row.
+ * Skips processing the current row when the source value evaluates to empty.
  *
- * @link https://www.drupal.org/node/2228793 Online handbook documentation for skip_on_empty process plugin @endlink
+ * The skip_on_empty process plugin checks to see if the current pipeline value
+ * is empty (for example the empty string, FALSE, or 0). If so, the further
+ * processing of the property or the entire row (depending on the chosen method)
+ * is skipped and will not be migrated.
+ *
+ * To skip the processing of the property when an empty value is encountered,
+ * use the method: process setting.
+ * This is useful when migrating parent values. When the parent source value is
+ * 0 or empty, which represents the root element, there is no need to set a
+ * destination value. In the other case a parent exists and needs a migration
+ * lookup.
+ *
+ * To skip the entire row when an empty value is encountered, use the method:
+ * row setting.
+ * this is useful when combined with a migration process plugin to check if a
+ * related item was previously migrated.
+ *
+ * Examples:
+ *
+ * Example of usage for method: row:
+ *
+ * @code
+ * process:
+ *   field_type_exists:
+ *   -
+ *     plugin: migration
+ *     migration: d6_field
+ *     source:
+ *       - field_name
+ *   -
+ *     plugin: skip_on_empty
+ *     method: row
+ *   -
+ *     plugin: extract
+ *     index:
+ *       - 1
+ * @endcode
+ *
+ * Examples of usage for method:  process:
+ *
+ * @code
+ * process:
+ *   parent:
+ *   -
+ *     plugin: skip_on_empty
+ *     method: process
+ *     source: parent
+ *   -
+ *     plugin: migration
+ *     migration: d6_taxonomy_term
+ * @endcode
+ *
+ * or
+ *
+ * @code
+ *  process:
+ *    book.pid:
+ *    -
+ *      plugin: skip_on_empty
+ *      method: process
+ *      source: plid
+ *    -
+ *     plugin: migration
+ *     migration: d6_book
+ * @endcode
+ *
+ * or
+ *
+ * @code
+ *  process:
+ *    pid:
+ *    -
+ *      plugin: skip_on_empty
+ *      method: process
+ *      source: pid
+ *    -
+ *      plugin: migration
+ *      migration: d6_comment
+ * @endcode
+ *
+ * @see \Drupal\migrate\Plugin\MigrateProcessInterface
  *
  * @MigrateProcessPlugin(
  *   id = "skip_on_empty"
@@ -20,7 +100,22 @@
 class SkipOnEmpty extends ProcessPluginBase {
 
   /**
-   * {@inheritdoc}
+   * Performs the associated process.
+   *
+   * @param mixed $value
+   *   The input value.
+   * @param \Drupal\migrate\MigrateExecutableInterface $migrate_executable
+   *   The migration in which this process is being executed.
+   * @param \Drupal\migrate\Row $row
+   *   The row from the source to process.
+   * @param string $destination_property
+   *   The destination property currently worked on. This is only used together
+   *   with the $row above.
+   *
+   * @return string
+   *   The sub string of $value.
+   *
+   * @throws \Drupal\migrate\MigrateSkipRowException
    */
   public function row($value, MigrateExecutableInterface $migrate_executable, Row $row, $destination_property) {
     if (!$value) {
@@ -30,7 +125,22 @@ public function row($value, MigrateExecutableInterface $migrate_executable, Row
   }
 
   /**
-   * {@inheritdoc}
+   * Performs the associated process.
+   *
+   * @param mixed $value
+   *   The input value.
+   * @param \Drupal\migrate\MigrateExecutableInterface $migrate_executable
+   *   The migration in which this process is being executed.
+   * @param \Drupal\migrate\Row $row
+   *   The row from the source to process.
+   * @param string $destination_property
+   *   The destination property currently worked on. This is only used together
+   *   with the $row above.
+   *
+   * @return string
+   *   The sub string of $value.
+   *
+   * @throws \Drupal\migrate\MigrateSkipProcessException
    */
   public function process($value, MigrateExecutableInterface $migrate_executable, Row $row, $destination_property) {
     if (!$value) {
diff --git a/core/modules/migrate/src/Plugin/migrate/process/SkipRowIfNotSet.php b/core/modules/migrate/src/Plugin/migrate/process/SkipRowIfNotSet.php
index a6cffce..df7ba73 100644
--- a/core/modules/migrate/src/Plugin/migrate/process/SkipRowIfNotSet.php
+++ b/core/modules/migrate/src/Plugin/migrate/process/SkipRowIfNotSet.php
@@ -8,9 +8,27 @@
 use Drupal\migrate\MigrateSkipRowException;
 
 /**
- * If the source evaluates to empty, we skip the current row.
+ * Skips processing the current row when a source value is not set.
  *
- * @link https://www.drupal.org/node/2345935 Online handbook documentation for skip_row_if_not_set process plugin @endlink
+ * The skip_row_if_not_set process plugin checks whether a value is set. If the
+ * value is set the value is returned otherwise a MigrateSkipRowException
+ * is thrown.
+ *
+ * Available configuration keys
+ *   - index: The source value to test.
+ *
+ * Example
+ *
+ * @code
+ *  process:
+ *    settings:
+ *    # Check if the "contact" key exists in the "data" array.
+ *    plugin: skip_row_if_not_set
+ *    index: contact
+ *    source: data
+ * @endcode
+ *
+ * @see \Drupal\migrate\Plugin\MigrateProcessInterface
  *
  * @MigrateProcessPlugin(
  *   id = "skip_row_if_not_set",
@@ -20,7 +38,22 @@
 class SkipRowIfNotSet extends ProcessPluginBase {
 
   /**
-   * {@inheritdoc}
+   * Performs the associated process.
+   *
+   * @param mixed $value
+   *   The input value.
+   * @param \Drupal\migrate\MigrateExecutableInterface $migrate_executable
+   *   The migration in which this process is being executed.
+   * @param \Drupal\migrate\Row $row
+   *   The row from the source to process.
+   * @param string $destination_property
+   *   The destination property currently worked on. This is only used together
+   *   with the $row above.
+   *
+   * @return string
+   *   The sub string of $value.
+   *
+   * @throws \Drupal\migrate\MigrateSkipRowException
    */
   public function transform($value, MigrateExecutableInterface $migrate_executable, Row $row, $destination_property) {
     if (!isset($value[$this->configuration['index']])) {
diff --git a/core/modules/migrate/src/Plugin/migrate/process/StaticMap.php b/core/modules/migrate/src/Plugin/migrate/process/StaticMap.php
index 769da3b..72b8a04 100644
--- a/core/modules/migrate/src/Plugin/migrate/process/StaticMap.php
+++ b/core/modules/migrate/src/Plugin/migrate/process/StaticMap.php
@@ -10,9 +10,76 @@
 use Drupal\migrate\MigrateSkipRowException;
 
 /**
- * This plugin changes the current value based on a static lookup map.
+ * Changes the source value based on a static lookup map.
  *
- * @link https://www.drupal.org/node/2143521 Online handbook documentation for static_map process plugin @endlink
+ * The static_map source plugin allows looking up a value based on a map
+ * specified in the configuration.
+ *
+ *  Available configuration keys
+ *    - source:
+ *    - map:
+ *    - bypass:
+ *
+ * Examples:
+ *
+ * @code
+ * process:
+ *   bar:
+ *     plugin: static_map
+ *     source: foo
+ *     map:
+ *       from: to
+ *       this: that
+ * @endcode
+ *
+ * If the value of the source property foo was from then the value of the
+ * destination property bar will be to. Similarly this becomes that. static_map
+ * can do a lot more than this: it supports a list of source properties. This is
+ * super useful in module-delta to machine name conversions.
+ *
+ * @code
+ * process:
+ *   id:
+ *   plugin: static_map
+ *     source:
+ *       - module
+ *       - delta
+ *      map:
+ *        filter:
+ *          0: filter_html_escape
+ *          1: filter_autop
+ *          2: filter_url
+ *          3: filter_htmlcorrector
+ *          4: filter_html_escape
+ *        php:
+ *          0: php_code
+ * @endcode
+ *
+ * If the value of the source properties module and delta are filter and 2
+ * respectively, then the value of the destination id will be filter_url. By
+ * default, if a value is not found in the map, an exception is thrown. This is
+ * desirable in the above example. When static_map is used to just rename a few
+ * things and leave the others, a bypass: true option can be added. In this
+ * case, the source value is used unchanged.
+ *
+ * Also, a default_value can be provided.
+ *
+ * @code
+ * process:
+ *   bar:
+ *     plugin: static_map
+ *     source: foo
+ *       map:
+ *         from: to
+ *         this: that
+ *       default_value: bar
+ * @endcode
+ *
+ * If the lookup fails, this value is used instead. Note that using the default
+ * value plugin after would not work as the pipeline has a value at this point:
+ * the value of the source specified for the static_map.
+ *
+ * @see \Drupal\migrate\Plugin\MigrateProcessInterface
  *
  * @MigrateProcessPlugin(
  *   id = "static_map"
@@ -21,7 +88,23 @@
 class StaticMap extends ProcessPluginBase {
 
   /**
-   * {@inheritdoc}
+   * Performs the associated process.
+   *
+   * @param mixed $value
+   *   The input value.
+   * @param \Drupal\migrate\MigrateExecutableInterface $migrate_executable
+   *   The migration in which this process is being executed.
+   * @param \Drupal\migrate\Row $row
+   *   The row from the source to process.
+   * @param string $destination_property
+   *   The destination property currently worked on. This is only used together
+   *   with the $row above.
+   *
+   * @return string
+   *   The sub string of $value.
+   *
+   * @throws \Drupal\migrate\MigrateException
+   * @throws \Drupal\migrate\MigrateSkipRowException
    */
   public function transform($value, MigrateExecutableInterface $migrate_executable, Row $row, $destination_property) {
     $new_value = $value;
diff --git a/core/modules/migrate/src/Plugin/migrate/process/Substr.php b/core/modules/migrate/src/Plugin/migrate/process/Substr.php
index 8ebc98c..18642a0 100644
--- a/core/modules/migrate/src/Plugin/migrate/process/Substr.php
+++ b/core/modules/migrate/src/Plugin/migrate/process/Substr.php
@@ -9,9 +9,42 @@
 use Drupal\Component\Utility\Unicode;
 
 /**
- * This plugin returns a substring of the current value.
+ * Returns a substring of the source value.
  *
- * @link https://www.drupal.org/node/2771965 Online handbook documentation for substr process plugin @endlink
+ * The substr process plugin returns the portion of the source value in the
+ * process pipeline specified by the start and length parameters.
+ * Unicode::substr is used to get the sub string.
+ *
+ * Available configuration keys
+ *   - start: (optional) The returned string will start at the start'th position in string.
+ *   - length: (optional) The maximum number of characters in the returned string.
+ *
+ * If start is NULL and length is an integer, the start position is the beginning
+ * of the string. If start is an integer and length is NULL the substring
+ * starting from the start position until the end of the string will be returned.
+ * If both start and length are NULL the entire string is returned.
+ *
+ * Example:
+ *
+ * @code
+ * process:
+ *   new_text_field:
+ *     plugin: substr
+ *     source: some_text_field
+ *       start: 6
+ *       length: 10
+ * @endcode
+ *
+ * If some_text_field was 'Marie Skłodowska Curie' then
+ * $destination['new_text_field'] would be 'Skłodowska'.
+ *
+ * The PHP equivalent of this is:
+ *
+ * @code
+ * $destination['new_text_field'] = substr($source['soume_text_field'], 6, 10)
+ * @endcode
+ *
+ * @see \Drupal\migrate\Plugin\MigrateProcessInterface
  *
  * @MigrateProcessPlugin(
  *   id = "substr"
@@ -20,7 +53,22 @@
 class Substr extends ProcessPluginBase {
 
   /**
-   * {@inheritdoc}
+   * Performs the associated process.
+   *
+   * @param string $value
+   *   The input string.
+   * @param \Drupal\migrate\MigrateExecutableInterface $migrate_executable
+   *   The migration in which this process is being executed.
+   * @param \Drupal\migrate\Row $row
+   *   The row from the source to process.
+   * @param string $destination_property
+   *   The destination property currently worked on. This is only used together
+   *   with the $row above.
+   *
+   * @return string
+   *   The sub string of $value.
+   *
+   * @throws \Drupal\migrate\MigrateException
    */
   public function transform($value, MigrateExecutableInterface $migrate_executable, Row $row, $destination_property) {
     $start = isset($this->configuration['start']) ? $this->configuration['start'] : 0;
diff --git a/core/modules/migrate/src/Plugin/migrate/process/UrlEncode.php b/core/modules/migrate/src/Plugin/migrate/process/UrlEncode.php
index b2c0d08..2c3a78e 100644
--- a/core/modules/migrate/src/Plugin/migrate/process/UrlEncode.php
+++ b/core/modules/migrate/src/Plugin/migrate/process/UrlEncode.php
@@ -9,10 +9,20 @@
 use GuzzleHttp\Psr7\Uri;
 
 /**
- * Apply urlencoding to a URI.
+ * Applies urlencoding to the source value.
  *
- * This is needed when the URI is to be opened by a later migration stage, and
- * the source URI value is not already encoded.
+ * The urlencode plugin is needed when the URI is to be opened by a later
+ * migration stage, and the source URI value is not already encoded.
+ *
+ * Example:
+ *
+ * @code
+ * process:
+ *   plugin: urlencode
+ *   source: some_url
+ * @endcode
+ *
+ * @see \Drupal\migrate\Plugin\MigrateProcessInterface
  *
  * @MigrateProcessPlugin(
  *   id = "urlencode"
@@ -21,7 +31,22 @@
 class UrlEncode extends ProcessPluginBase {
 
   /**
-   * {@inheritdoc}
+   * Performs the associated process.
+   *
+   * @param string $value
+   *   The input URL
+   * @param \Drupal\migrate\MigrateExecutableInterface $migrate_executable
+   *   The migration in which this process is being executed.
+   * @param \Drupal\migrate\Row $row
+   *   The row from the source to process.
+   * @param string $destination_property
+   *   The destination property currently worked on. This is only used together
+   *   with the $row above.
+   *
+   * @return string
+   *   The sub string of $value.
+   *
+   * @throws \Drupal\migrate\MigrateException
    */
   public function transform($value, MigrateExecutableInterface $migrate_executable, Row $row, $destination_property) {
     // Only apply to a full URL.
