Index: modules/taxonomy/taxonomy.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/taxonomy/taxonomy.module,v
retrieving revision 1.385
diff -u -p -r1.385 taxonomy.module
--- modules/taxonomy/taxonomy.module	27 Oct 2007 13:39:07 -0000	1.385
+++ modules/taxonomy/taxonomy.module	29 Oct 2007 18:37:03 -0000
@@ -340,10 +340,10 @@ function taxonomy_del_term($tid) {
 /**
  * Generate a form element for selecting terms from a vocabulary.
  */
-function taxonomy_form($vid, $value = 0, $help = NULL, $name = 'taxonomy') {
+function taxonomy_form($vid, $value = 0, $help = NULL, $name = 'taxonomy', $required = NULL) {
   $vocabulary = taxonomy_vocabulary_load($vid);
   $help = ($help) ? $help : $vocabulary->help;
-  if ($vocabulary->required) {
+  if ($vocabulary->required || !empty($required)) {
     $blank = 0;
   }
   else {
@@ -450,9 +450,19 @@ function taxonomy_form_alter(&$form, $fo
             $default_terms[$term->tid] = $term;
           }
         }
-        $form['taxonomy'][$vocabulary->vid] = taxonomy_form($vocabulary->vid, array_keys($default_terms), $vocabulary->help);
-        $form['taxonomy'][$vocabulary->vid]['#weight'] = $vocabulary->weight;
-        $form['taxonomy'][$vocabulary->vid]['#required'] = $vocabulary->required;
+        if (!isset($form['taxonomy'][$vocabulary->vid])) {
+          $form['taxonomy'][$vocabulary->vid] = array();
+        }
+        else {
+          // If the vocabulary is set to required earlier, overruling the default option, we have to deal
+          // with it before calling taxonomy_form, or else we will still have <none> as first option.
+          if (!empty($form['taxonomy'][$vocabulary->vid]['#required'])) {
+            $vocabulary->required = $form['taxonomy'][$vocabulary->vid]['#required'];
+          }        
+        }
+        $form['taxonomy'][$vocabulary->vid] += taxonomy_form($vocabulary->vid, array_keys($default_terms), $vocabulary->help, NULL, $vocabulary->required);
+        $form['taxonomy'][$vocabulary->vid]['#required'] += $vocabulary->required;
+        $form['taxonomy'][$vocabulary->vid]['#weight'] += $vocabulary->weight;
       }
     }
     if (!empty($form['taxonomy']) && is_array($form['taxonomy'])) {
@@ -916,6 +926,7 @@ function _taxonomy_term_select($title, $
     '#multiple' => $multiple,
     '#size' => $multiple ? min(9, count($options)) : 0,
     '#weight' => -15,
+    '#required' => 0,
     '#theme' => 'taxonomy_term_select',
   );
 }
Index: modules/forum/forum.install
===================================================================
RCS file: /cvs/drupal/drupal/modules/forum/forum.install,v
retrieving revision 1.11
diff -u -p -r1.11 forum.install
--- modules/forum/forum.install	10 Oct 2007 11:39:33 -0000	1.11
+++ modules/forum/forum.install	29 Oct 2007 18:35:30 -0000
@@ -13,7 +13,7 @@ function forum_enable() {
   // Create the forum vocabulary if it does not exist. Assign the vocabulary
   // a low weight so it will appear first in forum topic create and edit
   // forms.
-  $vid = variable_get('forum_nav_vocabulary', 0);
+  $vid = intval(variable_get('forum_nav_vocabulary', 0));
   $vocabularies = taxonomy_get_vocabularies();
   if (!isset($vocabularies[$vid])) {
     $vocabulary = array(
@@ -36,7 +36,7 @@ function forum_enable() {
  * Implementation of hook_uninstall().
  */
 function forum_uninstall() {
-  $vid = variable_get('forum_nav_vocabulary', '');
+  $vid = intval(variable_get('forum_nav_vocabulary'), '');
   // Delete the vocabulary.
   taxonomy_del_vocabulary($vid);
 
@@ -89,3 +89,16 @@ function forum_schema() {
 
   return $schema;
 }
+
+/**
+ * Implementation of hook_update().
+ */
+function forum_update_6001() {
+  $ret = array();
+  $vid = intval(variable_get('forum_nav_vocabulary', ''));
+  // Form vocabulary is not required by default.
+  if (!empty($vid)) {
+    $ret[] = update_sql("UPDATE {vocabulary} SET required = 0 WHERE vid = " . $vid);
+  }
+  return $ret;
+}
Index: modules/forum/forum.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/forum/forum.module,v
retrieving revision 1.425
diff -u -p -r1.425 forum.module
--- modules/forum/forum.module	25 Oct 2007 15:32:55 -0000	1.425
+++ modules/forum/forum.module	29 Oct 2007 18:35:31 -0000
@@ -78,10 +78,6 @@ function forum_term_load($tid) {
  * Implementation of hook_menu().
  */
 function forum_menu() {
-  $items['node/add/forum'] = array(
-    'title' => 'Forum topic',
-    'access arguments' => array('create forum topics'),
-  );
   $items['forum'] = array(
     'title' => 'Forums',
     'page callback' => 'forum_page',
@@ -260,12 +256,19 @@ function forum_nodeapi(&$node, $op, $tea
       break;
     case 'update':
       if (!$node->revision) {
-        db_query('UPDATE {forum} SET tid = %d WHERE vid = %d', $node->tid, $node->vid);
-        break;
+        if (!empty($node->tid)) {
+          db_query('UPDATE {forum} SET tid = %d WHERE vid = %d', $node->tid, $node->vid);
+        }
+        // The node is removed from the forum.
+        else {
+          db_query('DELETE FROM {forum} WHERE nid = %d', $node->nid);
+        }
       }
       // Deliberate no break -- for new revisions we need an insert.
     case 'insert':
-      db_query('INSERT INTO {forum} (tid, vid, nid) VALUES (%d, %d, %d)', $node->tid, $node->vid, $node->nid);
+      if (!empty($node->tid)) {
+        db_query('INSERT INTO {forum} (tid, vid, nid) VALUES (%d, %d, %d)', $node->tid, $node->vid, $node->nid);
+      }
       break;
     case 'delete':
       db_query('DELETE FROM {forum} WHERE nid = %d', $node->nid);
@@ -354,13 +357,18 @@ function forum_form_alter(&$form, $form_
       );
       $form['nodes']['#required'] = TRUE;
       $form['hierarchy'] = array('#type' => 'value', '#value' => 1);
-      unset($form['relations']);
-      unset($form['tags']);
-      unset($form['multiple']);
-      unset($form['delete']);
-      $form['required'] = array('#type' => 'value', '#value' => 1);
+      $form['required'] = array('#type' => 'value', '#value' => FALSE);
+      $form['relations'] = array('#type' => 'value', '#value' => FALSE);
+      $form['tags'] = array('#type' => 'value', '#value' => FALSE);
+      $form['multiple'] = array('#type' => 'value', '#value' => FALSE);
+      unset($form['delete']);    
     }
   }
+  if ($form_id == 'forum_node_form') {
+    // Set the vocabulary as required for forum-nodes.
+    $vid = variable_get('forum_nav_vocabulary', '');
+    $form['taxonomy'][$vid]['#required'] = TRUE;
+  }
 }
 
 /**
