diff -rupN excerpt/excerpt.install excerpt_new/excerpt.install
--- excerpt/excerpt.install	2008-03-20 12:04:08.000000000 +1100
+++ excerpt.install	2010-03-30 14:30:47.000000000 +1100
@@ -2,12 +2,37 @@
 /* $Id: excerpt.install,v 1.2.2.5 2008/03/20 01:04:08 smk Exp $ */
 
 /**
+ * Implementation of hook_install().
+ */
+function excerpt_install() {
+  switch ($GLOBALS['db_type']) {
+    case 'mysql':
+    case 'mysqli':
+      db_query("CREATE TABLE {excerpt} (
+        nid int unsigned NOT NULL,
+        vid int unsigned NOT NULL,
+        format int unsigned default 1,
+        PRIMARY KEY (vid),
+        KEY nid (nid)
+      ) /*!40100 DEFAULT CHARACTER SET utf8 */");
+      break;
+
+    case 'pgsql':
+      break;
+  }
+
+  db_query("UPDATE {system} SET weight = -10 WHERE name = 'excerpt'");
+}
+
+/**
  * Implementation of hook_uninstall().
  */
 function excerpt_uninstall() {
   // Delete all the excerpt variables and clear the variable cache.
   db_query("DELETE FROM {variable} WHERE name LIKE 'excerpt_%'");
   cache_clear_all('variables', 'cache');
+
+  db_query('DROP TABLE {excerpt}');
 }
 
 /**
@@ -40,3 +65,30 @@ function excerpt_update_5000() {
 /**
  * @} End of "defgroup updates-4.7-to-5.0"
  */
+
+/**
+ * Implementation of hook_update_N().
+ */
+function excerpt_update_5101() {
+  $ret = array();
+
+  switch ($GLOBALS['db_type']) {
+    case 'mysql':
+    case 'mysqli':
+      $ret[] = update_sql("CREATE TABLE {excerpt} (
+        nid int unsigned NOT NULL,
+        vid int unsigned NOT NULL,
+        format int unsigned default 0,
+        PRIMARY KEY (vid),
+        KEY nid (nid)
+      ) /*!40100 DEFAULT CHARACTER SET utf8 */");
+      break;
+
+    case 'pgsql':
+      break;
+  }
+
+  $ret[] = update_sql("UPDATE {system} SET weight = -10 WHERE name = 'excerpt'");
+
+  return $ret;
+}
diff -rupN excerpt/excerpt.module excerpt_new/excerpt.module
--- excerpt/excerpt.module	2009-04-04 15:05:03.000000000 +1100
+++ excerpt.module	2010-03-30 14:31:14.000000000 +1100
@@ -28,10 +28,43 @@ function excerpt_nodeapi(&$node, $op, $a
         // shown. With excerpts however, teasers can be even longer than the
         // body field, which is why we need to overwrite that property with our
         // own condition.
-        return array('excerpt' => (bool)strcmp($node->teaser, $node->body));
+        $excerpt = db_fetch_object(db_query("SELECT * FROM {excerpt} WHERE nid = %d AND vid = %d", $node->nid, $node->vid));
+        return array(
+          'excerpt' => (bool)strcmp($node->teaser, $node->body),
+          'teaser_format' => isset($excerpt->format) ? $excerpt->format : 1,
+        );
+
+      case 'delete revision':
+        db_query("DELETE FROM {excerpt} WHERE nid = %d and vid = %d", $node->nid, $node->vid);
+        break;
+
+      case 'delete':
+        db_query("DELETE FROM {excerpt} WHERE nid = %d", $node->nid);
+        break;
+
+      case 'update':
+        // Existing nodes may not have an excerpt information stored,
+        // Check to see if we need to update one or create a new one.
+        db_query("UPDATE {excerpt} SET format = %d WHERE nid = %d AND vid = %d", $node->teaser_format, $node->nid, $node->vid);
+        if (!db_affected_rows()) {
+          db_query("INSERT INTO {excerpt} (nid, vid, format) VALUES (%d, %d, %d)", $node->nid, $node->vid, $node->teaser_format);
+        }
+        break;
+
+      case 'insert':
+        db_query("INSERT INTO {excerpt} (nid, vid, format) VALUES (%d, %d, %d)", $node->nid, $node->vid, $node->teaser_format);
+        break;
 
       case 'view':
         $node->readmore = $node->excerpt;
+        // Because node_prepare overrides our selected format with the format of the body field we must recreate it
+        // This is a bit of a hack but because our module weight is -10 it should happen before other modules act on it
+        $node->teaser = db_result(db_query('SELECT teaser FROM {node_revisions} WHERE nid = %d and vid = %d', $node->nid, $node->vid));
+        if (trim($node->teaser) == '') {
+          $node->teaser = isset($node->body) ? node_teaser($node->body, isset($node->format) ? $node->format : NULL) : '';
+        }
+        $node->teaser = check_markup($node->teaser, $node->teaser_format, FALSE);
+        $node->content['body']['#value'] = $a3 ? $node->teaser : $node->body;
         break;
     }
   }
@@ -62,14 +95,18 @@ function excerpt_form_alter($form_id, &$
   }
   else if (isset($form['type']) && $form['type']['#value'] .'_node_form' == $form_id && variable_get('excerpt_'. $form['type']['#value'], 1)) {
     $form['#node']->teaser == node_teaser($form['#node']->body) ? $default = '' : $default = $form['#node']->teaser;
-    $form['teaser'] = array(
+    $form['teaser_field'] = array(
+      '#weight' => variable_get('excerpt_wt_'. $form['type']['#value'], 0),
+    );
+
+    $form['teaser_field']['teaser'] = array(
       '#type' => 'textarea',
       '#title' => t('Teaser'),
       '#default_value' => $default,
       '#cols' => 60,
       '#rows' => 6,
-      '#weight' => variable_get('excerpt_wt_'. $form['type']['#value'], 0),
       '#description' => t('Enter an excerpt for this item. It will be shown on listing pages along with a <em>read more</em> link which leads to the full view. Leave empty to auto-generate one from the body.'),
     );
+    $form['teaser_field']['format'] = filter_form($form['#node']->teaser_format, 1, array('teaser_format'));
   }
 }
