diff --git a/simplenews.module b/simplenews.module
index a763220..93bac4d 100644
--- a/simplenews.module
+++ b/simplenews.module
@@ -435,14 +435,12 @@ function simplenews_node_presave($node) {
     return;
   }
 
-  // Note that $node is NO full node object, see node_form_validate().
-  // Complete $node!
-  $newsletter = simplenews_newsletter_load($node->nid);
-  //$newsletter = simplenews_newsletter_load($node->nid, $node->vid);
-  if (!$newsletter) {
+  if (!empty($node->nid) && !isset($node->simplenews)) {
+    $node->simplenews = simplenews_newsletter_load($node->nid);
+  }
+  if (empty($node->simplenews)) {
     $newsletter = (object)simplenews_newsletter_defaults($node);
   }
-  $node->simplenews = $newsletter;
 }
 
 /**
@@ -469,7 +467,7 @@ function simplenews_newsletter_defaults($node = NULL) {
   );
 
   if ($node) {
-    $newsletter['nid'] = $node->nid;
+    $newsletter['nid'] = isset($node->nid) ? $node->nid : NULL;
     $terms = simplenews_get_term_values($node);
     $newsletter['tid'] = $terms[0]['tid'];
   }
diff --git a/tests/simplenews.test b/tests/simplenews.test
index 1271014..8efd254 100644
--- a/tests/simplenews.test
+++ b/tests/simplenews.test
@@ -1806,6 +1806,37 @@ class SimplenewsSendTestCase extends SimplenewsTestCase {
   }
 
   /**
+   * Creates and sends a node using the API.
+   */
+  function testProgrammaticNewsletter() {
+    // Create a very basic node.
+    $node = new stdClass();
+    $node->type = 'simplenews';
+    $node->title = $this->randomName();
+    $node->uid = 0;
+    $node->status = 1;
+    $node->language = LANGUAGE_NONE;
+    $node->field_simplenews_term[LANGUAGE_NONE][0]['tid'] = $this->getRandomNewsletter();
+    node_save($node);
+
+    // Send the node.
+    simplenews_add_node_to_spool($node);
+
+    // Send mails.
+    simplenews_mail_spool();
+
+    // 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] ' . $node->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.
    */
   function testSendNowNoCron() {
