diff --git a/commerce_currency_switcher.module b/commerce_currency_switcher.module
new file mode 100644
index 0000000..14078a3
--- /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 (!empty($build['#commerce_product']) ||
+      !empty($build['#commerce_product_variation'])) {
+		// Add our cache context.
+		$build['#cache']['contexts'][] = 'multicurrency';
+	}
+}
diff --git a/commerce_currency_switcher.services.yml b/commerce_currency_switcher.services.yml
index dff83da..ede9914 100644
--- a/commerce_currency_switcher.services.yml
+++ b/commerce_currency_switcher.services.yml
@@ -1,6 +1,11 @@
 services:
-  commerce_currency_switcher.multicurrency_price_resolver:
-    class: Drupal\commerce_currency_switcher\Resolver\MulticurrencyPriceResolver
-    arguments: ['@request_stack','@config.factory','@module_handler']
-    tags:
-     - { name: commerce_price.price_resolver, priority: 600 }
+	commerce_currency_switcher.multicurrency_price_resolver:
+		class: Drupal\commerce_currency_switcher\Resolver\MulticurrencyPriceResolver
+		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..b5c97c8
--- /dev/null
+++ b/src/Cache/Context/CurrencyCacheContext.php
@@ -0,0 +1,69 @@
+<?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..b8082e5 100644
--- a/src/Form/CurrencySwitchForm.php
+++ b/src/Form/CurrencySwitchForm.php
@@ -16,126 +16,129 @@ use Symfony\Component\HttpFoundation\RequestStack;
  */
 class CurrencySwitchForm extends FormBase {
 
-  /**
-   * @var \Drupal\Core\Entity\EntityStorageInterface
-   */
-  protected $storage;
-
-  /**
-   * The current request.
-   *
-   * @var \Symfony\Component\HttpFoundation\Request
-   */
-  protected $currentRequest;
-
-  /**
-   * @var \Drupal\commerce_cart\CartProviderInterface
-   */
-  protected $cartProvider;
-
-  /**
-   * {@inheritdoc}
-   */
-  public function __construct(EntityTypeManagerInterface $entity_type_manager, RequestStack $requestStack, CartProviderInterface $cartProvider) {
-    $this->storage = $entity_type_manager->getStorage('commerce_currency');
-    $this->currentRequest = $requestStack->getCurrentRequest();
-    $this->cartProvider = $cartProvider;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public static function create(ContainerInterface $container) {
-    return new static(
-      $container->get('entity_type.manager'),
-      $container->get('request_stack'),
-      $container->get('commerce_cart.cart_provider')
-    );
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function getFormId() {
-    return 'currency_switch_form';
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function buildForm(array $form, FormStateInterface $form_state) {
-
-    $currency_list = [];
-
-    $active_currencies = $this->storage
-      ->loadByProperties([
-        'status' => TRUE,
-      ]);
-
-    // If no currency is imported or active, do not show any form.
-    if (empty($active_currencies)) {
-      return;
-    }
-
-    foreach ($active_currencies as $currency_code => $currency) {
-      /* @var \Drupal\commerce_price\Entity\Currency $currency */
-      $currency_list[$currency_code] = $currency->getName();
-    }
-
-    $session = $this->currentRequest->getSession();
-    $selected_currency = $session->has('selected_currency') ? $session->get('selected_currency') : '';
-
-    // If no currency is available in session, set the first currency in list as
-    // default one. This helps in Price resolver to return a default price.
-    if (empty($selected_currency)) {
-      $selected_currency = reset($currency_list);
-      $session->set('selected_currency', $selected_currency);
-    }
-
-    // Set the active currency list on site in state.
-    \Drupal::state()->set('active_currencies', $currency_list);
-
-    $form['currency'] = [
-      '#type' => 'select',
-      '#options' => $currency_list,
-      '#default_value' => $selected_currency,
-      '#attributes' => [
-        'class' => ['currency-select'],
-        'onChange' => ['this.form.submit()'],
-      ],
-    ];
-
-    $form['submit'] = [
-      '#type' => 'submit',
-      '#value' => t('Submit'),
-    ];
-
-    return $form;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function validateForm(array &$form, FormStateInterface $form_state) {
-    parent::validateForm($form, $form_state);
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function submitForm(array &$form, FormStateInterface $form_state) {
-    $selected_currency = $form_state->getValue('currency');
-
-    $session = $this->currentRequest->getSession();
-    $session->set('selected_currency', $selected_currency);
-
-    // Save the carts on change of the currency to trigger OrderRefresh.
-    $carts = $this->cartProvider->getCarts();
-    foreach ($carts as $cart) {
-      /* @var \Drupal\commerce_order\Entity\Order $cart */
-      $cart->save();
-    }
-  }
+	/**
+	 * @var \Drupal\Core\Entity\EntityStorageInterface
+	 */
+	protected $storage;
+
+	/**
+	 * The current request.
+	 *
+	 * @var \Symfony\Component\HttpFoundation\Request
+	 */
+	protected $currentRequest;
+
+	/**
+	 * @var \Drupal\commerce_cart\CartProviderInterface
+	 */
+	protected $cartProvider;
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function __construct(EntityTypeManagerInterface $entity_type_manager, RequestStack $requestStack, CartProviderInterface $cartProvider) {
+		$this->storage = $entity_type_manager->getStorage('commerce_currency');
+		$this->currentRequest = $requestStack->getCurrentRequest();
+		$this->cartProvider = $cartProvider;
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public static function create(ContainerInterface $container) {
+		return new static(
+			$container->get('entity_type.manager'),
+			$container->get('request_stack'),
+			$container->get('commerce_cart.cart_provider')
+		);
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function getFormId() {
+		return 'currency_switch_form';
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function buildForm(array $form, FormStateInterface $form_state) {
+
+		$currency_list = [];
+
+		$active_currencies = $this->storage
+			->loadByProperties([
+				'status' => TRUE,
+			]);
+
+		// If no currency is imported or active, do not show any form.
+		if (empty($active_currencies)) {
+			return;
+		}
+
+		foreach ($active_currencies as $currency_code => $currency) {
+			/* @var \Drupal\commerce_price\Entity\Currency $currency */
+			$currency_list[$currency_code] = $currency->getName();
+		}
+
+		$session = $this->currentRequest->getSession();
+		$selected_currency = $session->has('selected_currency') ? $session->get('selected_currency') : '';
+
+		// If no currency is available in session, set the first currency in list as
+		// default one. This helps in Price resolver to return a default price.
+		if (empty($selected_currency)) {
+			$selected_currency = reset($currency_list);
+			$session->set('selected_currency', $selected_currency);
+		}
+
+		// Set the active currency list on site in state.
+		\Drupal::state()->set('active_currencies', $currency_list);
+
+		$form['currency'] = [
+			'#type' => 'select',
+			'#options' => $currency_list,
+			'#default_value' => $selected_currency,
+			'#attributes' => [
+				'class' => ['currency-select'],
+				'onChange' => ['this.form.submit()'],
+			],
+		];
+
+		$form['submit'] = [
+			'#type' => 'submit',
+			'#value' => t('Submit'),
+		];
+
+		// Add our cache context.
+		$form['#cache'] = ['contexts' => ['multicurrency']];
+
+		return $form;
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function validateForm(array &$form, FormStateInterface $form_state) {
+		parent::validateForm($form, $form_state);
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function submitForm(array &$form, FormStateInterface $form_state) {
+		$selected_currency = $form_state->getValue('currency');
+
+		$session = $this->currentRequest->getSession();
+		$session->set('selected_currency', $selected_currency);
+
+		// Save the carts on change of the currency to trigger OrderRefresh.
+		$carts = $this->cartProvider->getCarts();
+		foreach ($carts as $cart) {
+			/* @var \Drupal\commerce_order\Entity\Order $cart */
+			$cart->save();
+		}
+	}
 
 }
 
diff --git a/src/Resolver/MulticurrencyPriceResolver.php b/src/Resolver/MulticurrencyPriceResolver.php
index e422187..b7cf65a 100644
--- a/src/Resolver/MulticurrencyPriceResolver.php
+++ b/src/Resolver/MulticurrencyPriceResolver.php
@@ -14,62 +14,62 @@ use Symfony\Component\HttpFoundation\RequestStack;
  */
 class MulticurrencyPriceResolver implements PriceResolverInterface {
 
-  /**
-   * Current request object.
-   *
-   * @var \Symfony\Component\HttpFoundation\Request
-   */
-  protected $request;
-
-  /**
-   * @var \Drupal\Core\Config\ConfigFactoryInterface
-   */
-  protected $configFactory;
-
-  /**
-   * @var \Drupal\Core\Extension\ModuleHandler
-   */
-  protected $moduleHandler;
-
-  /**
-   * {@inheritdoc}
-   */
-  public function __construct(RequestStack $request_stack, ConfigFactoryInterface $configFactory, ModuleHandler $moduleHandler) {
-    $this->request = $request_stack->getCurrentRequest();
-    $this->configFactory = $configFactory;
-    $this->moduleHandler = $moduleHandler;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function resolve(PurchasableEntityInterface $variation, $quantity, Context $context) {
-
-    $session = $this->request->getSession();
-
-    $currency_switch_config = $this->configFactory->getEditable('currency_switch_settings.settings');
-
-    if ($currency_switch_config->get('geoip_enable') && $this->moduleHandler->moduleExists('geoip')) {
-      $geo_locator = \Drupal::service('geoip.geolocation');
-      $ip_address = \Drupal::request()->getClientIp();
-      $country = $geo_locator->geolocate($ip_address);
-      if (is_object($country)) {
-        $currency_code = $country->getCurrencyCode();
-
-        $active_currencies = \Drupal::state()->get('active_currencies');
-        $currency_code = isset($active_currencies[$currency_code]) ? $currency_code : reset($active_currencies);
-        $session->set('selected_currency', $currency_code);
-      }
-    }
-
-    $selected_currency = $session->get('selected_currency');
-
-    $resolved_price_field = 'field_price_' . strtolower($selected_currency);
-    if (!empty($selected_currency) && $variation->hasField($resolved_price_field)) {
-      return $variation->get($resolved_price_field)->first()->toPrice();
-    }
-
-    return '';
-  }
+	/**
+	 * Current request object.
+	 *
+	 * @var \Symfony\Component\HttpFoundation\Request
+	 */
+	protected $request;
+
+	/**
+	 * @var \Drupal\Core\Config\ConfigFactoryInterface
+	 */
+	protected $configFactory;
+
+	/**
+	 * @var \Drupal\Core\Extension\ModuleHandler
+	 */
+	protected $moduleHandler;
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function __construct(RequestStack $request_stack, ConfigFactoryInterface $configFactory, ModuleHandler $moduleHandler) {
+		$this->request = $request_stack->getCurrentRequest();
+		$this->configFactory = $configFactory;
+		$this->moduleHandler = $moduleHandler;
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function resolve(PurchasableEntityInterface $variation, $quantity, Context $context) {
+
+		$session = $this->request->getSession();
+
+		$currency_switch_config = $this->configFactory->getEditable('currency_switch_settings.settings');
+
+		if ($currency_switch_config->get('geoip_enable') && $this->moduleHandler->moduleExists('geoip')) {
+			$geo_locator = \Drupal::service('geoip.geolocation');
+			$ip_address = \Drupal::request()->getClientIp();
+			$country = $geo_locator->geolocate($ip_address);
+			if (is_object($country)) {
+				$currency_code = $country->getCurrencyCode();
+
+				$active_currencies = \Drupal::state()->get('active_currencies');
+				$currency_code = isset($active_currencies[$currency_code]) ? $currency_code : reset($active_currencies);
+				$session->set('selected_currency', $currency_code);
+			}
+		}
+
+		$selected_currency = $session->get('selected_currency');
+
+		$resolved_price_field = 'field_price_' . strtolower($selected_currency);
+		if (!empty($selected_currency) && $variation->hasField($resolved_price_field)) {
+			return $variation->get($resolved_price_field)->first()->toPrice();
+		}
+
+		return '';
+	}
 
 }
