diff --git a/CHANGELOG.txt b/CHANGELOG.txt
index dcd0530..8365916 100644
--- a/CHANGELOG.txt
+++ b/CHANGELOG.txt
@@ -3,6 +3,7 @@ Custom Formatters 7.x-2.x-dev, xxxx-xx-xx (development release)
 
 - #1920220: Fixed issue with coder review integration.
 - #1721294: Removed makefile.
+- #816924: Added Display suite integration.
 - Fixed issue when returning an empty result.
 
 
diff --git a/README.txt b/README.txt
index 8da13aa..63cb49c 100644
--- a/README.txt
+++ b/README.txt
@@ -29,6 +29,7 @@ Features
 * Integrates with:
   * Coder Review module - Review your Custom Formatter code for Drupal coding
       standards and more.
+  * Display Suite module - Format Display Suite fields.
   * Drupal Contextual links module - Adds a hover link for quick editing of
       Custom Formatters.
   * Entity tokens module - Leverages entity tokens for Field token support.
diff --git a/engines/token.inc b/engines/token.inc
index 707b7ce..ab2a483 100644
--- a/engines/token.inc
+++ b/engines/token.inc
@@ -36,9 +36,15 @@ function custom_formatters_engine_token_settings_form(&$form, $form_state, $item
   );
 
   $options = array();
-  foreach (field_info_field_types() as $type => $field) {
+  $fields = field_info_field_types();
+  // Give modules a chance to alter fields.
+  drupal_alter('custom_formatters_fields', $fields);
+  ksort($fields);
+
+  foreach ($fields as $type => $field) {
     $options[$field['module']][$type] = $field['label'];
   }
+  ksort($options);
   $form['field_types']['#type'] = 'select';
   $form['field_types']['#options'] = $options;
   unset($form['field_types']['#description']);
diff --git a/includes/ds.inc b/includes/ds.inc
new file mode 100644
index 0000000..c3041f1
--- /dev/null
+++ b/includes/ds.inc
@@ -0,0 +1,68 @@
+<?php
+/**
+ * @file
+ * Display Suite module integration.
+ */
+
+/**
+ * Implements hook_custom_formatters_fields_alter() on behalf of ds.module.
+ */
+function ds_custom_formatters_fields_alter(&$fields) {
+  foreach (array_keys(entity_get_info()) as $entity) {
+    $ds_fields = module_invoke_all('ds_fields_info', $entity);
+    if (is_array($ds_fields) && !empty($ds_fields)) {
+      foreach ($ds_fields[$entity] as $id => $field) {
+        if ($field['field_type'] == DS_FIELD_TYPE_FUNCTION) {
+          $fields['ds_' . $id] = array(
+            'module' => 'ds',
+            'label' => $field['title'],
+          );
+        }
+      }
+    }
+  }
+}
+
+/**
+ * Implements hook_ds_fields_info_alter().
+ */
+function custom_formatters_ds_fields_info_alter(&$fields, $entity_type) {
+  $formatters = custom_formatters_crud_load_all();
+  foreach ($formatters as $name => $formatter) {
+    foreach (drupal_explode_tags($formatter->field_types) as $field_type) {
+      if (strpos($field_type, 'ds_') === 0) {
+        $field_type = substr($field_type, 3);
+        if (isset($fields[$field_type]) && $fields[$field_type]['field_type'] == DS_FIELD_TYPE_FUNCTION) {
+          if (!isset($fields[$field_type]['#custom_formatters'])) {
+            $fields[$field_type]['#original_field'] = $fields[$field_type];
+            $fields[$field_type]['#custom_formatters'] = TRUE;
+            $fields[$field_type]['function'] = 'custom_formatters_ds_render_field';
+          }
+
+          $fields[$field_type]['properties']['formatters']['custom_formatters_' . $formatter->name] = $formatter->label;
+        }
+      }
+    }
+  }
+}
+
+/**
+ * Display Suite render function for Custom Formatters integration.
+ */
+function custom_formatters_ds_render_field($field) {
+  if (strpos($field['formatter'], 'custom_formatters_') === 0) {
+    $display = array('type' => $field['formatter']);
+    foreach (array_keys($field['properties']['formatters']) as $formatter) {
+      if (strpos($formatter, 'custom_formatters_') !== 0) {
+        $temp_field = $field;
+        $temp_field['formatter'] = $formatter;
+        $items[$formatter] = $field['#original_field']['function']($temp_field);
+      }
+    }
+    $element = custom_formatters_field_formatter_view($field['entity_type'], $field['entity'], $field, array(), language_default('language'), $items, $display);
+    return render($element);
+  }
+
+  // Pass field back to it's original function.
+  return $field['#original_field']['function']($field);
+}
diff --git a/plugins/export_ui/custom_formatters.inc b/plugins/export_ui/custom_formatters.inc
index eec2ebe..78414a6 100644
--- a/plugins/export_ui/custom_formatters.inc
+++ b/plugins/export_ui/custom_formatters.inc
@@ -435,9 +435,10 @@ function custom_formatters_autocomplete($string = '') {
   if ($last_string != '') {
     $prefix = count($array) ? implode(', ', $array) . ', ' : '';
 
-    $fields = array_keys(field_info_field_types());
+    $fields = field_info_field_types();
     // Give modules a chance to alter fields.
-    //drupal_alter('custom_formatters_fields', $fields);
+    drupal_alter('custom_formatters_fields', $fields);
+    $fields = array_keys($fields);
 
     sort($fields);
     foreach ($fields as $field) {
