diff --git a/ds.api.php b/ds.api.php
index 2c83ce5..e6df3fa 100644
--- a/ds.api.php
+++ b/ds.api.php
@@ -299,11 +299,11 @@ function hook_ds_fields_ui_alter(&$fields, $context) {
  * Define theme functions for fields.
  *
  * This only is necessary when you're using the field settings
- * plugin which comes with the DS extras module. This function
- * will call the theming functions directly, not through
- * theme('function', $variables); A function gets 2 parameters,
- * the $variables and $config which are the configuration options
- * for the current field: theme_ds_field_custom($variables, $config);
+ * plugin which comes with the DS extras module and you want to
+ * expose a special field theming function to the interface.
+ *
+ * The theme function gets $variables as the only parameter.
+ * The optional configuration through the UI is in $variables['ds-config'].
  *
  * @return $field_theme_functions
  *   A collection of field theming functions.
diff --git a/modules/ds_extras/ds_extras.admin.inc b/modules/ds_extras/ds_extras.admin.inc
index 0943b4d..11e3e05 100644
--- a/modules/ds_extras/ds_extras.admin.inc
+++ b/modules/ds_extras/ds_extras.admin.inc
@@ -58,18 +58,6 @@ function ds_extras_settings($form) {
     ),
   );
 
-  $form['additional_settings']['fs1']['ft-kill'] = array(
-    '#type' => 'checkbox',
-    '#title' => t('Remove theme suggestions'),
-    '#default_value' => variable_get('ft-kill', FALSE),
-    '#description' => t('Remove all theme suggestions from fields. If unsure, leave disabled.'),
-    '#states' => array(
-      'visible' => array(
-        'input[name="additional_settings[fs1][ds_extras_field_template]"]' => array('checked' => TRUE),
-      ),
-    ),
-  );
-
   $form['additional_settings']['fs2'] = array(
     '#type' => 'fieldset',
     '#title' => t('Extra fields'),
diff --git a/modules/ds_extras/ds_extras.install b/modules/ds_extras/ds_extras.install
index 4c86dec..ed14f03 100644
--- a/modules/ds_extras/ds_extras.install
+++ b/modules/ds_extras/ds_extras.install
@@ -126,7 +126,6 @@ function ds_extras_uninstall() {
   variable_del('ds_extras_editor_switch');
   variable_del('ds_extras_revision_view_mode');
   variable_del('ft-default');
-  variable_del('ft-kill');
   variable_del('ft-kill-colon');
   variable_del('ds_extras_contextual');
   db_drop_field('node_revision', 'ds_switch');
@@ -178,3 +177,10 @@ function ds_extras_update_7004() {
   $schema = ds_extras_schema();
   db_create_table('cache_ds_panels', $schema['cache_ds_panels']);
 }
+
+/**
+ * Cleanup ft-kill variable.
+ */
+function ds_extras_update_7005() {
+  variable_del('ft-kill');
+}
diff --git a/modules/ds_extras/ds_extras.module b/modules/ds_extras/ds_extras.module
index bf9050a..ff12acf 100644
--- a/modules/ds_extras/ds_extras.module
+++ b/modules/ds_extras/ds_extras.module
@@ -99,6 +99,21 @@ function ds_extras_menu() {
 }
 
 /**
+ * Implements hook_theme().
+ */
+function ds_extras_theme() {
+  $theme_functions = array();
+  $field_functions = module_invoke_all('ds_field_theme_functions_info');
+  foreach ($field_functions as $key => $label) {
+    $theme_functions[$key] = array(
+      'render element' => 'element',
+      'function' => $key,
+    );
+  }
+  return $theme_functions;
+}
+
+/**
  * Implements hook_entity_info().
  */
 function ds_extras_entity_info() {
@@ -222,16 +237,13 @@ function ds_extras_form_ds_styles_form_alter(&$form, &$form_state) {
 }
 
 /**
- * Overriden function of theme_field().
- *
- * This function is replaced in ds_extras_theme_registry_alter()
- * for every field. By default theme_field() is called directly.
+ * Implements hook_preprocess_field().
  */
-function theme_ds_field($variables) {
+function ds_preprocess_field(&$variables) {
 
   // We need to be sure this field is in a layout which is rendered by DS.
   if (!ds_get_layout($variables['element']['#entity_type'], $variables['element']['#bundle'], $variables['element']['#view_mode'])) {
-    return theme_field($variables);
+    return;
   }
 
   $config = array();
@@ -246,11 +258,12 @@ function theme_ds_field($variables) {
   // Check if this field has custom output settings.
   if (isset($field_settings[$variables['element']['#entity_type']][$variables['element']['#bundle']][$variables['element']['#view_mode']][$field_name]['ft'])) {
     $config = $field_settings[$variables['element']['#entity_type']][$variables['element']['#bundle']][$variables['element']['#view_mode']][$field_name]['ft'];
+    $variables['ds-config'] = $config;
   }
 
   // Styles
   if (isset($config['styles'])) {
-    $variables['classes'] .= ' ' . $config['styles'];
+    $variables['classes_array'][] = $config['styles'];
   }
 
   // Alter the label if configured.
@@ -260,21 +273,25 @@ function theme_ds_field($variables) {
     }
   }
 
-  // Call the field output function.
-  // We're not babysitting here, the function must exist.
+  // Determine the field function. In case it's something different
+  // than theme_field, we'll add that function as a suggestion.
   if (isset($config['func'])) {
-    return $config['func']($variables, $config);
+    $variables['ds-config'] = $config;
+    $variables['theme_hook_suggestions'][] = $config['func'];
+  }
+  else {
+    $field_theme_function = variable_get('ft-default', 'theme_field');
+    if ($field_theme_function != 'theme_field') {
+      $variables['ds-config'] = $config;
+      $variables['theme_hook_suggestions'][] = $field_theme_function;
+    }
   }
-
-  // Default field function.
-  $default_field_function = variable_get('ft-default', 'theme_field');
-  return $default_field_function($variables, $config);
 }
 
 /**
  * Reset all HTML for the field.
  */
-function theme_ds_field_reset($variables, $config) {
+function theme_ds_field_reset($variables) {
   $output = '';
 
   // Render the label.
@@ -297,9 +314,11 @@ function theme_ds_field_reset($variables, $config) {
 /**
  * Custom output all HTML for the field.
  */
-function theme_ds_field_expert($variables, $config) {
+function theme_ds_field_expert($variables) {
   $output = '';
 
+  $config = $variables['ds-config'];
+
   // Render the label if it's not hidden
   if (!$variables['label_hidden']) {
     if (isset($config['lb-el'])) {
diff --git a/modules/ds_extras/ds_extras.registry.inc b/modules/ds_extras/ds_extras.registry.inc
index 64cebea..630520c 100644
--- a/modules/ds_extras/ds_extras.registry.inc
+++ b/modules/ds_extras/ds_extras.registry.inc
@@ -138,20 +138,10 @@ function _ds_extras_theme_registry_alter(&$theme_registry) {
     $theme_registry['page']['process functions'][] = 'ds_extras_process_page_title';
   }
 
-  // Change the default field theming function.
-  if (variable_get('ds_extras_field_template', FALSE)) {
-
-    // We change the default theme_field function by ours.
-    $theme_registry['field']['function'] = 'theme_ds_field';
-
-    // Kill all theme hook suggestions.
-    if (variable_get('ft-kill', FALSE)) {
-      foreach ($theme_registry as $key => $hook) {
-        if (isset($hook['base hook']) && $hook['base hook'] == 'field') {
-          unset($theme_registry[$key]);
-        }
-      }
-    }
+  // Check on field templates.
+  if (!variable_get('ds_extras_field_template', FALSE)) {
+    $key = array_search('ds_preprocess_field', $theme_registry['field']['preprocess functions']);
+    unset($theme_registry['field']['preprocess functions'][$key]);
   }
 
   // Inject ds_extras_render_panel_layout in all entity theming functions.
@@ -185,6 +175,7 @@ function _ds_extras_module_implements_alter(&$implementations, $hook) {
   $fs_hooks = array(
     'ds_field_settings_alter',
     'form_ds_styles_form_alter',
+    'theme',
   );
   if (!variable_get('ds_extras_field_template', FALSE) && in_array($hook, $fs_hooks)) {
     unset($implementations['ds_extras']);
diff --git a/tests/ds.entities.test b/tests/ds.entities.test
index 351f9b9..d0bff7f 100644
--- a/tests/ds.entities.test
+++ b/tests/ds.entities.test
@@ -576,5 +576,16 @@ class dsNodeTests extends dsBaseTest {
     $this->assertRaw("<div class=\"group-right\">
       <div class=\"ow-class\"><div class=\"fi-class-2\"><span class=\"even fi-class\"><p>" . $body_field . "</p>
 </span></div></div>    </div>");
+
+    // Use the test field theming function to test that this function is
+    // registered in the theme registry through ds_extras_theme().
+    $edit = array(
+      'fields[body][format][ft][function]' => 'ds_test_theming_function',
+    );
+
+    $this->dsConfigureUI($edit);
+    $this->drupalGet('node/' . $node->nid);
+    $this->assertRaw("<div class=\"group-right\">
+      Testing field output through custom function    </div>");
   }
 }
diff --git a/tests/ds_test.module b/tests/ds_test.module
index 7181699..b3cbb85 100644
--- a/tests/ds_test.module
+++ b/tests/ds_test.module
@@ -94,6 +94,20 @@ function ds_test_ds_fields_info($entity_type) {
 }
 
 /**
+ * Implements hook_ds_field_theme_functions_info().
+ */
+function ds_test_ds_field_theme_functions_info() {
+  return array('ds_test_theming_function' => t('Field test function'));
+}
+
+/**
+ * Theme field test function.
+ */
+function ds_test_theming_function($variables) {
+  return 'Testing field output through custom function';
+}
+
+/**
  * Render the test code field.
  */
 function dstest_render_test_field($field) {
