diff -urp --strip-trailing-cr ../drupal-6.x-dev/modules/taxonomy/taxonomy.module ./modules/taxonomy/taxonomy.module
--- ../drupal-6.x-dev/modules/taxonomy/taxonomy.module	2007-10-02 18:15:56.000000000 +0200
+++ ./modules/taxonomy/taxonomy.module	2007-10-20 00:27:08.000000000 +0200
@@ -343,12 +343,7 @@ function taxonomy_del_term($tid) {
 function taxonomy_form($vid, $value = 0, $help = NULL, $name = 'taxonomy') {
   $vocabulary = taxonomy_vocabulary_load($vid);
   $help = ($help) ? $help : $vocabulary->help;
-  if ($vocabulary->required) {
-    $blank = 0;
-  }
-  else {
-    $blank = '<'. t('none') .'>';
-  }
+  $blank = ($vocabulary->required) ? t('-- Please choose! --') : '<'. t('none') .'>';
 
   return _taxonomy_term_select(check_plain($vocabulary->name), $name, $value, $vid, $help, intval($vocabulary->multiple), $blank);
 }
@@ -499,18 +494,27 @@ function taxonomy_node_get_terms($node, 
 }
 
 /**
- * Make sure incoming vids are free tagging enabled.
+ * Validate Taxonomy selection.
  */
 function taxonomy_node_validate(&$node) {
   if (!empty($node->taxonomy)) {
-    $terms = $node->taxonomy;
-    if (!empty($terms['tags'])) {
-      foreach ($terms['tags'] as $vid => $vid_value) {
-        $vocabulary = taxonomy_vocabulary_load($vid);
-        if (empty($vocabulary->tags)) {
-          // see form_get_error $key = implode('][', $element['#parents']);
-          // on why this is the key
-          form_set_error("taxonomy][tags][$vid", t('The %name vocabulary can not be modified in this way.', array('%name' => $vocabulary->name)));
+    foreach ($node->taxonomy as $key=>$terms) {
+      // If tags are present, make sure incoming vids are free tagging enabled.
+      if ($key == 'tags') {
+        foreach ($terms as $vid => $vid_value) {
+          $vocabulary = taxonomy_vocabulary_load($vid);
+          if (empty($vocabulary->tags)) {
+            // see form_get_error $key = implode('][', $element['#parents']);
+            // on why this is the key
+            form_set_error("taxonomy][tags][$vid", t('The %name vocabulary can not be modified in this way.', array('%name' => $vocabulary->name)));
+          }
+        }
+      }
+      // If the blank line was selected, check for the vocabulary being required.
+      else if (empty($terms) || (is_array($terms) && isset($terms[0]))) {
+        $vocabulary = taxonomy_vocabulary_load($key);
+        if ($vocabulary->required) {
+          form_set_error("taxonomy][$key", t('You must choose a term from %vocabulary.', array('%vocabulary' => $vocabulary->name)));
         }
       }
     }
@@ -890,10 +894,8 @@ function taxonomy_get_term($tid) {
 function _taxonomy_term_select($title, $name, $value, $vocabulary_id, $description, $multiple, $blank, $exclude = array()) {
   $tree = taxonomy_get_tree($vocabulary_id);
   $options = array();
+  $options[0] = $blank;
 
-  if ($blank) {
-    $options[0] = $blank;
-  }
   if ($tree) {
     foreach ($tree as $term) {
       if (!in_array($term->tid, $exclude)) {
@@ -902,10 +904,6 @@ function _taxonomy_term_select($title, $
         $options[] = $choice;
       }
     }
-    if (!$blank && !$value) {
-      // required but without a predefined value, so set first as predefined
-      $value = $tree[0]->tid;
-    }
   }
 
   return array('#type' => 'select',
