diff --git a/advancedqueue.module b/advancedqueue.module
index 3046308..c588d54 100644
--- a/advancedqueue.module
+++ b/advancedqueue.module
@@ -340,3 +340,44 @@ function _advancedqueue_release_stale_items() {
     $queue->releaseItem($item);
   }
 }
+
+/**
+ * Removes tags that are no longer related to an item.
+ */
+function _advancedqueue_purge_tags() {
+  $toDelete = db_select('advancedqueue', 'q');
+  $toDelete->addField('q', 'item_id');
+
+  // Delete all rows that have no valid advancedqueue item.
+  db_delete('advancedqueue_tags')
+    ->condition('item_id', $toDelete, 'NOT IN')
+    ->execute();
+}
+
+/**
+ * Determine if a tag has pending items in the queue.
+ *
+ * @param $tag
+ *   Tag name.
+ * @param optional $name
+ *   Queue name.
+ *
+ * @return bool
+ *   TRUE if there are items having this tag, FALSE otherwise.
+ */
+function advancedqueue_tag_has_items($tag, $name = NULL) {
+  $query = db_select('advancedqueue_tags', 'qt');
+  $query->join('advancedqueue', 'q', 'qt.item_id = q.item_id');
+
+  if (isset($name)) {
+    $query->condition('q.name', $name);
+  }
+
+  $result = $query->condition('qt.tag', $tag)
+    ->condition('q.status', array(ADVANCEDQUEUE_STATUS_QUEUED, ADVANCEDQUEUE_STATUS_PROCESSING, ADVANCEDQUEUE_STATUS_FAILURE_RETRY))
+    ->countQuery()
+    ->execute()
+    ->fetchField();
+
+  return (bool) $result;
+}
diff --git a/advancedqueue.queue.inc b/advancedqueue.queue.inc
index 559999d..bcc6577 100644
--- a/advancedqueue.queue.inc
+++ b/advancedqueue.queue.inc
@@ -31,7 +31,26 @@ class AdvancedQueue implements DrupalReliableQueueInterface {
         'created' => time(),
         'status' => ADVANCEDQUEUE_STATUS_QUEUED,
       ));
-    return (bool) $query->execute();
+    $item_id = $query->execute();
+
+    $tags = is_array($data) && isset($data['advancedqueue_tags']) ? $data['advancedqueue_tags'] : array();
+
+    // Adding tags to items if necessary.
+    if ($item_id && $tags) {
+      $tagging = db_insert('advancedqueue_tags')
+        ->fields(array('item_id', 'tag'));
+
+      foreach ($tags as $tag) {
+        $tagging->values(array(
+          'item_id' => $item_id,
+          'tag' => $tag,
+        ));
+      }
+
+      $tagging->execute();
+   }
+
+    return (bool) $item_id;
   }
 
   public function numberOfItems() {
@@ -123,5 +142,7 @@ class AdvancedQueue implements DrupalReliableQueueInterface {
     db_delete('advancedqueue')
       ->condition('name', $this->name)
       ->execute();
+
+    _advancedqueue_purge_tags();
   }
 }
