diff --git a/currency_conversion_rate_db_table/currency_conversion_rate_db_table.info b/currency_conversion_rate_db_table/currency_conversion_rate_db_table.info
new file mode 100644
index 0000000..76102b6
--- /dev/null
+++ b/currency_conversion_rate_db_table/currency_conversion_rate_db_table.info
@@ -0,0 +1,4 @@
+name = Currency conversion rate database table
+description = Provides a database table in which currency conversion rates are stored.
+core = 7.x
+dependencies[] = currency
diff --git a/currency_conversion_rate_db_table/currency_conversion_rate_db_table.install b/currency_conversion_rate_db_table/currency_conversion_rate_db_table.install
new file mode 100644
index 0000000..7cb89fe
--- /dev/null
+++ b/currency_conversion_rate_db_table/currency_conversion_rate_db_table.install
@@ -0,0 +1,33 @@
+<?php
+
+/**
+ * @file
+ * Installation and uninstallation functionality.
+ */
+
+/**
+ * Implements hook_schema().
+ */
+function currency_conversion_rate_db_table_schema() {
+  $schema['currency_conversion_rate_db_table'] = 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_rate_db_table/currency_conversion_rate_db_table.module b/currency_conversion_rate_db_table/currency_conversion_rate_db_table.module
new file mode 100644
index 0000000..e9882da
--- /dev/null
+++ b/currency_conversion_rate_db_table/currency_conversion_rate_db_table.module
@@ -0,0 +1,102 @@
+<?php
+
+/**
+ * @file
+ * Contains hook implementations and shared functions.
+ */
+
+/**
+ * The database table's default update interval.
+ */
+define('CURRENCY_CONVERSION_RATE_DB_TABLE_DEFAULT_UPDATE_INTERVAL', 3600);
+
+/**
+ * Implements hook_cron().
+ */
+function currency_conversion_rate_db_table_cron() {
+  $last = variable_get('currency_conversion_rate_db_table_cron_last');
+  $interval = variable_get('currency_conversion_rate_db_table_cron_interval', CURRENCY_CONVERSION_RATE_DB_TABLE_DEFAULT_UPDATE_INTERVAL);
+  if (is_null($last) || REQUEST_TIME - $last > $interval) {
+    currency_conversion_rate_db_table_refresh();
+    variable_set('currency_conversion_rate_db_table_cron_last', REQUEST_TIME);
+  }
+}
+
+/**
+ * Implements hook_menu().
+ */
+function currency_conversion_rate_db_table_menu() {
+  $items['admin/config/regional/currency_conversion_rate_db_table'] = array(
+    'access arguments' => array('currency_conversion_rate_db_table.administer'),
+    'page arguments' => array('currency_conversion_rate_db_table_form_global_configuration'),
+    'page callback' => 'drupal_get_form',
+    'title' => 'Currency conversion rate database table',
+  );
+
+  return $items;
+}
+
+/**
+ * Implements hook_permission().
+ */
+function currency_conversion_rate_db_table_permission() {
+  $permissions['currency_conversion_rate_db_table.administer'] = array(
+    'title' => t('Administer Currency conversion rate database table'),
+  );
+
+  return $permissions;
+}
+
+/**
+ * Implements hook_views_api().
+ */
+function currency_conversion_rate_db_table_views_api() {
+  return array(
+    'api' => '2',
+  );
+}
+
+/**
+ * Updates the conversion rates stored in the database table.
+ *
+ * @return NULL
+ */
+function currency_conversion_rate_db_table_refresh() {
+  $rates = CurrencyConverter::loadAll();
+  $delete_query = db_delete('currency_conversion_rate_db_table');
+  foreach ($rates as $currency_code_from => $currency_code_from_rates) {
+    foreach ($currency_code_from_rates as $currency_code_to => $rate) {
+      db_merge('currency_conversion_rate_db_table')
+        ->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();
+      // Add a condition that says this currency code combination is not stale.
+      $delete_query->where("currency_code_from <> '$currency_code_from' AND currency_code_to <> '$currency_code_to'");
+    }
+  }
+  $delete_query->execute();
+}
+
+/**
+ * Implements form build callback: the global configuration form.
+ */
+function currency_conversion_rate_db_table_form_global_configuration(array $form, array &$form_state) {
+  $form['currency_conversion_rate_db_table_cron_interval'] = array(
+    '#default_value' => variable_get('currency_conversion_rate_db_table_cron_interval', CURRENCY_CONVERSION_RATE_DB_TABLE_DEFAULT_UPDATE_INTERVAL),
+    '#description' => t('The length of time between conversion rate updates. Requires a correctly configured <a href="@cron">cron maintenance task</a>.', array(
+      '@cron' => url('admin/reports/status'),
+    )),
+    '#options' => drupal_map_assoc(array(60, 120, 180, 240, 300, 600, 1200, 1800, 2400, 3000, 3600, 7200, 10800, 14400, 18000), 'format_interval'),
+    '#title' => t('Update interval'),
+    '#type' => 'select',
+  );
+
+  return system_settings_form($form);
+}
diff --git a/currency_conversion_rate_db_table/currency_conversion_rate_db_table.views.inc b/currency_conversion_rate_db_table/currency_conversion_rate_db_table.views.inc
new file mode 100644
index 0000000..503444b
--- /dev/null
+++ b/currency_conversion_rate_db_table/currency_conversion_rate_db_table.views.inc
@@ -0,0 +1,89 @@
+<?php
+
+/**
+ * @file
+ * Views integration.
+ */
+
+/**
+ * Implements hook_views_data().
+ */
+function currency_conversion_rate_db_table_views_data() {
+  // Table configuration.
+  $data['currency_conversion_rate_db_table']['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_rate_db_table'][$field . $suffix] = array(
+        'title' => $title,
+        'real field' => $field,
+        'field' => array(
+          'handler' => 'CurrencyViewsHandlerField',
+          'currency_property' => $property,
+        ),
+        'filter' => array(
+          'handler' => 'CurrencyViewsHandlerFilter',
+        ),
+      );
+    }
+  }
+  $data['currency_conversion_rate_db_table']['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_rate_db_table']['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;
+}
