diff --git a/semantic_fields.admin.inc b/semantic_fields.admin.inc
index ca948ba..9e0d39b 100644
--- a/semantic_fields.admin.inc
+++ b/semantic_fields.admin.inc
@@ -1,34 +1,4 @@
 <?php
-function semantic_fields_preset_list() {
-  $output  = '';
-
-  $header = array(
-    t('Name'),
-    t('Description'),
-    array('data' => t('Operations'), 'colspan' => 2),
-  );
-  $rows = array();
-
-  $presets = semantic_fields_get_presets();
-  foreach($presets as $preset) {
-    $rows[] = array(
-      check_plain($preset['human_name']),
-      check_plain($preset['description']),
-      l(t('edit'), 'admin/config/content/semantic-field-formats/' . $preset['name'] . '/edit'),
-      l(t('delete'), 'admin/config/content/semantic-field-formats/' . $preset['name'] . '/delete'),
-    );
-  }
-
-  if (count($rows) > 0) {
-    $output .= theme('table', array('header' => $header, 'rows' => $rows));
-  }
-  else {
-    $output .= t('No custom field formats have been added yet.');
-  }
-
-  return $output;
-}
-
 function semantic_fields_preset_form($form, &$form_state, $name = '') {
   if (!empty($name)) {
     drupal_set_title(t('Update field format'));
@@ -360,72 +330,24 @@ function semantic_fields_preset_form($form, &$form_state, $name = '') {
 
   return $form;
 }
-
-function semantic_fields_preset_form_validate($form, &$form_state) {
-  $op = $form_state['values']['basic_settings']['op'];
-  $name = $form_state['values']['basic_settings']['name'];
-  
-  // Invalid field name.
-  if (!preg_match('!^[a-z0-9_]+$!', $name)) {
-    form_set_error('basic_settings][name', t('The machine name %name is invalid. The name must include only lowercase unaccentuated letters, numbers, and underscores.', array('%name' => $name)));
-  }
-  if (strlen($name) > 32) {
-    form_set_error('basic_settings][name', t("The machine name %name is too long. The name is limited to 32 characters.", array('%name' => $name)));
-  }
-
-  if ($op == 'insert') {
-    // Machine name already exists.
-    $preset = semantic_fields_preset_load($name);
-    if ($preset) {
-      form_set_error('basic_settings][name', t("The machine name %name already exists.", array('%name' => $name)));
-    }
-  }
-}
-
-function semantic_fields_preset_form_submit($form, &$form_state) {
-  $op = $form_state['values']['basic_settings']['op'];
-
-  $preset = array(
-    'name' => $form_state['values']['basic_settings']['name'],
-    'human_name' => $form_state['values']['basic_settings']['human_name'],
-    'description' => $form_state['values']['basic_settings']['description'],
-    'data' => $form_state['values']['semantic_field_settings'],
-  );
-
-  if ($op == 'update') {
-    $preset_source = semantic_fields_preset_load($form_state['values']['basic_settings']['name']);
-    $preset = array_merge($preset_source, $preset);
-    drupal_write_record('semantic_fields_preset', $preset, 'id');
-  }
-  else {
-    drupal_write_record('semantic_fields_preset', $preset);
-    // When a new preset is created, the menu needs to be rebuilt.
-    variable_set('menu_rebuild_needed', TRUE);
-  }
-
-  drupal_set_message(t('Saved %label configuration.', array('%label' => $preset['human_name'])));
-
-  $form_state['redirect'] = 'admin/config/content/semantic-field-formats/list';
-}
-
-function semantic_fields_preset_delete_form($form, &$form_state, $name) {
-  // TODO: check if preset is being used on any fields.
-  
-  $form['name'] = array(
-    '#type' => 'value',
-    '#value' => $name,
-  );
-
-  return confirm_form($form, t('Are you sure you want to delete the field format %name?', array('%name' => $name)), 'admin/config/content/semantic-field-formats');
-}
-
-function semantic_fields_preset_delete_form_submit($form, &$form_state) {
-  db_delete('semantic_fields_preset')
-      ->condition('name', $form_state['values']['name'])
-      ->execute();
-  drupal_set_message(t('The field preset has been deleted.'));
-
-  // TODO: Update fields that were using the deleted preset to now use the default field format.
-
-  $form_state['redirect'] = 'admin/config/content/semantic-field-formats';
-}
\ No newline at end of file
+//
+//function semantic_fields_preset_form_validate($form, &$form_state) {
+//  $op = $form_state['values']['basic_settings']['op'];
+//  $name = $form_state['values']['basic_settings']['name'];
+//  
+//  // Invalid field name.
+//  if (!preg_match('!^[a-z0-9_]+$!', $name)) {
+//    form_set_error('basic_settings][name', t('The machine name %name is invalid. The name must include only lowercase unaccentuated letters, numbers, and underscores.', array('%name' => $name)));
+//  }
+//  if (strlen($name) > 32) {
+//    form_set_error('basic_settings][name', t("The machine name %name is too long. The name is limited to 32 characters.", array('%name' => $name)));
+//  }
+//
+//  if ($op == 'insert') {
+//    // Machine name already exists.
+//    $preset = semantic_fields_preset_load($name);
+//    if ($preset) {
+//      form_set_error('basic_settings][name', t("The machine name %name already exists.", array('%name' => $name)));
+//    }
+//  }
+//}
diff --git a/semantic_fields.info b/semantic_fields.info
index dbe1606..3b6ad13 100644
--- a/semantic_fields.info
+++ b/semantic_fields.info
@@ -4,4 +4,5 @@ configure = admin/config/content/semantic-field-formats
 package = Fields
 dependencies[] = field
 dependencies[] = field_ui
+dependencies[] = ctools
 core = 7.x
\ No newline at end of file
diff --git a/semantic_fields.install b/semantic_fields.install
index 6de0ca6..5eae171 100644
--- a/semantic_fields.install
+++ b/semantic_fields.install
@@ -20,10 +20,26 @@ function semantic_fields_schema() {
   $schema = array();
 
   $schema['semantic_fields_preset'] = array(
+    'description' => t('Table storing preset definitions.'),
+    'export' => array(
+      'key' => 'name',
+      'key name' => 'Semantic fields',
+      'primary key' => 'id',
+      'identifier' => 'preset',
+      'default hook' => 'default_semantic_fields_preset',
+      'load callback' => 'semantic_fields_preset_load',
+      'api' => array(
+        'owner' => 'semantic_fields',
+        'api' => 'default_semantic_fields_presets',
+        'minimum_version' => 1,
+        'current_version' => 1,
+      ),
+    ),
     'fields' => array(
       'id' => array(
         'type' => 'serial',
         'not null' => TRUE,
+        'no export' => TRUE, // Do not export database-only keys.
       ),
       'name' => array(
         'type' => 'varchar',
@@ -56,4 +72,4 @@ function semantic_fields_schema() {
   );
 
   return $schema;
-}
\ No newline at end of file
+}
diff --git a/semantic_fields.module b/semantic_fields.module
index 9b63ab3..c787202 100644
--- a/semantic_fields.module
+++ b/semantic_fields.module
@@ -1,56 +1,5 @@
 <?php
 /**
- * Implementation of hook_menu()
- */
-function semantic_fields_menu() {
-  $items = array();
-
-  $items['admin/config/content/semantic-field-formats'] = array(
-    'title' => 'Field formats',
-    'description' => 'Configure customized, semantic rich formats for use when displaying fields.',
-    'page callback' => 'semantic_fields_preset_list',
-    'access arguments' => array('administer semantic fields'),
-    'type' => MENU_NORMAL_ITEM,
-    'file' => 'semantic_fields.admin.inc',
-  );
-  $items['admin/config/content/semantic-field-formats/list'] = array(
-    'title' => 'List',
-    'page callback' => 'semantic_fields_preset_list',
-    'type' => MENU_DEFAULT_LOCAL_TASK,
-    'file' => 'semantic_fields.admin.inc',
-    'weight' => '-1'
-  );
-  $items['admin/config/content/semantic-field-formats/add'] = array(
-    'title' => 'Add field format',
-    'page callback' => 'drupal_get_form',
-    'page arguments' => array('semantic_fields_preset_form'),
-    'access arguments' => array('administer semantic fields'),
-    'type' => MENU_LOCAL_ACTION,
-    'file' => 'semantic_fields.admin.inc',
-  );
-  foreach (semantic_fields_get_presets() as $preset) {
-    $items['admin/config/content/semantic-field-formats/' . $preset['name'] . '/edit'] = array(
-      'title' => 'Edit field format',
-      'page callback' => 'drupal_get_form',
-      'page arguments' => array('semantic_fields_preset_form', 4),
-      'access arguments' => array('administer semantic fields'),
-      'type' => MENU_CALLBACK,
-      'file' => 'semantic_fields.admin.inc',
-    );
-    $items['admin/config/content/semantic-field-formats/' . $preset['name'] . '/delete'] = array(
-      'title' => 'Delete field format',
-      'page callback' => 'drupal_get_form',
-      'page arguments' => array('semantic_fields_preset_delete_form', 4),
-      'access arguments' => array('administer semantic fields'),
-      'type' => MENU_CALLBACK,
-      'file' => 'semantic_fields.admin.inc',
-    );
-  }
-
-  return $items;
-}
-
-/**
  * Implementation of hook_permission()
  */
 function semantic_fields_permission() {
@@ -129,21 +78,12 @@ function semantic_fields_get_presets() {
 }
 
 function semantic_fields_preset_load($name) {
-  $presets = &drupal_static(__FUNCTION__, array());
-
-  if (!isset($presets[$name])) {
-    $preset = db_select('semantic_fields_preset', 'p')
-      ->fields('p')
-      ->condition('name', $name)
-      ->execute()
-      ->fetchAssoc();
-    if ($preset) {
-      $preset['data'] = unserialize($preset['data']);
-      $presets[$name] = $preset;
-    }
+  ctools_include('export');
+  $result = ctools_export_load_object('semantic_fields_preset','names', array($name));
+  dpm($result);
+  if (isset($result[$name])) {
+    return $result[$name];
   }
-
-  return (isset($presets[$name]) && !empty($presets[$name])) ? $presets[$name] : array();
 }
 
 function semantic_fields_get_preset_options() {
@@ -399,4 +339,23 @@ function theme_semantic_field(&$variables) {
   }
 
   return $output;
-}
\ No newline at end of file
+}
+
+/**
+* Implementats hook_ctools_plugin_api().
+*/
+function semantic_fields_ctools_plugin_api($owner, $api) {
+  if ($owner == 'semantic_fields' && $api == 'default_semantic_fields_presets') {
+    return array('version' => 1);
+  }
+}
+
+/**
+* Implements hook_ctools_plugin_directory().
+*/
+function semantic_fields_ctools_plugin_directory($module, $type) {
+  // Load the export_ui plugin.
+  if ($type =='export_ui') {
+    return 'plugins/export_ui';
+  }
+}
