diff --git a/includes/simplenews.admin.inc b/includes/simplenews.admin.inc
index 62ab5be..945971d 100644
--- a/includes/simplenews.admin.inc
+++ b/includes/simplenews.admin.inc
@@ -259,8 +259,6 @@ function simplenews_admin_issues_submit($form, &$form_state) {
       $args = array($nids);
     }
     call_user_func_array($function, $args);
-
-    drupal_set_message(t('The update has been performed.'));
   }
   else {
     // We need to rebuild the form to go to a second step. For example, to
@@ -270,13 +268,25 @@ function simplenews_admin_issues_submit($form, &$form_state) {
 }
 
 /**
- * @todo
+ * Callback to send newsletters.
  */
 function simplenews_issue_send($nids) {
-  //@todo
-  // check if $nids are not pending: error
-  // check if newsletters are not sent: error
-  // send newsletter
+  foreach (node_load_multiple($nids) as $node) {
+
+    $newsletter = simplenews_newsletter_load($node->nid);
+    if ($newsletter->status != SIMPLENEWS_STATUS_SEND_NOT) {
+      continue;
+    }
+
+    if ($node->status == NODE_NOT_PUBLISHED) {
+      simplenews_update_sent_status($node, SIMPLENEWS_COMMAND_SEND_PUBLISH);
+      drupal_set_message(t('Newsletter %title is unpublished and will be sent on publish', array('%title' => $node->title)));
+      continue;
+    }
+
+    simplenews_update_sent_status($node);
+    simplenews_send_node($node);
+  }
 }
 
 /**
@@ -1757,9 +1767,10 @@ function theme_simplenews_status($variables) {
         SIMPLENEWS_STATUS_SEND_READY => 'sn-sent.png',
       );
       $title = array(
-        SIMPLENEWS_STATUS_SEND_NOT => '-',
+        SIMPLENEWS_STATUS_SEND_NOT => t('Not yet sent'),
         SIMPLENEWS_STATUS_SEND_PENDING => t('Currently sending by cron'),
         SIMPLENEWS_STATUS_SEND_READY => t('Sent'),
+        SIMPLENEWS_STATUS_SEND_PUBLISH => t('Send on publish'),
       );
       break;
   }
diff --git a/simplenews.module b/simplenews.module
index 6946934..44145a9 100644
--- a/simplenews.module
+++ b/simplenews.module
@@ -3252,7 +3252,7 @@ function simplenews_update_sent_status($node, $status = SIMPLENEWS_STATUS_SEND_P
   if (!$newsletter) {
     $newsletter = (object)simplenews_newsletter_defaults($node);
   }
-  $newsletter->status = SIMPLENEWS_STATUS_SEND_PENDING;
+  $newsletter->status = $status;
   simplenews_newsletter_save($newsletter);
 }
 
diff --git a/tests/simplenews.test b/tests/simplenews.test
index 3664d2b..8d63b3a 100644
--- a/tests/simplenews.test
+++ b/tests/simplenews.test
@@ -1080,6 +1080,67 @@ class SimplenewsSendTestCase extends SimplenewsTestCase {
     $this->assertEqual(0, count($this->subscribers), t('all subscribers have been received a mail'));
   }
 
+
+
+  /**
+   * Send a newsletter using cron.
+   */
+  function testSendMultipleNoCron() {
+    // Disable cron.
+    variable_set('simplenews_use_cron', FALSE);
+
+    // Verify that the newsletter settings are shown.
+    $nodes = array();
+    for ($i = 0; $i < 3; $i++) {
+      $this->drupalGet('node/add/simplenews');
+      $this->assertText(t('Newsletter category'));
+
+      $edit = array(
+        'title' => $this->randomName(),
+        // The last newsletter shouldn't be published.
+        'status' => $i != 2,
+      );
+      $this->drupalPost(NULL, $edit, ('Save'));
+      $this->assertTrue(preg_match('|node/(\d+)$|', $this->getUrl(), $matches), 'Node created');
+      $nodes[] = node_load($matches[1]);
+
+      // Verify state.
+      $newsletter = simplenews_newsletter_load($matches[1]);
+      $this->assertEqual(SIMPLENEWS_STATUS_SEND_NOT, $newsletter->status, t('Newsletter not sent yet.'));
+    }
+
+    // Send the first and last newsletter on the newsletter overview.
+    list ($first, $second, $unpublished) = $nodes;
+
+    $edit = array(
+      'issues[' . $first->nid . ']' => $first->nid,
+      'issues[' . $unpublished->nid . ']' => $unpublished->nid  ,
+      'operation' => 'activate',
+    );
+    $this->drupalPost('admin/content/simplenews', $edit, t('Update'));
+
+    $this->assertText(t('Newsletter sent'));
+    $this->assertText(t('Newsletter @title is unpublished and will be sent on publish', array('@title' => $unpublished->title)));
+
+    // Verify states.
+    $newsletter = simplenews_newsletter_load($first->nid);
+    $this->assertEqual(SIMPLENEWS_STATUS_SEND_READY, $newsletter->status, t('First Newsletter sending finished'));
+    $newsletter = simplenews_newsletter_load($second->nid);
+    $this->assertEqual(SIMPLENEWS_STATUS_SEND_NOT, $newsletter->status, t('Second Newsletter not sent'));
+    $newsletter = simplenews_newsletter_load($unpublished->nid);
+    $this->assertEqual(SIMPLENEWS_STATUS_SEND_PUBLISH, $newsletter->status, t('Newsletter set to send on publish'));
+
+    // Verify mails.
+    $mails = $this->drupalGetMails();
+    $this->assertEqual(5, count($mails), t('All mails were sent.'));
+    foreach ($mails as $mail) {
+      $this->assertEqual($mail['subject'], '[Drupal newsletter] ' . $first->title, t('Mail has correct subject'));
+      $this->assertTrue(isset($this->subscribers[$mail['to']]), t('Found valid recipient'));
+      unset($this->subscribers[$mail['to']]);
+    }
+    $this->assertEqual(0, count($this->subscribers), t('all subscribers have been received a mail'));
+  }
+
   /**
    * Send a newsletter using cron and a low throttle.
    */
