diff --git a/ds.api.php b/ds.api.php
index f85c229..5de14c2 100644
--- a/ds.api.php
+++ b/ds.api.php
@@ -339,6 +339,20 @@ function hook_ds_layout_info() {
 }
 
 /**
+ * Modify the field settings before they get saved.
+ *
+ * @param $field_settings
+ *   A collection of field settings which keys are fields.
+ * @param $form
+ *   The current form which is submitted.
+ * @param $form_state
+ *   The form state with all its values.
+ */
+function hook_ds_field_settings_alter(&$field_settings, $form, $form_state) {
+  $field_settings['title']['region'] = 'left';
+}
+
+/**
  * Alter the region options in the field UI screen.
  *
  * This function is only called when a layout has been chosen.
diff --git a/ds.field_ui.inc b/ds.field_ui.inc
index d8907ab..3e4a73c 100644
--- a/ds.field_ui.inc
+++ b/ds.field_ui.inc
@@ -243,19 +243,8 @@ function ds_field_ui_layouts_save($form, &$form_state) {
 
     foreach ($fields as $key => $field) {
 
-      // Ignore the Field group module and the region to block plugin.
-      if ($key == '_add_new_group' || $key == '_add_new_block_region') {
-        continue;
-      }
-
-      // If the field is in hidden region, do not save. Check if the
-      // field has a type key which means it's from Field API and
-      // we need to reset that type to 'hidden' so it doesn't get
-      // fired by Field API in the frontend.
-      if ($field['region'] == 'hidden') {
-        if (isset($field['type'])) {
-          $form_state['values']['fields'][$key]['type'] = 'hidden';
-        }
+      // Make sure we need to save anything for this field
+      if (_ds_field_valid($key, $field, $form_state)) {
         continue;
       }
 
@@ -301,7 +290,7 @@ function ds_field_ui_layouts_save($form, &$form_state) {
 }
 
 /**
- * Save the field settings from the 'Manage display' screen.
+ * Save the Display Suite field settings from the 'Manage display' screen.
  */
 function ds_field_ui_fields_save($form, &$form_state) {
 
@@ -345,6 +334,9 @@ function ds_field_ui_fields_save($form, &$form_state) {
     $field_settings[$field] = $settings;
   }
 
+  // Let other modules modify the field settings before they get saved.
+  drupal_alter('ds_field_settings', $field_settings, $form, $form_state);
+
   // Save the record.
   if (!empty($field_settings)) {
     $record = new stdClass;
@@ -596,10 +588,12 @@ function _ds_field_ui_fields($entity_type, $bundle, $view_mode, &$form, &$form_s
     return;
   }
 
-  // Get the fields.
+  // Get the fields and put them on the form.
   $fields = ds_get_fields($entity_type, FALSE);
   $field_settings = ds_get_field_settings($entity_type, $bundle, $view_mode);
 
+  $form['#field_settings'] = $field_settings;
+
   $table = &$form['fields'];
   $form['#ds_fields'] = array();
 
@@ -762,28 +756,52 @@ function _ds_field_ui_fields($entity_type, $bundle, $view_mode, &$form, &$form_s
 }
 
 /**
+ * Helper function to check if we need to save anything for this field.
+ */
+function _ds_field_valid($key, $field, $form_state) {
+  $continue = FALSE;
+
+  // Ignore the Field group module and the region to block plugin.
+  if ($key == '_add_new_group' || $key == '_add_new_block_region') {
+    $continue = TRUE;
+  }
+
+  // If the field is in hidden region, do not save. Check if the
+  // field has a type key which means it's from Field API and
+  // we need to reset that type to 'hidden' so it doesn't get
+  // fired by Field API in the frontend.
+  if ($field['region'] == 'hidden') {
+    if (isset($field['type'])) {
+      $form_state['values']['fields'][$key]['type'] = 'hidden';
+    }
+    $continue = TRUE;
+  }
+
+  return $continue;
+}
+
+/**
  * Return styles.
  */
-function _ds_styles() {
-  static $run = FALSE;
+function _ds_styles($name = 'ds_styles_regions') {
   static $styles = array();
 
-  if (!$run) {
-    $region_styles = trim(variable_get('ds_styles_regions', ''));
-    if (!empty($region_styles)) {
-      $styles[''] = t('None');
-      $region_styles = explode("\n", $region_styles);
-      foreach ($region_styles as $key => $value) {
+  if (!isset($styles[$name])) {
+    $styles[$name] = array();
+    $custom_styles = trim(variable_get($name, ''));
+    if (!empty($custom_styles)) {
+      $styles[$name][''] = t('None');
+      $custom_styles = explode("\n", $custom_styles);
+      foreach ($custom_styles as $key => $value) {
         $classes = explode("|", $value);
         $key = trim($classes[0]);
-        $name = isset($classes[1]) ? trim($classes[1]) : $key;
-        $styles[$key] = $name;
+        $friendly_name = isset($classes[1]) ? trim($classes[1]) : $key;
+        $styles[$name][$key] = $friendly_name;
       }
     }
-    $run = TRUE;
   }
 
-  return $styles;
+  return $styles[$name];
 }
 
 
diff --git a/ds.module b/ds.module
index ef94802..432e58d 100644
--- a/ds.module
+++ b/ds.module
@@ -402,6 +402,11 @@ function ds_field_attach_view_alter(&$build, $context) {
 
   foreach ($field_values as $key => $field) {
 
+    // Ignore if this field is not a DS field.
+    if (!isset($fields[$key])) {
+      continue;
+    }
+
     $field = $fields[$key];
     $field['formatter'] = $field_values[$key]['format'];
 
@@ -420,6 +425,7 @@ function ds_field_attach_view_alter(&$build, $context) {
         '#field_name' => $key,
         '#bundle' => $bundle,
         '#entity_type' => $entity_type,
+        '#view_mode' => $view_mode,
         '#access' => TRUE,
         '#items' => array(
           0 => array(
diff --git a/ds.registry.inc b/ds.registry.inc
index e1d3b2d..e473a90 100644
--- a/ds.registry.inc
+++ b/ds.registry.inc
@@ -21,10 +21,10 @@ function _ds_menu() {
     'file path' => drupal_get_path('module', 'system'),
   );
 
-  // Custom styles.
+  // Styles.
   $items['admin/structure/ds/styles'] = array(
     'title' => 'Styles',
-    'description' => 'Define classes which you can use as classes for regions.',
+    'description' => 'Define styles which you can use as classes on regions and fields (if available).',
     'page callback' => 'drupal_get_form',
     'page arguments' => array('ds_styles_form'),
     'file' => 'ds.styles.inc',
diff --git a/modules/ds_extras/ds_extras.install b/modules/ds_extras/ds_extras.install
index 95b723d..b683e94 100644
--- a/modules/ds_extras/ds_extras.install
+++ b/modules/ds_extras/ds_extras.install
@@ -75,6 +75,8 @@ function ds_extras_uninstall() {
   variable_del('ds_extras_region_blocks');
   variable_del('ds_extras_switch_view_mode');
   variable_del('ds_extras_vd');
+  variable_del('ds_extras_field_settings');
+  variable_del('ds_extras_field_styles');
   db_drop_field('node_revision', 'ds_switch');
 }
 
diff --git a/modules/ds_extras/ds_extras.module b/modules/ds_extras/ds_extras.module
index 3669048..ebfc30c 100644
--- a/modules/ds_extras/ds_extras.module
+++ b/modules/ds_extras/ds_extras.module
@@ -40,6 +40,15 @@ function ds_extras_module_implements_alter(&$implementations, $hook) {
   // Because it's possible to turn on/off features for DS extras,
   // we'll unset hooks here if necessary which otherwhise do nothing at all.
 
+  // Disable the field settings feature.
+  $fs_hooks = array(
+    'form_ds_styles_form_alter',
+    'ds_field_settings_alter'
+  );
+  if (!variable_get('ds_extras_field_settings', FALSE) && in_array($hook, $fs_hooks)) {
+    unset($implementations['ds_extras']);
+  }
+
   // Disable the region to block feature.
   $region_hooks = array(
     'ds_layout_region_alter',
@@ -66,12 +75,16 @@ function ds_extras_module_implements_alter(&$implementations, $hook) {
     'field_extra_fields',
     'entity_info',
     'ds_fields_info',
-    'theme_registry_alter',
     'ctools_plugin_api',
   );
   if (!variable_get('ds_extras_vd', FALSE) && in_array($hook, $vd_hooks)) {
     unset($implementations['ds_extras']);
   }
+
+  // Theme registry alter is used by 2 features.
+  if ((!variable_get('ds_extras_vd', FALSE) && !variable_get('ds_extras_field_settings', FALSE)) && $hook == 'theme_registry_alter') {
+    unset($implementations['ds_extras']);
+  }
 }
 
 /**
@@ -79,6 +92,18 @@ function ds_extras_module_implements_alter(&$implementations, $hook) {
  */
 function ds_extras_settings($form) {
 
+  $form['fs'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('Field settings'),
+  );
+
+  $form['fs']['ds_extras_field_settings'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Enable'),
+    '#description' => t('Toggle this checkbox to enable the "Field settings" functionality. With this feature, you can change properties per field: classes, label and wrapper.'),
+    '#default_value' => variable_get('ds_extras_field_settings', FALSE),
+  );
+
   $form['switch'] = array(
     '#type' => 'fieldset',
     '#title' => t('Switch view modes'),
@@ -131,10 +156,118 @@ function ds_extras_settings_submit($form, &$form_state) {
   // Clear module_implements cache and rebuild menu.
   cache_clear_all('entity_info:', 'cache', TRUE);
   cache_clear_all('module_implements', 'cache_bootstrap');
+  cache_clear_all('theme_registry:', 'cache', TRUE);
   menu_rebuild();
 }
 
 /**
+ * Implements hook_form_FORM_ID_alter().
+ */
+function ds_extras_form_ds_styles_form_alter(&$form, &$form_state) {
+  $form['ds_styles_fields'] = array(
+    '#type' => 'textarea',
+    '#title' => t('Styles for fields'),
+    '#default_value' => variable_get('ds_styles_fields', ''),
+    '#description' => t('Configure styles which you can add to fields on the "manage display" screens. Add multiple styles line per line.<br />If you want to have a friendly name, separate class and friendly name by |, but this is not required. eg:<br /><em>class_name_1<br />class_name_2|Friendly name<br />class_name_3</em>')
+  );
+}
+
+/**
+ * Implements hook_ds_field_settings_alter().
+ */
+function ds_extras_ds_field_settings_alter(&$field_settings, $form, $form_state) {
+
+  $fields = $form_state['values']['fields'];
+  foreach ($fields as $key => $field) {
+
+    // Make sure we need to save anything for this field.
+    if (_ds_field_valid($key, $field, $form_state)) {
+      continue;
+    }
+
+    // Get the values.
+    $values = $fields[$key];
+
+    // Do not save empty field classes.
+    $classes = implode(' ', $values['field_classes']);
+    if (!empty($classes)) {
+      $field_settings[$key]['field_classes'] = $classes;
+    }
+
+    // Remove classes on outher div.
+    if ($values['classes_remove']) {
+      $field_settings[$key]['classes_remove'] = TRUE;
+    }
+
+    // Another label.
+    if (!empty($values['field_label'])) {
+      $field_settings[$key]['field_label'] = $values['field_label'];
+    }
+
+    // Another wrapper.
+    if (!empty($values['field_wrapper'])) {
+      $field_settings[$key]['field_wrapper'] = $values['field_wrapper'];
+    }
+  }
+}
+
+/**
+ * Overriden function of theme_field().
+ */
+function theme_ds_field($variables) {
+  $output = '';
+
+  //dsm($variables);
+  $entity_type = $variables['element']['#entity_type'];
+  $bundle = $variables['element']['#bundle'];
+  $view_mode = $variables['element']['#view_mode'];
+  $field = $variables['element']['#field_name'];
+
+  $field_settings = ds_get_field_settings($entity_type, $bundle, $view_mode);
+
+  // Render the label, if it's not hidden.
+  if (!$variables['label_hidden']) {
+    $label = $variables['label'];
+    if (isset($field_settings[$field]['field_label'])) {
+      $label = t(check_plain($field_settings[$field]['field_label']));
+    }
+    $output .= '<div class="field-label"' . $variables['title_attributes'] . '>' . $label . ':&nbsp;</div>';
+  }
+
+  // Render the items.
+  $output .= '<div class="field-items"' . $variables['content_attributes'] . '>';
+  $wrapper = 'div';
+  if (isset($field_settings[$field]['field_wrapper'])) {
+    $wrapper = $field_settings[$field]['field_wrapper'];
+  }
+  foreach ($variables['items'] as $delta => $item) {
+    $classes = 'field-item ' . ($delta % 2 ? 'odd' : 'even');
+    $output .= '<' . $wrapper . ' class="' . $classes . '"' . $variables['item_attributes'][$delta] . '>' . drupal_render($item) . '</' . $wrapper . '>';
+  }
+  $output .= '</div>';
+
+  // Classes on the top-level DIV.
+  $space = ' ';
+  $top_level_classes = $variables['classes'];
+  if (isset($field_settings[$field]['classes_remove'])) {
+    $space = '';
+    $top_level_classes = '';
+  }
+  if (isset($field_settings[$field]['field_classes'])) {
+    $top_level_classes .= $space . strtr($field_settings[$field]['field_classes'], '_', '-');
+  }
+  if (!empty($top_level_classes)) {
+    $top_level_classes = ' class="' . $top_level_classes . '"';
+  }
+
+  // Render the top-level DIV.
+  $output = '<div' . $top_level_classes . '' . $variables['attributes'] . '>' . $output . '</div>';
+
+  return $output;
+}
+
+
+/**
  * Implements hook_permission().
  */
 function ds_extras_permission() {
@@ -233,6 +366,53 @@ function ds_extras_form_node_form_alter(&$form, $form_state, $form_id) {
  */
 function ds_extras_form_field_ui_display_overview_form_alter(&$form, &$form_state) {
 
+  // Field settings.
+  if (variable_get('ds_extras_field_settings', FALSE) && isset($form['#ds_layout'])) {
+
+    $field_settings = $form['#field_settings'];
+    $field_styles = _ds_styles('ds_styles_fields');
+
+    foreach (element_children($form['fields']) as $key) {
+
+      // Field styles.
+      if (!empty($field_styles)) {
+        $field_styles_select = array(
+          '#type' => 'select',
+          '#multiple' => TRUE,
+          '#options' => $field_styles,
+          '#default_value' => isset($field_settings[$key]['field_classes']) ? explode(' ', $field_settings[$key]['field_classes']) : array(),
+        );
+        $form['fields'][$key]['field_classes'] = $field_styles_select;
+      }
+      else {
+        $form['fields'][$key]['field_classes'] = array(
+          '#type' => 'value',
+          '#value' => array(''),
+        );
+      }
+
+      // Remove classes.
+      $form['fields'][$key]['classes_remove'] = array(
+        '#type' => 'checkbox',
+        '#default_value' => isset($field_settings[$key]['classes_remove']) ? TRUE : FALSE,
+      );
+
+      // Another label
+      $form['fields'][$key]['field_label'] = array(
+        '#type' => 'textfield',
+        '#title' => t('Label'),
+        '#default_value' => isset($field_settings[$key]['field_label']) ? $field_settings[$key]['field_label'] : '',
+      );
+
+      // Another wrapper
+      $form['fields'][$key]['field_wrapper'] = array(
+        '#type' => 'textfield',
+        '#title' => t('Wrapper'),
+        '#default_value' => isset($field_settings[$key]['field_wrapper']) ? $field_settings[$key]['field_wrapper'] : '',
+      );
+    }
+  }
+
   // Views displays.
   if (variable_get('ds_extras_vd', FALSE)) {
     // Add an additional submit callback.
@@ -490,6 +670,9 @@ function ds_extras_theme_registry_alter(&$theme_registry) {
   if (variable_get('ds_extras_vd', FALSE)) {
     $theme_registry['views_view']['preprocess functions'][] = 'ds_extras_preprocess_view';
   }
+  if (variable_get('ds_extras_field_settings', FALSE)) {
+    $theme_registry['field']['function'] = 'theme_ds_field';
+  }
 }
 
 /**
diff --git a/tests/ds.entities.test b/tests/ds.entities.test
index a2f950a..3b97ad4 100644
--- a/tests/ds.entities.test
+++ b/tests/ds.entities.test
@@ -16,13 +16,15 @@ class dsNodeTests extends dsBaseTest {
   public static function getInfo() {
     return array(
       'name' => t('Node display'),
-      'description' => t('Tests for display of nodes.'),
+      'description' => t('Tests for display of nodes and fields.'),
       'group' => t('Display suite'),
     );
   }
 
-  function testDSNodeEntity() {
-
+  /**
+   * Helper function to setup for all kinds of tests.
+   */
+  function entitiesTestSetup() {
     // Create a node.
     $settings = array('type' => 'article');
     $node = $this->drupalCreateNode($settings);
@@ -54,6 +56,7 @@ class dsNodeTests extends dsBaseTest {
       'fields[php_field][region]' => 'left',
       'fields[body][region]' => 'right',
       'fields[links][region]' => 'footer',
+      'fields[body][label]' => 'above',
     );
     $this->dsConfigureUI($fields);
 
@@ -87,6 +90,16 @@ class dsNodeTests extends dsBaseTest {
     );
     $this->dsConfigureUI($fields, 'admin/structure/types/manage/article/display/teaser');
 
+    return $node;
+  }
+
+  /**
+   * Test basic node display fields.
+   */
+  function testDSNodeEntity() {
+
+    $node = $this->entitiesTestSetup();
+
     // Switch view mode on full node page.
     $edit = array('ds_switch' => 'teaser');
     $this->drupalPost('node/' . $node->nid . '/edit', $edit, t('Save'));
@@ -136,4 +149,71 @@ class dsNodeTests extends dsBaseTest {
     $this->assertNoRaw('<h2>Recent content</h2>');
     $this->assertNoRaw('Recent content');
   }
+
+  /**
+   * Tests on field settings.
+   */
+  function testDSFieldSettings() {
+    $node = $this->entitiesTestSetup();
+
+    // Create field styles.
+    $edit = array('ds_styles_fields' => "test_field_class\ntest_field_class_2|Field class 2");
+    $this->drupalPost('admin/structure/ds/styles', $edit, t('Save configuration'));
+
+    // Standard theming of field.
+    $this->drupalGet('node/' . $node->nid);
+    $body_field = $node->body[$node->language][0]['value'];
+    $this->assertRaw("<div class=\"field field-name-body field-type-text-with-summary field-label-above\"><div class=\"field-label\">Body:&nbsp;</div><div class=\"field-items\"><div class=\"field-item even\" property=\"content:encoded\"><p>" . $body_field . "</p>
+</div></div></div>");
+
+    // With extra class.
+    $edit = array(
+      'fields[body][field_classes][]' => 'test_field_class'
+    );
+    $this->dsConfigureUI($edit);
+    $this->drupalGet('node/' . $node->nid);
+    $this->assertRaw("<div class=\"field field-name-body field-type-text-with-summary field-label-above test-field-class\"><div class=\"field-label\">Body:&nbsp;</div><div class=\"field-items\"><div class=\"field-item even\" property=\"content:encoded\"><p>" . $body_field . "</p>
+</div></div></div>");
+
+    // With 2  extra classes.
+    $edit = array(
+      'fields[body][field_classes][]' => array('test_field_class', 'test_field_class_2'),
+    );
+    $this->dsConfigureUI($edit);
+    $this->drupalGet('node/' . $node->nid);
+    $this->assertRaw("<div class=\"field field-name-body field-type-text-with-summary field-label-above test-field-class test-field-class-2\"><div class=\"field-label\">Body:&nbsp;</div><div class=\"field-items\"><div class=\"field-item even\" property=\"content:encoded\"><p>" . $body_field . "</p>
+</div></div></div>");
+
+    // With extra class but all other classes removed.
+    $edit = array(
+      'fields[body][classes_remove]' => '1',
+      'fields[body][field_classes][]' => 'test_field_class',
+    );
+    $this->dsConfigureUI($edit);
+    $this->drupalGet('node/' . $node->nid);
+    $this->assertRaw("<div class=\"test-field-class\"><div class=\"field-label\">Body:&nbsp;</div><div class=\"field-items\"><div class=\"field-item even\" property=\"content:encoded\"><p>" . $body_field . "</p>
+</div></div></div>");
+
+    // With another label.
+    $edit = array(
+      'fields[body][classes_remove]' => FALSE,
+      'fields[body][field_classes][]' => array(),
+      'fields[body][field_label]' => 'My body',
+    );
+    $this->dsConfigureUI($edit);
+    $this->drupalGet('node/' . $node->nid);
+    $this->assertRaw("<div class=\"test-field-class\"><div class=\"field-label\">My body:&nbsp;</div><div class=\"field-items\"><div class=\"field-item even\" property=\"content:encoded\"><p>" . $body_field . "</p>
+</div></div></div>");
+
+    // With another wrapper.
+    $edit = array(
+      'fields[body][field_label]' => '',
+      'fields[body][field_wrapper]' => 'span',
+    );
+    $this->dsConfigureUI($edit);
+    $this->drupalGet('node/' . $node->nid);
+    $this->assertRaw("<div class=\"field field-name-body field-type-text-with-summary field-label-above\"><div class=\"field-label\">Body:&nbsp;</div><div class=\"field-items\"><span class=\"field-item even\" property=\"content:encoded\"><p>" . $body_field . "</p>
+</span></div></div>");
+
+  }
 }
diff --git a/tests/ds_test.module b/tests/ds_test.module
index 02fcc7c..1916227 100644
--- a/tests/ds_test.module
+++ b/tests/ds_test.module
@@ -11,6 +11,7 @@
 function ds_test_install() {
   variable_set('ds_extras_region_to_block', TRUE);
   variable_set('ds_extras_switch_view_mode', TRUE);
+  variable_set('ds_extras_field_settings', TRUE);
 }
 
 /**
