diff --git wysiwyg.admin.inc wysiwyg.admin.inc
index 1d3b48f..2dce1d4 100644
--- wysiwyg.admin.inc
+++ wysiwyg.admin.inc
@@ -429,6 +429,9 @@ function wysiwyg_profile_overview() {
       $form['formats'][$id]['edit'] = array(
         '#value' => l(t('Edit'), "admin/settings/wysiwyg/profile/$id/edit"),
       );
+      $form['formats'][$id]['export'] = array(
+        '#value' => l(t('Export'), "admin/settings/wysiwyg/profile/$id/export"),
+      );
       $form['formats'][$id]['remove'] = array(
         '#value' => l(t('Remove'), "admin/settings/wysiwyg/profile/$id/delete"),
       );
@@ -455,6 +458,7 @@ function theme_wysiwyg_profile_overview(&$form) {
       drupal_render($format['name']),
       drupal_render($format['editor']),
       isset($format['edit']) ? drupal_render($format['edit']) : '',
+      isset($format['export']) ? drupal_render($format['export']) : '',
       isset($format['remove']) ? drupal_render($format['remove']) : '',
     );
   }
@@ -509,3 +513,76 @@ function wysiwyg_profile_delete($format) {
   db_query("DELETE FROM {wysiwyg} WHERE format = %d", $format);
 }
 
+/**
+* Import a format setting.
+*/
+function wysiwyg_import_format(&$form_state) {
+
+  $form['wysiwyg'] = array(
+    '#type' => 'textarea',
+    '#title' => t('Paste wysiwyg settings code here:'),
+    '#required' => TRUE,
+  );
+
+  $form['submit'] = array(
+    '#type' => 'submit',
+    '#value' => t('Import'),
+    '#submit' => array('wysiwyg_import_submit'),
+    '#validate' => array('wysiwyg_import_validate'),
+  );
+
+  return $form;
+}
+
+/**
+ * Validate that the pasted in code works.
+ */
+function wysiwyg_import_validate() {
+  $wysiwyg = '';
+  // Put any necessary includes here
+  ob_start();
+  eval($form_state['values']['wysiwyg']);
+  ob_end_clean();
+
+  if (!is_object($wysiwyg)) {
+    return form_error($form['wysiwyg'], t('Unable to interpret view code.'));
+  }
+  if (empty($wysiwyg->api_version) || $wysiwyg->api_version < 2) {
+    form_error($form['wysiwyg'], t('That wysiwyg format setting is not compatible with this version of the wysiwyg module.'));
+  }
+
+  // Refuse any settings that already exist for that format type
+  $settings_count = db_result(db_query("SELECT count(*) FROM {wysiwyg} WHERE format = %d", $wysiwyg->format));
+  if ($settings_count >= 1) {
+    form_error($form['wysiwyg'], t('Wysiwyg settings already exist for that input format type. Please delete the existing settings and attempt the import again if you wish to replace the existing settings.'));
+  }
+
+}
+
+/**
+ * Submit handler for wysiwyg settings import
+ */
+function wysiwyg_import_submit($form, &$form_state) {
+  // Check to see if the setting exits (should have been caught by validation hook above); if so give an error;
+  // else write the format settings to the database and then redirect the user to the edit page
+  $wysiwyg = '';
+  eval($form_state['values']['wysiwyg']);
+
+  $settings_count = db_result(db_query("SELECT count(*) FROM {wysiwyg} WHERE format = %d", $wysiwyg->format));
+  if ($settings_count >= 1) {
+    drupal_set_message(t("Settings for that format input type already existed; your import was not used and nothing was done.  Please delete the existing wysiwyg format settings for that input type and import again."), "error");
+    return;
+  }
+
+  // Write the settings to the database
+  $wysiwyg->settings = serialize($wysiwyg->settings);
+  $dwr_ret = drupal_write_record("wysiwyg", $wysiwyg);
+
+  if ($dwr_ret == FALSE) {
+    drupal_set_message(t("An error occurred when writing the settings to the database.") , "error");
+    return ;
+  }
+
+  $form_state['redirect'] = 'admin/settings/wysiwyg/profile/'. $wysiwyg->format .'/edit';
+
+}
diff --git wysiwyg.features.inc wysiwyg.features.inc
new file mode 100644
index 0000000..e74545b
--- /dev/null
+++ wysiwyg.features.inc
@@ -0,0 +1,11 @@
+<?php
+
+// $Id$
+
+/**
+ * This file is only neccesary to inform to features modules that
+ * Wysiwyg can export their settings.
+ *
+ * However all the export/import proccess is managed by ctools.
+ */
+
diff --git wysiwyg.install wysiwyg.install
index 26505d6..4fa5dac 100644
--- wysiwyg.install
+++ wysiwyg.install
@@ -8,6 +8,18 @@ function wysiwyg_schema() {
   $schema = array();
   $schema['wysiwyg'] = array(
     'description' => t('Stores Wysiwyg profiles.'),
+    'export' =>  array(
+      'key' => 'format',
+      'identifier' => 'wysiwyg',
+      'default hook' => 'wysiwyg_default_format',  // Function hook name.
+      'export callback' => 'wysiwyg_format_export',
+      'api' => array(
+        'owner' => 'wysiwyg',
+        'api' => 'wysiwyg_default_format', // Base name for api include files.
+        'minimum_version' => 2,
+        'current_version' => 2,
+      ),
+    ),
     'fields' => array(
       'format' => array('type' => 'int', 'not null' => TRUE, 'default' => 0),
       'editor' => array('type' => 'varchar', 'length' => 128, 'not null' => TRUE, 'default' => ''),
diff --git wysiwyg.module wysiwyg.module
index dd56833..60680a1 100644
--- wysiwyg.module
+++ wysiwyg.module
@@ -50,6 +50,21 @@ function wysiwyg_menu() {
     'type' => MENU_CALLBACK,
     'file' => 'wysiwyg.dialog.inc',
   );
+  $items['admin/settings/wysiwyg/profile/%/export'] = array(
+    'title' => 'Export',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('wysiwyg_export_format', 4),
+    'access arguments' => array('administer filters'),
+    'type' => MENU_CALLBACK,
+  );
+  $items['admin/settings/wysiwyg/import'] = array(
+    'title' => 'Import',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('wysiwyg_import_format', 3),
+    'access arguments' => array('administer filters'),
+    'file' => 'wysiwyg.admin.inc',
+    'type' => MENU_LOCAL_TASK,
+  );
   return $items;
 }
 
@@ -572,6 +587,15 @@ function wysiwyg_profile_load($format) {
       $profile->settings = unserialize($profile->settings);
       $profiles[$profile->format] = $profile;
     }
+    // For features integration: call each module's hook_wysiwyg_defaults if they have it,
+    // and if the settings for that format type don't already exist from being read from
+    // the database above, put them in the array.
+    $default_profiles = module_invoke_all('wysiwyg_default_format');
+    foreach ($default_profiles as $def_prof) {
+      if (!isset($profiles) || !array_key_exists( $def_prof->format, $profiles)) {
+        $profiles[$def_prof->format] = $def_prof;
+      }
+    }
   }
 
   return (isset($profiles[$format]) ? $profiles[$format] : FALSE);
@@ -590,6 +614,15 @@ function wysiwyg_profile_load_all() {
       $profile->settings = unserialize($profile->settings);
       $profiles[$profile->format] = $profile;
     }
+    // For features integration: call each module's hook_wysiwyg_defaults if they have it,
+    // and if the settings for that format type don't already exist from being read from
+    // the database above, put them in the array.
+    $default_profiles = module_invoke_all('wysiwyg_default_format');
+    foreach ($default_profiles as $def_prof) {
+      if (!array_key_exists($def_prof->format, $profiles)) {
+        $profiles[$def_prof->format] = $def_prof;
+      }
+    }
   }
 
   return $profiles;
@@ -949,6 +982,65 @@ function _wysiwyg_process_include($module, $identifier, $path, $hook) {
 }
 
 /**
+ * Export a format setting and display it in a form.
+ */
+function wysiwyg_export_format(&$form_state, $format) {
+  $obj = wysiwyg_format_load($format);
+
+  $formats = filter_formats();
+  $format_name = $formats[$format]->name;
+
+  drupal_set_title(t('Export @wysiwyg settings for: @format input format', array('@wysiwyg'=> $obj->editor, '@format' => $format_name)));
+  $code = wysiwyg_format_export($obj);
+  $lines = substr_count($code, "\n");
+
+  $form['export'] = array(
+    '#title' => t('Export data'),
+    '#type' => 'textarea',
+    '#value' => $code,
+    '#rows' => $lines,
+    '#description' => t('Copy the export text and paste it into another wysiwyg format using the import function.'),
+  );
+  return $form;
+}
+
+/**
+ * Load a single format setting.
+ */
+function wysiwyg_format_load($format) {
+  ctools_include('export');
+  $result = ctools_export_load_object('wysiwyg', 'names', array($format));
+
+  if (isset($result[$format])) {
+    return $result[$format];
+  }
+}
+
+/**
+ * Export wysiwyg settings.
+ */
+function wysiwyg_format_export($obj, $indent = '') {
+  ctools_include('export');
+  $obj->settings = unserialize($obj->settings);
+  $output = ctools_export_object('wysiwyg', $obj, $indent);
+  return $output;
+}
+
+/**
+ * Implementation of hook_features_api().
+ */
+function wysiwyg_features_api() {
+  return array(
+    'wysiwyg' => array(
+      'default_hook' => 'wysiwyg_default_format',
+      'default_file' => FEATURES_DEFAULTS_INCLUDED,
+      'features_source' => TRUE,
+      'file' => drupal_get_path('module', 'wysiwyg') .'/wysiwyg.features.inc',
+    ),
+  );
+}
+
+/**
  * @} End of "defgroup wysiwyg_api".
  */
 
