--- modules/forum/forum.module.orig	Tue Jul 14 20:58:04 2009
+++ modules/forum/forum.module	Tue Jul 14 23:20:50 2009
@@ -284,9 +284,38 @@ function forum_node_presave($node) {
       foreach ($tree as $term) {
         $forum_terms[] = $term->tid;
       }
-      foreach ($node->taxonomy as $term_id) {
-        if (in_array($term_id, $forum_terms)) {
-          $node->tid = $term_id;
+      // $node->taxonomy can be one of several formats:
+      // 1. An array of term objects keyed by tid
+      // 2. An array of tids
+      // 3. A single term object
+      // 4. A single tid
+      // This code, based on Drupal 7's taxonomy save function, handles all
+      // See issue at: http://drupal.org/user/28680
+      if (is_array($node->taxonomy)) {
+        foreach ($node->taxonomy as $term_key => $term_val) {
+          if (is_object($term_val)) {
+            // Case 1 - array of term objects keyed by tid
+            $term_id = $term_val->tid;
+          } else {
+            // Case 2 - single tid
+            $term_id = $term_val;
+          }
+          if ($term_id && in_array($term_id, $forum_terms)) {
+            $node->tid = $term_id;
+          }
+        }
+      }
+      elseif (is_object($node->taxonomy)) {
+        // Case 3 - single term object
+        $term = $node->taxonomy;
+        if ($term->tid && in_array($term->tid, $forum_terms)) {
+          $node->tid = $term->tid;
+        }
+      }
+      elseif (is_numeric($node->taxonomy)) {
+        // Case 4 - single numeric tid
+        if (in_array($node->taxonomy, $forum_terms)) {
+          $node->tid = $node->taxonomy;
         }
       }
       $old_tid = db_query_range("SELECT t.tid FROM {taxonomy_term_node} t INNER JOIN {node} n ON t.vid = n.vid WHERE n.nid = :nid ORDER BY t.vid DESC", array(':nid' => $node->nid), 0, 1)->fetchField();
