diff --git a/workflow.module b/workflow.module
index a5e12fd..c7bb59c 100644
--- a/workflow.module
+++ b/workflow.module
@@ -37,34 +37,79 @@ function workflow_permission() {
 }
 
 /**
- * Implements hook_menu().
- * 
- * @todo: add Workflow History Tab for every $entity_type, not only user, node, term.
+ * Implements hook_menu_alter().
+ *
+ * Set a '/workflow' menu item for each entity type.
  */
-function workflow_menu() {
+function workflow_menu_alter(&$items) {
+  // Basic menu item.
   $menu_item = array(
     'title' => 'Workflow',
-    'type' => MENU_LOCAL_TASK,
-    'file' => 'workflow.pages.inc',
     'page callback' => 'workflow_tab_page',
     'access callback' => 'workflow_tab_access',
+    'file' => 'workflow.pages.inc',
+    'file path' => drupal_get_path('module', 'workflow'),
     'weight' => 2,
+    'type' => MENU_LOCAL_TASK,
+    'module' => 'workflow',
   );
+ 
+  // Get a cross-bundle map of all fields so we can add the workflow tab to all
+  // entities with a workflow field.
+  foreach (field_info_field_map() as $info) {
+    if ($info['type'] == 'workflow') {
+      // Loop over the entity types that have this field.
+      foreach ($info['bundles'] as $type => $bundles) {
+        $info = entity_get_info($type);
+
+        // Add the workflow tab in the admin UI.
+        if (!empty($info['admin ui']['path'])) {
+          $entity_position = substr_count($info['admin ui']['path'], '/') + 2;
+          $wildcard = (isset($info['admin ui']['menu wildcard']) ? $info['admin ui']['menu wildcard'] : '%entity_object');
+          $items[$info['admin ui']['path'] . '/manage/' . $wildcard . '/workflow'] = $menu_item + array(
+              'page arguments' => array($type, $entity_position),
+              'access arguments' => array($type, $entity_position),
+              'load arguments' => array($type),
+            );
+        }
 
-  $items['node/%node/workflow'] = $menu_item + array(
-    'access arguments' => array('node', 1),
-    'page arguments' => array('node', 1),
-  );
-  $items['user/%user/workflow'] = $menu_item + array(
-    'access arguments' => array('user', 1),
-    'page arguments' => array('user', 1),
-  );
-  $items['taxonomy/term/%taxonomy_term/workflow'] = $menu_item + array(
-    'access arguments' => array('taxonomy_term', 2),
-    'page arguments' => array('taxonomy_term', 2),
-  );
-
-  return $items;
+        // We can only continue if the entity relies on a ENTITY_TYPE_load() load hook.
+        if ($info['load hook'] == $type . '_load') {
+          try {
+            foreach ($bundles as $bundle) {
+              // Get the default entity values.
+              $values = array($info['entity keys']['id'] => '%' . $type);
+              if ($info['entity keys']['bundle']) {
+                $values[$info['entity keys']['bundle']] = $bundle;
+              }
+
+              // Create a dummy entity and get the URI.
+              $entity = @entity_create($type, $values);
+              $uri = @$info['uri callback']($entity);
+              if (isset($uri['path'])) {
+                $uri = $uri['path'];
+
+                // Add the workflow tab if possible.
+                if (isset($items[$uri]) && !isset($items[$uri . '/workflow'])) {
+                  $entity_position = array_search('%' . $type, explode('/', $uri));
+
+                  if ($entity_position) {
+                    $items[$uri . '/workflow'] = $menu_item + array(
+                      'page arguments' => array($type, $entity_position),
+                      'access arguments' => array($type, $entity_position),
+                    );
+                  }
+                }
+              }
+            }
+          }
+          catch (Exception $ex) {
+            // The $type entity could not be created or the URI building failed.
+          }
+        }
+      }
+    }
+  }
 }
 
 /**
