diff --git simplenews.install simplenews.install
index 9ba6d08..96bb1cf 100644
--- simplenews.install
+++ simplenews.install
@@ -574,7 +574,7 @@ function simplenews_update_6005() {
  */
 function simplenews_update_6006() {
   $ret = array();
-  
+
   // Convert existing node type or re-create it.
   // If _node_types_build() if called before update, the simplenews
   // node type gets deleted because simplenews_node_info() no longer exists.
@@ -588,7 +588,7 @@ function simplenews_update_6006() {
   else {
     _simplenews_install_nodetype();
   }
-  
+
   return $ret;
 }
 
@@ -600,7 +600,7 @@ function simplenews_update_6007() {
   $result = db_query("SELECT rid, perm FROM {permission} ORDER BY rid");
   while ($role = db_fetch_object($result)) {
     $patterns = array('/create newsletter/', '/edit own newsletter/', '/edit any newsletter/', '/delete own newsletter/', '/delete any newsletter/');
-    $replacements = array('create simplenews content', 'edit own simplenews content', 'edit any simplenews content' ,'delete own simplenews content', 'delete any simplenews content');
+    $replacements = array('create simplenews content', 'edit own simplenews content', 'edit any simplenews content', 'delete own simplenews content', 'delete any simplenews content');
     $renamed_permission = preg_replace($patterns, $replacements, $role->perm);
     if ($renamed_permission != $role->perm) {
       $ret[] = update_sql("UPDATE {permission} SET perm = '$renamed_permission' WHERE rid = $role->rid");
@@ -656,7 +656,7 @@ function simplenews_update_6100() {
  */
 function simplenews_update_6101() {
   $ret = array();
-  
+
   $old = array(
     '!site',
     '!mailto',
diff --git simplenews.module simplenews.module
index cfff778..a63d774 100644
--- simplenews.module
+++ simplenews.module
@@ -176,10 +176,10 @@ function simplenews_menu() {
     'title' => 'Subscriptions',
     'type' => MENU_CALLBACK,
     'page callback' => 'drupal_get_form',
-    'page arguments' => array('simplenews_admin_users_form', 5),
+    'page arguments' => array('simplenews_subscriptions_admin_form', 5),
     'access arguments' => array('administer simplenews subscriptions'),
     'file' => 'simplenews.subscription.inc',
-    );
+  );
   $items['admin/content/simplenews/users/list'] = array(
     'title' => 'List',
     'type' => MENU_DEFAULT_LOCAL_TASK,
@@ -276,7 +276,8 @@ function simplenews_menu() {
     'title' => 'Manage newsletter subscriptions',
     'type' => MENU_CALLBACK,
     'page callback' => 'drupal_get_form',
-    'page arguments' => array('simplenews_subscription_manager_form'),
+    'page arguments' => array('simplenews_subscriptions_public_all_form'),
+    // @todo The name of this function is not self explanitory
     'access arguments' => array('subscribe to newsletters'),
     'file' => 'simplenews.subscription.inc',
   );
@@ -336,7 +337,7 @@ function simplenews_nodeapi(&$node, $op, $teaser, $page) {
       if (!isset($node->simplenews_mail)) {
         global $language;
         $context['node'] = $node;
-        
+
         if (isset($node->body)) {
           $node->body = token_replace($node->body, 'simplenews', array('node' => $node));
         }
@@ -387,7 +388,7 @@ function simplenews_nodeapi(&$node, $op, $teaser, $page) {
         $s_status = $send_with_permission ? SIMPLENEWS_STATUS_SEND_PENDING : SIMPLENEWS_STATUS_SEND_NOT;
         db_query("INSERT INTO {simplenews_newsletters} (nid, vid, tid, s_status, s_format, priority, receipt)
                   VALUES (%d, %d, %d, %d, '%s', %d, %d)", $node->nid, $node->vid, $node->simplenews['tid'], $s_status, $node->simplenews['s_format'], $node->simplenews['priority'], $node->simplenews['receipt']);
-        }
+      }
       else {
         // Update node
         if ($send_with_permission) {
@@ -408,8 +409,8 @@ function simplenews_nodeapi(&$node, $op, $teaser, $page) {
           foreach ($translations as $translation) {
             db_query("UPDATE {simplenews_newsletters} SET s_status = %d, s_format = '%s', priority = %d, receipt = %d
               WHERE nid = %d",
-              SIMPLENEWS_STATUS_SEND_PENDING, $node->simplenews['s_format'], $node->simplenews['priority'],
-              $node->simplenews['receipt'], $translation->nid);
+            SIMPLENEWS_STATUS_SEND_PENDING, $node->simplenews['s_format'], $node->simplenews['priority'],
+            $node->simplenews['receipt'], $translation->nid);
           }
         }
       }
@@ -477,10 +478,10 @@ function simplenews_validate_taxonomy($taxonomy) {
             }
           }
         }
-        else if (is_object($term)) {
+        elseif (is_object($term)) {
           $selected_terms[] = $term->tid;
         }
-        else if ($term) {
+        elseif ($term) {
           $selected_terms[] = $term;
         }
       }
@@ -534,14 +535,14 @@ function simplenews_form_alter(&$form, $form_state, $form_id) {
       }
       $form['simplenews_subscription']['subscription_mail']['token_help'] = array(
         '#title' => t('Replacement patterns'),
-    	'#type' => 'fieldset',
-    	'#collapsible' => TRUE,
-    	'#collapsed' => TRUE,
+        '#type' => 'fieldset',
+        '#collapsible' => TRUE,
+        '#collapsed' => TRUE,
         '#weight' => -20,
         '#description' => t('These tokens can be used in all text fields and will be replaced on-screen and in the email. Note that simplenews-receiver tokens are not suitable for on-screen use.')
       );
       $form['simplenews_subscription']['subscription_mail']['token_help']['help'] = array(
-    	'#value' => theme('token_help', 'simplenews'),
+      '#value' => theme('token_help', 'simplenews'),
       );
 
       if (isset($form['#node']->simplenews)) {
@@ -562,7 +563,7 @@ function simplenews_form_alter(&$form, $form_state, $form_id) {
       // Translations of newsletters don't have send and format options. Only the
       // translation source (and non translated) newsletters will get these options.
       if (module_exists('translation') && translation_supported_type($form['#node']->type) &&
-          (isset($form['#node']->translation_source) || ($form['#node']->tnid && $form['#node']->tnid != $form['#node']->nid))) {
+      (isset($form['#node']->translation_source) || ($form['#node']->tnid && $form['#node']->tnid != $form['#node']->nid))) {
         $form['simplenews']['#description'] = t('This newsletter issue is part of a translation set. Sending this set is controlled from the <a href="@link">translation source newsletter</a>.', array('@link' => url('node/'. $form['tnid']['#value'])));
         // Send option of translated newsletters are not used, but a default is
         // required to prevent errors when data is stored in the database.
@@ -575,10 +576,10 @@ function simplenews_form_alter(&$form, $form_state, $form_id) {
         // Show newsletter sending options if newsletter has not been send yet.
         // If send a nodification is shown.
         if (!isset($simplenews_values['s_status']) || (isset($simplenews_values['s_status']) && $simplenews_values['s_status'] == SIMPLENEWS_STATUS_SEND_NOT)) {
-  
+
           // Add dynamic text for send button.
           drupal_add_js(drupal_get_path('module', 'simplenews') .'/simplenews.js', 'module');
-  
+
           if (user_access('send newsletter')) {
             $options[SIMPLENEWS_COMMAND_SEND_NONE] = t("Don't send now");
             $options[SIMPLENEWS_COMMAND_SEND_TEST] = t('Send one test newsletter to the test address');
@@ -603,7 +604,7 @@ function simplenews_form_alter(&$form, $form_state, $form_id) {
               '#attributes' => array('class' => 'simplenews-command-send'),
             );
           }
-  
+
           $address_default = variable_get('site_mail', ini_get('sendmail_from'));
           if (variable_get('simplenews_test_address_override', 0)) {
             $form['simplenews']['test_address'] = array(
@@ -621,14 +622,14 @@ function simplenews_form_alter(&$form, $form_state, $form_id) {
               '#value' => variable_get('simplenews_test_address', $address_default),
             );
           }
-  
+
           $form['simplenews']['advanced'] = array(
             '#type' => 'fieldset',
             '#title' => t('Email options'),
             '#collapsible' => TRUE,
             '#collapsed' => TRUE,
           );
-             // Hide format selection if there is nothing to choose.
+          // Hide format selection if there is nothing to choose.
           // The default format is plain text.
           $format_options = _simplenews_format_options();
           if (count($format_options) > 1) {
@@ -645,19 +646,19 @@ function simplenews_form_alter(&$form, $form_state, $form_id) {
               '#value' => key($format_options),
             );
           }
-  
+
           $form['simplenews']['advanced']['priority'] = array(
             '#type' => 'select',
             '#title' => t('Email priority'),
             '#default_value' => isset($simplenews_values['priority']) ? $simplenews_values['priority'] : variable_get('simplenews_priority', SIMPLENEWS_PRIORITY_NONE),
             '#options' => array(
-              SIMPLENEWS_PRIORITY_NONE => t('none'),
-              SIMPLENEWS_PRIORITY_HIGHEST => t('highest'),
-              SIMPLENEWS_PRIORITY_HIGH => t('high'),
-              SIMPLENEWS_PRIORITY_NORMAL => t('normal'),
-              SIMPLENEWS_PRIORITY_LOW => t('low'),
-              SIMPLENEWS_PRIORITY_LOWEST => t('lowest'),
-            ),
+          SIMPLENEWS_PRIORITY_NONE => t('none'),
+          SIMPLENEWS_PRIORITY_HIGHEST => t('highest'),
+          SIMPLENEWS_PRIORITY_HIGH => t('high'),
+          SIMPLENEWS_PRIORITY_NORMAL => t('normal'),
+          SIMPLENEWS_PRIORITY_LOW => t('low'),
+          SIMPLENEWS_PRIORITY_LOWEST => t('lowest'),
+          ),
           );
           $form['simplenews']['advanced']['receipt'] = array(
             '#type' => 'checkbox',
@@ -730,7 +731,7 @@ function simplenews_user($op, &$edit, &$account, $category = NULL) {
 
       // Determine the newsletters to which a user can choose to subscribe.
       // Determine to which other newsletter a user is automatically subscribed.
-      foreach(simplenews_get_newsletters(variable_get('simplenews_vid', ''), TRUE) as $newsletter) {
+      foreach (simplenews_get_newsletters(variable_get('simplenews_vid', ''), TRUE) as $newsletter) {
         $subscribe_new_account = variable_get('simplenews_new_account_'. $newsletter->tid, 'none');
         $opt_inout_method = variable_get('simplenews_opt_inout_'. $newsletter->tid, 'double');
         if (($subscribe_new_account == 'on' || $subscribe_new_account == 'off') && ($opt_inout_method == 'single' || $opt_inout_method == 'double')) {
@@ -739,7 +740,7 @@ function simplenews_user($op, &$edit, &$account, $category = NULL) {
         }
         else {
           if ($subscribe_new_account == 'silent' || ($subscribe_new_account == 'on' && $opt_inout_method == 'hidden')) {
-            $hidden[] = $newsletter->tid;            
+            $hidden[] = $newsletter->tid;
           }
         }
       }
@@ -785,7 +786,7 @@ function simplenews_user($op, &$edit, &$account, $category = NULL) {
 
         // Process hidden (automatic) subscriptions.
         if (isset($data['simplenews_hidden'])) {
-          foreach(explode(',', $data['simplenews_hidden']) as $tid) {
+          foreach (explode(',', $data['simplenews_hidden']) as $tid) {
             simplenews_subscribe_user($account->mail, $tid, FALSE, 'automatically');
           }
           $data['simplenews_hidden'] = NULL;
@@ -794,7 +795,7 @@ function simplenews_user($op, &$edit, &$account, $category = NULL) {
 
         // Process subscription check boxes.
         if (isset($data['newsletters'])) {
-          foreach(array_keys(array_filter($data['newsletters'])) as $tid) {
+          foreach (array_keys(array_filter($data['newsletters'])) as $tid) {
             simplenews_subscribe_user($account->mail, $tid, FALSE, 'website');
             $newsletters = simplenews_get_newsletters(variable_get('simplenews_vid', ''), TRUE);
             drupal_set_message(t('You have been subscribed to %newsletter.', array('%newsletter' => $newsletters[$tid]->name)));
@@ -832,8 +833,8 @@ function simplenews_user($op, &$edit, &$account, $category = NULL) {
       }
 
       if ($category == 'newsletter'
-       && (user_access('subscribe to newsletters', $account) || user_access('administer users'))
-       && isset($edit['newsletters'])) {
+      && (user_access('subscribe to newsletters', $account) || user_access('administer users'))
+      && isset($edit['newsletters'])) {
         foreach ($edit['newsletters'] as $tid => $checked) {
           if ($checked) {
             simplenews_subscribe_user($account->mail, $tid, FALSE, 'website');
@@ -861,7 +862,10 @@ function simplenews_user($op, &$edit, &$account, $category = NULL) {
     case 'form':
       if ($category == 'newsletter') {
         $subscription = simplenews_get_subscription($account);
-        $form = _simplenews_subscription_manager_form($subscription);
+        $form = __simplenews_subscriptions_public_all_form($subscription);
+        // @todo The name of this function is not self explanitory
+        // @todo _ is private function. But what is __ ??
+        // @todo private functions ('-') are normally not used as callback.
         $form['subscriptions']['#title'] =  t('Current newsletter subscriptions');
         unset($form['update'], $form['subscriptions']['mail']);
         return $form;
@@ -890,7 +894,7 @@ function simplenews_user($op, &$edit, &$account, $category = NULL) {
           if (db_result(db_query('SELECT COUNT(s.uid) FROM {simplenews_subscriptions} s
                                  INNER JOIN {simplenews_snid_tid} t ON s.snid = t.snid
                                  WHERE s.uid = %d AND t.tid = %d AND t.status = %d',
-                                 $account->uid, $newsletter->tid, SIMPLENEWS_SUBSCRIPTION_STATUS_SUBSCRIBED))) {
+          $account->uid, $newsletter->tid, SIMPLENEWS_SUBSCRIPTION_STATUS_SUBSCRIBED))) {
             $subscriptions[] = l($newsletter->name, 'taxonomy/term/'. $newsletter->tid);
           }
         }
@@ -934,7 +938,7 @@ function simplenews_subscription_edit_access($account) {
   if ($user->uid == $account->uid) {
     if (user_access('subscribe to newsletters', $account)) {
       return TRUE;
-    } 
+    }
   }
   // Allow administrator to edit account's subscription.
   if (user_access('administer users')) {
@@ -950,8 +954,16 @@ function simplenews_block($op = 'list', $delta = 0, $edit = array()) {
   switch ($op) {
     case 'list':
       $blocks = array();
+
+      // Special block for multisignup
+      // @todo Code style (use coder!): Space after double slash; Period at end of the line.
+      $blocks[0] = array(
+        'info' => t('Newsletter: Multiple Sign-up'),
+        // @todo 'Sign-up' is not used a terminolity. Use 'Multi subscription' or 'Multiple subscription'
+      );
+
       foreach (simplenews_get_newsletters(variable_get('simplenews_vid', '')) as $newsletter) {
-        //TODO: 1. without form -> by role; 2. with form -> user caching with refresh on subscribe/unsubscribe (option as setting) or no caching
+        // TODO: 1. without form -> by role; 2. with form -> user caching with refresh on subscribe/unsubscribe (option as setting) or no caching
         // Only list a block if the newsletter is not Hidden.
         $blocks[$newsletter->tid] = array(
           'info' => t('Newsletter: @title', array('@title' => $newsletter->name)),
@@ -960,66 +972,95 @@ function simplenews_block($op = 'list', $delta = 0, $edit = array()) {
       }
       return $blocks;
     case 'configure':
-      $form['simplenews_block_'. $delta]['simplenews_block_m_'. $delta] = array(
-        '#type' => 'textfield',
-        '#title' => t('Block message'),
-        '#size' => 60,
-        '#maxlength' => 128,
-        '#default_value' => variable_get('simplenews_block_m_'. $delta, t('Stay informed on our latest news!')),
-      );
-      $form['simplenews_block_'. $delta]['simplenews_block_f_'. $delta] = array(
-        '#type' => 'radios',
-        '#title' => t('Subscription interface'),
-        '#options' => array('1' => t('Subscription form'), '0' => t('Link to form')),
-        '#description' => t("Note: this requires permission 'subscribe to newsletters'."),
-        '#default_value' => variable_get('simplenews_block_f_'. $delta, 1),
-      );
-      $form['simplenews_block_'. $delta]['simplenews_block_l_'. $delta] = array(
-        '#type' => 'checkbox',
-        '#title' => t('Display link to previous issues'),
-        '#return_value' => 1,
-        '#default_value' => variable_get('simplenews_block_l_'. $delta, 1),
-      );
-      $form['simplenews_block_'. $delta]['simplenews_block_i_status_'. $delta] = array(
-        '#type' => 'checkbox',
-        '#title' => t('Display previous issues'),
-        '#return_value' => 1,
-        '#default_value' => variable_get('simplenews_block_i_status_'. $delta, 0),
-      );
-      $form['simplenews_block_'. $delta]['simplenews_block_i_'. $delta] = array(
-        '#type' => 'select',
-        '#title' => t('Number of issues to display'),
-        '#options' => drupal_map_assoc(array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)),
-        '#default_value' => variable_get('simplenews_block_i_'. $delta, 5),
-      );
-      $form['simplenews_block_'. $delta]['simplenews_block_r_'. $delta] = array(
-        '#type' => 'checkbox',
-        '#title' => t('Display RSS-feed icon'),
-        '#return_value' => 1,
-        '#default_value' => variable_get('simplenews_block_r_'. $delta, 1),
-      );
-      return $form;
+      //Special block for multisignup
+      if ($delta == 0) {
+        $form['simplenews_block_multiple']['simplenews_block_m_multiple'] = array(
+          '#type' => 'textfield',
+          '#title' => t('Block message'),
+          '#size' => 60,
+          '#maxlength' => 128,
+          '#default_value' => variable_get('simplenews_block_m_multiple', 'Select the newsletter(s) to which you want to subscribe or unsubscribe.'),
+          // @todo This is existing description, but not very helpfull to UNsubscribe. Or does the form have two buttons??
+        );
+        return $form;
+      }
+      else {
+        $form['simplenews_block_'. $delta]['simplenews_block_m_'. $delta] = array(
+          '#type' => 'textfield',
+          '#title' => t('Block message'),
+          '#size' => 60,
+          '#maxlength' => 128,
+          '#default_value' => variable_get('simplenews_block_m_'. $delta, 'Stay informed on our latest news!'),
+        );
+        $form['simplenews_block_'. $delta]['simplenews_block_f_'. $delta] = array(
+          '#type' => 'radios',
+          '#title' => t('Subscription interface'),
+          '#options' => array('1' => t('Subscription form'), '0' => t('Link to form')),
+          '#description' => t("Note: this requires permission 'subscribe to newsletters'."),
+          '#default_value' => variable_get('simplenews_block_f_'. $delta, 1),
+        );
+        $form['simplenews_block_'. $delta]['simplenews_block_l_'. $delta] = array(
+          '#type' => 'checkbox',
+          '#title' => t('Display link to previous issues'),
+          '#return_value' => 1,
+          '#default_value' => variable_get('simplenews_block_l_'. $delta, 1),
+        );
+        $form['simplenews_block_'. $delta]['simplenews_block_i_status_'. $delta] = array(
+          '#type' => 'checkbox',
+          '#title' => t('Display previous issues'),
+          '#return_value' => 1,
+          '#default_value' => variable_get('simplenews_block_i_status_'. $delta, 0),
+        );
+        $form['simplenews_block_'. $delta]['simplenews_block_i_'. $delta] = array(
+          '#type' => 'select',
+          '#title' => t('Number of issues to display'),
+          '#options' => drupal_map_assoc(array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)),
+          '#default_value' => variable_get('simplenews_block_i_'. $delta, 5),
+        );
+        $form['simplenews_block_'. $delta]['simplenews_block_r_'. $delta] = array(
+          '#type' => 'checkbox',
+          '#title' => t('Display RSS-feed icon'),
+          '#return_value' => 1,
+          '#default_value' => variable_get('simplenews_block_r_'. $delta, 1),
+        );
+        return $form;
+      }
     case 'save':
-      variable_set('simplenews_block_m_'. $delta, $edit['simplenews_block_m_'. $delta]);
-      variable_set('simplenews_block_f_'. $delta, $edit['simplenews_block_f_'. $delta]);
-      variable_set('simplenews_block_l_'. $delta, $edit['simplenews_block_l_'. $delta]);
-      variable_set('simplenews_block_i_status_'. $delta, $edit['simplenews_block_i_status_'. $delta]);
-      variable_set('simplenews_block_i_'. $delta, $edit['simplenews_block_i_'. $delta]);
-      variable_set('simplenews_block_r_'. $delta, $edit['simplenews_block_r_'. $delta]);
+      //Special block for multisignup
+      if ($delta == 0) {
+        variable_set('simplenews_block_m_multiple', $edit['simplenews_block_m_multiple']);
+      }
+      else {
+        variable_set('simplenews_block_m_'. $delta, $edit['simplenews_block_m_'. $delta]);
+        variable_set('simplenews_block_f_'. $delta, $edit['simplenews_block_f_'. $delta]);
+        variable_set('simplenews_block_l_'. $delta, $edit['simplenews_block_l_'. $delta]);
+        variable_set('simplenews_block_i_status_'. $delta, $edit['simplenews_block_i_status_'. $delta]);
+        variable_set('simplenews_block_i_'. $delta, $edit['simplenews_block_i_'. $delta]);
+        variable_set('simplenews_block_r_'. $delta, $edit['simplenews_block_r_'. $delta]);
+      }
       break;
     case 'view':
-      global $language;
-
-      $newsletters = simplenews_get_newsletters(variable_get('simplenews_vid', ''));
-      // Only display a block if $delta is a valid newsletter term id.
-      if (in_array($delta, array_keys($newsletters))) {
-        // $delta is validated, the block can be displayed.
+      //Special block for multisignup
+      if ($delta == 0) {
         $block = array(
-          'subject' => check_plain($newsletters['$delta']),
-          'content' => theme(array('simplenews_block__'. $delta, 'simplenews_block'), $delta),
+          'content' => _simplenews_multi_signup_block(),
         );
         return $block;
       }
+      else {
+        global $language;
+
+        $newsletters = simplenews_get_newsletters(variable_get('simplenews_vid', ''));
+        // Only display a block if $delta is a valid newsletter term id.
+        if (in_array($delta, array_keys($newsletters))) {
+          // $delta is validated, the block can be displayed.
+          $block = array(
+            'subject' => check_plain($newsletters['$delta']),
+            'content' => theme(array('simplenews_block__'. $delta, 'simplenews_block'), $delta),
+          );
+          return $block;
+        }
+      }
       break;
   }
 }
@@ -1132,20 +1173,20 @@ function simplenews_subscribe_user($mail, $tid, $confirm = TRUE, $source = 'unkn
   }
   elseif (!isset($subscription->tids[$tid])) {
     // Add user to newsletter relationship if not already subscribed.
-    
+
     // Check if user is (un)subscribed to this newsletter.
     // Resubscribe or add new subscription.
     if (isset($subscription->newsletter_subscription[$tid])) {
       db_query("UPDATE {simplenews_snid_tid}
                SET status = %d, timestamp = %d, source = '%s'
                WHERE snid = %d AND tid = %d",
-               SIMPLENEWS_SUBSCRIPTION_STATUS_SUBSCRIBED, time(), $source,
-               $subscription->snid, $tid);
+      SIMPLENEWS_SUBSCRIPTION_STATUS_SUBSCRIBED, time(), $source,
+      $subscription->snid, $tid);
     }
     else {
       db_query("INSERT INTO {simplenews_snid_tid} (snid, tid, status, timestamp, source)
                VALUES (%d, %d, %d, %d, '%s')",
-               $subscription->snid, $tid, SIMPLENEWS_SUBSCRIPTION_STATUS_SUBSCRIBED, time(), $source);
+      $subscription->snid, $tid, SIMPLENEWS_SUBSCRIPTION_STATUS_SUBSCRIBED, time(), $source);
     }
 
     // Execute simplenews subscribe trigger.
@@ -1196,7 +1237,7 @@ function simplenews_unsubscribe_user($mail, $tid, $confirm = TRUE, $source = 'un
     db_query("UPDATE {simplenews_snid_tid}
              SET status = %d, timestamp = %d, source = '%s'
              WHERE snid = %d AND tid = %d",
-             SIMPLENEWS_SUBSCRIPTION_STATUS_UNSUBSCRIBED, time(), $source, $subscription->snid, $tid);
+    SIMPLENEWS_SUBSCRIPTION_STATUS_UNSUBSCRIBED, time(), $source, $subscription->snid, $tid);
 
     // Execute simplenews unsubscribe trigger
     simplenews_call_actions('unsubscribe', $subscription);
@@ -1217,16 +1258,16 @@ function simplenews_unsubscribe_user($mail, $tid, $confirm = TRUE, $source = 'un
 function simplenews_user_is_subscribed($mail, $tid, $reset = FALSE) {
   static $subscribed = array();
 
-    if ($reset) {
-      $subscribed = array();
-    }
+  if ($reset) {
+    $subscribed = array();
+  }
 
-    if (!isset($subscribed[$mail][$tid])) {
-      $subscribed[$mail][$tid] = db_result(db_query("SELECT COUNT(*) FROM {simplenews_subscriptions} s
+  if (!isset($subscribed[$mail][$tid])) {
+    $subscribed[$mail][$tid] = db_result(db_query("SELECT COUNT(*) FROM {simplenews_subscriptions} s
                                                     INNER JOIN {simplenews_snid_tid} t ON s.snid = t.snid
                                                     WHERE s.mail = '%s' AND t.tid = %d AND t.status = %d",
-                                                    $mail, $tid, SIMPLENEWS_SUBSCRIPTION_STATUS_SUBSCRIBED)) ? TRUE : FALSE;
-    }
+    $mail, $tid, SIMPLENEWS_SUBSCRIPTION_STATUS_SUBSCRIBED)) ? TRUE : FALSE;
+  }
 
   return $subscribed[$mail][$tid];
 }
@@ -1307,68 +1348,7 @@ function simplenews_delete_subscription($snid) {
   watchdog('simplenews', 'User %email deleted from the mailing list.', array('%email' => $account->mail), WATCHDOG_NOTICE);
 }
 
-/**
- * Build subscription manager form.
- *
- * @param object $subscription subscription object
- */
-function _simplenews_subscription_manager_form($subscription) {
-  $form = array();
-  $options = array();
-  $default_value = array();
-  global $language;
 
-  // Get newsletters for subscription form checkboxes.
-  // Newsletters with opt-in/out method 'hidden' will not be listed.
-  foreach(simplenews_get_newsletters(variable_get('simplenews_vid', '')) as $newsletter) {
-    $options[$newsletter->tid] = check_plain($newsletter->name);
-    $default_value[$newsletter->tid] = FALSE;
-  }
-
-  $form['subscriptions'] = array(
-    '#type' => 'fieldset',
-    '#description' => t('Select the newsletter(s) to which you want to subscribe or unsubscribe.'),
-  );
-  $form['subscriptions']['newsletters'] = array(
-    '#type' => 'checkboxes',
-    '#options' => $options,
-    '#default_value' => array_merge($default_value, (array)$subscription->tids),
-  );
-
-  // If current user is logged in, just display email.
-  // Anonymous users see an email box and will receive confirmations
-  if ($subscription->mail) {
-    $form['subscriptions']['#title'] = t('Subscriptions for %mail', array('%mail' => $subscription->mail));
-    $form['subscriptions']['mail'] = array('#type' => 'value', '#value' => $subscription->mail);
-    $form['update'] = array(
-      '#type' => 'submit',
-      '#value' => t('Update'),
-      '#weight' => 20,
-    );
-  }
-  else {
-    $form['subscriptions']['#title'] = t('Manage your newsletter subscriptions');
-    $form['subscriptions']['mail'] = array(
-      '#type' => 'textfield',
-      '#title' => t('email'),
-      '#size' => 20,
-      '#maxlength' => 128,
-      '#weight' => 10,
-      '#required' => TRUE,
-    );
-    $form['subscribe'] = array(
-      '#type' => 'submit',
-      '#value' => t('Subscribe'),
-      '#weight' => 20,
-    );
-    $form['unsubscribe'] = array(
-      '#type' => 'submit',
-      '#value' => t('Unsubscribe'),
-      '#weight' => 30,
-    );
-  }
-  return $form;
-}
 
 /**
  * Create a list of recent newsletters.
@@ -1519,7 +1499,7 @@ function simplenews_send_node($node, $accounts = array()) {
       $result = db_query('SELECT s.mail FROM {simplenews_subscriptions} s
                          INNER JOIN {simplenews_snid_tid} t ON s.snid = t.snid
                          WHERE s.activated = %d AND t.tid = %d AND t.status = %d',
-                         1, $node_data['tid'], SIMPLENEWS_SUBSCRIPTION_STATUS_SUBSCRIBED);
+      1, $node_data['tid'], SIMPLENEWS_SUBSCRIPTION_STATUS_SUBSCRIBED);
       while ($account = db_fetch_object($result)) {
         $mails[] = array('mail' => $account->mail);
       }
@@ -1809,16 +1789,16 @@ function simplenews_mail_mail($nid, $vid, $mail, $key = 'node') {
       $to = isset($message['params']['context']['account']) ? $message['params']['context']['account'] : $message['to'];
       $plain = $message['params']['context']['node']->simplenews['s_format'] == 'plain' ? TRUE : NULL;
       $message['result'] = mimemail(
-        $message['from'],
-        $to,
-        $message['subject'],
-        $message['body'],
-        $plain,
-        $message['headers'],
-        $plain ? $message['body'] : simplenews_html_to_text($message['body'], TRUE),
-        isset($message['params']['context']['node']->files) ? $message['params']['context']['node']->files : array(),
+      $message['from'],
+      $to,
+      $message['subject'],
+      $message['body'],
+      $plain,
+      $message['headers'],
+      $plain ? $message['body'] : simplenews_html_to_text($message['body'], TRUE),
+      isset($message['params']['context']['node']->files) ? $message['params']['context']['node']->files : array(),
         ''
-      );
+        );
     }
     else {
       $message = drupal_mail('simplenews', $key, $subscription->mail, $subscription->language, $params, $params['from']['formatted'], TRUE);
@@ -1924,7 +1904,7 @@ function simplenews_mail_spool($nid = NULL, $vid = NULL, $limit = NULL) {
     else {
       watchdog('simplenews', '%success emails sent, %fail failed.', array('%success' => $count_success, '%fail' => $count_fail));
     }
-    
+
     variable_set('simplenews_last_cron', time());
     variable_set('simplenews_last_sent', count($mail_sent));
   }
@@ -2065,7 +2045,7 @@ function simplenews_send_status_update() {
     foreach ($node_count as $nidvid => $count) {
       // Translated nodes (tnid != 0)
       if ($tnid != '0' && $sum[$tnid] == '0') {
-          $send[] = $nidvid;
+        $send[] = $nidvid;
       }
       // Untranslated nodes (tnid == 0)
       elseif ($tnid == '0' && $count == '0') {
@@ -2164,7 +2144,7 @@ function _simplenews_set_from($node = NULL) {
 
   // Windows based PHP systems don't accept formatted emails.
   $formatted_address = substr(PHP_OS, 0, 3) == 'WIN' ? $address : '"'. mime_header_encode($name) .'" <'. $address .'>';
-  
+
   return array(
     'address' => $address,
     'formatted' => $formatted_address,
@@ -2288,7 +2268,7 @@ function _simplenews_absolute_mail_urls($match) {
  * List of preg* regular expression patterns to search for and replace with
  */
 function _simplenews_html_replace() {
-    return array(
+  return array(
         '/&quot;/i'  => '"',
         '/&gt;/i'    => '>',
         '/&lt;/i'    => '<',
@@ -2309,7 +2289,7 @@ function _simplenews_html_replace() {
         '/&reg;/i'   => '(R)',
         '/&bull;/i'  => '*',
         '/&euro;/i'  => 'Euro ',
-    );
+  );
 }
 
 /**
@@ -2368,7 +2348,7 @@ function simplenews_token_values($type, $object = NULL, $options = array()) {
         $hash = _simplenews_generate_hash($account->mail, $account->snid, $newsletter->tid);
       }
 
-      // When simplenews_token_values() is called from simplenews_nodeapi() 
+      // When simplenews_token_values() is called from simplenews_nodeapi()
       // $newsletter->name contains no value. Newsletter name is
       // reconstructed from $node->simplenews['tid'].
       $newsletter_name = isset($newsletter->name) ? $newsletter->name : '';
@@ -2381,7 +2361,7 @@ function simplenews_token_values($type, $object = NULL, $options = array()) {
       }
 
       // Build tokens for both 'simplenews_subscription' and 'simplenews'.
-      $values['simplenews-subscribe-url']       = url('newsletter/confirm/add/'. $hash, array('absolute' => TRUE, 'language' => $language));      
+      $values['simplenews-subscribe-url']       = url('newsletter/confirm/add/'. $hash, array('absolute' => TRUE, 'language' => $language));
       $values['simplenews-unsubscribe-url']     = url('newsletter/confirm/remove/'. $hash, array('absolute' => TRUE, 'language' => $language));
       $values['simplenews-receiver-mail']       = $account->mail;
       $values['simplenews-newsletters-name']    = $newsletter_name ? check_plain($newsletter_name) : '';
@@ -2453,15 +2433,15 @@ function simplenews_help($path, $arg) {
       return $help;
     case 'admin/settings/simplenews/subscription':
       if (variable_get('language_count', 1) > 1) {
-	if (module_exists('i18nstrings')) {
+        if (module_exists('i18nstrings')) {
           global $language;
           $language_default = variable_get('language_default', $language);
-	  $help = '<p>'. t('This is a Multilingual website. Enter text for confirmation subject and body in the default site language (@language).', array('@language' => $language_default->name)) ."</p>\n";
-	}
-	else {
-	  $help = '<p>'. t('This is a Multilingual website. <a href="@url">Enable the String translation module</a> to enable translation of the confirmation subject and body.', array('@url' => url('admin/build/modules'))) ."</p>\n";
-	}
-	return $help;
+          $help = '<p>'. t('This is a Multilingual website. Enter text for confirmation subject and body in the default site language (@language).', array('@language' => $language_default->name)) ."</p>\n";
+        }
+        else {
+          $help = '<p>'. t('This is a Multilingual website. <a href="@url">Enable the String translation module</a> to enable translation of the confirmation subject and body.', array('@url' => url('admin/build/modules'))) ."</p>\n";
+        }
+        return $help;
       }
       break;
     case 'admin/content/simplenews/types/add':
@@ -2500,7 +2480,7 @@ function simplenews_locale_refresh() {
     'unsubscribe_subscribed',
     'unsubscribe_unsubscribed',
     'subscribe_subject',
-    );
+  );
   foreach ($keys as $key) {
     i18nstrings_update('simplenews:'. $key, _simplenews_subscription_confirmation_text($key, NULL, FALSE));
   }
@@ -2619,7 +2599,7 @@ function _simplenews_measure_usec($start = FALSE) {
   if (!function_exists('getrusage')) {
     return 0;
   }
-  
+
   static $start_time;
   $usage = getrusage();
   $now = (float)($dat["ru_stime.tv_sec"] .'.'. $dat["ru_stime.tv_usec"]) + (float)($usage["ru_utime.tv_sec"] .'.'. $usage["ru_utime.tv_usec"]);
@@ -2640,7 +2620,7 @@ function _simplenews_get_node_form_defaults() {
       's_format' => variable_get('simplenews_format', 'plain'),
       'priority' => variable_get('simplenews_priority', SIMPLENEWS_PRIORITY_NONE),
       'receipt' => variable_get('simplenews_receipt', 0),
-    ),
+  ),
     'send' => user_access('send newsletter') ? variable_get('simplenews_send', SIMPLENEWS_COMMAND_SEND_NONE) : SIMPLENEWS_COMMAND_SEND_NONE,
     's_status' => '0',
     'test_address' => variable_get('simplenews_test_address', variable_get('site_mail', ini_get('sendmail_from'))),
@@ -2659,13 +2639,13 @@ function simplenews_content_build_modes() {
         'email_plain' => array(
           'title' => t('Email: Plain'),
           'views style' => FALSE,
-        ),
+  ),
         'email_html' => array(
           'title' => t('Email: HTML'),
           'views style' => FALSE,
-        ),
-      ),
-    ),
+  ),
+  ),
+  ),
   );
 }
 
@@ -2678,29 +2658,34 @@ function simplenews_theme() {
       'template' => 'simplenews-block',
       'arguments' => array('tid' => NULL),
       'pattern' => 'simplenews_block__',
-    ),
+  ),
     'simplenews_status' => array(
       'template' => 'simplenews-status',
       'file' => 'simplenews.admin.inc',
       'arguments' => array('status' => NULL, 'source' => NULL),
-    ),
+  ),
     'simplenews_newsletter_subject' => array(
       'arguments' => array('name' => NULL, 'title' => NULL, 'language' => NULL),
-    ),
+  ),
     'simplenews_newsletter_body' => array(
       'template' => 'simplenews-newsletter-body',
       'arguments' => array('node' => NULL, 'language' => NULL),
       'pattern' => 'simplenews_newsletter_body__',
-    ),
+  ),
     'simplenews_newsletter_footer' => array(
       'template' => 'simplenews-newsletter-footer',
       'arguments' => array('node' => NULL, 'key' => NULL, 'language' => NULL),
       'pattern' => 'simplenews_newsletter_footer__',
-    ),
+  ),
     'simplenews_subscription_list' => array(
       'file' => 'simplenews.admin.inc',
       'arguments' => array('form' => NULL),
-    ),
+  ),
+    // @todo Use the -p parameter when creating patches. It includes the function name and makes patches more readable.
+    'simplenews_multi_signup_block' => array(
+      'rendered_form' => NULL,
+      'help' => NULL,
+  ),
   );
 }
 
@@ -2785,3 +2770,38 @@ function template_preprocess_simplenews_newsletter_footer(&$variables) {
   $variables['unsubscribe_text'] = t('Unsubscribe from this newsletter', array(), $variables['language']->language);
   $variables['test_message'] = t('This is a test version of the newsletter.', array(), $variables['language']->language);
 }
+
+/**
+ * Build subscription block.
+ *
+ * @return string
+ */
+function _simplenews_multi_signup_block() {
+  $content = '';
+
+  if (user_access('subscribe to newsletters')) {
+    // @todo Why use access check in the function. Generally better to use it on higher level (i.e. hook_block).
+    $help = t(variable_get('simplenews_block_m_multiple', 'Select the newsletter(s) to which you want to subscribe or unsubscribe.'));
+    // @todo t() should not be used for variables. Only static text (with tokens).
+    // @todo see how subscription notification email texts are translated.
+    module_load_include('inc', 'simplenews', 'simplenews.subscription');
+    $rendered_form = drupal_get_form('simplenews_subscriptions_multisignup_block_form');
+    $content = theme('simplenews_multi_signup_block', $rendered_form, check_plain($help));
+   // @todo text is escaped twice by t() and check_plain().
+  }
+  return $content;
+}
+
+/**
+ * Theme signup block.
+ *
+ * @param string $rendered_form
+ * @param string $help
+ * @return string
+ */
+// @todo Add description to the parameters.
+
+function theme_simplenews_multi_signup_block($rendered_form, $help) {
+  return '<div class="simplenews-multisignup-help">' . $help . '</div>' . $rendered_form;
+  // @todo Do we realy need this explanation text?
+}
diff --git simplenews.subscription.inc simplenews.subscription.inc
index b11f9ab..19c91ed 100644
--- simplenews.subscription.inc
+++ simplenews.subscription.inc
@@ -11,10 +11,10 @@
 /**
  * Menu callback: Generates the subscription form for users.
  *
- * @see simplenews_subscription_manager_form_validate()
- * @see simplenews_subscription_manager_form_submit()
+ * @see simplenews_subscriptions_public_all_form_validate()
+ * @see simplenews_subscriptions_public_all_form_submit()
  */
-function simplenews_subscription_manager_form(&$form_state, $snid = NULL) {
+function simplenews_subscriptions_public_all_form(&$form_state, $snid = NULL) {
   global $user;
 
   if (isset($snid)) {
@@ -26,20 +26,25 @@ function simplenews_subscription_manager_form(&$form_state, $snid = NULL) {
     $subscription = simplenews_get_subscription($user);
   }
 
-  // If non-admin is trying to edit someone else's subscription, access denied.
-  if ($user->uid && $user->uid != $subscription->uid && !user_access('administer simplenews subscriptions')) {
+  // If admin trying to edit someone else's subscriptions redirect to admin_all_subscriptions page
+  if (user_access('administer simplenews subscriptions') && $user->uid != $subscription->uid) {
+    drupal_goto('admin/content/simplenews/users/edit/' . $snid);
+    // @todo I think this is confusing for an admin to redirected to an other part of the site when he edits a user.
+    //       Unless we can redirect the admin back to where he came from after submit.
+    return;
+  }
+
+  // If someone is trying to edit someone else's subscription, access denied.
+  if ($user->uid && $user->uid != $subscription->uid) {
     drupal_access_denied();
     return;
   }
-  $form = _simplenews_subscription_manager_form($subscription);
-  $form['#validate'][] = 'simplenews_subscription_manager_form_validate';
-  $form['#submit'][] = 'simplenews_subscription_manager_form_submit';
-  $form['#redirect'] = '';  //Return to home page after (un)subscribe
 
+  $form = _simplenews_subscriptions_public_all_form($subscription);
   return $form;
 }
 
-function simplenews_subscription_manager_form_validate($form, &$form_state) {
+function simplenews_subscriptions_public_all_form_validate($form, &$form_state) {
   $valid_email = valid_email_address($form_state['values']['mail']);
   if (!$valid_email) {
     form_set_error('mail', t('The email address you supplied is not valid.'));
@@ -52,7 +57,7 @@ function simplenews_subscription_manager_form_validate($form, &$form_state) {
   }
 }
 
-function simplenews_subscription_manager_form_submit($form, &$form_state) {
+function simplenews_subscriptions_public_all_form_submit($form, &$form_state) {
   switch ($form_state['values']['op']) {
     case t('Update'):
       // We first subscribe, then unsubscribe. This prevents deletion of subscriptions
@@ -214,9 +219,344 @@ function simplenews_confirm_removal_form_submit($form, &$form_state) {
 /**
  * Menu callback: handle the edit subscription page and a subscription
  * page for anonymous users.
+ * 
+ * @see simplenews_subscriptions_admin_form_validate()
+ * @see simplenews_subscriptions_admin_form_submit()
+ */
+function simplenews_subscriptions_admin_form(&$form_state, $snid) {
+  global $user;
+
+  $account = new stdClass();
+  $account->snid = $snid;
+  $subscription = simplenews_get_subscription($account);
+
+  // If non-admin, access denied.
+  if (!user_access('administer simplenews subscriptions')) {
+    drupal_access_denied();
+    return;
+  }
+  // @todo We don't need an access check here. The menu system does this already.
+
+  $form = _simplenews_subscriptions_admin_form($subscription);
+  return $form;
+}
+
+function simplenews_subscriptions_admin_form_validate($form, &$form_state) {
+  $valid_email = valid_email_address($form_state['values']['mail']);
+  if (!$valid_email) {
+    form_set_error('mail', t('The email address you supplied is not valid.'));
+  }
+  $checked_newsletters = array_filter($form_state['values']['newsletters']);
+  $account = new stdClass();
+  $account->mail = $form_state['values']['mail'];
+  if (!count($checked_newsletters) && !simplenews_get_subscription($account)) {
+    form_set_error('newsletters', t('You must select at least one newsletter.'));
+  }
+}
+
+function simplenews_subscriptions_admin_form_submit($form, &$form_state) {
+  switch ($form_state['values']['op']) {
+    case t('Update'):
+      // We first subscribe, then unsubscribe. This prevents deletion of subscriptions
+      // @todo This comment is no longer true in 6.x-2.x. We don't delete the subscriber anymore.
+      // when unsubscribed from the
+      // @todo Comment incomplete.
+      arsort($form_state['values']['newsletters'], SORT_NUMERIC);
+      foreach ($form_state['values']['newsletters'] as $tid => $checked) {
+        if ($checked) {
+          simplenews_subscribe_user($form_state['values']['mail'], $tid, FALSE, 'website');
+        }
+        else {
+          simplenews_unsubscribe_user($form_state['values']['mail'], $tid, FALSE, 'website');
+        }
+      }
+      drupal_set_message(t('The newsletter subscriptions for %mail have been updated.', array('%mail' => $form_state['values']['mail'])));
+      break;
+    case t('Subscribe'):
+      foreach ($form_state['values']['newsletters'] as $tid => $checked) {
+        if ($checked) {
+          simplenews_subscribe_user($form_state['values']['mail'], $tid, TRUE, 'website');
+        }
+      }
+      drupal_set_message(t('A confirmation email will be sent shortly containing further instructions on how to complete your subscription.'));
+      break;
+    case t('Unsubscribe'):
+      foreach ($form_state['values']['newsletters'] as $tid => $checked) {
+        if ($checked) {
+          simplenews_unsubscribe_user($form_state['values']['mail'], $tid, TRUE, 'website');
+        }
+      }
+      drupal_set_message(t('A confirmation email will be sent shortly containing further instructions on how to cancel your subscription.'));
+      break;
+  }
+}
+
+/**
+ * Menu callback: Generates the subscription form for users for the multisignup block.
+ *
+ * @see simplenews_subscriptions_multisignup_block_form_validate()
+ * @see simplenews_subscriptions_multisignup_block_form_submit()
+ */
+function simplenews_subscriptions_multisignup_block_form(&$form_state) {
+  global $user;
+
+  $subscription = simplenews_get_subscription($user);
+
+  // If someone not authorized to edit their subscription, return empty form.
+  // @todo move the access check to the calling function.
+  if (!user_access('subscribe to newsletters')) {
+    return;
+  }
+
+  $form = _simplenews_subscriptions_multisignup_block_form($subscription);
+  return $form;
+}
+
+function simplenews_subscriptions_multisignup_block_form_validate($form, &$form_state) {
+  $valid_email = valid_email_address($form_state['values']['mail']);
+  if (!$valid_email) {
+    form_set_error('mail', t('The email address you supplied is not valid.'));
+  }
+  $checked_newsletters = array_filter($form_state['values']['newsletters']);
+  $account = new stdClass();
+  $account->mail = $form_state['values']['mail'];
+  if (!count($checked_newsletters) && !simplenews_get_subscription($account)) {
+    form_set_error('newsletters', t('You must select at least one newsletter.'));
+  }
+}
+
+function simplenews_subscriptions_multisignup_block_form_submit($form, &$form_state) {
+  switch ($form_state['values']['op']) {
+    case t('Update'):
+      // We first subscribe, then unsubscribe. This prevents deletion of subscriptions
+      // when unsubscribed from the
+      arsort($form_state['values']['newsletters'], SORT_NUMERIC);
+      foreach ($form_state['values']['newsletters'] as $tid => $checked) {
+        if ($checked) {
+          simplenews_subscribe_user($form_state['values']['mail'], $tid, FALSE, 'website');
+        }
+        else {
+          simplenews_unsubscribe_user($form_state['values']['mail'], $tid, FALSE, 'website');
+        }
+      }
+      drupal_set_message(t('The newsletter subscriptions for %mail have been updated.', array('%mail' => $form_state['values']['mail'])));
+      break;
+    case t('Subscribe'):
+      foreach ($form_state['values']['newsletters'] as $tid => $checked) {
+        if ($checked) {
+          simplenews_subscribe_user($form_state['values']['mail'], $tid, TRUE, 'website');
+        }
+      }
+      drupal_set_message(t('You will receive a confirmation email shortly containing further instructions on how to complete your subscription.'));
+      break;
+    case t('Unsubscribe'):
+      foreach ($form_state['values']['newsletters'] as $tid => $checked) {
+        if ($checked) {
+          simplenews_unsubscribe_user($form_state['values']['mail'], $tid, TRUE, 'website');
+        }
+      }
+      drupal_set_message(t('You will receive a confirmation email shortly containing further instructions on how to cancel your subscription.'));
+      break;
+  }
+}
+
+/**
+ * Build edit own subscriptions form.
+ *
+ * @param object $subscription subscription object
+ */
+function _simplenews_subscriptions_public_all_form($subscription) {
+  // @todo Why use this difficult contruction with simplenews_subscriptions_public_all_form() calling _simplenews_subscriptions_public_all_form()?
+  $form = array();
+  $options = array();
+  $default_value = array();
+  global $language;
+
+  // Get newsletters for subscription form checkboxes.
+  // Newsletters with opt-in/out method 'hidden' will not be listed.
+  foreach (simplenews_get_newsletters(variable_get('simplenews_vid', '')) as $newsletter) {
+    $options[$newsletter->tid] = check_plain($newsletter->name);
+    $default_value[$newsletter->tid] = FALSE;
+  }
+
+  $form['subscriptions'] = array(
+    '#type' => 'fieldset',
+    '#description' => t('Select the newsletter(s) to which you want to subscribe or unsubscribe.'),
+  );
+  $form['subscriptions']['newsletters'] = array(
+    '#type' => 'checkboxes',
+    '#options' => $options,
+    '#default_value' => array_merge($default_value, (array)$subscription->tids),
+  );
+
+  // If current user is logged in, just display email.
+  // Anonymous users see an email box and will receive confirmations
+  if ($subscription->mail) {
+    $form['subscriptions']['#title'] = t('Subscriptions for %mail', array('%mail' => $subscription->mail));
+    $form['subscriptions']['mail'] = array('#type' => 'value', '#value' => $subscription->mail);
+    $form['update'] = array(
+      '#type' => 'submit',
+      '#value' => t('Update'),
+      '#weight' => 20,
+    );
+  }
+  else {
+    $form['subscriptions']['#title'] = t('Manage your newsletter subscriptions');
+    $form['subscriptions']['mail'] = array(
+      '#type' => 'textfield',
+      '#title' => t('email'),
+      '#size' => 20,
+      '#maxlength' => 128,
+      '#weight' => 10,
+      '#required' => TRUE,
+    );
+    $form['subscribe'] = array(
+      '#type' => 'submit',
+      '#value' => t('Subscribe'),
+      '#weight' => 20,
+    );
+    $form['unsubscribe'] = array(
+      '#type' => 'submit',
+      '#value' => t('Unsubscribe'),
+      '#weight' => 30,
+    );
+  }
+
+  $form['#validate'][] = 'simplenews_subscriptions_public_all_form_validate';
+  $form['#submit'][] = 'simplenews_subscriptions_public_all_form_submit';
+  $form['#redirect'] = '';  //Return to home page after (un)subscribe
+
+  return $form;
+}
+
+/**
+ * Build admin all subscriptions form.
+ *
+ * @param object $subscription subscription object
  */
-function simplenews_admin_users_form(&$form_state, $snid = NULL) {
-  $form = simplenews_subscription_manager_form($form_state, $snid);
+function _simplenews_subscriptions_admin_form($subscription) {
+  $form = array();
+  $options = array();
+  $default_value = array();
+  global $language;
+
+  // Get newsletters for subscription form checkboxes.
+  // Newsletters with opt-in/out method 'hidden' will not be listed.
+  foreach (simplenews_get_newsletters(variable_get('simplenews_vid', '')) as $newsletter) {
+    $options[$newsletter->tid] = check_plain($newsletter->name);
+    $default_value[$newsletter->tid] = FALSE;
+  }
+
+  $form['subscriptions'] = array(
+    '#type' => 'fieldset',
+    '#description' => t('Select the newsletter(s) to add/remove from subscription.'),
+  );
+  $form['subscriptions']['newsletters'] = array(
+    '#type' => 'checkboxes',
+    '#options' => $options,
+    '#default_value' => array_merge($default_value, (array)$subscription->tids),
+  );
+
+  // If current user is logged in, just display email.
+  // Anonymous users see an email box and will receive confirmations
+  if ($subscription->mail) {
+    $form['subscriptions']['#title'] = t('Subscriptions for %mail', array('%mail' => $subscription->mail));
+    $form['subscriptions']['mail'] = array('#type' => 'value', '#value' => $subscription->mail);
+    $form['update'] = array(
+      '#type' => 'submit',
+      '#value' => t('Update'),
+      '#weight' => 20,
+    );
+  }
+  else {
+    $form['subscriptions']['#title'] = t('Manage user\'s newsletter subscriptions');
+    $form['subscriptions']['mail'] = array(
+      '#type' => 'textfield',
+      '#title' => t('email'),
+      '#size' => 20,
+      '#maxlength' => 128,
+      '#weight' => 10,
+      '#required' => TRUE,
+    );
+    $form['subscribe'] = array(
+      '#type' => 'submit',
+      '#value' => t('Subscribe'),
+      '#weight' => 20,
+    );
+    $form['unsubscribe'] = array(
+      '#type' => 'submit',
+      '#value' => t('Unsubscribe'),
+      '#weight' => 30,
+    );
+  }
+
+  $form['#validate'][] = 'simplenews_subscriptions_admin_form_validate';
+  $form['#submit'][] = 'simplenews_subscriptions_admin_form_submit';
   $form['#redirect'] = 'admin/content/simplenews/users';
+
   return $form;
 }
+
+/**
+ * Build edit own subscriptions form for the multisignup block.
+ *
+ * @param object $subscription subscription object
+ */
+function _simplenews_subscriptions_multisignup_block_form($subscription) {
+  $form = array();
+  $options = array();
+  $default_value = array();
+  global $language;
+
+  // Get newsletters for subscription form checkboxes.
+  // Newsletters with opt-in/out method 'hidden' will not be listed.
+  foreach (simplenews_get_newsletters(variable_get('simplenews_vid', '')) as $newsletter) {
+    $options[$newsletter->tid] = check_plain($newsletter->name);
+    $default_value[$newsletter->tid] = FALSE;
+  }
+
+  $form['subscriptions']['newsletters'] = array(
+    '#type' => 'checkboxes',
+    '#options' => $options,
+    '#default_value' => array_merge($default_value, (array)$subscription->tids),
+  );
+
+  // If current user is logged in, just display email.
+  // Anonymous users see an email box and will receive confirmations
+  if ($subscription->mail) {
+    $form['subscriptions']['#title'] = t('Subscriptions for %mail', array('%mail' => $subscription->mail));
+    $form['subscriptions']['mail'] = array('#type' => 'value', '#value' => $subscription->mail);
+    $form['update'] = array(
+      '#type' => 'submit',
+      '#value' => t('Update'),
+      '#weight' => 20,
+    );
+  }
+  else {
+    $form['subscriptions']['#title'] = t('Manage your newsletter subscriptions');
+    $form['subscriptions']['mail'] = array(
+      '#type' => 'textfield',
+      '#title' => t('email'),
+      '#size' => 20,
+      '#maxlength' => 128,
+      '#weight' => 10,
+      '#required' => TRUE,
+    );
+    $form['subscribe'] = array(
+      '#type' => 'submit',
+      '#value' => t('Subscribe'),
+      '#weight' => 20,
+    );
+    $form['unsubscribe'] = array(
+      '#type' => 'submit',
+      '#value' => t('Unsubscribe'),
+      '#weight' => 30,
+    );
+  }
+
+  $form['#validate'][] = 'simplenews_subscriptions_public_all_form_validate';
+  $form['#submit'][] = 'simplenews_subscriptions_public_all_form_submit';
+  $form['#redirect'] = '';  //Return to home page after (un)subscribe
+
+  return $form;
+}
\ No newline at end of file
diff --git tests/simplenews.test tests/simplenews.test
index 7233460..2f6d4ef 100644
--- tests/simplenews.test
+++ tests/simplenews.test
@@ -5,7 +5,7 @@ class SimplenewsTestCase extends DrupalWebTestCase {
 
   public function setUp() {
     parent::setUp('taxonomy', 'simplenews', 'simplenews_test');
-    
+
     //$this->simplenews_admin_user = $this->drupalCreateUser(array('administer newsletters', 'administer simplenews settings', 'administer simplenews subscriptions'));
     //$this->sender_user = $this->drupalCreateUser(array('create simplenews content', 'edit own simplenews content', 'send newsletter'));
 
@@ -82,7 +82,7 @@ class SimplenewsTestCase extends DrupalWebTestCase {
     $block['delta'] = $tid;
     $edit[$block['module'] . '_' . $block['delta'] . '[region]'] = 'left';
     $this->drupalPost('admin/build/block', $edit, t('Save blocks'));
-    
+
     // Set block parameters
     $edit = array();
     if (isset($settings['message'])) {
@@ -126,18 +126,18 @@ class SimplenewsBlockTestCase extends SimplenewsTestCase {
    * Test basic subscription block functionality.
    */
   function testBlockBasic() {
-    
+
     /* Test code goes here */
-    
+
   }
-  
+
   /**
    * Test multiple blocks on one page.
    */
   function testBlockMultiple() {
-    
+
     /* Test code goes here */
-    
+
   }
 }
 
@@ -172,7 +172,7 @@ class SimplenewsSubscribeTestCase extends SimplenewsTestCase {
     $this->setAnonymousUserSubscription(TRUE);
 
     // Setup subscription block with subscription form.
-    $block_settings = array(    
+    $block_settings = array(
       'message' => $this->randomName(4),
       'form' => '1',
       'link to previous' => FALSE,
@@ -183,20 +183,20 @@ class SimplenewsSubscribeTestCase extends SimplenewsTestCase {
     $this->setupSubscriptionBlock($tid, $block_settings);
 
     $this->drupalLogout();
-    
+
     //file_put_contents('output.html', $this->drupalGetContent());
 
     // 1. Subscribe anonymous via block
     // Subscribe + submit
     // Assert confirmation message
     // Assert outgoing email
-    // 
+    //
     // Confirm using mail link
     // Confirm using mail link
     // Assert confirmation message
-  
+
     $mail = $this->randomEmail(8, 'testmail');
-    $edit = array (
+    $edit = array(
       'mail' => $mail,
       'action' => 'subscribe',
     );
@@ -210,7 +210,7 @@ class SimplenewsSubscribeTestCase extends SimplenewsTestCase {
     $match = array();
     preg_match($pattern, $content, $match);
     $confirm_url = $match[1];
-    
+
     $pattern = '@http:/.*/newsletter/confirm/add/[0-9,a-f]{10}[0-9]+t[0-9]+@';
     $this->assertPattern($pattern, t('Confirmation URL found: @url', array('@url' => $confirm_url)));
 
@@ -224,18 +224,18 @@ class SimplenewsSubscribeTestCase extends SimplenewsTestCase {
     $this->assertRaw(t('%user was added to the %newsletter mailing list.', array('%user' => $mail, '%newsletter' => $newsletter->name)), t('Anonymous subscriber added to newsletter'));;
 
     //file_put_contents('output2.html', $this->drupalGetContent());
-    
+
     // 2. Subscribe anonymous via subscription page
     // Subscribe + submit
     // Assert confirmation message
     // Assert outgoing email
-    // 
+    //
     // Confirm using mail link
     // Confirm using mail link
     // Assert confirmation message
 
     $mail = $this->randomEmail(8, 'testmail');
-    $edit = array (
+    $edit = array(
       "newsletters[$tid]" => '1',
       'mail' => $mail,
     );
@@ -249,7 +249,7 @@ class SimplenewsSubscribeTestCase extends SimplenewsTestCase {
     $match = array();
     preg_match($pattern, $content, $match);
     $confirm_url = $match[1];
-    
+
     $pattern = '@http:/.*/newsletter/confirm/add/[0-9,a-f]{10}[0-9]+t[0-9]+@';
     $this->assertPattern($pattern, t('Confirmation URL found: @url', array('@url' => $confirm_url)));
 
@@ -289,7 +289,7 @@ class SimplenewsSubscribeTestCase extends SimplenewsTestCase {
     $this->setAnonymousUserSubscription(TRUE);
 
     // Setup subscription block with subscription form.
-    $block_settings = array(    
+    $block_settings = array(
       'message' => $this->randomName(4),
       'form' => '1',
       'link to previous' => FALSE,
@@ -314,7 +314,7 @@ class SimplenewsSubscribeTestCase extends SimplenewsTestCase {
     // Unsubscribe + submit
     // Assert confirmation message
 
-    $edit = array (
+    $edit = array(
       "newsletters[$tid]" => 0,
     );
     $this->drupalPost('newsletter/subscriptions', $edit, t('Update'));
@@ -324,7 +324,7 @@ class SimplenewsSubscribeTestCase extends SimplenewsTestCase {
     // Subscribe + submit
     // Assert confirmation message
 
-    $edit = array (
+    $edit = array(
       "newsletters[$tid]" => '1',
     );
     $this->drupalPost('newsletter/subscriptions', $edit, t('Update'));
@@ -336,7 +336,7 @@ class SimplenewsSubscribeTestCase extends SimplenewsTestCase {
     // Unsubscribe + submit
     // Assert confirmation message
 
-    $edit = array (
+    $edit = array(
       "newsletters[$tid]" => 0,
     );
     $url = 'user/'. $subscriber_user->uid .'/edit/newsletter';
@@ -347,7 +347,7 @@ class SimplenewsSubscribeTestCase extends SimplenewsTestCase {
     // Subscribe + submit
     // Assert confirmation message
 
-    $edit = array (
+    $edit = array(
       "newsletters[$tid]" => '1',
     );
     $url = 'user/'. $subscriber_user->uid .'/edit/newsletter';
