diff --git a/modules/tracker.views.inc b/modules/tracker.views.inc
new file mode 100644
index 0000000..ee14589
--- /dev/null
+++ b/modules/tracker.views.inc
@@ -0,0 +1,183 @@
+<?php
+
+/**
+ * @file
+ * Provide views data and handlers for tracker.module.
+ *
+ * @ingroup views_module_handlers
+ */
+/**
+ * Implementation of hook_views_data().
+ */
+function tracker_views_data() {
+  $data = array();
+
+  $data['tracker_node']['table']['group'] = t('Tracker');
+  $data['tracker_node']['table']['join'] = array(
+    'node' => array(
+      'type' => 'INNER',
+      'left_field' => 'nid',
+      'field' => 'nid',
+    ),
+  );
+  $data['tracker_node']['nid'] = array(
+    'title' => t('Nid'),
+    'help' => t('The node ID of the node.'),
+    'field' => array(
+      'handler' => 'views_handler_field_node',
+      'click sortable' => TRUE,
+    ),
+    'argument' => array(
+      'handler' => 'views_handler_argument_node_nid',
+      'name field' => 'title',
+      'numeric' => TRUE,
+      'validate type' => 'nid',
+    ),
+    'filter' => array(
+      'handler' => 'views_handler_filter_numeric',
+    ),
+    'sort' => array(
+      'handler' => 'views_handler_sort',
+    ),
+  );
+  $data['tracker_node']['changed'] = array(
+    'title' => t('Updated date'),
+    'help' => t('The date the node was last updated.'),
+    'field' => array(
+      'handler' => 'views_handler_field_date',
+      'click sortable' => TRUE,
+    ),
+    'sort' => array(
+      'handler' => 'views_handler_sort_date',
+    ),
+    'filter' => array(
+      'handler' => 'views_handler_filter_date',
+    ),
+  );
+  $data['tracker_node']['published'] = array(
+    'title' => t('Published'),
+    'help' => t('Whether or not the node is published.'),
+    'field' => array(
+      'handler' => 'views_handler_field_boolean',
+      'click sortable' => TRUE,
+    ),
+    'filter' => array(
+      'handler' => 'views_handler_filter_tracker_boolean_operator',
+      'label' => t('Published'),
+      'type' => 'yes-no',
+    ),
+    'sort' => array(
+      'handler' => 'views_handler_sort',
+    ),
+  );
+
+  $data['tracker_user']['table']['group'] = t('Tracker - User');
+  $data['tracker_user']['table']['join'] = array(
+    'node' => array(
+      'type' => 'INNER',
+      'left_field' => 'nid',
+      'field' => 'nid',
+    ),
+    'user' => array(
+      'type' => 'INNER',
+      'left_field' => 'uid',
+      'field' => 'uid',
+    ),
+  );
+  $data['tracker_user']['nid'] = array(
+    'title' => t('Nid'),
+    'help' => t('The node ID of the node a user created or commented on. You must use an argument or filter on UID or you will get misleading results using this field.'),
+    'field' => array(
+      'handler' => 'views_handler_field_node',
+      'click sortable' => TRUE,
+    ),
+    'argument' => array(
+      'handler' => 'views_handler_argument_node_nid',
+      'name field' => 'title',
+      'numeric' => TRUE,
+      'validate type' => 'nid',
+    ),
+    'filter' => array(
+      'handler' => 'views_handler_filter_numeric',
+    ),
+    'sort' => array(
+      'handler' => 'views_handler_sort',
+    ),
+  );
+  $data['tracker_user']['uid'] = array(
+    'title' => t('Uid'),
+    'help' => t('The user ID of a user who touched the node (either created or commented on it).'),
+    'field' => array(
+      'handler' => 'views_handler_field_user',
+      'click sortable' => TRUE,
+    ),
+    'argument' => array(
+      'handler' => 'views_handler_argument_user_uid',
+      'name field' => 'name',
+    ),
+    'filter' => array(
+      'title' => t('Name'),
+      'handler' => 'views_handler_filter_user_name',
+    ),
+    'sort' => array(
+      'handler' => 'views_handler_sort',
+    ),
+  );
+  $data['tracker_user']['changed'] = array(
+    'title' => t('Updated date'),
+    'help' => t('The date the node was last updated or commented on. You must use an argument or filter on UID or you will get misleading results using this field.'),
+    'field' => array(
+      'handler' => 'views_handler_field_date',
+      'click sortable' => TRUE,
+    ),
+    'sort' => array(
+      'handler' => 'views_handler_sort_date',
+    ),
+    'filter' => array(
+      'handler' => 'views_handler_filter_date',
+    ),
+  );
+  $data['tracker_user']['published'] = array(
+    'title' => t('Published'),
+    'help' => t('Whether or not the node is published. You must use an argument or filter on UID or you will get misleading results using this field.'),
+    'field' => array(
+      'handler' => 'views_handler_field_boolean',
+      'click sortable' => TRUE,
+    ),
+    'filter' => array(
+      'handler' => 'views_handler_filter_tracker_boolean_operator',
+      'label' => t('Published'),
+      'type' => 'yes-no',
+    ),
+    'sort' => array(
+      'handler' => 'views_handler_sort',
+    ),
+  );
+
+  return $data;
+}
+
+/**
+ * Implementation of hook_views_data_alter().
+ */
+function tracker_views_data_alter(&$data) {
+  // Provide additional uid_touch handlers which are handled by tracker
+  $data['node']['uid_touch_tracker'] = array(
+    'group' => t('Tracker - User'),
+    'title' => t('User posted or commented'),
+    'help' => t('Display nodes only if a user posted the node or commented on the node.'),
+    'argument' => array(
+      'field' => 'uid',
+      'name table' => 'users',
+      'name field' => 'name',
+      'handler' => 'views_handler_argument_tracker_comment_user_uid',
+      'no group by' => TRUE,
+    ),
+    'filter' => array(
+      'field' => 'uid',
+      'name table' => 'users',
+      'name field' => 'name',
+      'handler' => 'views_handler_filter_tracker_comment_user_uid'
+    ),
+  );
+}
diff --git a/modules/tracker/views_handler_argument_tracker_comment_user_uid.inc b/modules/tracker/views_handler_argument_tracker_comment_user_uid.inc
new file mode 100644
index 0000000..e614482
--- /dev/null
+++ b/modules/tracker/views_handler_argument_tracker_comment_user_uid.inc
@@ -0,0 +1,26 @@
+<?php
+
+/**
+ * @file
+ * Contains views_handler_argument_tracker_comment_user_uid
+ */
+
+/**
+ * UID argument to check for nodes that user posted or commented on.
+ *
+ * @ingroup views_argument_handlers
+ */
+class views_handler_argument_tracker_comment_user_uid extends views_handler_argument_comment_user_uid {
+
+  /**
+   * Overrides views_handler_argument_comment_user_uid::query().
+   */
+  function query($group_by = FALSE) {
+    // Because this handler thinks it's an argument for a field on the {node}
+    // table, we need to make sure {tracker_user} is JOINed and use its alias
+    // for the WHERE clause.
+    $tracker_user_alias = $this->query->ensure_table('tracker_user');
+    $this->query->add_where(0, "$tracker_user_alias.uid", $this->argument);
+  }
+
+}
diff --git a/modules/tracker/views_handler_filter_tracker_boolean_operator.inc b/modules/tracker/views_handler_filter_tracker_boolean_operator.inc
new file mode 100644
index 0000000..455e824
--- /dev/null
+++ b/modules/tracker/views_handler_filter_tracker_boolean_operator.inc
@@ -0,0 +1,31 @@
+<?php
+
+/**
+ * @file
+ * Contains views_handler_filter_tracker_boolean_operator
+ */
+
+  /**
+   * Filter handler for boolean values to use = 1 instead of <> 0.
+   */
+class views_handler_filter_tracker_boolean_operator extends views_handler_filter_boolean_operator {
+
+  /**
+   * Overrides views_handler_filter_boolean_operator::query().
+   */
+  function query() {
+    $this->ensure_my_table();
+    $where = "$this->table_alias.$this->real_field ";
+    if (empty($this->value)) {
+      $where .= '= 0';
+      if ($this->accept_null) {
+        $where = '(' . $where . " OR $this->table_alias.$this->real_field IS NULL)";
+      }
+    }
+    else {
+      $where .= '= 1';
+    }
+    $this->query->add_where_expression($this->options['group'], $where);
+  }
+
+}
diff --git a/modules/tracker/views_handler_filter_tracker_comment_user_uid.inc b/modules/tracker/views_handler_filter_tracker_comment_user_uid.inc
new file mode 100644
index 0000000..da6f65b
--- /dev/null
+++ b/modules/tracker/views_handler_filter_tracker_comment_user_uid.inc
@@ -0,0 +1,23 @@
+<?php
+/**
+ * @file
+ * Contains views_handler_filter_tracker_comment_user_uid
+ */
+
+/**
+ * UID filter to check for nodes that user posted or commented on.
+ */
+class views_handler_filter_tracker_comment_user_uid extends views_handler_filter_comment_user_uid {
+
+  /**
+   * Overrides views_handler_filter_comment_user_uid::query()
+   */
+  function query() {
+    // Because this handler thinks it's an argument for a field on the {node}
+    // table, we need to make sure {tracker_user} is JOINed and use its alias
+    // for the WHERE clause.
+    $tracker_user_alias = $this->query->ensure_table('tracker_user');
+    $this->query->add_where(0, "$tracker_user_alias.uid", $this->value);
+  }
+
+}
diff --git a/views.info b/views.info
index 5802e22..7521d82 100644
--- a/views.info
+++ b/views.info
@@ -171,6 +171,9 @@ files[] = modules/taxonomy/views_handler_filter_vocabulary_machine_name.inc
 files[] = modules/taxonomy/views_handler_relationship_node_term_data.inc
 files[] = modules/taxonomy/views_plugin_argument_validate_taxonomy_term.inc
 files[] = modules/taxonomy/views_plugin_argument_default_taxonomy_tid.inc
+files[] = modules/tracker/views_handler_argument_tracker_comment_user_uid.inc
+files[] = modules/tracker/views_handler_filter_tracker_comment_user_uid.inc
+files[] = modules/tracker/views_handler_filter_tracker_boolean_operator.inc
 files[] = modules/system/views_handler_filter_system_type.inc
 files[] = modules/translation/views_handler_argument_node_tnid.inc
 files[] = modules/translation/views_handler_field_node_link_translate.inc
diff --git a/views.module b/views.module
index 68953e5..b4a37e4 100644
--- a/views.module
+++ b/views.module
@@ -2511,6 +2511,10 @@ if (!function_exists('system_views_api')) {
   function system_views_api() { return views_views_api(); }
 }
 
+if (!function_exists('tracker_views_api')) {
+  function tracker_views_api() { return views_views_api(); }
+}
+
 if (!function_exists('taxonomy_views_api')) {
   function taxonomy_views_api() { return views_views_api(); }
 }
