diff --git a/CHANGELOG.md b/CHANGELOG.md
index e65247c901fa95c330d9e95cfe25490b237b0e77..cdcc687a2ff6e8947505a6197e4f5199c366e9c0 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -8,6 +8,7 @@
 * Added Union Query Data Flow.
 * Added a field specification for a fixed value
 * Fixed #24
+* Improved export/import functionality. 
 
 # Version 1.3.0
 
diff --git a/CRM/Dataprocessor/Utils/Importer.php b/CRM/Dataprocessor/Utils/Importer.php
index 87d8b6eae80e53ab057f6f5407cc9b848f821d04..dd2f68b2b1cdbd8facff10e528ca781266b6e0bd 100644
--- a/CRM/Dataprocessor/Utils/Importer.php
+++ b/CRM/Dataprocessor/Utils/Importer.php
@@ -16,6 +16,8 @@ class CRM_Dataprocessor_Utils_Importer {
    * @throws \Exception
    */
   public static function export($data_processor_id) {
+    $factory = dataprocessor_get_factory();
+
     $dataProcessor = civicrm_api3('DataProcessor', 'getsingle', array('id' => $data_processor_id));
     unset($dataProcessor['id']);
     unset($dataProcessor['status']);
@@ -26,6 +28,10 @@ class CRM_Dataprocessor_Utils_Importer {
     foreach($sources['values'] as $i => $datasource) {
       unset($datasource['id']);
       unset($datasource['data_processor_id']);
+      $sourceClass = $factory->getDataSourceByName($datasource['type']);
+      if ($sourceClass instanceof \Civi\DataProcessor\Utils\AlterExportInterface) {
+        $datasource = $sourceClass->alterExportData($datasource);
+      }
       $dataProcessor['data_sources'][] = $datasource;
     }
     $filters = civicrm_api3('DataProcessorFilter', 'get', array('data_processor_id' => $data_processor_id, 'options' => array('limit' => 0)));
@@ -33,6 +39,10 @@ class CRM_Dataprocessor_Utils_Importer {
     foreach($filters['values'] as $i => $filter) {
       unset($filter['id']);
       unset($filter['data_processor_id']);
+      $filterClass = $factory->getFilterByName($filter['type']);
+      if ($filterClass instanceof \Civi\DataProcessor\Utils\AlterExportInterface) {
+        $filter = $filterClass->alterExportData($filter);
+      }
       $dataProcessor['filters'][] = $filter;
     }
     $fields = civicrm_api3('DataProcessorField', 'get', array('data_processor_id' => $data_processor_id, 'options' => array('limit' => 0)));
@@ -40,6 +50,10 @@ class CRM_Dataprocessor_Utils_Importer {
     foreach($fields['values'] as $i => $field) {
       unset($field['id']);
       unset($field['data_processor_id']);
+      $fieldClass = $factory->getOutputHandlerByName($field['type']);
+      if ($fieldClass instanceof \Civi\DataProcessor\Utils\AlterExportInterface) {
+        $field = $filterClass->alterExportData($field);
+      }
       $dataProcessor['fields'][] = $field;
     }
     $outputs = $outputs = civicrm_api3('DataProcessorOutput', 'get', array('data_processor_id' => $data_processor_id, 'options' => array('limit' => 0)));
@@ -47,6 +61,10 @@ class CRM_Dataprocessor_Utils_Importer {
     foreach($outputs['values'] as $i => $output) {
       unset($output['id']);
       unset($output['data_processor_id']);
+      $outputClass = $factory->getOutputByName($output['type']);
+      if ($outputClass instanceof \Civi\DataProcessor\Utils\AlterExportInterface) {
+        $output = $outputClass->alterExportData($output);
+      }
       $dataProcessor['outputs'][] = $output;
     }
 
@@ -148,6 +166,7 @@ class CRM_Dataprocessor_Utils_Importer {
    * @throws \Exception
    */
   public static function importDataProcessor($data, $filename, $data_processor_id, $status) {
+    $factory = dataprocessor_get_factory();
     $params = $data;
     unset($params['data_sources']);
     unset($params['outputs']);
@@ -174,6 +193,10 @@ class CRM_Dataprocessor_Utils_Importer {
     CRM_Dataprocessor_BAO_DataProcessorOutput::deleteWithDataProcessorId($id);
 
     foreach($data['data_sources'] as $data_source) {
+      $sourceClass = $factory->getDataSourceByName($data_source['type']);
+      if ($sourceClass instanceof \Civi\DataProcessor\Utils\AlterExportInterface) {
+        $data_source = $sourceClass->alterImportData($data_source);
+      }
       $params = $data_source;
       $params['data_processor_id'] = $id;
       $params['debug'] = 1;
@@ -184,16 +207,28 @@ class CRM_Dataprocessor_Utils_Importer {
       }
     }
     foreach($data['filters'] as $filter) {
+      $filterClass = $factory->getFilterByName($filter['type']);
+      if ($filterClass instanceof \Civi\DataProcessor\Utils\AlterExportInterface) {
+        $filter = $filterClass->alterImportData($filter);
+      }
       $params = $filter;
       $params['data_processor_id'] = $id;
       civicrm_api3('DataProcessorFilter', 'create', $params);
     }
     foreach($data['fields'] as $field) {
+      $fieldClass = $factory->getFilterByName($field['type']);
+      if ($fieldClass instanceof \Civi\DataProcessor\Utils\AlterExportInterface) {
+        $field = $fieldClass->alterImportData($field);
+      }
       $params = $field;
       $params['data_processor_id'] = $id;
       civicrm_api3('DataProcessorField', 'create', $params);
     }
     foreach($data['outputs'] as $output) {
+      $outputClass = $factory->getFilterByName($output['type']);
+      if ($outputClass instanceof \Civi\DataProcessor\Utils\AlterExportInterface) {
+        $output = $outputClass->alterImportData($output);
+      }
       $params = $output;
       $params['data_processor_id'] = $id;
       civicrm_api3('DataProcessorOutput', 'create', $params);
@@ -222,9 +257,9 @@ class CRM_Dataprocessor_Utils_Importer {
 
     // Remove all data processors which are in code or overridden but not imported
     $removeSql = "
-        SELECT id, name, status 
-        FROM civicrm_data_processor 
-        WHERE  status IN (".CRM_Dataprocessor_Status::STATUS_IN_CODE.", ".CRM_Dataprocessor_Status::STATUS_OVERRIDDEN.") 
+        SELECT id, name, status
+        FROM civicrm_data_processor
+        WHERE  status IN (".CRM_Dataprocessor_Status::STATUS_IN_CODE.", ".CRM_Dataprocessor_Status::STATUS_OVERRIDDEN.")
         AND source_file IS NOT NULL";
     if (count($importedIds)) {
       $removeSql .= " AND id NOT IN (".implode($importedIds, ",").")";
diff --git a/Civi/DataProcessor/DataSpecification/Utils.php b/Civi/DataProcessor/DataSpecification/Utils.php
index 8258012a7ad598addf8773ddafa852765dc15b61..4f39ca209b09784e51a9e07448b9938ded60f47a 100644
--- a/Civi/DataProcessor/DataSpecification/Utils.php
+++ b/Civi/DataProcessor/DataSpecification/Utils.php
@@ -26,6 +26,7 @@ class Utils {
       if (in_array($field['name'], $fieldsToSkip)) {
         continue;
       }
+      
       $type = \CRM_Utils_Type::typeToString($field['type']);
       $options = $daoClass::buildOptions($field['name']);
       $alias = $aliasPrefix.$field['name'];
diff --git a/Civi/DataProcessor/Source/Event/EventSource.php b/Civi/DataProcessor/Source/Event/EventSource.php
index 31048dfdc8eb09dd30c2e07f4a0e8e8e9ac45d93..be0126cde8a74085f865849b6245fe065dcf385d 100644
--- a/Civi/DataProcessor/Source/Event/EventSource.php
+++ b/Civi/DataProcessor/Source/Event/EventSource.php
@@ -14,9 +14,10 @@ use Civi\DataProcessor\DataSpecification\FieldSpecification;
 use Civi\DataProcessor\DataSpecification\Utils;
 use Civi\DataProcessor\Source\AbstractCivicrmEntitySource;
 
+use Civi\DataProcessor\Utils\AlterExportInterface;
 use CRM_Dataprocessor_ExtensionUtil as E;
 
-class EventSource extends AbstractCivicrmEntitySource {
+class EventSource extends AbstractCivicrmEntitySource implements AlterExportInterface {
 
   /**
    * @var SqlTableDataFlow
@@ -41,6 +42,70 @@ class EventSource extends AbstractCivicrmEntitySource {
     return 'civicrm_event';
   }
 
+  /**
+   * Function to alter the export data.
+   * E.g. use this to convert ids to names
+   *
+   * @param array $data
+   *
+   * @return array
+   */
+  public function alterExportData($data) {
+    if (isset($data['configuration']) && is_array($data['configuration'])) {
+      $configuration = $data['configuration'];
+
+      if (isset($configuration['filter']['event_type_id'])) {
+        $event_types = [];
+        foreach ($configuration['filter']['event_type_id']['value'] as $event_type_id) {
+          try {
+            $event_types[] = civicrm_api3('OptionValue', 'getvalue', [
+              'option_group_id' => 'event_type',
+              'value' => $event_type_id,
+              'return' => 'name'
+            ]);
+          } catch (\CiviCRM_API3_Exception $ex) {
+            $event_types[] = $event_type_id;
+          }
+        }
+        $configuration['filter']['event_type_id']['value'] = $event_types;
+      }
+
+      $data['configuration'] = $configuration;
+    }
+    return $data;
+  }
+
+  /**
+   * Function to alter the export data.
+   * E.g. use this to convert names to ids
+   *
+   * @param array $data
+   *
+   * @return array
+   */
+  public function alterImportData($data) {
+    if (isset($data['configuration']) && is_array($data['configuration'])) {
+      $configuration = $data['configuration'];
+      if (isset($configuration['filter']['event_type_id'])) {
+        $event_types = [];
+        foreach ($configuration['filter']['event_type_id']['value'] as $event_type_id) {
+          try {
+            $event_types[] = civicrm_api3('OptionValue', 'getvalue', [
+              'option_group_id' => 'event_type',
+              'name' => $event_type_id,
+              'return' => 'value'
+            ]);
+          } catch (\CiviCRM_API3_Exception $ex) {
+            $event_types[] = $event_type_id;
+          }
+        }
+        $configuration['filter']['event_type_id']['value'] = $event_types;
+      }
+      $data['configuration'] = $configuration;
+    }
+    return $data;
+  }
+
   /**
    * Load the fields from this entity.
    *
diff --git a/Civi/DataProcessor/Source/Event/ParticipantSource.php b/Civi/DataProcessor/Source/Event/ParticipantSource.php
index e9f102386259dd74f576c78a9b9544818ecba528..b0080db8a7b11d161ec2c8f1fe78e95f000d34d4 100644
--- a/Civi/DataProcessor/Source/Event/ParticipantSource.php
+++ b/Civi/DataProcessor/Source/Event/ParticipantSource.php
@@ -8,9 +8,10 @@ namespace Civi\DataProcessor\Source\Event;
 
 use Civi\DataProcessor\Source\AbstractCivicrmEntitySource;
 
+use Civi\DataProcessor\Utils\AlterExportInterface;
 use CRM_Dataprocessor_ExtensionUtil as E;
 
-class ParticipantSource extends AbstractCivicrmEntitySource {
+class ParticipantSource extends AbstractCivicrmEntitySource implements AlterExportInterface {
 
   /**
    * Returns the entity name
@@ -30,4 +31,98 @@ class ParticipantSource extends AbstractCivicrmEntitySource {
     return 'civicrm_participant';
   }
 
-}
\ No newline at end of file
+  /**
+   * Function to alter the export data.
+   * E.g. use this to convert ids to names
+   *
+   * @param array $data
+   *
+   * @return array
+   */
+  public function alterExportData($data) {
+    if (isset($data['configuration']) && is_array($data['configuration'])) {
+      $configuration = $data['configuration'];
+
+      if (isset($configuration['filter']['status_id'])) {
+        $status_ids = [];
+        foreach ($configuration['filter']['status_id']['value'] as $status_id) {
+          try {
+            $status_ids[] = civicrm_api3('ParticipantStatusType', 'getvalue', [
+              'id' => $status_id,
+              'return' => 'name'
+            ]);
+          } catch (\CiviCRM_API3_Exception $ex) {
+            $status_ids[] = $status_id;
+          }
+        }
+        $configuration['filter']['status_id']['value'] = $status_ids;
+      }
+
+      if (isset($configuration['filter']['role_id'])) {
+        $roles = [];
+        foreach ($configuration['filter']['role_id']['value'] as $role_id) {
+          try {
+            $roles[] = civicrm_api3('OptionValue', 'getvalue', [
+              'option_group_id' => 'participant_role',
+              'value' => $role_id,
+              'return' => 'name'
+            ]);
+          } catch (\CiviCRM_API3_Exception $ex) {
+            $roles[] = $role_id;
+          }
+        }
+        $configuration['filter']['role_id']['value'] = $roles;
+      }
+      $data['configuration'] = $configuration;
+    }
+    return $data;
+  }
+
+  /**
+   * Function to alter the export data.
+   * E.g. use this to convert names to ids
+   *
+   * @param array $data
+   *
+   * @return array
+   */
+  public function alterImportData($data) {
+    if (isset($data['configuration']) && is_array($data['configuration'])) {
+      $configuration = $data['configuration'];
+      if (isset($configuration['filter']['status_id'])) {
+        $status_ids = [];
+        foreach ($configuration['filter']['status_id']['value'] as $status_name) {
+          try {
+            $status_ids[] = civicrm_api3('ParticipantStatusType', 'getvalue', [
+              'name' => $status_name,
+              'return' => 'id'
+            ]);
+          } catch (\CiviCRM_API3_Exception $ex) {
+            $status_ids[] = $status_name;
+          }
+        }
+        $configuration['filter']['status_id']['value'] = $status_ids;
+      }
+
+      if (isset($configuration['filter']['role_id'])) {
+        $roles = [];
+        foreach ($configuration['filter']['role_id']['value'] as $role_name) {
+          try {
+            $roles[] = civicrm_api3('OptionValue', 'getvalue', [
+              'option_group_id' => 'participant_role',
+              'name' => $role_name,
+              'return' => 'value'
+            ]);
+          } catch (\CiviCRM_API3_Exception $ex) {
+            $roles[] = $role_name;
+          }
+        }
+        $configuration['filter']['role_id']['value'] = $roles;
+      }
+      $data['configuration'] = $configuration;
+    }
+    return $data;
+  }
+
+
+}
diff --git a/Civi/DataProcessor/Utils/AlterExportInterface.php b/Civi/DataProcessor/Utils/AlterExportInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..524e18eaa547c05d064ea968ad5c6be0075b54f7
--- /dev/null
+++ b/Civi/DataProcessor/Utils/AlterExportInterface.php
@@ -0,0 +1,31 @@
+<?php
+/**
+ * @author Jaap Jansma <jaap.jansma@civicoop.org>
+ * @license AGPL-3.0
+ */
+
+namespace Civi\DataProcessor\Utils;
+
+interface AlterExportInterface {
+
+  /**
+   * Function to alter the export data.
+   * E.g. use this to convert ids to names
+   *
+   * @param array $data
+   *
+   * @return array
+   */
+  public function alterExportData($data);
+
+  /**
+   * Function to alter the export data.
+   * E.g. use this to convert names to ids
+   *
+   * @param array $data
+   *
+   * @return array
+   */
+  public function alterImportData($data);
+
+}