diff --git a/currency_conversion_db/currency_conversion_db.info b/currency_conversion_db/currency_conversion_db.info
new file mode 100644
index 0000000..80cf646
--- /dev/null
+++ b/currency_conversion_db/currency_conversion_db.info
@@ -0,0 +1,4 @@
+name = Currency conversion database table
+description = Provides a database table in which currency conversion rates are stored.
+core = 7.x
+dependencies[] = currency
diff --git a/currency_conversion_db/currency_conversion_db.install b/currency_conversion_db/currency_conversion_db.install
new file mode 100644
index 0000000..c69dca6
--- /dev/null
+++ b/currency_conversion_db/currency_conversion_db.install
@@ -0,0 +1,33 @@
+<?php
+
+/**
+ * @file
+ * Installation and uninstallation functionality.
+ */
+
+/**
+ * Implements hook_schema().
+ */
+function currency_conversion_db_schema() {
+  $schema['currency_conversion_db'] = array(
+    'description' => 'Currency conversion rates.',
+    'fields' => array(
+      'currency_code_from' => array(
+        'type' => 'varchar',
+        'length' => 3,
+      ),
+      'currency_code_to' => array(
+        'type' => 'varchar',
+        'length' => 3,
+      ),
+      'rate' => array(
+        'type' => 'float',
+        'size' => 'big',
+        'not null' => TRUE,
+      ),
+    ),
+    'primary key' => array('currency_code_from', 'currency_code_to'),
+  );
+
+  return $schema;
+}
diff --git a/currency_conversion_db/currency_conversion_db.module b/currency_conversion_db/currency_conversion_db.module
new file mode 100644
index 0000000..2a462f5
--- /dev/null
+++ b/currency_conversion_db/currency_conversion_db.module
@@ -0,0 +1,52 @@
+<?php
+
+/**
+ * @file
+ * Contains hook implementations and shared functions.
+ */
+
+/**
+ * Implements hook_cron().
+ */
+function currency_conversion_db_cron() {
+  currency_conversion_db_refresh();
+}
+
+/**
+ * Implements hook_views_api().
+ */
+function currency_conversion_db_views_api() {
+  return array(
+    'api' => '2',
+  );
+}
+
+/**
+ * Updates the conversion rates stored in the database table.
+ *
+ * @todo How do we delete stale rates without making things slow, or causing a
+ * situation in which rates are missing, because the old ones have been
+ * deleted, but the new ones have not yet been inserted?
+ */
+function currency_conversion_db_refresh() {
+  $rates = CurrencyConverter::loadAll();
+  foreach ($rates as $currency_code_from => $currency_code_from_rates) {
+    foreach ($currency_code_from_rates as $currency_code_to => $rate) {
+      db_merge('currency_conversion_db')
+        ->key(array(
+          'currency_code_from' => $currency_code_from,
+          'currency_code_to' => $currency_code_to,
+        ))
+        ->fields(array(
+          'currency_code_from' => $currency_code_from,
+          'currency_code_to' => $currency_code_to,
+          'rate' => $rate,
+        ))
+        ->execute();
+    }
+  }
+}
+
+function currency_conversion_db_init() {
+  currency_conversion_db_refresh();
+}
\ No newline at end of file
diff --git a/currency_conversion_db/currency_conversion_db.views.inc b/currency_conversion_db/currency_conversion_db.views.inc
new file mode 100644
index 0000000..5ee117e
--- /dev/null
+++ b/currency_conversion_db/currency_conversion_db.views.inc
@@ -0,0 +1,89 @@
+<?php
+
+/**
+ * @file
+ * Views integration.
+ */
+
+/**
+ * Implements hook_views_data().
+ */
+function currency_conversion_db_views_data() {
+  // Table configuration.
+  $data['currency_conversion_db']['table'] = array(
+    'base' => array(
+      'title' => t('Currency conversion rates'),
+    ),
+    'group' => t('Currency'),
+  );
+
+  // Field configuration.
+  $properties = array(
+    'currency_code_from' => array(
+      'ISO4217Code' => t('Source currency code'),
+      'ISO4217Number' => t('Source currency number'),
+      'minorUnit' => t('Source currency number of decimals'),
+      'sign' => t('Source currency sign'),
+      'title' => t('Source currency name'),
+    ),
+    'currency_code_to' => array(
+      'ISO4217Code' => t('Destination currency code'),
+      'ISO4217Number' => t('Destination currency number'),
+      'minorUnit' => t('Destination currency number of decimals'),
+      'sign' => t('Destination currency sign'),
+      'title' => t('Destination currency name'),
+    ),
+  );
+  foreach ($properties as $field => $field_properties) {
+    foreach ($field_properties as $property => $title) {
+      // Don't alias the currency code.
+      $suffix = $property == 'ISO4217Code' ? '' : '_' . $property;
+      $data['currency_conversion_db'][$field . $suffix] = array(
+        'title' => $title,
+        'real field' => $field,
+        'field' => array(
+          'handler' => 'CurrencyViewsHandlerField',
+          'currency_property' => $property,
+        ),
+        'filter' => array(
+          'handler' => 'CurrencyViewsHandlerFilter',
+        ),
+      );
+    }
+  }
+  $data['currency_conversion_db']['rate'] = array(
+    'title' => t('Conversion rate'),
+    'field' => array(
+      'handler' => 'views_handler_field_numeric',
+      'float' => TRUE,
+    ),
+    'sort' => array(
+      'handler' => 'views_handler_sort',
+    ),
+    'filter' => array(
+      'handler' => 'views_handler_filter_numeric',
+    ),
+    'argument' => array(
+      'handler' => 'views_handler_argument_numeric',
+    ),
+  );
+  $data['currency_conversion_db']['rate_amount'] = array(
+    'title' => t('Conversion rate (as an amount)'),
+    'real field' => 'rate',
+    'field' => array(
+      'handler' => 'CurrencyAmountViewsHandlerField',
+      'float' => TRUE,
+    ),
+    'sort' => array(
+      'handler' => 'views_handler_sort',
+    ),
+    'filter' => array(
+      'handler' => 'views_handler_filter_numeric',
+    ),
+    'argument' => array(
+      'handler' => 'views_handler_argument_numeric',
+    ),
+  );
+
+  return $data;
+}
\ No newline at end of file
