diff --git a/sites/all/modules/similarterms/similarterms.info b/sites/all/modules/similarterms/similarterms.info
index e3e57e8..ed07009 100644
--- a/sites/all/modules/similarterms/similarterms.info
+++ b/sites/all/modules/similarterms/similarterms.info
@@ -1,6 +1,7 @@
 ; $Id: similarterms.info,v 1.1.2.1 2007/06/06 21:43:25 jjeff Exp $
 name = Similar By Terms
 description = "Display a block of other content that is similar by keywords (taxonomy terms)."
+dependencies = taxonomy
 
 ; Information added by drupal.org packaging script on 2008-07-19
 version = "5.x-1.9"
diff --git a/sites/all/modules/similarterms/similarterms.install b/sites/all/modules/similarterms/similarterms.install
new file mode 100644
index 0000000..06928ee
--- /dev/null
+++ b/sites/all/modules/similarterms/similarterms.install
@@ -0,0 +1,83 @@
+<?php
+// $Id$
+
+/**
+ * @file
+ * Similar By Terms install file
+ */
+
+/**
+ * Implementation of hook_install()
+ */
+function similarterms_install() {
+  switch ($GLOBALS['db_type']) {
+    case 'mysql':
+    case 'mysqli':
+      $result = db_query("CREATE TABLE IF NOT EXISTS {similarterms_override} (
+        nid INT(10) UNSIGNED NOT NULL DEFAULT '0',
+        path INT(10) UNSIGNED NOT NULL,
+        vid INT(10) UNSIGNED NOT NULL DEFAULT '0',
+        KEY (nid),
+        KEY (vid)
+      ) /*!40100 DEFAULT CHARACTER SET utf8 */;");
+      break;
+    case 'pgsql':
+      $result = db_query("CREATE TABLE {similarterms_override}
+        nid integer NOT NULL DEFAULT 0,
+        path integer NOT NULL,
+        vid integer NOT NULL DEFAULT 0,
+	KEY(nid),
+        KEY (vid)
+      ) /*!40100 DEFAULT CHARACTER SET utf8 */;");
+      break;
+  }
+
+  if (! $result) {
+    drupal_set_message(t('The table similar by terms was not installed properly. Please investigate.', 'error'));
+  }
+}
+
+/**
+ * Implementation of hook_uninstall()
+ */
+function similarterms_uninstall() {
+  switch ($GLOBALS['db_type']) {
+    case 'mysql':
+    case 'mysqli':
+      $deleted = db_query('DROP TABLE IF EXISTS {similarterms_override}');
+      break;
+    case 'pgsql':
+      $deleted = db_query('DROP TABLE {similarterms_override}');
+      break;
+  }
+}
+
+/**
+ * Implementation of hook_update()
+ */
+function similarterms_update_1() {
+  $return = array();
+  switch ($GLOBALS['db_type']) {
+    case 'mysql':
+    case 'mysqli':
+      $return[] = update_sql("CREATE TABLE IF NOT EXISTS {similarterms_override} (
+        nid INT(10) UNSIGNED NOT NULL DEFAULT '0',
+        path INT(10) UNSIGNED NOT NULL,
+        vid INT(10) UNSIGNED NOT NULL DEFAULT '0',
+        KEY (nid),
+	KEY(vid)
+      ) /*!40100 DEFAULT CHARACTER SET utf8 */;");
+      break;
+    case 'pgsql':
+      $return[] = update_sql("CREATE TABLE {similarterms_override}
+        nid integer NOT NULL DEFAULT 0,
+        path integer NOT NULL,
+        vid integer NOT NULL DEFAULT 0,
+	KEY(nid),
+	KEY(vid)
+      ) /*!40100 DEFAULT CHARACTER SET utf8 */;");
+      break;
+  }
+  
+  return $return;
+}
diff --git a/sites/all/modules/similarterms/similarterms.module b/sites/all/modules/similarterms/similarterms.module
index 9a71a74..fcfa40f 100644
--- a/sites/all/modules/similarterms/similarterms.module
+++ b/sites/all/modules/similarterms/similarterms.module
@@ -72,14 +72,34 @@ function similarterms_block($op = 'list', $delta = 0, $edit = array()) {
       variable_set('simterms_ignoreterms_'. $delta, $edit['ignoreterms']);
       return;
     case 'view':
+      $list = array();
+      if (arg(0) == 'node' && is_numeric(arg(1))) {
+        $nodes = array();
+        $nodes = similarterms_get_overrides(arg(1), $delta);
+        if ($nodes[$delta]) {
+          foreach ($nodes[$delta] as $nid) {
+            if (is_numeric($nid)) {
+              $list[] = node_load($nid);
+            }
+          }
+        }
+      }
+      if (sizeof($list) == 0) {
+        if ($delta == 0) {
+          $list = similarterms_list();
+        }
+        else {
+          $list = similarterms_list($delta);
+        }
+      }
       if ($delta == 0) {
         $block['subject'] = t('Similar');
-        $block['content'] = theme('similarterms', variable_get('similarterms_display_options', 'title_only'), similarterms_list());
+        $block['content'] = theme('similarterms', variable_get('similarterms_display_options', 'title_only'), $list);
       }
       else {
         $block['subject'] = t('Similar');
         // $delta = $vocid - integer - vocabulary id, leave out to use ALL terms for this node
-        $block['content'] = theme('similarterms', variable_get('similarterms_display_options', 'title_only'), similarterms_list($delta));
+        $block['content'] = theme('similarterms', variable_get('similarterms_display_options', 'title_only'), $list);
       }
       return $block;
   }
@@ -168,6 +188,86 @@ function similarterms_list($vocid = 0, $nid = NULL) {
 }
 
 /**
+ * Implementation of hook_form_alter().
+ */
+function similarterms_form_alter($form_id, &$form) {
+  if (isset($form['type']) && $form['type']['#value'] .'_node_form' == $form_id) {
+    // no need to alter form if block module is off
+    if (! module_exists('block')) {
+      return;
+    }
+    $blocks = similarterms_get_active_block_vocabularies();
+    // no need to alter form if no similarterms blocks are active
+    if (sizeof($blocks) == 0) {
+      return;
+    }
+    $overrides = array();
+    if (is_numeric($form['nid']['#value'])) {
+      $overrides = similarterms_get_overrides($form['nid']['#value']);
+    }
+    $form['similarterms'] = array(
+      '#type' => 'fieldset',
+      '#title' => t('Similar Terms'),
+      '#description' => t('Override the links generated by similar terms module.'),
+      '#collapsible' => 1,
+      '#collapsed' => sizeof($overrides) ? 0 : 1,
+    );
+    $node_type = $form['type']['#value'];
+    $no_similarterms = 1;
+    foreach (similarterms_taxonomy_get_vocabularies() as $v) {
+      if (! $blocks[$v->vid]) {
+        continue;
+      }
+      $types = variable_get('simterms_sametype_'. $v->vid, array());
+      if (! $types[$node_type] && ! isset($types[0])) {
+        continue;
+      }
+      $no_similarterms = 0;
+      $form['similarterms']['similarterms_vid_' . $v->vid] = array(
+        '#type' => 'fieldset',
+        '#title' => $v->name,
+        '#collapsible' => 1,
+        '#collapsed' => sizeof($overrides[$v->vid]) ? 0 : 1,
+        '#tree' => 1,
+      );
+      $form['similarterms']['similarterms_vid_' . $v->vid]['similarterms_override_orig'] = array(
+        '#type' => 'hidden',
+        '#default_value' => sizeof($overrides[$v->vid]) ? 1 : 0,
+      );
+      $form['similarterms']['similarterms_vid_' . $v->vid]['similarterms_override'] = array(
+        '#type' => 'checkbox',
+        '#title' => t('Override Similar Terms?'),
+        '#description' => t('If this option is checked, all paths are required. If it\'s unchecked, all paths will be deleted.'),
+        '#default_value' => sizeof($overrides[$v->vid]) ? 1 : 0,
+      );
+      $form['similarterms']['similarterms_vid_' . $v->vid]['similarterms_paths'] = array(
+        '#type' => 'fieldset',
+        '#title' => t('Paths'),
+        '#tree' => 1,
+      );
+      $count = variable_get('simterms_count_'. $v->vid, 5);
+      for ($i = 0; $i < $count; $i++) {
+        $default_value = '';
+        if ($overrides[$v->vid][$i]) {
+          $default_value = drupal_lookup_path('alias', 'node/' . $overrides[$v->vid][$i]);
+  	  if (! $default_value) {
+ 	    $default_value = 'node/' . $overrides[$v->vid][$i];
+  	  }
+        }
+        $form['similarterms']['similarterms_vid_' . $v->vid]['similarterms_paths'][$i] = array(
+          '#type' => 'textfield',
+          '#title' => t('Path %d', array('%d' => $i + 1)),
+          '#default_value' => $default_value ? $default_value : '',
+        );
+      }
+    }
+    if ($no_similarterms) {
+      unset($form['similarterms']);
+    }
+  }
+}
+
+/**
  * Implementation of hook_menu().
  */
 function similarterms_menu($may_cache) {
@@ -188,6 +288,24 @@ function similarterms_menu($may_cache) {
 }
 
 /**
+ * Implementation of hook_nodeapi().
+ */
+function similarterms_nodeapi($node, $op, $arg = 0) {
+  switch ($op) {
+    case 'delete':
+      similarterms_node_delete($node);
+      break;
+    case 'insert':
+    case 'update':
+      similarterms_node_save($node);
+      break;
+    case 'validate':
+      similarterms_node_validate($node);
+      break;
+  }
+}
+
+/**
  * Module settings page.
  */
 function similarterms_admin_settings() {
@@ -219,6 +337,135 @@ function similarterms_admin_settings() {
 }
 
 /**
+ * This function returns a list of all blocks for similarterms
+ *
+ * Note: I could not find a public function in the block module to do this
+ * so I wrote this function based on _block_rehash(). If there's a better 
+ * way to do this, this code should be refactored
+ */
+function similarterms_get_active_block_vocabularies() {
+  // TODO: add in code to check for blockcache module
+  global $theme_key;
+  init_theme();
+  $result = db_query("SELECT * FROM {blocks} WHERE theme = '%s' AND module = '%s'", $theme_key, 'similarterms');
+  while ($object = db_fetch_object($result)) {
+    if ($object->status) {
+      $blocks[$object->delta] = 1; 
+    }
+  }
+  return $blocks;
+}
+
+/**
+ * This function returns a list of overrides
+ */
+function similarterms_get_overrides($nid, $vid = NULL) {
+  $paths = array();
+  $query = "SELECT * FROM {similarterms_override} WHERE nid = %s";
+  $args = array($nid);
+  if ($vid) {
+    $query .= " AND vid = %s";
+    $args[] = $vid;
+  }
+  $result = db_query($query, $args);
+  while ($object = db_fetch_object($result)) {
+    $paths[$object->vid][] = $object->path;
+  }
+  return $paths;
+}
+
+/**
+ * Function to delete entries from overrides table when a node is deleted
+ */
+function similarterms_node_delete($node, $vid = NULL) {
+  $query = "DELETE FROM {similarterms_override} WHERE nid = %d";
+  $args = array($node->nid);
+  if ($vid) {
+    $query .= " AND vid = %d";
+    $args[] = $vid;
+  }
+  db_query($query, $args);
+}
+
+/**
+ * Function to populate overrides table 
+ */
+function similarterms_node_save($node) {
+  $result = array();
+  $query = "INSERT INTO {similarterms_override} (nid, path, vid) VALUES(%d, %d, %d)";
+  foreach (similarterms_taxonomy_get_vocabularies() as $v) {
+    $vid = 'similarterms_vid_' . $v->vid;
+    $alias =& $node->$vid;
+    if (! $alias['similarterms_override']) {
+      if ($alias['similarterms_override_orig']) {
+        similarterms_node_delete($node, $v->vid);
+      }
+      continue;
+    }
+    similarterms_node_delete($node, $v->vid);
+    foreach ($alias['similarterms_paths'] as $id => $path) {
+      $pieces = explode('/', $path);
+      if (sizeof($pieces) == 2 && $pieces[0] == "node" && is_numeric($pieces[1])) {
+        $nid = $pieces[1];
+      }
+      else {
+        $path = drupal_lookup_path('source', $path);
+        $pieces = explode('/', $path);
+        $nid = $pieces[1];
+      }
+      if ($nid) {
+        $args = array(
+        $node->nid,
+  	$nid,
+  	$v->vid
+        );
+        $result[$id] = db_query($query, $args);
+      }
+    }
+  }
+}
+
+/**
+ * Function to validate entries into the overrides table
+ */
+function similarterms_node_validate($node) {
+  foreach (similarterms_taxonomy_get_vocabularies() as $v) {
+    $vid = 'similarterms_vid_' . $v->vid;
+    $alias =& $node->$vid;
+    if (! $alias['similarterms_override']) {
+      continue;
+    }
+    // Make sure that the paths are valid
+    foreach ($alias['similarterms_paths'] as $id => $path) {
+      $pieces = explode('/', $path);
+      if (sizeof($pieces) == 2 && $pieces[0] == "node" && is_numeric($pieces[1])) {
+        // If there's a better way to check if a node exists, replace this code
+        $thisnode = node_load($pieces[1]);
+        if (! $thisnode->nid) {
+          form_set_error("$vid][similarterms_paths][$id", t('%path is not a valid path', array('%path' => $path)));
+        }
+      }
+      elseif ($path == '') {
+        form_set_error("$vid][similarterms_paths][$id", t('Please enter a value for %vocab Path %id.', array('%id' => $id, '%vocab' => $v->name)));
+      }
+      elseif (! drupal_lookup_path('source', $path)) {
+        form_set_error("$vid][similarterms_paths][$id", t('%vocab %path is not a valid path', array('%path' => $path, '%vocab' => $v->name)));
+      }
+    }
+  }
+}
+
+/**
+ * This function gets taxonomy vocabularies and add in 0 for "all vocabs";
+ */
+function similarterms_taxonomy_get_vocabularies() {
+  $object = taxonomy_get_vocabularies();
+  $object[0]->vid = 0;
+  $object[0]->name = t('Any Vocabulary');
+  return $object;
+}
+
+/**
  * Theme function for similar block
  *
  * Available variables:
