diff --git a/currency.info b/currency.info
index bb8f690..7d83714 100755
--- a/currency.info
+++ b/currency.info
@@ -4,10 +4,15 @@ core = 7.x
 php = 5.3
 configure = admin/config/regional/currency
 dependencies[] = ctools
+test_dependencies[] = views
 files[] = includes/Currency.inc
+files[] = includes/CurrencyAmountViewsHandlerField.inc
 files[] = includes/CurrencyExportableInterface.inc
 files[] = includes/CurrencyLocalePattern.inc
+files[] = includes/CurrencyViewsHandlerField.inc
+files[] = tests/CurrencyAmountViewsHandlerFieldWebTestCase.test
 files[] = tests/CurrencyCRUDWebTestCase.test
 files[] = tests/CurrencyLocalePatternCRUDWebTestCase.test
 files[] = tests/CurrencyLocalePatternWebTestCase.test
+files[] = tests/CurrencyViewsHandlerFieldWebTestCase.test
 files[] = tests/CurrencyWebTestCase.test
diff --git a/includes/CurrencyAmountViewsHandlerField.inc b/includes/CurrencyAmountViewsHandlerField.inc
new file mode 100644
index 0000000..740a354
--- /dev/null
+++ b/includes/CurrencyAmountViewsHandlerField.inc
@@ -0,0 +1,142 @@
+<?php
+
+/**
+ * @file
+ * Contains class CurrencyAmountViewsHandlerField.
+ */
+
+/**
+ * A Views field handler for currency amounts.
+ *
+ * This handler has two definition properties, that function identically to and
+ * provide default values for the handler's options:
+ * - currency_code
+ * - currency_code_field
+ *   See $this->option_definition() for a detailed explanation.
+ */
+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.
+    $options['currency_code'] = array(
+      'default' => !empty($this->definition['currency_code']) ? $this->definition['currency_code'] : 'XXX',
+    );
+    // The name of the fields that contains ISO 4217 currency codes. For every
+    // row that does not contain a valid code, the value of the "currency_code"
+    // option is used instead.
+    $options['currency_code_field'] = array(
+      'default' => !empty($this->definition['currency_code_field']) ? $this->definition['currency_code_field'] : '',
+    );
+
+    return $options;
+  }
+
+  /**
+   * Overrides parent::options_form().
+   */
+  function options_form(&$form, &$form_state) {
+    parent::options_form($form, $form_state);
+    // The currency code.
+    $options = array();
+    foreach (ctools_export_crud_load_all('currency') as $currency) {
+      $options[$currency->ISO4217Code] = $currency->title;
+    }
+    asort($options);
+    $handler_options = $this->option_definition();
+    $form['currency_code'] = array(
+      '#type' => 'select',
+      '#title' => t('Default currency'),
+      '#options' => $options,
+      '#default_value' => $this->options['currency_code'],
+      '#required' => TRUE,
+    );
+
+    // The currency code field.
+    $options = array();
+    foreach ($this->view->display_handler->get_handlers('field') as $handler) {
+      // We only allow fields up to this one.
+      if ($handler->field == $this->options['id']) {
+        break;
+      }
+      $options[$handler->table . '_' . $handler->field] = $handler->ui_name();
+    }
+    asort($options);
+    $form['currency_code_field'] = array(
+      '#type' => 'select',
+      '#title' => t('Currency field'),
+      '#description' => t('Another field that contains the ISO 4217 currency codes of the currencies to use for displaying the amounts. If no field is specified, or if the specified field does not contain a valid currency code, then the default currency will be used.'),
+      '#options' => $options,
+      '#empty_value' => '',
+      '#default_value' => $this->options['currency_code_field'],
+    );
+  }
+
+  /**
+   * Overrides parent::render().
+   *
+   * @throws RuntimeException
+   */
+  function render($values) {
+    $currency = $this->getCurrency($values);
+    $amount = $this->getAmount($this->get_value($values));
+
+    return $currency->format($amount);
+  }
+
+  /**
+   * Loads the Currency for this field.
+   *
+   * @throws RuntimeException
+   *
+   * @param stdClass $values
+   *   A values object as received by $this->render().
+   *
+   * @return Currency
+   */
+  function getCurrency(stdClass $values) {
+    $currency = NULL;
+
+    // Check if the configured field exists, because the option might be
+    // outdated.
+    $currency_code_field = $this->options['currency_code_field'];
+    if (isset($values->{$currency_code_field})) {
+      $currency_code = $values->{$currency_code_field};
+      $currency = ctools_export_crud_load('currency', $currency_code);
+    }
+    if (!$currency) {
+      $currency = ctools_export_crud_load('currency', $this->options['currency_code']);
+    }
+    if (!$currency) {
+      $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..d9f89d7
--- /dev/null
+++ b/includes/CurrencyViewsHandlerField.inc
@@ -0,0 +1,33 @@
+<?php
+
+/**
+ * @file
+ * Contains class CurrencyViewsHandlerField.
+ */
+
+/**
+ * A Views field handler for fields that contain ISO 4217 currency codes.
+ *
+ * This handler has one definition property:
+ * - currency_property: the name of the Currency class property of which to
+ *   display the value, which must be a scalar.
+ */
+class CurrencyViewsHandlerField extends views_handler_field {
+
+  /**
+   * Overrides parent::render().
+   *
+   * @throws RuntimeException
+   */
+  function render($values) {
+    $property = !empty($this->definition['currency_property']) ? $this->definition['currency_property'] : NULL;
+    if ($property) {
+      $currency_code = $this->get_value($values);
+      $currency = ctools_export_crud_load('currency', $currency_code);
+      if ($currency && property_exists($currency, $property)) {
+        return $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..504f159
--- /dev/null
+++ b/tests/CurrencyAmountViewsHandlerFieldWebTestCase.test
@@ -0,0 +1,251 @@
+<?php
+
+/**
+ * @file
+ * Contains class CurrencyAmountViewsHandlerFieldWebTestCase.
+ */
+
+/**
+ * Tests CurrencyAmountViewsHandlerField.
+ */
+class CurrencyAmountViewsHandlerFieldWebTestCase extends ViewsSqlTest {
+
+  static function getInfo() {
+    return array(
+      'name' => 'CurrencyAmountViewsFieldHandler',
+      'group' => 'Currency',
+      'dependencies' => array('views'),
+    );
+  }
+
+  function setUp() {
+    parent::setUp();
+    module_enable(array('currency', 'views'));
+  }
+
+  /**
+   * Overrides parent::schemaDefinition.
+   */
+  protected function schemaDefinition() {
+    $schema['views_test'] = array(
+      'fields' => array(
+        'currency_code' => array(
+          'type' => 'varchar',
+          'length' => '3',
+        ),
+      ),
+    );
+    $fields = array('amount_currency_code_option', 'amount_currency_code_field_option', 'amount_currency_code_definition', 'amount_currency_code_field_definition', 'amount_currency_undefined');
+    foreach ($fields as $field) {
+      $schema['views_test']['fields'][$field] = 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_currency_code_option'] = array(
+      'title' => t('Amount'),
+      'help' => t('Amount'),
+      'field' => array(
+        'handler' => 'CurrencyAmountViewsHandlerField',
+        'float' => TRUE,
+      ),
+    );
+    $data['views_test']['amount_currency_code_field_option'] = array(
+      'title' => t('Amount'),
+      'help' => t('Amount'),
+      'field' => array(
+        'handler' => 'CurrencyAmountViewsHandlerField',
+        'float' => TRUE,
+      ),
+    );
+    $data['views_test']['amount_currency_code_definition'] = array(
+      'title' => t('Amount'),
+      'help' => t('Amount'),
+      'field' => array(
+        'handler' => 'CurrencyAmountViewsHandlerField',
+        'float' => TRUE,
+        'currency_code' => 'EUR',
+      ),
+    );
+    $data['views_test']['amount_currency_code_field_definition'] = array(
+      'title' => t('Amount'),
+      'help' => t('Amount'),
+      'field' => array(
+        'handler' => 'CurrencyAmountViewsHandlerField',
+        'float' => TRUE,
+        'currency_code' => 'UAH',
+        'currency_code_field' => 'views_test_currency_code',
+      ),
+    );
+    $data['views_test']['amount_currency_undefined'] = array(
+      'title' => t('Amount'),
+      'help' => t('Amount'),
+      'field' => array(
+        'handler' => 'CurrencyAmountViewsHandlerField',
+        'float' => TRUE,
+      ),
+    );
+
+    return $data;
+  }
+
+  /**
+   * Overrides parent::dataSet();
+   */
+  protected function dataSet() {
+    $amounts = array(
+      'amount_currency_code_option' => 123.456,
+      'amount_currency_code_field_option' => 123.456,
+      'amount_currency_code_definition' => 123.456,
+      'amount_currency_code_field_definition' => 123.456,
+      'amount_currency_undefined' => 123.456,
+    );
+    return array(
+      array(
+        'currency_code' => 'EUR',
+      ) + $amounts,
+      array(
+        'currency_code' => 'USD',
+      ) + $amounts,
+      array(
+        'currency_code' => '',
+       ) + $amounts,
+    );
+  }
+
+  /**
+   * 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_currency_code_option' => array(
+        'id' => 'amount_currency_code_option',
+        'table' => 'views_test',
+        'field' => 'amount_currency_code_option',
+        'relationship' => 'none',
+      ),
+      'amount_currency_code_field_option' => array(
+        'id' => 'amount_currency_code_field_option',
+        'table' => 'views_test',
+        'field' => 'amount_currency_code_field_option',
+        'relationship' => 'none',
+      ),
+      'amount_currency_code_definition' => array(
+        'id' => 'amount_currency_code_definition',
+        'table' => 'views_test',
+        'field' => 'amount_currency_code_definition',
+        'relationship' => 'none',
+      ),
+      'amount_currency_code_field_definition' => array(
+        'id' => 'amount_currency_code_field_definition',
+        'table' => 'views_test',
+        'field' => 'amount_currency_code_field_definition',
+        'relationship' => 'none',
+      ),
+      'amount_currency_undefined' => array(
+        'id' => 'amount_currency_undefined',
+        'table' => 'views_test',
+        'field' => 'amount_currency_undefined',
+        'relationship' => 'none',
+      ),
+    ));
+
+    return $view;
+  }
+
+  /**
+   * Tests CurrencyAmountViewsHandlerField.
+   */
+  public function testCurrencyAmountViewsHandlerField() {
+    $view = $this->getBasicView();
+    $view->save();
+
+    // Test view creation/editing.
+    $account = $this->drupalCreateUser(array('administer views'));
+    $this->drupalLogin($account);
+    $this->drupalPost('admin/structure/views/nojs/config-item/test_view/default/field/amount_currency_code_option', array(
+      'options[currency_code]' => 'EUR',
+    ), t('Apply'));
+    $this->drupalPost('admin/structure/views/nojs/config-item/test_view/default/field/amount_currency_code_field_option', array(
+      'options[currency_code]' => 'UAH',
+      'options[currency_code_field]' => 'views_test_currency_code',
+    ), t('Apply'));
+    $this->drupalPost('admin/structure/views/view/' . $view->name, array(), t('Save'));
+
+    // Test view display.
+    $view = views_get_view($view->name);
+    $this->executeView($view);
+    $values = array(
+      array(
+        'amount_currency_code_option' => '€123.456',
+        'amount_currency_code_field_option' => '€123.456',
+        'amount_currency_code_definition' => '€123.456',
+        'amount_currency_code_field_definition' => '€123.456',
+        'amount_currency_undefined' => '¤123.456',
+      ),
+      array(
+        'amount_currency_code_option' => '€123.456',
+        'amount_currency_code_field_option' => '$123.456',
+        'amount_currency_code_definition' => '€123.456',
+        'amount_currency_code_field_definition' => '$123.456',
+        'amount_currency_undefined' => '¤123.456',
+      ),
+      array(
+        'amount_currency_code_option' => '€123.456',
+        'amount_currency_code_field_option' => '₴123.456',
+        'amount_currency_code_definition' => '€123.456',
+        'amount_currency_code_field_definition' => '₴123.456',
+        'amount_currency_undefined' => '¤123.456',
+      ),
+    );
+    foreach ($values as $row => $row_values) {
+      foreach ($row_values as $field => $value) {
+        $this->assertEqual($view->field[$field]->advanced_render($view->result[$row]), $value);
+      }
+    }
+  }
+}
diff --git a/tests/CurrencyViewsHandlerFieldWebTestCase.test b/tests/CurrencyViewsHandlerFieldWebTestCase.test
new file mode 100644
index 0000000..b604941
--- /dev/null
+++ b/tests/CurrencyViewsHandlerFieldWebTestCase.test
@@ -0,0 +1,132 @@
+<?php
+
+/**
+ * @file
+ * Contains class CurrencyViewsHandlerFieldWebTestCase.
+ */
+
+/**
+ * Tests CurrencyAmountViewsHandlerField.
+ */
+class CurrencyViewsHandlerFieldWebTestCase extends ViewsSqlTest {
+
+  static function getInfo() {
+    return array(
+      'name' => 'CurrencyViewsFieldHandler',
+      'group' => 'Currency',
+      'dependencies' => array('views'),
+    );
+  }
+
+  function setUp() {
+    parent::setUp();
+    module_enable(array('currency', 'views'));
+  }
+
+  /**
+   * Overrides parent::schemaDefinition.
+   */
+  protected function schemaDefinition() {
+    $schema['views_test'] = array(
+      'fields' => array(
+        'currency_code' => array(
+          'type' => 'varchar',
+          'length' => '3',
+        ),
+      ),
+    );
+
+    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_sign'] = array(
+      'real field' => 'currency_code',
+      'title' => t('Currency code'),
+      'help' => t('Currency code'),
+      'field' => array(
+        'handler' => 'CurrencyViewsHandlerField',
+        'currency_property' => 'sign',
+      ),
+    );
+    $data['views_test']['currency_minor_unit'] = array(
+      'real field' => 'currency_code',
+      'title' => t('Currency code'),
+      'help' => t('Currency code'),
+      'field' => array(
+        'handler' => 'CurrencyViewsHandlerField',
+        'currency_property' => 'minorUnit',
+      ),
+    );
+
+    return $data;
+  }
+
+  /**
+   * Overrides parent::dataSet();
+   */
+  protected function dataSet() {
+    return array(array(
+      'currency_code' => 'EUR',
+    ));
+  }
+
+  /**
+   * 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_sign' => array(
+        'id' => 'currency_sign',
+        'table' => 'views_test',
+        'field' => 'currency_sign',
+        'relationship' => 'none',
+      ),
+      'currency_minor_unit' => array(
+        'id' => 'currency_minor_unit',
+        'table' => 'views_test',
+        'field' => 'currency_minor_unit',
+        'relationship' => 'none',
+      ),
+    ));
+
+    return $view;
+  }
+
+  /**
+   * Tests CurrencyAmountViewsHandlerField.
+   */
+  public function testCurrencyAmountViewsHandlerField() {
+    $view = $this->getBasicView();
+    $view->save();
+
+    // Test view display.
+    $view = views_get_view($view->name);
+    $this->executeView($view);
+    $this->assertEqual($view->field['currency_sign']->advanced_render($view->result[0]), '€');
+    $this->assertEqual($view->field['currency_minor_unit']->advanced_render($view->result[0]), '2');
+  }
+}
