diff --git a/commerce_currency_switcher.module b/commerce_currency_switcher.module
new file mode 100644
index 0000000..d0c8417
--- /dev/null
+++ b/commerce_currency_switcher.module
@@ -0,0 +1,12 @@
+<?php
+
+/**
+ * Implements hook_entity_build_defaults_alter().
+ */
+function commerce_currency_switcher_entity_view_alter(array &$build, \Drupal\Core\Entity\EntityInterface $entity, $view_mode) {
+  if (array_key_exists('#commerce_product', $build) ||
+      array_key_exists('#commerce_product_variation', $build)) {
+    // Add our cache context.
+    $build['#cache']['contexts'][] = 'multicurrency';
+  }
+}
diff --git a/commerce_currency_switcher.services.yml b/commerce_currency_switcher.services.yml
index dff83da..e98102c 100644
--- a/commerce_currency_switcher.services.yml
+++ b/commerce_currency_switcher.services.yml
@@ -4,3 +4,8 @@ services:
     arguments: ['@request_stack','@config.factory','@module_handler']
     tags:
      - { name: commerce_price.price_resolver, priority: 600 }
+  cache_context.multicurrency:
+    class: Drupal\commerce_currency_switcher\Cache\Context\CurrencyCacheContext
+    arguments: ['@current_user', '@request_stack']
+    tags:
+     - { name: cache.context }
\ No newline at end of file
diff --git a/src/Cache/Context/CurrencyCacheContext.php b/src/Cache/Context/CurrencyCacheContext.php
new file mode 100644
index 0000000..aaee0c3
--- /dev/null
+++ b/src/Cache/Context/CurrencyCacheContext.php
@@ -0,0 +1,68 @@
+<?php
+
+namespace Drupal\commerce_currency_switcher\Cache\Context;
+
+use Drupal\Core\Cache\Cache;
+use Drupal\Core\Cache\CacheableMetadata;
+use Drupal\Core\Cache\Context\CacheContextInterface;
+use Drupal\Core\Session\AccountInterface;
+use Symfony\Component\HttpFoundation\RequestStack;
+
+/**
+ * Defines the CurrencyCacheContext service, for "per currency" caching.
+ *
+ * Cache context ID: 'multicurrency'.
+ */
+class CurrencyCacheContext implements CacheContextInterface {
+
+  /**
+   * The current user.
+   *
+   * @var \Drupal\Core\Session\AccountInterface
+   */
+  protected $account;
+
+  /**
+   * Current request object.
+   *
+   * @var \Symfony\Component\HttpFoundation\Request
+   */
+  protected $request;
+
+
+  /**
+   * Constructs a new CurrencyCacheContext object.
+   *
+   * @param \Drupal\Core\Session\AccountInterface $account
+   *   The current user account.
+   * @param \Symfony\Component\HttpFoundation\RequestStack $request_stack
+   *   The request stack.
+   */
+  public function __construct(AccountInterface $account, RequestStack $request_stack) {
+    $this->account = $account;
+    $this->request = $request_stack->getCurrentRequest();
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function getLabel() {
+    return t('Current currency');
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getContext() {
+    return $this->request->getSession()->get('selected_currency');
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getCacheableMetadata() {
+    $metadata = new CacheableMetadata();
+    $metadata->setCacheMaxAge(Cache::PERMANENT);
+    return $metadata;
+  }
+}
diff --git a/src/Form/CurrencySwitchForm.php b/src/Form/CurrencySwitchForm.php
index 171144c..82dd68b 100644
--- a/src/Form/CurrencySwitchForm.php
+++ b/src/Form/CurrencySwitchForm.php
@@ -110,6 +110,9 @@ class CurrencySwitchForm extends FormBase {
       '#value' => t('Submit'),
     ];
 
+    // Add our cache context.
+    $form['#cache'] = ['contexts' => ['multicurrency']];
+
     return $form;
   }
 
