diff --git a/ds.module b/ds.module
index dfee280..c22a154 100644
--- a/ds.module
+++ b/ds.module
@@ -816,7 +816,7 @@ function ds_field_attach_view_alter(&$build, $context) {
         '#bundle' => $bundle,
         '#entity_type' => $entity_type,
         '#view_mode' => $view_mode,
-        '#access' => TRUE,
+        '#access' => (variable_get('ds_extras_field_permissions', FALSE) && function_exists('ds_extras_ds_field_access')) ? ds_extras_ds_field_access($key, $entity_type) : TRUE,
         '#items' => array(
           0 => array(
             'value' => $field_value,
diff --git a/modules/ds_extras/ds_extras.admin.inc b/modules/ds_extras/ds_extras.admin.inc
index b21c263..1f7bc02 100644
--- a/modules/ds_extras/ds_extras.admin.inc
+++ b/modules/ds_extras/ds_extras.admin.inc
@@ -140,6 +140,13 @@ function ds_extras_settings($form) {
     '#default_value' => variable_get('ds_extras_flag', FALSE),
   );
 
+  $form['additional_settings']['fs4']['ds_extras_field_permissions'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Field permissions'),
+    '#description' => t('Hide or manually set the page title of the "Full content" view mode.'),
+    '#default_value' => variable_get('ds_extras_field_permissions', FALSE),
+  );
+
   if (module_exists('block')) {
     $form['additional_settings']['fs4']['ds_extras_region_to_block'] = array(
       '#type' => 'checkbox',
diff --git a/modules/ds_extras/ds_extras.module b/modules/ds_extras/ds_extras.module
index b5e5222..55020b5 100644
--- a/modules/ds_extras/ds_extras.module
+++ b/modules/ds_extras/ds_extras.module
@@ -75,17 +75,30 @@ function ds_extras_entity_info() {
  * Implements hook_permission().
  */
 function ds_extras_permission() {
+  $permissions = array();
 
   // Extra check to make sure this doesn't get fired on install.
   if (variable_get('ds_extras_switch_view_mode', FALSE)) {
-    $permissions = array();
     foreach (node_type_get_names() as $key => $name) {
       $permissions['ds_switch ' . $key] = array(
         'title' => t('Switch view modes on :type', array(':type' => $name))
       );
     }
-    return $permissions;
   }
+
+  if (variable_get('ds_extras_field_permissions', FALSE)) {
+    $entities = entity_get_info();
+    foreach ($entities as $entity_type => $info) {
+      $fields = ds_get_fields($entity_type);
+      foreach ($fields as $key => $finfo) {
+        $permissions['view ' . $key . ' on ' . $entity_type] = array(
+          'title' => t('View !field on !entity_type', array('!field' => $finfo['title'], '!entity_type' => $info['label'])),
+        );
+      }
+    }
+  }
+
+  return $permissions;
 }
 
 /**
@@ -134,6 +147,23 @@ function ds_extras_form_field_ui_display_overview_form_alter(&$form, &$form_stat
 }
 
 /**
+ * DS fields access.
+ *
+ * @param $field
+ *   The machine name of the field
+ * @param $entity_type
+ *   The name of the entity type.
+ */
+function ds_extras_ds_field_access($field, $entity_type) {
+
+  if (user_access('view ' . $field . ' on ' . $entity_type)) {
+    return TRUE;
+  }
+
+  return FALSE;
+}
+
+/**
  * Implements hook_field_attach_view_alter().
  */
 function ds_extras_field_attach_view_alter(&$build, $context) {
diff --git a/modules/ds_extras/ds_extras.registry.inc b/modules/ds_extras/ds_extras.registry.inc
index 635f17e..6ea7da1 100644
--- a/modules/ds_extras/ds_extras.registry.inc
+++ b/modules/ds_extras/ds_extras.registry.inc
@@ -172,7 +172,6 @@ function _ds_extras_module_implements_alter(&$implementations, $hook) {
 
   // Switch view mode
   $switch_hooks = array(
-    'permission',
     'form_node_form_alter',
   );
   if (!variable_get('ds_extras_switch_view_mode', FALSE) && in_array($hook, $switch_hooks)) {
diff --git a/tests/ds.base.test b/tests/ds.base.test
index 042e9ba..02465e8 100644
--- a/tests/ds.base.test
+++ b/tests/ds.base.test
@@ -17,7 +17,7 @@ class dsBaseTest extends DrupalWebTestCase {
     variable_set('search_active_modules', array('node' => '', 'user' => 'user', 'ds_search' => 'ds_search'));
     menu_rebuild();
 
-    $this->admin_user = $this->drupalCreateUser(array('admin_view_modes', 'admin_fields', 'admin_display_suite', 'rel_build_registration', 'ds_switch article', 'use text format ds_code', 'access administration pages', 'administer content types', 'administer users', 'administer comments', 'administer nodes', 'bypass node access', 'administer blocks', 'search content', 'use advanced search', 'administer search', 'access user profiles'));
+    $this->admin_user = $this->drupalCreateUser(array('admin_view_modes', 'admin_fields', 'admin_display_suite', 'rel_build_registration', 'ds_switch article', 'use text format ds_code', 'access administration pages', 'administer content types', 'administer users', 'administer comments', 'administer nodes', 'bypass node access', 'administer blocks', 'search content', 'use advanced search', 'administer search', 'access user profiles', 'administer permissions'));
     $this->drupalLogin($this->admin_user);
   }
 
@@ -694,9 +694,58 @@ class dsLayoutsClassesTests extends dsBaseTest {
   }
 }
 
+/**
+ * Tests for Display Suite field permissions.
+ */
+class dsFieldPermissionTests extends dsBaseTest {
+
+  /**
+   * Implements getInfo().
+   */
+  public static function getInfo() {
+    return array(
+      'name' => t('Field permissions'),
+      'description' => t('Tests for testing field permissions.'),
+      'group' => t('Display suite'),
+    );
+  }
+
+  function testFieldPermissions() {
+
+    $fields = array(
+      'fields[body][region]' => 'right',
+      'fields[ds_test_field][region]' => 'left',
+    );
+
+    variable_set('ds_extras_field_permissions', TRUE);
+    $this->refreshVariables();
+    module_implements(FALSE, FALSE, TRUE);
+
+    $this->dsSelectLayout();
+    $this->dsConfigureUI($fields);
+
+    // Create a node.
+    $settings = array('type' => 'article');
+    $node = $this->drupalCreateNode($settings);
+    $this->drupalGet('node/' . $node->nid);
+    $this->assertNoRaw('group-left', 'Template found (but not region left)');
+    $this->assertRaw('group-right', 'Template found (region right)');
+    $this->assertNoText('Test code field on node ' . $node->nid, 'Test code field not found');
+
+    // Give permissions.
+    $edit = array(
+      '2[view author on node]' => 1,
+      '2[view ds_test_field on node]' => 1,
+    );
+    $this->drupalPost('admin/people/permissions', $edit, t('Save permissions'));
+    $this->drupalGet('node/' . $node->nid);
+    $this->assertRaw('group-left', 'Template found (region left)');
+    $this->assertText('Test code field on node ' . $node->nid, 'Test code field found');
+  }
+}
 
 /**
- * Tests for Display Suite hookds.
+ * Tests for Display Suite hooks.
  */
 class dsHooksTests extends dsBaseTest {
 
