diff --git a/currency.info b/currency.info
index 9a713ac..d7c6c1d 100755
--- a/currency.info
+++ b/currency.info
@@ -4,4 +4,7 @@ core = 7.x
 configure = admin/config/regional/currency
 dependencies[] = ctools
 files[] = includes/Currency.inc
+files[] = includes/CurrencyAmountViewsHandlerField.inc
+files[] = includes/CurrencyViewsHandlerField.inc
+files[] = tests/CurrencyAmountViewsHandlerFieldWebTestCase.test
 files[] = tests/CurrencyCRUDWebTestCase.test
diff --git a/includes/CurrencyAmountViewsHandlerField.inc b/includes/CurrencyAmountViewsHandlerField.inc
new file mode 100644
index 0000000..e25feac
--- /dev/null
+++ b/includes/CurrencyAmountViewsHandlerField.inc
@@ -0,0 +1,122 @@
+<?php
+
+/**
+ * @file
+ * Contains class CurrencyAmountViewsHandlerField.
+ */
+
+/**
+ * A Views field handler for currency amounts.
+ */
+class CurrencyAmountViewsHandlerField extends views_handler_field {
+
+  /**
+   * Overrides parent::option_definition().
+   */
+  function option_definition() {
+    $options = parent::option_definition();
+
+    // The ISO 4217 currency code of the currency to use to display the amount,
+    // or a field name prefixed with "field" that contains an ISO 4217 code.
+    $options['currency'] = array(
+      'default' => 'XXX',
+      );
+
+    return $options;
+  }
+
+  /**
+   * Overrides parent::options_form().
+   */
+  function options_form(&$form, &$form_state) {
+    parent::options_form($form, $form_state);
+    $options = array();
+    foreach ($this->view->display_handler->get_handlers('field') as $field => $handler) {
+      // We only allow fields up to this one.
+      if ($field == $this->options['id']) {
+        break;
+      }
+      $options['field_' . $field] = $handler->ui_name();
+    }
+    foreach (ctools_export_crud_load_all('currency') as $currency) {
+      $options[$currency->ISO4217Code] = $currency->title;
+    }
+    asort($options);
+    $handler_options = $this->option_definition();
+    $form['currency'] = array(
+      '#type' => 'select',
+      '#title' => t('Currency'),
+      '#options' => $options,
+      '#default_value' => $handler_options['currency']['default'],
+    );
+  }
+
+  /**
+   * Overrides parent::render().
+   *
+   * @throws RuntimeException
+   */
+  function render($values) {
+    $currency = $this->getCurrency();
+    $amount = $this->getAmount($this->get_value($values));
+
+    return $currency->format($amount);
+  }
+
+  /**
+   * Loads the Currency for this field.
+   *
+   * @throws RuntimeException
+   *
+   * @return Currency
+   */
+  function getCurrency() {
+    static $currency = NULL;
+
+    if (is_null($currency)) {
+      $this->view->style_plugin->render_fields($this->view->result);
+
+      // Get the configured currency code.
+      if (strpos($this->options['currency'], 'field_') === 0) {
+        $field = substr($this->options['currency'], 6);
+        $fields = $this->view->display_handler->get_handlers('field');
+        $currency_code = $fields[$field]->last_render;
+      }
+      else {
+        $currency_code = $this->options['currency'];
+      }
+
+      // Try to load the currency for the code, or default to XXX to provide
+      // graceful degradation for views or data that use a currency that is no
+      // longer available.
+      $currency = ctools_export_crud_load('currency', $currency_code);
+      if (!$currency && $currency_code != 'XXX') {
+        $currency = ctools_export_crud_load('currency', 'XXX');
+        if (!$currency) {
+          throw new RuntimeException(t('Could not load currency with ISO 4217 code XXX.'));
+        }
+      }
+    }
+
+    return $currency;
+  }
+
+  /**
+   * Gets this field's amount as a float.
+   *
+   * If the amount cannot be fetched from your implementation's database field
+   * as a float or a format that can easily be parsed to a float, such as a
+   * string or an integer, you should override this method so it returns a
+   * float representation of the amount.
+   *
+   * @param mixed $amount_value
+   *   The amount as Views fetched it from the database.
+   *
+   * @return float
+   */
+  function getAmount($amount_value) {
+    // Even if the amount is stored as a float, in most cases it is returned as
+    // a string, so cast it.
+    return (float) $amount_value;
+  }
+}
diff --git a/includes/CurrencyViewsHandlerField.inc b/includes/CurrencyViewsHandlerField.inc
new file mode 100644
index 0000000..4712c52
--- /dev/null
+++ b/includes/CurrencyViewsHandlerField.inc
@@ -0,0 +1,46 @@
+<?php
+
+/**
+ * @file
+ * Contains class CurrencyViewsHandlerField.
+ */
+
+/**
+ * A Views field handler for fields that contain ISO 4217 currency codes.
+ */
+class CurrencyViewsHandlerField extends views_handler_field {
+
+  /**
+   * The name of the currency's minor unit property.
+   */
+  const CURRENCY_MINOR_UNIT = 'minor_unit';
+
+  /**
+   * The name of the currency's ISO 4217 number property.
+   */
+  const CURRENCY_ISO_4217_NUMBER = 'ISO4217number';
+
+  /**
+   * The name of the currency's sign property.
+   */
+  const CURRENCY_SIGN = 'sign';
+
+  /**
+   * The name of the currency title property.
+   */
+  const CURRENCY_TITLE = 'title';
+
+  /**
+   * Overrides parent::render().
+   *
+   * @throws RuntimeException
+   */
+  function render($values) {
+    if (!empty($this->definition['currency_property'])) {
+      $currency_code = $this->get_value($values);
+      $currency = ctools_export_crud_load('currency', $currency_code);
+      return $currency->{$this->definition['currency_property']};
+    }
+    throw new RuntimeException(t('CurrencyViewsHandlerField requires a set-up currency property handler definition.'));
+  }
+}
diff --git a/tests/CurrencyAmountViewsHandlerFieldWebTestCase.test b/tests/CurrencyAmountViewsHandlerFieldWebTestCase.test
new file mode 100644
index 0000000..3e41f59
--- /dev/null
+++ b/tests/CurrencyAmountViewsHandlerFieldWebTestCase.test
@@ -0,0 +1,152 @@
+<?php
+
+/**
+ * @file
+ * Contains class CurrencyAmountViewsHandlerFieldWebTestCase.
+ */
+
+/**
+ * Tests CurrencyAmountViewsHandlerField.
+ */
+class CurrencyAmountViewsHandlerFieldWebTestCase extends ViewsSqlTest {
+
+  static function getInfo() {
+    return array(
+      'name' => 'CurrencyAmountViewsFieldHandler',
+      'group' => 'Currency',
+    );
+  }
+
+  function setUp() {
+    parent::setUp();
+    module_enable(array('currency'));
+  }
+
+  /**
+   * Overrides parent::schemaDefinition.
+   */
+  protected function schemaDefinition() {
+    $schema['views_test'] = array(
+      'fields' => array(
+        'currency_code' => array(
+          'type' => 'varchar',
+          'length' => '3',
+        ),
+        'amount' => array(
+          'type' => 'float',
+          'size' => 'big',
+        ),
+      ),
+    );
+
+    return $schema;
+  }
+
+  /**
+   * Overrides parent::viewsData();
+   */
+  function viewsData() {
+    // Declaration of the base table.
+    $data['views_test']['table'] = array(
+      'group' => t('Views test'),
+      'base' => array(
+        'field' => 'id',
+        'title' => t('Views test'),
+      ),
+    );
+
+    // Declaration of fields.
+    $data['views_test']['currency_code'] = array(
+      'title' => t('Currency code'),
+      'help' => t('Currency code'),
+      'field' => array(
+        'handler' => 'views_handler_field',
+      ),
+      'sort' => array(
+        'handler' => 'views_handler_sort',
+      ),
+    );
+    $data['views_test']['amount'] = array(
+      'title' => t('Amount'),
+      'help' => t('Amount'),
+      'field' => array(
+        'handler' => 'CurrencyAmountViewsHandlerField',
+        'float' => TRUE,
+      ),
+    );
+
+    return $data;
+  }
+
+  /**
+   * Overrides parent::dataSet();
+   */
+  protected function dataSet() {
+    return array(
+      array(
+        'currency_code' => 'EUR',
+        'amount' => 123.456,
+      ),
+      array(
+        'currency_code' => 'USD',
+        'amount' => 123456,
+      ),
+    );
+  }
+
+  /**
+   * Overrides parent::getBasicView().
+   */
+  protected function getBasicView() {
+    views_include('view');
+
+    // Create the basic view.
+    $view = new view();
+    $view->name = 'test_view';
+    $view->add_display('default');
+    $view->base_table = 'views_test';
+
+    // Set up the fields we need.
+    $display = $view->new_display('default', 'Master', 'default');
+    $display->override_option('fields', array(
+      'currency_code' => array(
+        'id' => 'currency_code',
+        'table' => 'views_test',
+        'field' => 'currency_code',
+        'relationship' => 'none',
+      ),
+      'amount' => array(
+        'id' => 'amount',
+        'table' => 'views_test',
+        'field' => 'amount',
+        'relationship' => 'none',
+        'currency' => 'field_currency_code',
+      ),
+    ));
+
+    return $view;
+  }
+
+  /**
+   * Tests CurrencyAmountViewsHandlerField.
+   */
+  public function testCurrencyAmountViewsHandlerField() {
+    $view = $this->getBasicView();
+    $view->save();
+
+    // Test view creation.
+    $base_tables = views_fetch_base_tables();
+    $account = $this->drupalCreateUser(array('administer views'));
+    $this->drupalLogin($account);
+    $this->drupalGet('admin/structure/views/view/' . $view->name);
+    $this->clickLink($base_tables[$view->base_table]['title'] . ': Amount (Amount)');
+    // Confirm the select element offers currencies and fields.
+    $this->assertRaw('<option value="AFN">');
+    $this->assertRaw('<option value="field_currency_code">');
+
+    // Test view display.
+    $this->executeView($view);
+    $this->assertEqual($view->field['amount']->advanced_render($view->result[0]), '€123.456');
+    $this->assertEqual($view->field['amount']->advanced_render($view->result[1]), '$123,456');
+  }
+}
