diff --git a/currency.info b/currency.info
index bd9d5d1..d13a01d 100755
--- a/currency.info
+++ b/currency.info
@@ -20,5 +20,6 @@ files[] = tests/CurrencyConverterWebTestCase.test
 files[] = tests/CurrencyCRUDWebTestCase.test
 files[] = tests/CurrencyLocalePatternCRUDWebTestCase.test
 files[] = tests/CurrencyLocalePatternWebTestCase.test
+files[] = tests/CurrencyTokenWebTestCase.test
 files[] = tests/CurrencyViewsHandlerFieldWebTestCase.test
 files[] = tests/CurrencyWebTestCase.test
diff --git a/currency.tokens.inc b/currency.tokens.inc
new file mode 100644
index 0000000..e6f8211
--- /dev/null
+++ b/currency.tokens.inc
@@ -0,0 +1,77 @@
+<?php
+
+/**
+ * @file
+ * Contains Token API hook implementations.
+ */
+
+/**
+ * Implements hook_token_info().
+ */
+function currency_token_info() {
+  // Token groups.
+  $token_info['types']['currency'] = array(
+    'description' => t('ISO 4217 currencies.'),
+    'name' => t('Currencies'),
+    'needs-data' => 'currency',
+  );
+
+  // Tokens.
+  $token_info['tokens']['code'] = array(
+    'description' => t('The ISO 4217 currency code.'),
+    'name' => t('Currency code'),
+    'type' => 'text',
+  );
+  $token_info['tokens']['number'] = array(
+    'description' => t('The ISO 4217 currency number.'),
+    'name' => t('Currency number'),
+    'type' => 'text',
+  );
+  $token_info['tokens']['minor-unit'] = array(
+    'description' => t('The ISO 4217 currency code.'),
+    'name' => t('Currency code'),
+    'type' => 'text',
+  );
+  $token_info['tokens']['sign'] = array(
+    'name' => t('Sign'),
+    'type' => 'text',
+  );
+  $token_info['tokens']['title'] = array(
+    'name' => t('Name'),
+    'type' => 'text',
+  );
+
+  return $token_info;
+}
+
+/**
+ * Implements hook_tokens().
+ */
+function currency_tokens($type, array $tokens, array $data = array(), array $options = array()) {
+  $replacements = array();
+
+  if ($type == 'currency' && isset($data['currency'])) {
+    $currency_code = $data['currency'];
+    if (isset($tokens['code'])) {
+      $replacements[$tokens['code']] = $data['currency'];
+      unset($tokens['code']);
+    }
+    if ($tokens) {
+      ctools_include('export');
+      $currency = ctools_export_crud_load('currency', $data['currency']);
+      $map = array(
+        'number' => 'ISO4217Number',
+        'minor-unit' => 'minorUnit',
+        'sign' => 'sign',
+        'title' => 'title',
+      );
+      foreach ($tokens as $token => $original) {
+        if (isset($map[$token])) {
+          $replacements[$original] = $currency->{$map[$token]};
+        }
+      }
+    }
+  }
+
+  return $replacements;
+}
diff --git a/tests/CurrencyTokenWebTestCase.test b/tests/CurrencyTokenWebTestCase.test
new file mode 100644
index 0000000..e712bd2
--- /dev/null
+++ b/tests/CurrencyTokenWebTestCase.test
@@ -0,0 +1,49 @@
+<?php
+
+/**
+ * @file
+ * Contains class CurrencyTokenWebTestCase.
+ */
+
+/**
+ * Tests Token integration.
+ */
+class CurrencyTokenWebTestCase extends DrupalWebTestCase {
+
+  static function getInfo() {
+    return array(
+      'name' => 'Token integration',
+      'group' => 'Currency',
+    );
+  }
+
+  function setUp(array $modules = array()) {
+    parent::setUp($modules + array('currency'));
+  }
+
+  /**
+   * Tests token integration.
+   */
+  function testTokenIntegration() {
+    $data = array(
+      'EUR' => array(
+        '[currency:code]' => 'EUR',
+        '[currency:number]' => '978',
+        '[currency:minor-unit]' => '2',
+      ),
+      'BHD' => array(
+        '[currency:code]' => 'BHD',
+        '[currency:number]' => '048',
+        '[currency:minor-unit]' => '3',
+      ),
+    );
+    foreach ($data as $currency_code => $tokens) {
+      $data = array(
+        'currency' => $currency_code,
+      );
+      foreach ($tokens as $token => $replacement) {
+        $this->assertEqual(token_replace($token, $data), $replacement);
+      }
+    }
+  }
+}
