diff --git a/tests/VersioncontrolTokenTests.test b/tests/VersioncontrolTokenTests.test
new file mode 100644
index 0000000..4432a61
--- /dev/null
+++ b/tests/VersioncontrolTokenTests.test
@@ -0,0 +1,123 @@
+<?php
+/**
+ * @file
+ *   Tests ensuring proper behavior of the integration with Token.
+ *
+ *   @todo test when sanitized option is passed
+ *   @todo test chained tokens
+ */
+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();
+  }
+
+  function testVersioncontrolBackendTokens() {
+    $object = $this->testBackend;
+    $tokens = array(
+      '[VersioncontrolBackend:name]' => $object->name,
+      '[VersioncontrolBackend:type]' => $object->type,
+      '[VersioncontrolBackend:description]' => $object->description,
+    );
+    // Test to make sure that we generated something for each token.
+    $this->assertFalse(in_array(0, array_map('strlen', $tokens)), t('No empty tokens generated.'));
+    foreach ($tokens as $name => $value) {
+      $render = token_replace($name, array('VersioncontrolBackend' => $object));
+      $this->assertEqual($render, $value);
+    }
+  }
+
+  function testVersioncontrolRepositoryTokens() {
+    $object = $this->versioncontrolCreateRepository();
+    $viewer_url = l($object->name, $object->getUrlHandler()->getRepositoryViewUrl());
+    $tokens = array(
+      '[VersioncontrolRepository:id]' => $object->repo_id,
+      '[VersioncontrolRepository:name]' => $object->name,
+      '[VersioncontrolRepository:vcs]' => $object->vcs,
+      '[VersioncontrolRepository:viewer]' => $viewer_url,
+    );
+    // Test to make sure that we generated something for each token.
+    $this->assertFalse(in_array(0, array_map('strlen', $tokens)), t('No empty tokens generated.'));
+    foreach ($tokens as $name => $value) {
+      $render = token_replace($name, array('VersioncontrolRepository' => $object));
+      $this->assertEqual($render, $value);
+    }
+  }
+
+  function testVersioncontrolOperationTokens() {
+    $object = $this->versioncontrolCreateOperation();
+    $tokens = array(
+      '[VersioncontrolOperation:id]' => $object->vc_op_id,
+      '[VersioncontrolOperation:revision]' => $object->revision,
+      '[VersioncontrolOperation:author_date]' => format_date($object->author_date, 'medium', '', NULL, $language_code),
+      '[VersioncontrolOperation:committer_date]' => format_date($object->committer_date, 'medium', '', NULL, $language_code),
+      '[VersioncontrolOperation:author]' => $object->author,
+      '[VersioncontrolOperation:committer]' => $object->committer,
+      '[VersioncontrolOperation:message]' => $object->message,
+    );
+    // Test to make sure that we generated something for each token.
+    $this->assertFalse(in_array(0, array_map('strlen', $tokens)), t('No empty tokens generated.'));
+    foreach ($tokens as $name => $value) {
+      $render = token_replace($name, array('VersioncontrolOperation' => $object));
+      $this->assertEqual($render, $value);
+    }
+  }
+
+  //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($message, array('VersioncontrolBranch' => $object));
+    //$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($message, array('VersioncontrolTag' => $object));
+    //$this->assertEqual($render, $expected);
+  //}
+
+  //function testVersioncontrolItemTokens() {
+    //$message = '[item-path]';
+    //$object = $this->versioncontrolCreateItem();
+    //$expected = $object->path;
+    //$render = token_replace($message, array('VersioncontrolItem' => $object));
+    //$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($message, array('VersioncontrolEvent' => $object));
+    //$this->assertEqual($render, $expected);
+  //}
+}
diff --git a/versioncontrol.info b/versioncontrol.info
index 204150c..cce963f 100644
--- a/versioncontrol.info
+++ b/versioncontrol.info
@@ -52,3 +52,4 @@ files[] = tests/VersioncontrolRepositoryManagementTestCase.test
 files[] = tests/VersioncontrolRepositoryUnitTestingTestCase.test
 files[] = tests/VersioncontrolTagUnitTestingTestCase.test
 files[] = tests/VersioncontrolTestCase.test
+files[] = tests/VersioncontrolTokenTests.test
diff --git a/versioncontrol.tokens.inc b/versioncontrol.tokens.inc
new file mode 100644
index 0000000..01194db
--- /dev/null
+++ b/versioncontrol.tokens.inc
@@ -0,0 +1,252 @@
+<?php
+/**
+ * @file
+ *   Token integration.
+ */
+
+/**
+ * Implements hook_token_info().
+ */
+function versioncontrol_token_info() {
+  $info = array();
+
+  // Backend.
+  $info['types']['VersioncontrolBackend'] = array(
+    'name' => t('Version Control Backend'),
+    'description' => t('Tokens related to backends.'),
+    'needs-data' => 'VersioncontrolBackend',
+  );
+  $info['tokens']['VersioncontrolBackend'] = array(
+    'name' => array(
+      'name'=> t('Backend name'),
+      'description' => t('The name of the backend'),
+    ),
+    'type' => array(
+      'name'=> t('Backend machine name'),
+      'description' => t('The type of the backend'),
+    ),
+    'description' => array(
+      'name'=> t('Backend description'),
+      'description' => t('The description of the backend'),
+    ),
+  );
+
+  // Repository.
+  $info['types']['VersioncontrolRepository'] = array(
+    'name' => t('Version Control Repository'),
+    'description' => t('Tokens related to repositories.'),
+    'needs-data' => 'VersioncontrolRepository',
+  );
+  $info['tokens']['VersioncontrolRepository'] = array(
+    'id' => array(
+      'name'=> t('Repository ID'),
+      'description' => t('The unique identifier for the repository.'),
+    ),
+    'name' => array(
+      'name'=> t('Repository name'),
+      'description' => t('User visible name of the repository.'),
+    ),
+    // @todo Provide the whole backend object from here?
+    'vcs' => array(
+      'name'=> t('Repository backend machine name'),
+      'description' => t('The description of the backend'),
+    ),
+    'viewer' => array(
+      'name'=> t('Repository viewer url.'),
+      'description' => t('A link to the web viewer associated with this repository.'),
+    ),
+  );
+
+  // Operation.
+  $info['types']['VersioncontrolOperation'] = array(
+    'name' => t('Version Control Operation'),
+    'description' => t('Tokens related to operations.'),
+    'needs-data' => 'VersioncontrolOperation',
+  );
+  $info['tokens']['VersioncontrolOperation'] = array(
+    'id' => array(
+      'name' => t('Operation ID'),
+      'description' => t('The unique identifier for the operation.'),
+    ),
+    // @todo Provide the whole repository object from here?
+    'revision' => array(
+      'name' => t('Operation revision'),
+      'description' => t('Backend internal identifier for the operation.'),
+    ),
+    'author_date' => array(
+      'name' => t('Authored date'),
+      'description' => 'Date/time when the operation was created.',
+      'type' => 'date',
+    ),
+    'committer_date' => array(
+      'name' => t('Committed date'),
+      'description' => 'Date/time when the operation was added to the repository.',
+      'type' => 'date',
+    ),
+    'author' => array(
+      'name' => t('Author'),
+      'description' => 'VCS specific username of the user who is the original author of this operation.',
+      'type' => 'user',
+    ),
+    'committer' => array(
+      'name' => t('Committer'),
+      'description' => 'VCS specific username of the user who is the original committer of this operation.',
+      'type' => 'user',
+    ),
+    'message' => array(
+      'name' => t('Commit message'),
+      'description' => 'Log message from VCS for this operation.',
+      'type' => 'user',
+    ),
+  );
+
+  //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 $info;
+}
+
+/**
+ * Implements hook_tokens().
+ */
+function versioncontrol_tokens($type, $tokens, array $data = array(), array $options = array()) {
+  $replacements = array();
+  $sanitize = !empty($options['sanitize']);
+  $language_code = isset($options['language']) ? $options['language']->language : NULL;
+
+  if (empty($data[$type])) {
+    return $replacements;
+  }
+  $object = $data[$type];
+
+  foreach ($tokens as $name => $original) {
+    switch ($type) {
+      case 'VersioncontrolBackend':
+        switch ($name) {
+          case 'name':
+          case 'type':
+          case 'description':
+            $replacements[$original] = $sanitize ? check_plain($object->$name) : $object->$name;
+        }
+        break;
+      case 'VersioncontrolRepository':
+        switch ($name) {
+          case 'viewer':
+            $replacements[$original] = l($object->name, $object->getUrlHandler()->getRepositoryViewUrl());
+            break;
+          case 'id':
+            $name = 'repo_id';
+          case 'name':
+          case 'vcs':
+            $replacements[$original] = $sanitize ? check_plain($object->$name) : $object->$name;
+        }
+        break;
+      case 'VersioncontrolOperation':
+        switch ($name) {
+          case 'author_date':
+          case 'committer_date':
+            $replacements[$original] = format_date($object->$name, 'medium', '', NULL, $language_code);
+            break;
+          case 'id':
+            $name = 'vc_op_id';
+          case 'revision':
+          case 'author':
+          case 'committer':
+          case 'message':
+            $replacements[$original] = $sanitize ? check_plain($object->$name) : $object->$name;
+        }
+        if ($author_date_tokens = token_find_with_prefix($tokens, 'author_date')) {
+          $replacements += token_generate('date', $author_date_tokens, array('date' => $object->author_date), $options);
+        }
+        if ($committer_date_tokens = token_find_with_prefix($tokens, 'committer_date')) {
+          $replacements += token_generate('date', $committer_date_tokens, array('date' => $object->committer_date), $options);
+        }
+        if ($author_tokens = token_find_with_prefix($tokens, 'author')) {
+          $author = user_load($object->author_uid);
+          $replacements += token_generate('user', $author_tokens, array('user' => $author), $options);
+        }
+        if ($committer_tokens = token_find_with_prefix($tokens, 'committer')) {
+          $committer = user_load($object->committer_uid);
+          $replacements += token_generate('user', $author_tokens, array('user' => $committer), $options);
+        }
+        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 $replacements;
+}
