diff --git a/twitter.generate.inc b/twitter.generate.inc
new file mode 100644
index 0000000..f65da5a
--- /dev/null
+++ b/twitter.generate.inc
@@ -0,0 +1,150 @@
+<?php
+
+/**
+ * @file
+ * Devel generate integration for the twitter module.
+ */
+
+function twitter_generate_form() {
+  $options = array(1 => t('Now'));
+  foreach (array(3600, 86400, 604800, 2592000, 31536000) as $interval) {
+    $options[$interval] = format_interval($interval, 1) . ' ' . t('ago');
+  }
+
+  // Twitter Account settings
+  $form['delete_accounts'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Delete all existing Twitter accounts before generating new accounts.'),
+    '#default_value' => FALSE,
+  );
+  $form['num_accounts'] = array(
+    '#type' => 'textfield',
+    '#title' => t('How many Twitter accounts would you like to generate?'),
+    '#description' => t('If Twitter accounts are generated, then only these accounts will be used for generated messages.'),
+    '#default_value' => 10,
+    '#size' => 10,
+  );
+  $form['account_time_range'] = array(
+    '#type' => 'select',
+    '#title' => t('How old should user accounts be?'),
+    '#description' => t('User ages will be distributed randomly from the current time, back to the selected time.'),
+    '#options' => $options,
+    '#default_value' => 604800,
+  );
+  
+  // Twitter Message settings
+  $form['delete_messages'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Delete all existing Twitter messages before generating new messages.'),
+    '#default_value' => FALSE,
+  );
+  $form['num_messages'] = array(
+    '#type' => 'textfield',
+    '#title' => t('How many Twitter messages would you like to generate?'),
+    '#default_value' => 50,
+    '#size' => 10,
+  );
+  $form['message_time_range'] = array(
+    '#type' => 'select',
+    '#title' => t('How old should Twitter messages be?'),
+    '#description' => t('Messages will be distributed randomly from the current time, back to the selected time.'),
+    '#options' => $options,
+    '#default_value' => 604800,
+  );
+
+  // Submit  
+  $form['submit'] = array(
+    '#type' => 'submit',
+    '#value' => t('Generate'),
+  );
+
+  return $form;
+}
+
+function twitter_generate_form_submit(&$form, &$form_state) {
+  module_load_include('inc', 'devel_generate');
+  module_load_include('inc', 'twitter');
+
+  $values = $form_state['values'];
+  if ($values['delete_messages']) {
+    _twitter_generate_delete_messages();
+  }
+  if ($values['delete_accounts']) {
+    _twitter_generate_delete_accounts();
+  }
+  
+  // TODO: use batch API
+  for ($i=0; $i<$values['num_accounts']; $i++) {
+    _twitter_generate_account($values);
+  }
+  for ($i=0; $i<$values['num_messages']; $i++) {
+    _twitter_generate_message($values);
+  }
+}
+
+function _twitter_generate_delete_accounts() {
+  db_query("TRUNCATE TABLE {twitter_account}");
+}
+
+function _twitter_generate_delete_messages() {
+  db_query("TRUNCATE TABLE {twitter}");
+}
+
+function _twitter_generate_account($values) {
+  $screen_name = devel_generate_word(mt_rand(5, 20));
+  $created_time = isset($values['account_time_range']) ? REQUEST_TIME - mt_rand(0, $values['account_time_range']) : REQUEST_TIME;
+  
+  // if ($values['attach_accounts']) {
+    $result = db_query_range("SELECT uid FROM {users} ORDER BY RAND()", 0, 1);
+    $uid = $result->fetchField();
+  // }
+  /* else {
+    $uid = 1;
+  } */
+  
+  $twitter_user = array(
+    'id' => rand(100000, 999999), // twitter_uid
+    'uid' => $uid,
+    'host' => NULL,
+    'screen_name' => $screen_name,
+    'oauth_token' => NULL,
+    'oauth_token_secret' => NULL,
+    'name' => 'Name for ' . $screen_name,
+    'description' => 'Description for ' . $screen_name,
+    'location' => devel_generate_word(mt_rand(5, 20)),
+    'followers_count' => mt_rand(0, 100),
+    'friends_count' => mt_rand(0, 100),
+    'statuses_count' => mt_rand(0, 100),
+    'favourites_count' => mt_rand(0, 100),
+    'url' => 'http://drupal.org/',
+    'profile_image_url' => 'https://si0.twimg.com/profile_images/29645282/druplicon_normal.png',
+    'created_at' => format_date($created_time, 'custom', 'D M d H:i:s Z Y'),
+    'created_time' => $created_time,
+    'utc_offset' => 0,
+    'import' => 0,
+    'is_global' => 0,
+  );
+
+  twitter_account_save($twitter_user);
+}
+
+function _twitter_generate_message($values) {
+  $account = db_query_range("SELECT twitter_uid, screen_name FROM {twitter_account} ORDER BY RAND()", 0, 1)->fetchObject();
+  $created_time = isset($values['message_time_range']) ? REQUEST_TIME - mt_rand(0, $values['message_time_range']) : REQUEST_TIME;
+
+  $status = (object) array(
+    'id' => $account->twitter_uid,
+    'user' => (object) array(
+      'screen_name' => $account->screen_name,
+    ),
+    'created_at' => format_date($created_time, 'custom', 'D M d H:i:s Z Y'),
+    'text' => devel_create_para(mt_rand(1, 10)),
+    'source' => 'devel_generate',
+    'in_reply_to_status_id' => 0,
+    'in_reply_to_user_id' => 0,
+    'in_reply_to_screen_name' => NULL,
+    'truncated' => 0,
+  );
+  // dsm($status);
+  twitter_status_save($status);
+}
diff --git a/twitter.module b/twitter.module
index 901e0f9..f36275f 100644
--- a/twitter.module
+++ b/twitter.module
@@ -55,6 +55,18 @@ function twitter_menu() {
     'access arguments' => array('make twitter accounts global'),
     'file' => 'twitter.pages.inc',
   );
+  
+  // Devel generate integration.
+  if (module_exists('devel_generate')) {
+    $items['admin/config/development/generate/twitter'] = array(
+      'title' => 'Generate tweets',
+      'description' => 'Generate a given number of tweets. Optionally delete current tweets.',
+      'page callback' => 'drupal_get_form',
+      'page arguments' => array('twitter_generate_form'),
+      'access arguments' => array('administer site configuration'),
+      'file' => 'twitter.generate.inc',
+    );
+  }
 
   return $items;
 }
