diff --git a/flag.install b/flag.install
index fe3882d..7287d1e 100644
--- a/flag.install
+++ b/flag.install
@@ -660,6 +660,22 @@ function flag_update_6208() {
   return $ret;
 }
 
+/**
+ * Clean up orphaned flags due to node and comment deletion.
+ */
+function flag_update_6209() {
+  // Clean-up for nodes.
+  db_query("DELETE FROM {flag_content} WHERE content_type = 'node' AND NOT EXISTS (SELECT 1 FROM {node} n WHERE content_id = n.nid)");
+  db_query("DELETE FROM {flag_counts} WHERE content_type = 'node' AND NOT EXISTS (SELECT 1 FROM {node} n WHERE content_id = n.nid)");
+
+  // Clean-up for comments. Do not use module_exists() because comment module
+  // could be disabled.
+  if (db_table_exists('comment')) {
+    db_query("DELETE FROM {flag_content} WHERE content_type = 'comment' AND NOT EXISTS (SELECT 1 FROM {comment} c WHERE content_id = c.cid)");
+    db_query("DELETE FROM {flag_counts} WHERE content_type = 'comment' AND NOT EXISTS (SELECT 1 FROM {comment} c WHERE content_id = c.cid)");
+  }
+}
+
 // This is a replacement for update_sql(). The latter doesn't support placeholders.
 function _flag_update_sql($sql) {
   $args = func_get_args();
diff --git a/flag.module b/flag.module
index 7d79097..ee280fe 100644
--- a/flag.module
+++ b/flag.module
@@ -474,6 +474,14 @@ function flag_nodeapi(&$node, $op, $teaser = NULL, $page = NULL) {
         if (!$flag->i18n || empty($node->tnid)) {
           db_query("DELETE FROM {flag_content} WHERE fid = %d AND content_id = %d", $flag->fid, $node->nid);
           db_query("DELETE FROM {flag_counts} WHERE fid = %d AND content_id = %d", $flag->fid, $node->nid);
+
+          // Delete comments.
+          db_query("DELETE FROM {flag_content}
+                     WHERE content_type = 'comment'
+                       AND content_id IN(
+                    SELECT cid
+                      FROM {comments}
+                     WHERE nid = %d)", $node->nid);
         }
       }
       break;
@@ -977,6 +985,23 @@ function flag_users($users, $action, $flag_name) {
     flag($action, $flag_name, $uid);
   }
 }
+
+/**
+ * Implements hook_comment().
+ */
+function flag_comment(&$comment, $op) {
+  switch ($op) {
+    case 'delete':
+      db_query("DELETE FROM {flag_content}
+                 WHERE content_type = 'comment'
+                   AND content_id = %d", $comment->cid);
+
+      db_query("DELETE FROM {flag_counts}
+                 WHERE content_type = 'comment'
+                   AND content_id = %d", $comment->cid);
+      break;
+  }
+}
 
 /**
  * Implementation of hook_mail().
