diff -urp user_mailman_register_old\user_mailman_register.install user_mailman_register\user_mailman_register.install
--- user_mailman_register_old\user_mailman_register.install	Wed Jan 23 08:31:56 2008
+++ user_mailman_register\user_mailman_register.install	Sat Feb 16 14:46:05 2008
@@ -3,6 +3,8 @@
 function user_mailman_register_install() {
   variable_set('user_mailman_register_required', 0);
   variable_set('user_mailman_register_registerform', 1);
+  variable_set('user_mailman_register_defaultnewreg', 0);
+  variable_set('user_mailman_register_ownform', 1);
   variable_set('user_mailman_register_profilename', '');
   switch ($GLOBALS['db_type']) {
   case 'pgsql':
@@ -16,6 +18,14 @@ function user_mailman_register_install()
     db_query("ALTER TABLE {mailman_lists} ALTER COLUMN user_notify SET DEFAULT 0");
     db_query("ALTER TABLE {mailman_lists} ADD COLUMN user_admin_notify BOOLEAN");
     db_query("ALTER TABLE {mailman_lists} ALTER COLUMN user_admin_notify SET DEFAULT 0");
+    db_query("ALTER TABLE {mailman_lists} ADD COLUMN allow_unsubscribe BOOLEAN");
+    db_query("ALTER TABLE {mailman_lists} ALTER COLUMN allow_unsubscribe SET DEFAULT 1");
+    db_query("ALTER TABLE {mailman_lists} ADD COLUMN allow_temp_disable BOOLEAN");
+    db_query("ALTER TABLE {mailman_lists} ALTER COLUMN allow_temp_disable SET DEFAULT 1");
+    db_query("ALTER TABLE {mailman_lists} ADD COLUMN allow_digest BOOLEAN");
+    db_query("ALTER TABLE {mailman_lists} ALTER COLUMN allow_digest SET DEFAULT 1");
+    db_query("ALTER TABLE {mailman_lists} ADD COLUMN description TEXT");
+    db_query("ALTER TABLE {mailman_lists} ALTER COLUMN description SET DEFAULT ''"); 
     break; 
     
   case 'mysql': 
@@ -25,6 +35,10 @@ function user_mailman_register_install()
     db_query("ALTER TABLE {mailman_lists} ADD COLUMN user_invite boolean DEFAULT 0"); 
     db_query("ALTER TABLE {mailman_lists} ADD COLUMN user_notify boolean DEFAULT 0"); 
     db_query("ALTER TABLE {mailman_lists} ADD COLUMN user_admin_notify boolean DEFAULT 0"); 
+    db_query("ALTER TABLE {mailman_lists} ADD COLUMN allow_unsubscribe boolean DEFAULT 1");
+    db_query("ALTER TABLE {mailman_lists} ADD COLUMN allow_temp_disable boolean DEFAULT 1");
+    db_query("ALTER TABLE {mailman_lists} ADD COLUMN allow_digest boolean DEFAULT 1");
+    db_query("ALTER TABLE {mailman_lists} ADD COLUMN description mediumtext NOT NULL");
     break; 
   }
   
@@ -33,6 +47,8 @@ function user_mailman_register_install()
 function user_mailman_register_uninstall() {
   variable_del('user_mailman_register_required');
   variable_del('user_mailman_register_registerform');
+  variable_del('user_mailman_register_defaultnewreg');
+  variable_del('user_mailman_register_ownform');
   variable_del('user_mailman_register_profilename');
   switch ($GLOBALS['db_type']) {
   case 'pgsql':
@@ -43,6 +59,10 @@ function user_mailman_register_uninstall
     db_query("ALTER TABLE {mailman_lists} DROP COLUMN user_invite;");
     db_query("ALTER TABLE {mailman_lists} DROP COLUMN user_notify;");
     db_query("ALTER TABLE {mailman_lists} DROP COLUMN user_admin_notify;");
+    db_query("ALTER TABLE {mailman_lists} DROP COLUMN allow_unsubscribe;");
+    db_query("ALTER TABLE {mailman_lists} DROP COLUMN allow_temp_disable;");
+    db_query("ALTER TABLE {mailman_lists} DROP COLUMN allow_digest;");
+    db_query("ALTER TABLE {mailman_lists} DROP COLUMN description;");
     break;
   }
 }
@@ -62,5 +82,33 @@ function user_mailman_register_update_1(
         break; 
     } 
  
+    return $ret; 
+}
+ 
+// Add more settings fields.
+function user_mailman_register_update_2() {
+    $ret = array(); 
+
+    switch ($GLOBALS['db_type']) { 
+    case 'pgsql': 
+      $ret[] = update_sql("ALTER TABLE {mailman_lists} ADD COLUMN allow_unsubscribe BOOLEAN");
+      $ret[] = update_sql("ALTER TABLE {mailman_lists} ALTER COLUMN allow_unsubscribe SET DEFAULT 1");
+      $ret[] = update_sql("ALTER TABLE {mailman_lists} ADD COLUMN allow_temp_disable BOOLEAN");
+      $ret[] = update_sql("ALTER TABLE {mailman_lists} ALTER COLUMN allow_temp_disable SET DEFAULT 1");
+      $ret[] = update_sql("ALTER TABLE {mailman_lists} ADD COLUMN allow_digest BOOLEAN");
+      $ret[] = update_sql("ALTER TABLE {mailman_lists} ALTER COLUMN allow_digest SET DEFAULT 1");
+      $ret[] = update_sql("ALTER TABLE {mailman_lists} ADD COLUMN description TEXT");
+      $ret[] = update_sql("ALTER TABLE {mailman_lists} ALTER COLUMN description SET DEFAULT ''");
+      break; 
+ 
+    case 'mysql': 
+    case 'mysqli': 
+      $ret[] = update_sql("ALTER TABLE {mailman_lists} ADD COLUMN allow_unsubscribe boolean DEFAULT 1"); 
+      $ret[] = update_sql("ALTER TABLE {mailman_lists} ADD COLUMN allow_temp_disable boolean DEFAULT 1");
+      $ret[] = update_sql("ALTER TABLE {mailman_lists} ADD COLUMN allow_digest boolean DEFAULT 1");
+      $ret[] = update_sql("ALTER TABLE {mailman_lists} ADD COLUMN description mediumtext NOT NULL");
+      break; 
+    } 
+
     return $ret; 
 }
diff -urp user_mailman_register_old\user_mailman_register.module user_mailman_register\user_mailman_register.module
--- user_mailman_register_old\user_mailman_register.module	Tue Feb 12 04:09:58 2008
+++ user_mailman_register\user_mailman_register.module	Sat Feb 16 15:19:14 2008
@@ -21,14 +21,16 @@ function user_mailman_register_user($op,
   switch ($op) {
     //Create menu option on user tab;
   case 'categories':
-    $lists = _mailman_manager_get_lists();
-    if (count($lists) && user_access('access user_mailman_register')) {
-      $output_user[] = array('name' => 'user_mailman_register', 'title' => t('Mailing Lists register'), 'weight' => 9);
+    if (variable_get('user_mailman_register_ownform', 1)) {
+      $lists = _mailman_manager_get_lists();
+      if (count($lists) && user_access('access user_mailman_register')) {
+        $output_user[] = array('name' => 'user_mailman_register', 'title' => t('Mailing Lists register'), 'weight' => 9);
+      }
+      return $output_user;
     }
-    return $output_user;
     break;
   case 'form':
-    if ($category == 'user_mailman_register' && user_access('access user_mailman_register')) {
+    if ($category == (variable_get('user_mailman_register_ownform', 1)?'user_mailman_register':'account') && user_access('access user_mailman_register')) {
       return _user_mailman_register_form($account);
     }
     break;
@@ -59,10 +61,10 @@ function user_mailman_register_user($op,
     }
     break;
   case 'update':
-    if ($category=='user_mailman_register') {
+    if ($category==(variable_get('user_mailman_register_ownform', 1)?'user_mailman_register':'account')) {
       _user_mailman_register_subscribe($account, $edit);
     } 
-    else if ($category=='account' && isset($edit['mail']) && $account->mail != $edit['mail']) {
+    if ($category=='account' && isset($edit['mail']) && $account->mail != $edit['mail']) {
       $lists = _mailman_manager_get_lists();
       if (count($lists) > 0) {
         //prepare a form from old status subscriptions. 
@@ -92,20 +94,22 @@ function _user_mailman_register_form($ac
   $lists = _mailman_manager_get_lists();
   if (count($lists) > 0) {
     $status = 0;
+    $form['user_mailman_register'] = array('#weight' => 0.9);
     $form['user_mailman_register']['lists'] = array(
                                                     '#type' => 'fieldset',
                                                     '#title' => t('Mailing list subscription'),
-                                                    '#description' => t('Join a mailing list to receive or partecipate in its discussions via email.'),
+                                                    '#description' => t('Join a mailing list to receive or participate in its discussions via email.'),
                                                     '#collapsible' => FALSE 
                                                     );
     foreach ($lists as $list) {
-      if (!$list['webadmin']||!$list['webpass']) {
+      if (!$list['webadmin'] || !$list['webpass'] || !user_access("can subscribe to ".$list['name'])) {
         continue;
       }
       $lstatus = 0;
       $form['user_mailman_register']['lists']['list'. trim($list['lid'])] = array(
                                                                                  '#type' => 'fieldset',
                                                                                  '#title' => $list['name'],
+                                                                                 '#description' => $list['description'],
                                                                                  '#collapsible' => TRUE
                                                                                  );
       if ($account) {
@@ -115,17 +119,27 @@ function _user_mailman_register_form($ac
 
       if ($lstatus == 0) {
         $title = t('Subscribe to ') . $list['name'] ."?";
-        $options = array( '3' => t('Yes'), '0' => t('No'));
+        if ($list['allow_unsubscribe'])
+          $options['0'] = t('No');
+        $options['3'] = t('Yes');
       } 
       else {
         $title = t('Change your subscription');
-        $options = array('0' => t('Unsubscribe'),
-                         '1' => t('No mail (temporarily disable delivery)'),
-                         '2' => t('Subscribe for digest (receive emails in a bundle)'),
-                         '3' => t('Subscribe for all Mail (normal delivery)')
-                         );
+        if ($list['allow_unsubscribe'])
+          $options['0'] = t('Unsubscribe');
+        if ($list['allow_temp_disable'])
+          $options['1'] = t('No mail (temporarily disable delivery)');
+        if ($list['allow_digest']) {
+          $options['2'] = t('Subscribe for digest (receive emails in a bundle)');
+          $options['3'] = t('Subscribe for all mail (normal delivery)');
+        }
+        else
+          $options['3'] = t('Subscribe');
       }
 
+      // feeds specified default value into the form on new-user registration if allowed
+      if (!$account) $lstatus = ((variable_get('user_mailman_register_defaultnewreg', 0)==0 && $list['allow_unsubscribe'])?0:3);
+
       $form['user_mailman_register']['lists']['list'. trim($list['lid'])]['options'. trim($list['lid'])] = array(
                                                                                                                 '#type' => 'radios',
                                                                                                                 '#title' => $title,
@@ -145,10 +159,12 @@ function _user_mailman_register_subscrib
   $lists = _mailman_manager_get_lists();
   if (count($lists) > 0) {
     foreach ($lists as $list) {
-      if ($deluser || !isset($edit['options'. trim($list['lid'])])) {
+      if ($deluser) {
         $reqstatus='0';
       }
       else {
+        if (!isset($edit['options'. trim($list['lid'])]))
+          continue;
         $reqstatus=$edit['options'. trim($list['lid'])];
       }
       $subscrip=_mailman_manager_get_subscriptions($account->uid, $list['lid']);
@@ -318,6 +334,10 @@ function user_mailman_register_admin() {
                    array('data' => t('User invite'), 'field' => 'user_invite'),
                    array('data' => t('User notify'), 'field' => 'user_notify'),
                    array('data' => t('list admins notify'), 'field' => 'user_admin_notify'),
+                   array('data' => t('allow unsubscribe'), 'field' => 'allow_unsubscribe'),
+                   array('data' => t('allow temporary disable'), 'field' => 'allow_temp_disable'),
+                   array('data' => t('allow digest'), 'field' => 'allow_digest'),
+                   array('data' => t('Description'), 'field' => 'description'),
                    );
   
     
@@ -372,6 +392,19 @@ function user_mailman_register_adminlist
                                                    '#default_value' => variable_get('user_mailman_register_registerform', 1),
                                                    '#description' => t('If checked, mailing list subscription is displayed in the register new user form.'),
                                                    );
+  $form['user_mailman_admin']['defaultnewreg'] = array(
+                                                   '#type' => 'radios', 
+                                                   '#title' => t('Default choice in user registration form'),
+                                                   '#options' => array('0' => t('No'),'1' => t('Yes')),
+                                                   '#default_value' => variable_get('user_mailman_register_defaultnewreg', 0),
+                                                   '#description' => t('If the above box is checked, this will be the default choice for all mailing lists in the register new user form.'),
+                                                   );
+  $form['user_mailman_admin']['ownform'] = array(
+                                                  '#type' => 'checkbox', 
+                                                  '#title' => t('Display in own separate category'),
+                                                  '#default_value' => variable_get('user_mailman_register_ownform', 1),
+                                                  '#description' => t('If checked, mailing list subscription is displayed in a separate category on the user account edit form.'),
+                                                  );
   if (module_exists('profile')) { 
     $form['user_mailman_admin']['profilename'] = array(
                                                         '#type' => 'textfield', 
@@ -400,11 +433,15 @@ function user_mailman_register_adminlist
   }
   $required = $form_values['user_mailman_admin']['required'];
   $register = $form_values['user_mailman_admin']['register'];
+  $defaultnewreg = $form_values['user_mailman_admin']['defaultnewreg'];
+  $ownform = $form_values['user_mailman_admin']['ownform'];
   $profilename = $form_values['user_mailman_admin']['profilename'];
   $mailonerrors = $form_values['user_mailman_admin']['mailonerrors'];
   if (is_numeric($required) && is_numeric($register)) {
     variable_set('user_mailman_register_required', $required);
     variable_set('user_mailman_register_registerform', $register);
+    variable_set('user_mailman_register_defaultnewreg', $defaultnewreg);
+    variable_set('user_mailman_register_ownform', $ownform);
     variable_set('user_mailman_register_profilename', $profilename);
     if (isset($mailonerrors)) {
       variable_set('user_mailman_register_mailonerrors', $mailonerrors);
@@ -471,6 +508,30 @@ function user_mailman_register_adminedit
                                       '#description' => t('Send notifications of new subscription to the list owner?'),
                                       '#type' => 'checkbox',
                                       );
+  $form['allow_unsubscribe'] = array(
+    '#title' => t('Allow unsubscribe'),
+    '#default_value' => $list->allow_unsubscribe,
+    '#description' => t('Allow users to unsubscribe from the list? This is equivalent to forcing subscription to this list.'),
+    '#type' => 'checkbox',
+    );
+  $form['allow_temp_disable'] = array(
+    '#title' => t('Allow temporary disable'),
+    '#default_value' => $list->allow_temp_disable,
+    '#description' => t('Allow users to temporarily disable delivery?'),
+    '#type' => 'checkbox',
+    );
+  $form['allow_digest'] = array(
+    '#title' => t('Allow digest'),
+    '#default_value' => $list->allow_digest,
+    '#description' => t('Allow users to subscribe in digest mode?'),
+    '#type' => 'checkbox',
+    );
+  $form['description'] = array(
+    '#title' => t('Description'),
+    '#default_value' => $list->description,
+    '#description' => t('A brief description of this mailing list. This text will be displayed in the subscriptions page.'),
+    '#type' => 'textarea',
+    );
 
   $form['lid'] = array('#type' => 'hidden', '#value' => $id );
   $form['name'] = array('#type' => 'hidden', '#value' => $list->name );
@@ -493,13 +554,17 @@ function user_mailman_register_adminedit
     return;
   }
   //Update existin
-  $query = "UPDATE {mailman_lists} SET webadmin = '%s', webpass = '%s', user_invite = '%s', user_notify = '%s', user_admin_notify = '%s' WHERE lid = %d";
+  $query = "UPDATE {mailman_lists} SET webadmin = '%s', webpass = '%s', user_invite = '%s', user_notify = '%s', user_admin_notify = '%s', allow_unsubscribe = '%s', allow_temp_disable = '%s', allow_digest = '%s', description = '%s' WHERE lid = %d";
   $result = db_query($query, 
                      $form_values['webadmin'], 
                      $form_values['webpass'], 
                      $form_values['user_invite'], 
                      $form_values['user_notify'], 
                      $form_values['user_admin_notify'],
+                     $form_values['allow_unsubscribe'],
+                     $form_values['allow_temp_disable'],
+                     $form_values['allow_digest'],
+                     $form_values['description'],
                      $form_values['lid']
                      );
   
@@ -519,7 +584,14 @@ function user_mailman_register_adminedit
  * Implementation of hook_perm().
  */
 function user_mailman_register_perm() {
-  return array('access user_mailman_register');
+  $permStrings = array('access user_mailman_register');
+  $lists = _mailman_manager_get_lists();
+  if (count($lists) > 0) {
+    foreach ($lists as $list) {
+      $permStrings[] = "can subscribe to ".$list['name'];
+    }
+  }
+  return $permStrings;
 }
 
 
@@ -533,7 +605,7 @@ function user_mailman_register_page() {
   }
   else {
     global $user;
-    drupal_goto('user/'. $user->uid .'/edit/user_mailman_register');
+    drupal_goto('user/'. $user->uid .'/edit'.(variable_get('user_mailman_register_ownform', 1)?'/user_mailman_register':''));
   }
 }
 
