diff --git a/entity_translation.module b/entity_translation.module
index 9aa0eb4..4a512d5 100644
--- a/entity_translation.module
+++ b/entity_translation.module
@@ -712,14 +712,14 @@ function entity_translation_permission() {
       'title' => t('Toggle field translatability'),
       'description' => t('Toggle translatability of fields performing a bulk update.'),
     ),
-    'edit translation shared fields' => array(
-      'title' => t('Edit shared fields'),
-      'description' => t('Edit fields shared between translations on the translation form.'),
-    ),
     'translate any entity' => array(
       'title' => t('Translate any entity'),
       'description' => t('Translate field content for any fieldable entity.'),
     ),
+    'edit translation shared fields' => array(
+      'title' => t('Edit shared fields'),
+      'description' => t('Edit fields shared between translations on the translation form.'),
+    ),
     'edit original values' => array(
       'title' => t('Edit original values'),
       'description' => t('Access any entity edit form in the original language.'),
@@ -743,6 +743,11 @@ function entity_translation_permission() {
         'title' => t('Edit original values on entities of type @type', array('@type' => $label)),
         'description' => t('Access the edit form in the original language for entities of type @type.', array('@type' => $label)),
       );
+
+      $permission["edit $entity_type translation shared fields"] = array(
+        'title' => t('Edit @type shared fields.', array('@type' => $label)),
+        'description' => t('Edit fields shared between translations on the @type translation form.', array('@type' => $label)),
+      );
     }
   }
 
@@ -1622,7 +1627,9 @@ function entity_translation_get_handler($entity_type = NULL, $entity = NULL, $up
   if (!isset($handlers[$entity_type][$entity_id])) {
     $entity_info = entity_get_info($entity_type);
     $class = $entity_info['translation']['entity_translation']['class'];
-    $handler = new $class($entity_type, $entity_info, $entity, $entity_id);
+    // @todo remove fourth parameter once 3rd-party translation handlers have
+    // been fixed and no longer require the deprecated entity_id parameter.
+    $handler = new $class($entity_type, $entity_info, $entity, NULL);
 
     // If the entity id is empty we cannot cache the translation handler
     // instance.
diff --git a/includes/translation.handler.comment.inc b/includes/translation.handler.comment.inc
index 2b5ba24..b574f1d 100644
--- a/includes/translation.handler.comment.inc
+++ b/includes/translation.handler.comment.inc
@@ -11,8 +11,8 @@
  */
 class EntityTranslationCommentHandler extends EntityTranslationDefaultHandler {
 
-  public function __construct($entity_type, $entity_info, $entity, $entity_id) {
-    parent::__construct('comment', $entity_info, $entity, $entity_id);
+  public function __construct($entity_type, $entity_info, $entity) {
+    parent::__construct('comment', $entity_info, $entity);
   }
 
   /**
diff --git a/includes/translation.handler.inc b/includes/translation.handler.inc
index 707f9dc..502787e 100644
--- a/includes/translation.handler.inc
+++ b/includes/translation.handler.inc
@@ -280,6 +280,7 @@ class EntityTranslationDefaultHandler implements EntityTranslationHandlerInterfa
   protected $entity;
   protected $entityInfo;
   protected $entityId;
+  protected $bundle;
 
   private $entityForm;
   private $translating;
@@ -304,13 +305,10 @@ class EntityTranslationDefaultHandler implements EntityTranslationHandlerInterfa
    *   The entity information for the entity being wrapped.
    * @param $entity
    *   The entity being wrapped.
-   * @param $entity_id
-   *   The identifier of the entity being wrapped.
    */
-  public function __construct($entity_type, $entity_info, $entity, $entity_id) {
+  public function __construct($entity_type, $entity_info, $entity) {
     $this->entityType = $entity_type;
     $this->entityInfo = $entity_info;
-    $this->entityId = $entity_id;
     $this->setEntity($entity);
 
     $this->entityForm = FALSE;
@@ -492,8 +490,7 @@ class EntityTranslationDefaultHandler implements EntityTranslationHandlerInterfa
 
     if (is_array($values)) {
       // Update field translations.
-      list(, , $bundle) = entity_extract_ids($this->entityType, $this->entity);
-      foreach (field_info_instances($this->entityType, $bundle) as $instance) {
+      foreach (field_info_instances($this->entityType, $this->bundle) as $instance) {
         $field_name = $instance['field_name'];
         $field = field_info_field($field_name);
         if ($field['translatable'] && isset($values[$field_name])) {
@@ -524,10 +521,8 @@ class EntityTranslationDefaultHandler implements EntityTranslationHandlerInterfa
       $this->entity->{$translations_key}->data = array();
     }
 
-    list(, , $bundle) = entity_extract_ids($this->entityType, $this->entity);
-
     // Remove field translations.
-    foreach (field_info_instances($this->entityType, $bundle) as $instance) {
+    foreach (field_info_instances($this->entityType, $this->bundle) as $instance) {
       $field_name = $instance['field_name'];
       $field = field_info_field($field_name);
 
@@ -585,9 +580,8 @@ class EntityTranslationDefaultHandler implements EntityTranslationHandlerInterfa
   public function initOriginalTranslation() {
     $fixed = FALSE;
     $translations = $this->getTranslations();
-    list(, , $bundle) = entity_extract_ids($this->entityType, $this->entity);
 
-    foreach (field_info_instances($this->entityType, $bundle) as $instance) {
+    foreach (field_info_instances($this->entityType, $this->bundle) as $instance) {
       $field_name = $instance['field_name'];
       $field = field_info_field($field_name);
       $langcode = count($this->entity->{$field_name}) == 1 ? key($this->entity->{$field_name}) : $translations->original;
@@ -635,8 +629,7 @@ class EntityTranslationDefaultHandler implements EntityTranslationHandlerInterfa
    * @see EntityTranslationHandlerInterface::getDefaultLanguage()
    */
   public function getDefaultLanguage() {
-    list(, , $bundle) = entity_extract_ids($this->entityType, $this->entity);
-    $settings = variable_get('entity_translation_settings_' . $this->entityType . '__' . $bundle, array());
+    $settings = variable_get('entity_translation_settings_' . $this->entityType . '__' . $this->bundle, array());
 
     if (!empty($settings['default_language'])) {
       switch ($settings['default_language']) {
@@ -712,6 +705,9 @@ class EntityTranslationDefaultHandler implements EntityTranslationHandlerInterfa
     if (!isset($this->entity->{$translations_key})) {
       $this->entity->{$translations_key} = self::emptyTranslations();
     }
+
+    // Update bundle and entity id properties.
+    list($this->entityId, , $this->bundle) = entity_extract_ids($this->entityType, $this->entity);
   }
 
   /**
@@ -921,6 +917,7 @@ class EntityTranslationDefaultHandler implements EntityTranslationHandlerInterfa
     $new_translation = !isset($translations->data[$form_langcode]);
     $no_translations = count($translations->data) < 2;
     $languages = language_list();
+    $access = user_access('translate any entity') || user_access("translate $this->entityType entities");
 
     // The only way to determine whether we are editing the original values is
     // comparing form language and entity language. Since a language change
@@ -944,6 +941,7 @@ class EntityTranslationDefaultHandler implements EntityTranslationHandlerInterfa
         '#collapsed' => TRUE,
         '#tree' => TRUE,
         '#weight' => -100,
+        '#access' => $access,
         'language' => array(
           '#type' => 'select',
           '#default_value' => $this->getSourceLanguage(),
@@ -997,7 +995,7 @@ class EntityTranslationDefaultHandler implements EntityTranslationHandlerInterfa
         '#collapsed' => TRUE,
         '#tree' => TRUE,
         '#weight' => 10,
-        '#access' => user_access('translate any entity') || user_access("translate $this->entityType entities"),
+        '#access' => $access,
       );
 
       $status = $new_translation || $translations->data[$form_langcode]['status'];
@@ -1076,14 +1074,30 @@ class EntityTranslationDefaultHandler implements EntityTranslationHandlerInterfa
     if (!empty($form['actions']['delete']['#submit'])) {
       $form['actions']['delete']['#submit'][] = 'entity_translation_entity_form_submit';
     }
+
+    // Hide shared fields if the user is not allowed to edit them.
+    $this->entityFormAccess($form, user_access('edit translation shared fields') || user_access("edit $this->entityType translation shared fields"));
+  }
+
+  /**
+   * Assign the given access to the form elements not defining one yet.
+   */
+  protected function entityFormAccess(&$form, $access) {
+    if (!$access) {
+      $allowed_types = array_flip(array('actions', 'container', 'value', 'hidden', 'vertical_tabs'));
+      foreach (element_children($form) as $key) {
+        if (!isset($form[$key]['#access']) && !isset($allowed_types[$form[$key]['#type']])) {
+          $form[$key]['#access'] = $access;
+        }
+      }
+    }
   }
 
   /**
    * @see EntityTranslationHandlerInterface::entityFormLanguageWidget()
    */
   public function entityFormLanguageWidget(&$form, &$form_state) {
-    list(, , $bundle) = entity_extract_ids($this->entityType, $this->entity);
-    $settings = entity_translation_settings($this->entityType, $bundle);
+    $settings = entity_translation_settings($this->entityType, $this->bundle);
     $translations = $this->getTranslations();
     $is_new = $this->isNewEntity();
     $is_translation = !$is_new && !empty($form_state['entity_translation']['is_translation']);
@@ -1152,9 +1166,8 @@ class EntityTranslationDefaultHandler implements EntityTranslationHandlerInterfa
    */
   function entityFormLanguageWidgetSubmit($form, &$form_state) {
     $form_langcode = $this->getFormLanguage();
-    list(, , $bundle) = entity_extract_ids($this->entityType, $this->entity);
 
-    foreach (field_info_instances($this->entityType, $bundle) as $instance) {
+    foreach (field_info_instances($this->entityType, $this->bundle) as $instance) {
       $field_name = $instance['field_name'];
       $field = field_info_field($field_name);
       $previous_langcode = $form[$field_name]['#language'];
diff --git a/includes/translation.handler.node.inc b/includes/translation.handler.node.inc
index cd7545a..6d82175 100644
--- a/includes/translation.handler.node.inc
+++ b/includes/translation.handler.node.inc
@@ -13,8 +13,8 @@
  */
 class EntityTranslationNodeHandler extends EntityTranslationDefaultHandler {
 
-  public function __construct($entity_type, $entity_info, $entity, $entity_id) {
-    parent::__construct('node', $entity_info, $entity, $entity_id);
+  public function __construct($entity_type, $entity_info, $entity) {
+    parent::__construct('node', $entity_info, $entity);
   }
 
   /**
diff --git a/includes/translation.handler.taxonomy_term.inc b/includes/translation.handler.taxonomy_term.inc
index bb15b4c..800e106 100644
--- a/includes/translation.handler.taxonomy_term.inc
+++ b/includes/translation.handler.taxonomy_term.inc
@@ -11,8 +11,8 @@
  */
 class EntityTranslationTaxonomyTermHandler extends EntityTranslationDefaultHandler {
 
-  public function __construct($entity_type, $entity_info, $entity, $entity_id) {
-    parent::__construct('taxonomy_term', $entity_info, $entity, $entity_id);
+  public function __construct($entity_type, $entity_info, $entity) {
+    parent::__construct('taxonomy_term', $entity_info, $entity);
   }
 
   /**
diff --git a/includes/translation.handler.user.inc b/includes/translation.handler.user.inc
index bfc3a28..53b353b 100644
--- a/includes/translation.handler.user.inc
+++ b/includes/translation.handler.user.inc
@@ -11,8 +11,8 @@
  */
 class EntityTranslationUserHandler extends EntityTranslationDefaultHandler {
 
-  public function __construct($entity_type, $entity_info, $entity, $entity_id) {
-    parent::__construct('user', $entity_info, $entity, $entity_id);
+  public function __construct($entity_type, $entity_info, $entity) {
+    parent::__construct('user', $entity_info, $entity);
   }
 
   /**
