diff --git a/tests/VersioncontrolTokenTests.test b/tests/VersioncontrolTokenTests.test
new file mode 100644
index 0000000..075b167
--- /dev/null
+++ b/tests/VersioncontrolTokenTests.test
@@ -0,0 +1,142 @@
+<?php
+
+/**
+ * @file
+ * Tests ensuring proper behavior of the integration with Token.
+ */
+
+require_once drupal_get_path('module', 'versioncontrol') . '/tests/VersioncontrolTestCase.test';
+
+
+class VersioncontrolTokenTests extends VersioncontrolTestCase {
+
+  public static function getInfo() {
+    return array(
+      'name' => t('Token integration tests'),
+      'description' => t('Tests on Token integration.'),
+      'group' => t('Version Control API'),
+    );
+  }
+
+  function setUp() {
+    $this->useBackends = self::BACKENDS_ALL;
+    parent::setUp('token');
+  }
+  
+  function testVersioncontrolBackendTokens() {
+    $message = '[backend-name] [backend-type] [backend-description]';
+    
+    $object = $this->testBackend;
+    
+    $expected = $object->name .' '.
+                $object->type .' '.
+                $object->description;
+    
+    $render = token_replace_multiple($message, array('VersioncontrolBackend' => $object), '[', ']', array(), TRUE);
+    
+    $this->assertEqual($render, $expected);
+  }
+
+  function testVersioncontrolRepositoryTokens() {
+    $message = '[repository] [repository-id] [repository-name] [repository-vcs]';
+    
+    $object = $this->versioncontrolCreateRepository();
+    
+    $expected = l($object->name, $object->getUrlHandler()->getRepositoryViewUrl()) .' '.
+                $object->repo_id .' '.
+                $object->name .' '.
+                $object->vcs;
+    
+    $render = token_replace_multiple($message, array('VersioncontrolRepository' => $object), '[', ']', array(), TRUE);
+    
+    $this->assertEqual($render, $expected);
+  }
+  
+  function testVersioncontrolOperationTokens() {
+    $message = '[operation-id] [operation-repository] [operation-repository-id] [operation-repository-name] [operation-revision] [operation-message] [operation-author] [operation-author-name] [operation-author-uid] [operation-committer] [operation-committer-name] [operation-committer-uid]';
+    
+    $object = $this->versioncontrolCreateOperation();
+    
+    $expected = $object->vc_op_id .' '.
+                l($object->getRepository()->name, $object->getRepository()->getUrlHandler()->getRepositoryViewUrl()) .' '.
+                $object->getRepository()->repo_id .' '.
+                $object->getRepository()->name .' '.
+                $object->revision .' '.
+                $object->message .' '.
+                l($object->author, 'user/'. $object->author_uid) .' '.
+                $object->author .' '.
+                $object->author_uid .' '.
+                l($object->committer, 'user/'. $object->committer_uid) .' '.
+                $object->committer .' '.
+                $object->committer_uid;
+    
+    $render = token_replace_multiple($message, array('VersioncontrolOperation' => $object), '[', ']', array(), TRUE);
+    
+    $this->assertEqual($render, $expected);
+  }
+  
+  function testVersioncontrolBranchTokens() {
+    $message = '[branch-id] [branch-name] [branch-repository] [branch-repository-id] [branch-repository-name]';
+    
+    $object = $this->versioncontrolCreateLabel('branch');
+    
+    $expected = $object->label_id .' '.
+                $object->name .' '.
+                l($object->getRepository()->name, $object->getRepository()->getUrlHandler()->getRepositoryViewUrl()) .' '.
+                $object->getRepository()->repo_id .' '.
+                $object->getRepository()->name;
+    
+    $render = token_replace_multiple($message, array('VersioncontrolBranch' => $object), '[', ']', array(), TRUE);
+    
+    $this->assertEqual($render, $expected);
+  }
+  
+  function testVersioncontrolTagTokens() {
+    $message = '[tag-id] [tag-name] [tag-repository] [tag-repository-id] [tag-repository-name]';
+    
+    $object = $this->versioncontrolCreateLabel('tag');
+    
+    $expected = $object->label_id .' '.
+                $object->name .' '.
+                l($object->getRepository()->name, $object->getRepository()->getUrlHandler()->getRepositoryViewUrl()) .' '.
+                $object->getRepository()->repo_id .' '.
+                $object->getRepository()->name;
+    
+    $render = token_replace_multiple($message, array('VersioncontrolTag' => $object), '[', ']', array(), TRUE);
+    
+    $this->assertEqual($render, $expected);
+  }
+  
+  function testVersioncontrolItemTokens() {
+    $message = '[item-path]';
+    
+    $object = $this->versioncontrolCreateItem();
+    
+    $expected = $object->path;
+    
+    $render = token_replace_multiple($message, array('VersioncontrolItem' => $object), '[', ']', array(), TRUE);
+    
+    $this->assertEqual($render, $expected);
+  }
+  
+  function testVersioncontrolEventTokens() {
+    $message = '[event-id] [event-actor] [event-actor-name] [event-actor-uid] [event-repository] [event-repository-id] [event-repository-name]';
+    
+    $object = $this->versioncontrolCreateEvent();
+    
+    $actor = db_fetch_object(db_query("SELECT name, mail FROM {users} WHERE uid = %d", $object->uid));
+    
+    $expected = $object->elid .' '.
+                l($actor->name, 'user/'. $object->uid) .' '.
+                $actor->name .' '.
+                $object->uid .' '.
+                l($object->getRepository()->name, $object->getRepository()->getUrlHandler()->getRepositoryViewUrl()) .' '.
+                $object->getRepository()->repo_id .' '.
+                $object->getRepository()->name;
+    
+    $render = token_replace_multiple($message, array('VersioncontrolEvent' => $object), '[', ']', array(), TRUE);
+    
+    $this->assertEqual($render, $expected);
+  }
+  
+}
diff --git a/versioncontrol.module b/versioncontrol.module
index 5b5e97c..7fb625d 100644
--- a/versioncontrol.module
+++ b/versioncontrol.module
@@ -553,3 +553,176 @@ function versioncontrol_plugins_get_information() {
     ),
   );
 }
+
+/**
+ * Implementation of hook token_list.
+ */
+function versioncontrol_token_list($type = 'all') {
+  $tokens = array();
+  $all = ($type == 'all');
+
+  if ($all || $type == 'VersioncontrolBackend') {
+    $tokens['Versioncontrol Backend'] = array(
+      'backend-name' => t('The name of the backend'),
+      'backend-type' => t('The type of the backend'),
+      'backend-description' => t('The description of the backend'),
+    );
+  }
+
+  if ($all || $type == 'VersioncontrolRepository') {
+    $tokens['Versioncontrol Repository'] = array(
+      'repository' => t('Link to the repository'),
+      'repository-id' => t('The identifier of the repository'),
+      'repository-name' => t('The name of the repository'),
+      'repository-vcs' => t('The name of the version control system the repository belongs to'),
+    );
+  }
+
+  if ($all || $type == 'VersioncontrolOperation') {
+    $tokens['Versioncontrol Operation'] = array(
+      'operation-id' => t('The identifier of the operation'),
+      'operation-repository' => t('Link to the repository'),
+      'operation-repository-id' => t('The identifier of the repository'),
+      'operation-repository-name' => t('The name of the repository'),
+      'operation-revision' => t('The operation\'s revision identifier'),
+      'operation-message' => t('The log message for the operation'),
+      'operation-author' => t('Link to the user who performed the action'),
+      'operation-author-name' => t('The name of the user who performed the action'),
+      'operation-author-uid' => t('The user id of the user who performed the action'),
+      'operation-committer' => t('Link to the user who performed the commit'),
+      'operation-committer-name' => t('The name of the user who performed the commit'),
+      'operation-committer-uid' => t('The user id of the user who performed the commit'),
+    ) + token_get_date_token_info(t('The operation\'s author'), 'operation-author-')
+      + token_get_date_token_info(t('The operation\'s committer'), 'operation-committer-');
+  }
+
+  if ($all || $type == 'VersioncontrolBranch') {
+    $tokens['Versioncontrol Branch'] = array(
+      'branch-id' => t('The identifier of the branch'),
+      'branch-name' => t('The name of the branch'),
+      'branch-repository' => t('Link to the repository'),
+      'branch-repository-id' => t('The identifier of the repository'),
+      'branch-repository-name' => t('The name of the repository'),
+    );
+  }
+
+  if ($all || $type == 'VersioncontrolTag') {
+    $tokens['Versioncontrol Tag'] = array(
+      'tag-id' => t('The identifier of the tag'),
+      'tag-name' => t('The name of the tag'),
+      'tag-repository' => t('Link to the repository'),
+      'tag-repository-id' => t('The identifier of the repository'),
+      'tag-repository-name' => t('The name of the repository'),
+    );
+  }
+
+  if ($all || $type == 'VersioncontrolItem') {
+    $tokens['Versioncontrol Item'] = array(
+      'item-path' => t('The path of the item'),
+    );
+  }
+
+  if ($all || $type == 'VersioncontrolEvent') {
+    $tokens['Versioncontrol Event'] = array(
+      'event-id' => t('The identifier of the operation'),
+      'event-actor' => t('Link to the user that caused the event'),
+      'event-actor-name' => t('The name of the user that caused the event'),
+      'event-actor-uid' => t('The user id of the user that caused the event'),
+      'event-repository' => t('Link to the repository'),
+      'event-repository-id' => t('The identifier of the repository'),
+      'event-repository-name' => t('The name of the repository'),
+    ) + token_get_date_token_info(t('The event\'s'), 'event-');
+  }
+
+  return $tokens;
+}
+
+/**
+ * Implementation of hook_token_values().
+ */
+function versioncontrol_token_values($type, $object = NULL, $options = array()) {
+  $values = array();
+
+  if (empty($object)) {
+    return $values;
+  }
+
+  switch ($type) {
+    case 'VersioncontrolBackend':
+      $values = array(
+        'backend-name' => $object->name,
+        'backend-type' => $object->type,
+        'backend-description' => $object->description,
+      );
+
+      break;
+    case 'VersioncontrolRepository':
+      $values = array(
+        'repository' => l($object->name, $object->getUrlHandler()->getRepositoryViewUrl()),
+        'repository-id' => $object->repo_id,
+        'repository-name' => $object->name,
+        'repository-vcs' => $object->vcs,
+      );
+
+      break;
+    case 'VersioncontrolOperation':
+      $values = array(
+        'operation-id' => $object->vc_op_id,
+        'operation-repository' => l($object->getRepository()->name, $object->getRepository()->getUrlHandler()->getRepositoryViewUrl()),
+        'operation-repository-id' => $object->getRepository()->repo_id,
+        'operation-repository-name' => $object->getRepository()->name,
+        'operation-revision' => $object->revision,
+        'operation-message' => $object->message,
+        'operation-author' => l($object->author, 'user/'. $object->author_uid),
+        'operation-author-name' => $object->author,
+        'operation-author-uid' => $object->author_uid,
+        'operation-committer' => l($object->committer, 'user/'. $object->committer_uid),
+        'operation-committer-name' => $object->committer,
+        'operation-committer-uid' => $object->committer_uid,
+      ) + token_get_date_token_values($object->author_date, 'operation-author-')
+        + token_get_date_token_values($object->committer_date, 'operation-committer-');
+
+      break;
+    case 'VersioncontrolBranch':
+      $values = array(
+        'branch-id' => $object->label_id,
+        'branch-name' => $object->name,
+        'branch-repository' => l($object->getRepository()->name, $object->getRepository()->getUrlHandler()->getRepositoryViewUrl()),
+        'branch-repository-id' => $object->getRepository()->repo_id,
+        'branch-repository-name' => $object->getRepository()->name,
+      );
+
+      break;
+    case 'VersioncontrolTag':
+      $values = array(
+        'tag-id' => $object->label_id,
+        'tag-name' => $object->name,
+        'tag-repository' => l($object->getRepository()->name, $object->getRepository()->getUrlHandler()->getRepositoryViewUrl()),
+        'tag-repository-id' => $object->getRepository()->repo_id,
+        'tag-repository-name' => $object->getRepository()->name,
+      );
+
+      break;
+    case 'VersioncontrolItem':
+      $values = array(
+        'item-path' => $object->path,
+      );
+
+      break;
+    case 'VersioncontrolEvent':
+      $actor = db_fetch_object(db_query("SELECT name, mail FROM {users} WHERE uid = %d", $object->uid));
+
+      $values = array(
+        'event-id' => $object->elid,
+        'event-actor' => l($actor->name, 'user/'. $object->uid),
+        'event-actor-name' => $actor->name,
+        'event-actor-uid' => $object->uid,
+        'event-repository' => l($object->getRepository()->name, $object->getRepository()->getUrlHandler()->getRepositoryViewUrl()),
+        'event-repository-id' => $object->getRepository()->repo_id,
+        'event-repository-name' => $object->getRepository()->name,
+      ) + token_get_date_token_values($object->timestamp, 'event-');
+
+  }
+
+  return $values;
+}
