diff --git a/talk.install b/talk.install
index c89ef81..81bd837 100644
--- a/talk.install
+++ b/talk.install
@@ -11,6 +11,7 @@
  */
 function talk_uninstall() {
   variable_del('talk_title');
+  drupal_uninstall_schema('talk');
   $result = db_query("DELETE FROM {variable} WHERE name LIKE 'comment_talk_%%'");
   cache_clear_all('variables', 'cache');
 }
@@ -26,4 +27,72 @@ function talk_update_1() {
   variable_del('talk_title');
 
   return array(array('success' => TRUE, 'query' => 'Your Talk module settings have been updated automatically to support customizable strings. You may want to configure them further at Administer > Site configuration > Talk page.'));
+}
+
+function talk_update_2() {
+  $schema['talk_history'] = array(
+    'description' => 'A record of which {users} have read which {node}s.',
+    'fields' => array(
+      'uid' => array(
+        'description' => 'The {users}.uid that read the {node} nid.',
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0),
+      'nid' => array(
+        'description' => 'The {node}.nid that was read.',
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0),
+      'timestamp' => array(
+        'description' => 'The Unix timestamp at which the read occurred.',
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0)
+      ),
+    'primary key' => array('uid', 'nid'),
+    'indexes' => array(
+      'nid' => array('nid'),
+    ),
+  );
+  $ret = array();
+  db_create_table($ret, 'talk_history', $schema['talk_history']);
+  return $ret;
+}
+
+/**
+ * Implementation of hook_install().
+ */
+function talk_install() {
+  drupal_install_schema('talk');
+}
+
+/**
+ * Implementation of hook_schema().
+ */
+function talk_schema() {
+  $schema['talk_history'] = array(
+    'description' => 'A record of which {users} have read which {node}s.',
+    'fields' => array(
+      'uid' => array(
+        'description' => 'The {users}.uid that read the {node} nid.',
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0),
+      'nid' => array(
+        'description' => 'The {node}.nid that was read.',
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0),
+      'timestamp' => array(
+        'description' => 'The Unix timestamp at which the read occurred.',
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0)
+      ),
+    'primary key' => array('uid', 'nid'),
+    'indexes' => array(
+      'nid' => array('nid'),
+    ),
+  );
+  return $schema;
 }
\ No newline at end of file
diff --git a/talk.module b/talk.module
index a9b9a5d..1c15a0a 100644
--- a/talk.module
+++ b/talk.module
@@ -18,6 +18,42 @@ function talk_help($path, $arg) {
 }
 
 /**
+ * Implementation of hook_exit().
+ */
+function talk_exit() {
+  global $user;
+  if ($user->uid) {
+    $menu = menu_get_item();
+    if (($menu['path'] == 'node/%/talk') && ($node = $menu['map'][1]) && (talk_activated($node->type))) {
+      talk_set_history($node->nid);
+    }
+    else if (($menu['path'] == 'node/%') && ($node = $menu['map'][1]) && (!talk_activated($node->type))) {
+      talk_set_history($node->nid);
+    }
+  }
+}
+
+function talk_set_history($nid) {
+  global $user;
+  if ($user->uid) {
+    if (db_result(db_query("SELECT COUNT(*) FROM {talk_history} WHERE uid = %d AND nid = %d", $user->uid, $nid)) == 0) {
+      db_query('INSERT INTO {talk_history} (uid, nid, timestamp) VALUES (%d, %d, %d)', $user->uid, $nid, time());
+    }
+    else {
+      db_query('UPDATE {talk_history} SET timestamp = %d WHERE uid = %d AND nid = %d', time(), $user->uid, $nid);
+    }
+  }
+}
+
+function talk_get_last_access($nid) {
+  global $user;
+  if ($user->uid) {
+    return db_result(db_query("SELECT timestamp FROM {talk_history} WHERE uid = %d AND nid = %d", $user->uid, $nid));
+  }
+  return 0;
+}
+
+/**
  * Implementation of hook_menu().
  */
 function talk_menu() {
@@ -270,6 +306,11 @@ function template_preprocess_talkpage(&$variables) {
   $variables['comments'] = $comments;
 }
 
+function talk_preprocess_comment(&$variables) {
+  $comment = $variables['comment'];
+  $variables['new'] = ($comment->timestamp > talk_get_last_access($comment->nid)) ? t('new') : '';
+}
+
 /**
  * Implementation of hook_token_list(). Documents the individual
  * tokens handled by the module.
