diff --git a/addressfield.devel_generate.inc b/addressfield.devel_generate.inc
new file mode 100644
index 0000000..b4a7219
--- /dev/null
+++ b/addressfield.devel_generate.inc
@@ -0,0 +1,47 @@
+<?php
+
+/**
+ * Implements hook_devel_generate().
+ */
+function addressfield_devel_generate($object, $field, $instance, $bundle) {
+  $formats = &drupal_static(__FUNCTION__, array());
+  if (empty($formats[$bundle])) {
+    $instance['default_value'][0]['available_countries'] = $instance['widget']['settings']['available_countries'];
+    $formats[$bundle] = addressfield_generate($instance['default_value'][0], array_filter($instance['widget']['settings']['format_handlers']), 'form');
+  }
+  $values = array();
+  _addressfield_devel_generate_fill_values($values, $format, $format);
+  return $values;
+}
+
+/**
+ * Recursive function to find and fill in addressfield form values.
+ */
+function _addressfield_devel_generate_fill_values(&$values, $format_level, $format_root) {
+  foreach (element_children($format_level) as $field) {
+    if ($format_level[$field]['#type'] === 'addressfield_container') {
+      // Recurse
+      _addressfield_devel_generate_fill_values($values, $format_level[$field], $format_root);
+    }
+    elseif ($field === 'country') {
+      // Country field is a special case
+      if (!empty($format_root['#handlers']['address-hide-country'])) {
+        $values['country'] = $format_root['#address']['country'];
+      }
+      elseif (!empty($format_root['#address']['available_countries'])) {
+        $values['country'] = array_rand($format_root['#address']['available_countries']);
+      }
+      else {
+        $values['country'] = array_rand($format_level['country']['#options']);
+      }
+    }
+    else {
+      if (!empty($format_level[$field]['#options'])) {
+        $values[$field] = array_rand($format_level[$field]['#options']);
+      }
+      else {
+        $values[$field] = devel_create_greeking(mt_rand(1, 3), TRUE);
+      }
+    }
+  }
+}
