diff -rub similarterms.orig/similarterms.admin.inc similarterms/similarterms.admin.inc
--- similarterms.orig/similarterms.admin.inc	2009-01-26 01:46:55.000000000 +0000
+++ similarterms/similarterms.admin.inc	2009-07-31 16:46:14.000000000 +0100
@@ -48,6 +48,27 @@
     '#prefix' => '<div>',
     '#suffix' => '</div>',
   );
+  $similarterms_blocks = variable_get('similarterms_blocks',array());
+  $form['similarterms_blocks'] = array(
+    '#tree' => TRUE,
+    '#type' => 'fieldset',
+    '#collapsible' => TRUE,
+    '#collapsed' => TRUE,
+    '#title' => t('Additional block configuration'),
+  );
+
+  $vocabs = taxonomy_get_vocabularies();
+  $any = array('vid' => 0, 'name' => t('ANY'));
+  array_unshift($vocabs, (object)$any);
+  foreach ($vocabs as $v) {
+    $form['similarterms_blocks'][$v->vid] = array(
+      '#type' => 'textfield',
+      '#title' => t('Number of blocks for the @vocab vocabulary', array('@vocab' => $v->name)),
+      '#size' => 3,
+      '#default_value' => isset($similarterms_blocks[$v->vid])?$similarterms_blocks[$v->vid]:1,
+      '#description' => t('The number of blocks to offer in the block configuration for this vocabulary'),
+    );
+  }
 
   $cache_options = drupal_map_assoc(array(0, 300, 600, 900, 1800, 3600, 7200, 21600, 43200, 86400, 604800, 1209600, 2419200, 4838400, 9676800, 31536000),  'format_interval');
   $cache_options[0] = t('Never');
diff -rub similarterms.orig/similarterms.module similarterms/similarterms.module
--- similarterms.orig/similarterms.module	2009-01-26 22:15:01.000000000 +0000
+++ similarterms/similarterms.module	2009-07-31 16:46:10.000000000 +0100
@@ -1,6 +1,8 @@
 <?php
 // $Id: similarterms.module,v 1.23 2009/01/26 22:15:01 rmiddle Exp $
 // by Jeff Robbins
+// 2009/08 miiimooo - multiple blocks for each vocabulary (number is configurable)
+//                  - added other than current content type option
 
 /**
  * @file
@@ -39,20 +41,31 @@
  */
 function similarterms_block($op = 'list', $delta = 0, $edit = array()) {
   if ($op == 'list') {
-    $blocks[0]['info'] = t('Similar entries from ANY vocabulary.');
-    $blocks[0]['cache'] = BLOCK_CACHE_PER_PAGE;
+    $similarterms_blocks = variable_get('similarterms_blocks',array());
+    $num = isset($similarterms_blocks[0])?$similarterms_blocks[0] : 1;
+    for($i=1;$i<=$num;$i++) {
+      $blocks['0_'.$i]['info'] = t('Similar entries from the ANY vocabulary. @count', array('@vocab' => $v->name,'@count' => ($num>1?'#'.$i:'')));
+      $blocks['0_'.$i]['cache'] = BLOCK_CACHE_PER_PAGE;
+    }
     if (variable_get("similarterms_vocabularies", 'multi_select_and_tags') == 'all') {
       foreach (taxonomy_get_vocabularies() as $v) {
-        $blocks[$v->vid]['info'] = t('Similar entries from the @vocab vocabulary.', array('@vocab' => $v->name));
-        $blocks[$v->vid]['cache'] = BLOCK_CACHE_PER_PAGE;
+        $num = isset($similarterms_blocks[$v->vid])?$similarterms_blocks[$v->vid] : 1;
+        for($i=1;$i<=$num;$i++) {
+          $blocks[$v->vid.'_'.$i]['info'] = t('Similar entries from the @vocab vocabulary. @count', array('@vocab' => $v->name,'@count' => ($num>1?'#'.$i:'')));
+          $blocks[$v->vid.'_'.$i]['cache'] = BLOCK_CACHE_PER_PAGE;
+        }
+
       }
     }
     else {
       foreach (taxonomy_get_vocabularies() as $v) {
         // this only makes sense for multi-select vocabularies and free tagging
         if ($v->multiple || $v->tags) {
-          $blocks[$v->vid]['info'] = t('Similar entries from the @vocab vocabulary.', array('@vocab' => $v->name));
-          $blocks[$v->vid]['cache'] = BLOCK_CACHE_PER_PAGE;
+          $num = isset($similarterms_blocks[$v->vid])?$similarterms_blocks[$v->vid] : 1;
+          for($i=1;$i<=$num;$i++) {
+            $blocks[$v->vid.'_'.$i]['info'] = t('Similar entries from the @vocab vocabulary. @count', array('@vocab' => $v->name,'@count' => ($num>1?'#'.$i:'')));
+            $blocks[$v->vid.'_'.$i]['cache'] = BLOCK_CACHE_PER_PAGE;
+          }
         }
       }
     }
@@ -70,11 +83,12 @@
     $form['showcurrentnode'] = array(
       '#type' => 'checkbox',
       '#title' => t('Show current node as active in the list'),
-      '#default_value' => variable_get('similarterms_showcurrentnode_'. $delta, FALSE),
+      '#default_value' => variable_get('similarterms_showcurrentnode_'. $delta , FALSE),
       '#required' => FALSE,
     );
     //mimo addition to configuration to limit to same page type
-    $types = array('0' => t('<none>'), '1' => t('same as current'));
+    $types = array( '0' => t('<none>'), '1' => t('same as current'),
+      '2' => t('other than current') );
     $arr_types_obj = node_get_types();
     foreach ($arr_types_obj as $type => $obj) {
       $types[$type] = $obj->name;
@@ -103,21 +117,21 @@
       );
     }
     return $form;
-  }
-  else if ($op == 'save') {
+  }  else if ($op == 'save') {
     variable_set('simterms_count_'. $delta, $edit['count']);
     variable_set('simterms_sametype_'. $delta, $edit['sametype']);
     variable_set('simterms_ignoreterms_'. $delta, $edit['ignoreterms']);
     variable_set('similarterms_showcurrentnode_'. $delta, $edit['showcurrentnode']);
-  }
-  else if ($op == 'view') {
-    if ($delta == 0) {
+  } else if ($op == 'view') {
+    if ($delta === 0) {
       $block['subject'] = t('Similar');
       $block['content'] = theme('similarterms', variable_get('similarterms_display_options', 'title_only'), similarterms_list());
+    } else {
+      if(strpos($delta,'_') !== FALSE) {
+        list($vid,$num) = explode('_',$delta);
     }
-    else {
       $block['subject'] = t('Similar');
-      $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'), similarterms_list($delta, $vid));
     }
     return $block;
   }
@@ -133,7 +147,7 @@
  * @return
  *   an array of node objects
  */
-function similarterms_list($vocid = 0, $nid = NULL) {
+function similarterms_list($delta=0, $vocid = NULL, $nid = NULL, $count = 5) {
   $nodes = array();
   $sql = "";
   $args = array();
@@ -144,7 +158,7 @@
   }
 
   if ($nid != NULL) {
-    $cid = "$vocid:$nid";
+    $cid = "$delta:$vocid:$nid";
     if ($cache_lifetime) {
       if ($cached = cache_get($cid, 'cache_similarterms')) {
         return $cached->data;
@@ -158,9 +172,8 @@
     else {
       $terms = array_keys(taxonomy_node_get_terms_by_vocabulary($node_obj, $vocid));
     }
-
     // Filter out some terms
-    $terms_filter = variable_get('simterms_ignoreterms_'. $vocid, array());
+    $terms_filter = variable_get('simterms_ignoreterms_'. $delta, array());
 
     foreach ($terms_filter as $v) {
       $idx = array_search($v, $terms);
@@ -169,7 +182,7 @@
       }
     }
 
-    $count = variable_get('simterms_count_'. $vocid, 5);
+    $count = variable_get('simterms_count_' . $delta, 5);
 
     if (!empty($terms)) {
       //past events
@@ -193,13 +206,16 @@
       }
       $sql .= ') ';
 
-      $types = variable_get('simterms_sametype_'. $vocid, FALSE);
+      $types = variable_get('simterms_sametype_'. $delta, FALSE);
       if (($types !== FALSE) && is_array($types) && count($types) > 0 && ($types['0'] == NULL) ) {
-        if ($types[1]) {
+        if ($types[1] || $types[2]) {
           $node_obj = node_load($nid);
           $types[1] = $node_obj->type;
+          if ($types[2] == 2) { // not in
+            $not = " NOT ";
         }
-        $sql .= 'AND n.type IN (';
+        }
+        $sql .= 'AND n.type ' . $not . ' IN (';
         $number_of_types = count($types);
         foreach ($types as $types_items) {
           $number_of_types--;
@@ -213,9 +229,8 @@
         }
         $sql .= ') ';
       }
-
       //if showcurrentnode option is false (default state), create filter for query.
-      if (!variable_get('similarterms_showcurrentnode_'. $vocid, FALSE)) {
+      if (!variable_get('similarterms_showcurrentnode_'. $delta, FALSE)) {
         $sql .= 'AND n.nid != %d ';
         $args[] = $nid;
       }
