diff --git a/twitter.inc b/twitter.inc
index be2993c..39bd012 100644
--- a/twitter.inc
+++ b/twitter.inc
@@ -88,6 +88,7 @@ function twitter_account_load($id) {
     $account->import = $values['import'];
     $account->mentions = $values['mentions'];
     $account->is_global = $values['is_global'];
+    $account->moderated = $values['moderated'];
     return $account;
   }
   return NULL;
@@ -159,6 +160,9 @@ function twitter_status_save($status) {
   );
   db_merge('twitter')
     ->key(array('twitter_id' => $row['twitter_id']))
+    ->insertFields(array(
+      'status' => (int) $status->status,
+    ))
     ->fields($row)
     ->execute();
   // Let other modules know that a status has been saved.
@@ -166,6 +170,22 @@ function twitter_status_save($status) {
 }
 
 /**
+ * Updates a tweets status {twitter}
+ */
+function twitter_status_update($status) {
+  $row = array(
+      'twitter_id' => $status['twitter_id'],
+      'status' => (int) $status['status'],
+  );
+  db_merge('twitter')
+    ->key(array('twitter_id' => $row['twitter_id']))
+    ->fields($row)
+    ->execute();
+  // Let other modules know that a status has been saved.
+  module_invoke_all('twitter_status_update', $status);
+}
+
+/**
  * Post a message to twitter
  *
  * @param $twitter_account
@@ -183,7 +203,7 @@ function twitter_set_status($twitter_account, $status) {
 /**
  * Fetches a user's timeline.
  */
-function twitter_fetch_user_timeline($id) {
+function twitter_fetch_user_timeline($id, $moderated) {
   $account = twitter_account_load($id);
   $since = db_query("SELECT MAX(twitter_id) FROM {twitter} WHERE screen_name = :screen_name", array(':screen_name' => $account->screen_name))->fetchField();
 
@@ -197,11 +217,13 @@ function twitter_fetch_user_timeline($id) {
   // Fetch tweets.
   $statuses = $twitter->user_timeline($id, $params);
   foreach ($statuses as $status) {
+    $status->status = ! (bool) $moderated;
     twitter_status_save($status);
   }
 
   if (count($statuses) > 0) {
-    // Update account details.
+    // Update account details, but keep current moderation
+    $statuses[0]->user->moderated = $moderated;
     twitter_account_save($statuses[0]->user);
   }
 }
@@ -209,7 +231,7 @@ function twitter_fetch_user_timeline($id) {
 /**
  * Fetches user's mentions of an authenticated account.
  */
-function twitter_fetch_mentions_timeline($id) {
+function twitter_fetch_mentions_timeline($id, $moderated) {
   $account = twitter_account_load($id);
   // Connect to Twitter's API using the authenticated account to fetch mentions.
   $twitter = twitter_connect($account);
@@ -217,6 +239,7 @@ function twitter_fetch_mentions_timeline($id) {
   $params = array();
   $statuses = $twitter->mentions_timeline($params);
   foreach ($statuses as $status) {
+    $status->status = ! (bool) $moderated;
     if (!twitter_account_load($status->user->id)) {
       twitter_account_save($status->user);
     }
@@ -232,7 +255,8 @@ function twitter_fetch_mentions_timeline($id) {
  */
 function twitter_tweets($screen_name = NULL) {
   $query = db_select('twitter', 't')
-    ->fields('t');
+    ->fields('t')
+    ->orderBy('created_time', 'DESC');
   if (isset($screen_name)) {
     $query->condition('t.screen_name', $screen_name);
   }
diff --git a/twitter.install b/twitter.install
index e721596..0ca96fe 100644
--- a/twitter.install
+++ b/twitter.install
@@ -109,7 +109,14 @@ function twitter_schema() {
         'not null' => TRUE,
         'default' => 0,
       ),
-    ),
+      'status' => array(
+        'description' => "Boolean indicating whether the tweet is published.",
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'default' => 0,
+       ),
+     ),
     'indexes' => array('screen_name' => array('screen_name')),
     'primary key' => array('twitter_id'),
   );
@@ -289,6 +296,13 @@ function twitter_schema() {
         'not null' => TRUE,
         'default' => 0,
       ),
+      'moderated' => array(
+        'description' => "Boolean indicating whether the account is moderated.",
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'default' => 0,
+      ),
       'last_refresh' => array(
         'description' => "A UNIX timestamp marking the date Twitter statuses were last fetched on.",
         'type' => 'int',
@@ -427,3 +441,27 @@ function twitter_update_7500() {
     db_change_field('twitter_account', 'added_by_uid', 'uid', $spec);
   }
 }
+
+/**
+ * Adds twitter.status and twitter_account.moderated fields to identify
+ * published and unpublished tweets and moderated accounts
+ */
+function twitter_update_7501() {
+  $data = array(
+    'description' => "Boolean indicating whether the tweet is published.",
+    'type' => 'int',
+    'unsigned' => TRUE,
+    'not null' => TRUE,
+    'default' => 1,
+  );
+  db_add_field('twitter', 'status', $data);
+
+  $data = array(
+    'description' => "Boolean indicating whether the account is moderated.",
+    'type' => 'int',
+    'unsigned' => TRUE,
+    'not null' => TRUE,
+    'default' => 0,
+  );
+  db_add_field('twitter_account', 'moderated', $data);
+}
diff --git a/twitter.lib.php b/twitter.lib.php
index b58a1d7..267417d 100644
--- a/twitter.lib.php
+++ b/twitter.lib.php
@@ -1264,6 +1264,8 @@ class TwitterStatus {
 
   public $user;
 
+  public $status;
+
   /**
    * Constructor for TwitterStatus
    */
@@ -1279,6 +1281,14 @@ class TwitterStatus {
     $this->in_reply_to_screen_name = $values['in_reply_to_screen_name'];
     if (isset($values['user'])) {
       $this->user = new TwitterUser($values['user']);
+      $this->status = $this->user->moderated;
+    }
+    elseif (isset($values['status'])) {
+      $this->status = new TwitterUser($values['status']);
+    }
+    else
+    {
+      $this->status = 0;
     }
   }
 }
@@ -1333,6 +1343,8 @@ class TwitterUser {
 
   public $status;
 
+  public $moderated;
+
   protected $oauth_token;
 
   protected $oauth_token_secret;
@@ -1359,6 +1371,13 @@ class TwitterUser {
     $this->profile_background_tile = $values['profile_background_tile'];
     $this->verified = $values['verified'];
     $this->created_at = $values['created_at'];
+    if (!empty($values['moderated'])) {
+      $this->moderated = $values['moderated'];
+    }
+    else
+    {
+      $this->moderated = 0;
+    }
     if (!empty($values['uid'])) {
       $this->uid = $values['uid'];
     }
diff --git a/twitter.module b/twitter.module
index 9b91bec..4da8d3f 100644
--- a/twitter.module
+++ b/twitter.module
@@ -45,6 +45,15 @@ function twitter_menu() {
     'type' => MENU_LOCAL_TASK,
   );
 
+  $items['admin/config/services/twitter/tweets'] = array(
+      'title' => 'Tweets',
+      'description' => 'Tweets list.',
+      'page callback' => 'twitter_tweets_list',
+      'access arguments' => array('moderate tweets'),
+      'file' => 'twitter.pages.inc',
+      'type' => MENU_LOCAL_TASK,
+  );
+
   $items['user/%user/edit/twitter'] = array(
     'title' => 'Twitter accounts',
     'page callback' => 'twitter_user_settings',
@@ -69,6 +78,9 @@ function twitter_permission() {
     'add authenticated twitter accounts' => array(
       'title' => t('Add authenticated Twitter accounts'),
     ),
+    'moderate tweets' => array(
+      'title' => t('Moderate tweets'),
+    ),
     'administer twitter accounts' => array(
       'title' => t('Administer Twitter accounts'),
     ),
@@ -93,6 +105,9 @@ function twitter_theme() {
     'twitter_account_list_form' => array(
       'render element' => 'form',
     ),
+    'twitter_tweet_list_form' => array(
+      'render element' => 'form',
+    ),
     'twitter_status' => array(
       'variables' => array(
         'status' => NULL,
@@ -168,7 +183,7 @@ function twitter_cron() {
   // Pull up a list of Twitter accounts that are flagged for updating,
   // sorted by how long it's been since we last updated them. This ensures
   // that the most out-of-date accounts get updated first.
-  $result = db_query_range("SELECT twitter_uid
+  $result = db_query_range("SELECT twitter_uid, moderated
                             FROM {twitter_account}
                             WHERE uid <> 0 AND import = 1
                             ORDER BY last_refresh ASC",
@@ -176,10 +191,10 @@ function twitter_cron() {
   try {
     foreach ($result as $account) {
       // Fetch tweets and mentions.
-      twitter_fetch_user_timeline($account->twitter_uid);
+      twitter_fetch_user_timeline($account->twitter_uid, $account->moderated);
       $twitter_account = twitter_account_load($account->twitter_uid);
       if ($twitter_account->is_auth() && $twitter_account->mentions) {
-        twitter_fetch_mentions_timeline($twitter_account->id);
+        twitter_fetch_mentions_timeline($twitter_account->id, $account->moderated);
       }
       // Mark the time this account was updated.
       db_update('twitter_account')
diff --git a/twitter.pages.inc b/twitter.pages.inc
index caaa940..879ecfb 100644
--- a/twitter.pages.inc
+++ b/twitter.pages.inc
@@ -79,6 +79,143 @@ function twitter_admin_form($form, &$form_state) {
 }
 
 /**
+ * Form builder that lists Tweets.
+ *
+ * @param object $account
+ *   Optional user account.
+ * @return
+ *   A list of Tweets.
+ */
+function twitter_tweets_list($account = NULL) {
+  // Verify OAuth keys.
+  if (!twitter_api_keys()) {
+    $output = t('<p>You need to authenticate at least one Twitter account in order to use the Twitter API. Please fill out the OAuth fields at <a href="/admin/config/services/twitter/settings">Twitter Settings</a> and then return here.</p>');
+  }
+  else {
+    module_load_include('inc', 'twitter');
+    if (!$account) {
+      $tweets = twitter_tweets();
+    }
+    else {
+      $tweets = twitter_tweets($account->screen_name);
+    }
+
+    $output = array();
+    if (count($tweets)) {
+      // List Twitter accounts.
+      $output['header']['#markup'] = '';
+      if (user_access('administer site configuration')) {
+        $output['header']['#markup'] = t('<p>Tweets are pulled from Twitter by ' .
+            '<a href="/admin/reports/status/run-cron?destination=admin/config/services/twitter/tweets">running cron</a>. ');
+      }
+      $output['list_form'] = drupal_get_form('twitter_tweet_list_form', $tweets);
+    }
+    else {
+      // No accounts added. Inform about how to add one.
+      $output['header'] = array(
+          '#markup' => t('<p>No Twitter accounts have been added yet. Click on the following button to add one.</p>'),
+      );
+    }
+  }
+
+  return $output;
+}
+
+/**
+ * Formats each Tweet as a row within a form.
+ */
+function twitter_tweet_list_form($form, $form_state, $tweets = array()) {
+  $form['#tree'] = TRUE;
+  $form['tweets'] = array();
+
+  foreach ($tweets as $tweet) {
+    $form['tweets'][] = _twitter_tweet_list_row($tweet);
+  }
+
+  if (!empty($tweets)) {
+    $form['buttons']['submit'] = array(
+        '#type' => 'submit',
+        '#value' => t('Save changes'),
+    );
+  }
+
+  return $form;
+}
+
+/**
+ * Returns the form fields to manage a Tweet.
+ */
+function _twitter_tweet_list_row($tweet) {
+  $form['#tweet'] = $tweet;
+
+  $form['twitter_id'] = array(
+      '#type' => 'value',
+      '#value' => $tweet->twitter_id,
+  );
+
+  $form['screen_name'] = array(
+      '#type' => 'value',
+      '#value' => $tweet->screen_name,
+  );
+
+  $form['visible_name'] = array(
+    '#markup' => _twitter_user_profile($tweet->screen_name),
+  );
+
+  $form['text'] = array(
+      '#markup' => filter_xss(_twitter_filter_link(_twitter_filter_hashtag(_twitter_filter_username($tweet->text, NULL), NULL), NULL)),
+  );
+
+  $form['status'] = array(
+    '#type' => 'checkbox',
+    '#default_value' => $tweet->status ? $tweet->status : '',
+  );
+
+  return $form;
+}
+
+/**
+ * Themes the list of Tweets.
+ */
+function theme_twitter_tweet_list_form($variables) {
+  $form = $variables['form'];
+
+  $header = array(
+      t('Name'),
+      t('Text'),
+      t('Published'),
+  );
+
+  $rows = array();
+  foreach (element_children($form['tweets']) as $key) {
+    $element = &$form['tweets'][$key];
+    $row = array(
+        drupal_render($element['id']) . drupal_render($element['screen_name']) .
+        drupal_render($element['visible_name']).
+        drupal_render($element['screen_name']),
+        drupal_render($element['text']),
+        drupal_render($element['status']),
+    );
+    $rows[] = $row;
+  }
+
+  $output = theme('table', array('header' => $header, 'rows' => $rows));
+  $output .= drupal_render_children($form);
+  return $output;
+}
+
+/**
+ * Form submit handler for altering the list of Tweets.
+ */
+function twitter_tweet_list_form_submit($form, &$form_state) {
+  $tweets = $form_state['values']['tweets'];
+  foreach ($tweets as $tweet) {
+    twitter_status_update($tweet);
+  }
+  drupal_set_message(t('The Tweets settings were updated.'));
+}
+
+/**
  * Form builder that lists Twitter accounts.
  *
  * @param object $account
@@ -224,6 +361,18 @@ function _twitter_account_list_row($account) {
     );
   }
 
+  if ($account->import == TRUE || $account->mentions == TRUE) {
+    $form['moderated'] = array(
+      '#type' => 'checkbox',
+      '#default_value' => $account->moderated ? $account->moderated : '',
+    );
+  }
+  else {
+    $form['moderated'] = array(
+      '#markup' => '',
+    );
+  }
+
   $form['delete'] = array(
     '#type' => 'checkbox',
   );
@@ -250,6 +399,7 @@ function theme_twitter_account_list_form($variables) {
     t('Private'),
     t('Tweets'),
     t('Mentions'),
+    t('Moderated'),
     t('Delete'),
   ));
 
@@ -270,6 +420,7 @@ function theme_twitter_account_list_form($variables) {
       drupal_render($element['protected']),
       drupal_render($element['import']),
       drupal_render($element['mentions']),
+      drupal_render($element['moderated']),
       drupal_render($element['delete']),
     ));
     $rows[] = $row;
diff --git a/twitter.views.inc b/twitter.views.inc
index 6e319f1..3ddab1c 100644
--- a/twitter.views.inc
+++ b/twitter.views.inc
@@ -166,6 +166,22 @@ function twitter_views_data() {
     ),
   );
 
+  // Twitter account protected
+  $data['twitter']['status'] = array(
+      'title' => t('Publishing status'),
+      'help' => t('Whether this Tweet should be visible to the general public.'),
+      'field' => array(
+          'handler' => 'views_handler_field_boolean',
+          'click sortable' => TRUE,
+      ),
+      'filter' => array(
+          'handler' => 'views_handler_filter_boolean_operator',
+      ),
+      'sort' => array(
+          'handler' => 'views_handler_sort',
+      ),
+  );
+
   // Table twitter_account.
   $data['twitter_account']['table']['group']  = t('Twitter');
   $data['twitter_account']['table']['join'] = array(
diff --git a/twitter.views_default.inc b/twitter.views_default.inc
index 6883bca..cf9edb7 100644
--- a/twitter.views_default.inc
+++ b/twitter.views_default.inc
@@ -77,7 +77,13 @@ function twitter_views_default_views() {
   $handler->display->display_options['filters']['protected']['value'] = 0;
   $handler->display->display_options['filters']['protected']['group'] = '0';
   $handler->display->display_options['filters']['protected']['expose']['operator'] = FALSE;
-
+  /* Filter criterion: Twitter: Published status */
+  $handler->display->display_options['filters']['status']['id'] = 'status';
+  $handler->display->display_options['filters']['status']['table'] = 'twitter';
+  $handler->display->display_options['filters']['status']['field'] = 'status';
+  $handler->display->display_options['filters']['status']['value'] = 1;
+  $handler->display->display_options['filters']['status']['group'] = '0';
+  $handler->display->display_options['filters']['status']['expose']['operator'] = FALSE;
   /* Display: Tweets Raw */
   $handler = $view->new_display('page', 'Tweets Raw', 'page_all_tweets');
   $handler->display->display_options['defaults']['title'] = FALSE;
