diff --git a/core/lib/Drupal/Component/Utility/Random.php b/core/lib/Drupal/Component/Utility/Random.php
index f3bc4ae..79ba1dc 100644
--- a/core/lib/Drupal/Component/Utility/Random.php
+++ b/core/lib/Drupal/Component/Utility/Random.php
@@ -155,4 +155,91 @@ public function object($size = 4) {
     return $object;
   }
 
+  /**
+   * Build a string containing Latin words, often used as placeholder text.
+   *
+   * @param int $word_count
+   * @param bool $title
+   *   Uppercase all the words in the string.
+   * @return string
+   */
+  public function createGreeking($word_count, $title = FALSE) {
+    $dictionary = array("abbas", "abdo", "abico", "abigo", "abluo", "accumsan",
+      "acsi", "ad", "adipiscing", "aliquam", "aliquip", "amet", "antehabeo",
+      "appellatio", "aptent", "at", "augue", "autem", "bene", "blandit",
+      "brevitas", "caecus", "camur", "capto", "causa", "cogo", "comis",
+      "commodo", "commoveo", "consectetuer", "consequat", "conventio", "cui",
+      "damnum", "decet", "defui", "diam", "dignissim", "distineo", "dolor",
+      "dolore", "dolus", "duis", "ea", "eligo", "elit", "enim", "erat",
+      "eros", "esca", "esse", "et", "eu", "euismod", "eum", "ex", "exerci",
+      "exputo", "facilisi", "facilisis", "fere", "feugiat", "gemino",
+      "genitus", "gilvus", "gravis", "haero", "hendrerit", "hos", "huic",
+      "humo", "iaceo", "ibidem", "ideo", "ille", "illum", "immitto",
+      "importunus", "imputo", "in", "incassum", "inhibeo", "interdico",
+      "iriure", "iusto", "iustum", "jugis", "jumentum", "jus", "laoreet",
+      "lenis", "letalis", "lobortis", "loquor", "lucidus", "luctus", "ludus",
+      "luptatum", "macto", "magna", "mauris", "melior", "metuo", "meus",
+      "minim", "modo", "molior", "mos", "natu", "neo", "neque", "nibh",
+      "nimis", "nisl", "nobis", "nostrud", "nulla", "nunc", "nutus", "obruo",
+      "occuro", "odio", "olim", "oppeto", "os", "pagus", "pala", "paratus",
+      "patria", "paulatim", "pecus", "persto", "pertineo", "plaga", "pneum",
+      "populus", "praemitto", "praesent", "premo", "probo", "proprius",
+      "quadrum", "quae", "qui", "quia", "quibus", "quidem", "quidne", "quis",
+      "ratis", "refero", "refoveo", "roto", "rusticus", "saepius",
+      "sagaciter", "saluto", "scisco", "secundum", "sed", "si", "similis",
+      "singularis", "sino", "sit", "sudo", "suscipere", "suscipit", "tamen",
+      "tation", "te", "tego", "tincidunt", "torqueo", "tum", "turpis",
+      "typicus", "ulciscor", "ullamcorper", "usitas", "ut", "utinam",
+      "utrum", "uxor", "valde", "valetudo", "validus", "vel", "velit",
+      "veniam", "venio", "vereor", "vero", "verto", "vicis", "vindico",
+      "virtus", "voco", "volutpat", "vulpes", "vulputate", "wisi", "ymo",
+      "zelus");
+    $dictionary_flipped = array_flip($dictionary);
+    $greeking = '';
+
+    if (!$title) {
+      $words_remaining = $word_count;
+      while ($words_remaining > 0) {
+        $sentence_length = mt_rand(3, 10);
+        $words = array_rand($dictionary_flipped, $sentence_length);
+        $sentence = implode(' ', $words);
+        $greeking .= ucfirst($sentence) . '. ';
+        $words_remaining -= $sentence_length;
+      }
+    }
+    else {
+      // Use slightly different method for titles.
+      $words = array_rand($dictionary_flipped, $word_count);
+      $words = is_array($words) ? implode(' ', $words) : $words;
+      $greeking = ucwords($words);
+    }
+    return trim($greeking);
+  }
+
+  /**
+   * Generate a string that looks like a word.
+   *
+   * @param int $length
+   *    The expected word length.
+   *
+   * @return string
+   */
+  public function generateWord($length) {
+    mt_srand((double)microtime()*1000000);
+
+    $vowels = array("a", "e", "i", "o", "u");
+    $cons = array("b", "c", "d", "g", "h", "j", "k", "l", "m", "n", "p", "r", "s", "t", "u", "v", "w", "tr",
+      "cr", "br", "fr", "th", "dr", "ch", "ph", "wr", "st", "sp", "sw", "pr", "sl", "cl", "sh");
+
+    $num_vowels = count($vowels);
+    $num_cons = count($cons);
+    $word = '';
+
+    while(strlen($word) < $length){
+      $word .= $cons[mt_rand(0, $num_cons - 1)] . $vowels[mt_rand(0, $num_vowels - 1)];
+    }
+
+    return substr($word, 0, $length);
+  }
+
 }
diff --git a/core/lib/Drupal/Core/Field/FieldItemBase.php b/core/lib/Drupal/Core/Field/FieldItemBase.php
index 715bbb7..b120200 100644
--- a/core/lib/Drupal/Core/Field/FieldItemBase.php
+++ b/core/lib/Drupal/Core/Field/FieldItemBase.php
@@ -240,6 +240,11 @@ public function delete() { }
   /**
    * {@inheritdoc}
    */
+  public function generate() { }
+
+  /**
+   * {@inheritdoc}
+   */
   public function deleteRevision() { }
 
   /**
diff --git a/core/lib/Drupal/Core/Field/FieldItemInterface.php b/core/lib/Drupal/Core/Field/FieldItemInterface.php
index 8577a04..62e9388 100644
--- a/core/lib/Drupal/Core/Field/FieldItemInterface.php
+++ b/core/lib/Drupal/Core/Field/FieldItemInterface.php
@@ -208,6 +208,13 @@ public function update();
   public function delete();
 
   /**
+   * Generate arbitrary, valid field values.
+   *
+   * Useful when populating a site with dummy content during site building or profiling.
+   */
+  public function generate();
+
+  /**
    * Defines custom revision delete behavior for field values.
    *
    * This method is called from during the process of deleting an entity
diff --git a/core/modules/link/src/Plugin/Field/FieldType/LinkItem.php b/core/modules/link/src/Plugin/Field/FieldType/LinkItem.php
index f8639bb..9872708 100644
--- a/core/modules/link/src/Plugin/Field/FieldType/LinkItem.php
+++ b/core/modules/link/src/Plugin/Field/FieldType/LinkItem.php
@@ -7,6 +7,7 @@
 
 namespace Drupal\link\Plugin\Field\FieldType;
 
+use Drupal\Component\Utility\Random;
 use Drupal\Core\Field\FieldItemBase;
 use Drupal\Core\Field\FieldStorageDefinitionInterface;
 use Drupal\Core\Form\FormStateInterface;
@@ -136,6 +137,32 @@ public function instanceSettingsForm(array $form, FormStateInterface $form_state
   /**
    * {@inheritdoc}
    */
+  public function generate() {
+    // Set of possible top-level domains.
+    $tlds = array('com', 'net', 'gov', 'org', 'edu', 'biz', 'info');
+    // Set random length for the domain name.
+    $domain_length = mt_rand(7, 15);
+    $random = new Random();
+
+    switch ($this->getSetting('title')) {
+      case DRUPAL_DISABLED:
+        $values['title'] = '';
+        break;
+      case DRUPAL_REQUIRED:
+        $values['title'] = $random->greeking(4);
+        break;
+      case DRUPAL_OPTIONAL:
+        // In case of optional title, randomize its generation.
+        $values['title'] = mt_rand(0,1) ? $random->greeking(4) : '';
+        break;
+    }
+    $values['url'] = 'http://www.' . $random->generateWord($domain_length) . '.' . $tlds[mt_rand(0, (sizeof($tlds)-1))];
+    $this->setValue($values);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   public function isEmpty() {
     $value = $this->get('url')->getValue();
     return $value === NULL || $value === '';
diff --git a/core/modules/link/src/Tests/LinkItemTest.php b/core/modules/link/src/Tests/LinkItemTest.php
index 1033fff..618c786 100644
--- a/core/modules/link/src/Tests/LinkItemTest.php
+++ b/core/modules/link/src/Tests/LinkItemTest.php
@@ -100,6 +100,14 @@ public function testLinkItem() {
     $this->assertEqual($entity->field_test->url, $new_url);
     $this->assertEqual($entity->field_test->title, $new_title);
     $this->assertEqual($entity->field_test->options['attributes']['class'], $new_class);
+
+    // Test the generate() method.
+    $entity = entity_create('entity_test');
+    $entity->field_test->first()->generate();
+    $entity->save();
+    // If there were no exceptions, our data passed validation and was saveable.
   }
 
+
+
 }
