diff --git a/modules/product/commerce_product_ui.module b/modules/product/commerce_product_ui.module
index 8a43d4d..5497faf 100644
--- a/modules/product/commerce_product_ui.module
+++ b/modules/product/commerce_product_ui.module
@@ -540,8 +540,12 @@ function commerce_product_ui_product_form_submit($form, &$form_state) {
  */
 function commerce_product_ui_product_form_translation_submit($form, &$form_state) {
   // Get an array of available languages.
+  $product = $form_state['commerce_product'];
   $available_languages = field_content_languages();
-  list(, , $bundle) = entity_extract_ids('commerce_product', $form_state['commerce_product']);
+  list(, , $bundle) = entity_extract_ids('commerce_product', $product);
+  $product->language = $form_state['values']['language'];
+  // Entity translation might be switching the form language.
+  $current_language = entity_language('commerce_product', $product);
 
   foreach (field_info_instances('commerce_product', $bundle) as $instance) {
     $field_name = $instance['field_name'];
@@ -550,8 +554,8 @@ function commerce_product_ui_product_form_translation_submit($form, &$form_state
 
     // Handle a possible language change; new language values are inserted and
     // the previous values are deleted.
-    if ($field['translatable'] && $previous_language != $form_state['values']['language']) {
-      $form_state['values'][$field_name][$form_state['values']['language']] = $form_state['commerce_product']->{$field_name}[$previous_language];
+    if ($field['translatable'] && $previous_language != $current_language) {
+      $form_state['values'][$field_name][$current_language] = $product->{$field_name}[$previous_language];
       $form_state['values'][$field_name][$previous_language] = array();
     }
   }
diff --git a/modules/product/includes/commerce_product.forms.inc b/modules/product/includes/commerce_product.forms.inc
index fa58bd3..5470d6c 100644
--- a/modules/product/includes/commerce_product.forms.inc
+++ b/modules/product/includes/commerce_product.forms.inc
@@ -14,7 +14,8 @@
  *     with only a product type defined.
  */
 function commerce_product_product_form($form, &$form_state, $product) {
-  $language = !empty($product->language) ? $product->language : LANGUAGE_NONE;
+  $language = entity_language('commerce_product', $product);
+  $language = !empty($language) ? $language : LANGUAGE_NONE;
 
   // Ensure this include file is loaded when the form is rebuilt from the cache.
   $form_state['build_info']['files']['form'] = drupal_get_path('module', 'commerce_product') . '/includes/commerce_product.forms.inc';
diff --git a/modules/product/includes/commerce_product.translation_handler.inc b/modules/product/includes/commerce_product.translation_handler.inc
index a1d38ad..6339a20 100644
--- a/modules/product/includes/commerce_product.translation_handler.inc
+++ b/modules/product/includes/commerce_product.translation_handler.inc
@@ -41,6 +41,25 @@ class EntityTranslationCommerceProductHandler extends EntityTranslationDefaultHa
   }
 
   /**
+   * Tweaks the product form to support multilingual elements.
+   */
+  public function entityForm(&$form, &$form_state) {
+    parent::entityForm($form, $form_state);
+    if (isset($form['change_history']['#weight'])) {
+      $form['translation']['#weight'] = $form['change_history']['#weight'] - 0.01;
+    }
+    $form['actions']['delete_translation']['#suffix'] = $form['actions']['submit']['#suffix'];
+    unset($form['actions']['submit']['#suffix']);
+  }
+
+  /**
+   * @see EntityTranslationDefaultHandler::entityFormTitle()
+   */
+  protected function entityFormTitle() {
+    return commerce_product_ui_product_title($this->entity);
+  }
+
+  /**
    * Returns whether the product is active (TRUE) or disabled (FALSE).
    */
   protected function getStatus() {
