diff --git a/CRM/Dataprocessor/BAO/DataProcessor.php b/CRM/Dataprocessor/BAO/DataProcessor.php
index 57625c534864d46622ce9e0beffe28660cc953ae..d06e4bd334d0819aea284db7759a7293decd6107 100644
--- a/CRM/Dataprocessor/BAO/DataProcessor.php
+++ b/CRM/Dataprocessor/BAO/DataProcessor.php
@@ -1,179 +1,30 @@
 <?php
-/**
- * @author Jaap Jansma <jaap.jansma@civicoop.org>
- * @license AGPL-3.0
- */
+use CRM_Dataprocessor_ExtensionUtil as E;
 
 class CRM_Dataprocessor_BAO_DataProcessor extends CRM_Dataprocessor_DAO_DataProcessor {
 
-  static $importingDataProcessors = array();
-
-  /**
-   * Function to get values
-   *
-   * @return array $result found rows with data
-   * @access public
-   * @static
-   */
-  public static function getValues($params) {
-    $result = array();
-    $dataProcessor = new CRM_Dataprocessor_DAO_DataProcessor();
-    if (!empty($params)) {
-      $fields = self::fields();
-      foreach ($params as $key => $value) {
-        if (isset($fields[$key])) {
-          $dataProcessor->$key = $value;
-        }
-      }
-    }
-    $dataProcessor->find();
-    while ($dataProcessor->fetch()) {
-      $row = array();
-      self::storeValues($dataProcessor, $row);
-      if (!empty($row['aggregation'])) {
-        $row['aggregation'] = json_decode($row['aggregation'], true);
-      } else {
-        $row['aggregation'] = array();
-      }
-      $result[$row['id']] = $row;
-    }
-    return $result;
-  }
-
-  /**
-   * Function to add or update a DataProcessor
-   *
-   * @param array $params
-   * @return array $result
-   * @access public
-   * @throws Exception when params is empty
-   * @static
-   */
-  public static function add($params) {
-    $result = array();
-    if (empty($params)) {
-      throw new Exception('Params can not be empty when adding or updating a data processor');
-    }
-
-    if (!empty($params['id'])) {
-      CRM_Utils_Hook::pre('edit', 'DataProcessor', $params['id'], $params);
-    }
-    else {
-      CRM_Utils_Hook::pre('create', 'DataProcessor', NULL, $params);
-    }
-
-    $dataProcessor = new CRM_Dataprocessor_DAO_DataProcessor();
-    $fields = self::fields();
-    foreach ($params as $key => $value) {
-      if (isset($fields[$key])) {
-        $dataProcessor->$key = $value;
-      }
-    }
-    if (empty($dataProcessor->name) && !empty($dataProcessor->title)) {
-      $dataProcessor->name = self::buildNameFromTitle($dataProcessor->title);
-    }
-    if (empty($dataProcessor->type)) {
-      $dataProcessor->type = 'default';
-    }
-    if (isset($dataProcessor->configuration) && is_array($dataProcessor->configuration)) {
-      $dataProcessor->configuration = json_encode($dataProcessor->configuration);
-    }
-    if (isset($dataProcessor->aggregation) && is_array($dataProcessor->aggregation)) {
-      $dataProcessor->aggregation = json_encode($dataProcessor->aggregation);
-    }
-    if (isset($dataProcessor->storage_configuration) && is_array($dataProcessor->storage_configuration)) {
-      $dataProcessor->storage_configuration = json_encode($dataProcessor->storage_configuration);
-    }
-
-    $dataProcessor->save();
-    self::storeValues($dataProcessor, $result);
-    CRM_Dataprocessor_BAO_DataProcessor::updateAndChekStatus($dataProcessor->id);
-
-    if (!empty($params['id'])) {
-      CRM_Utils_Hook::post('edit', 'DataProcessor', $dataProcessor->id, $dataProcessor);
-    }
-    else {
-      CRM_Utils_Hook::post('create', 'DataProcessor', $dataProcessor->id, $dataProcessor);
-    }
-
-    return $result;
-  }
-
-  /**
-   * Function to delete a FormProcessorInstance with id
-   *
-   * @param int $id
-   * @throws Exception when $id is empty
-   * @access public
-   * @static
-   */
-  public static function deleteWithId($id) {
-    if (empty($id)) {
-      throw new Exception('id can not be empty when attempting to delete a data processor');
+  public static function checkName($title, $id=null,$name=null) {
+    if (!$name) {
+      $name = preg_replace('@[^a-z0-9_]+@','_',strtolower($title));
     }
 
-    CRM_Utils_Hook::pre('delete', 'DataProcessor', $id, CRM_Core_DAO::$_nullArray);
-
-    CRM_Dataprocessor_BAO_DataProcessorOutput::deleteWithDataProcessorId($id);
-    CRM_Dataprocessor_BAO_DataProcessorFilter::deleteWithDataProcessorId($id);
-    CRM_Dataprocessor_BAO_DataProcessorField::deleteWithDataProcessorId($id);
-    CRM_Dataprocessor_BAO_DataProcessorSource::deleteWithDataProcessorId($id);
-
-    $dataProcessor = new CRM_Dataprocessor_DAO_DataProcessor();
-    $dataProcessor->id = $id;
-    $dataProcessor->delete();
-
-    CRM_Utils_Hook::post('delete', 'DataProcessor', $id, CRM_Core_DAO::$_nullArray);
+    $name = preg_replace('@[^a-z0-9_]+@','_',strtolower($name));
+    $name_part = $name;
 
-    return;
-  }
-
-  /**
-   * Function to disable a data processor
-   *
-   * @param int $id
-   * @throws Exception when id is empty
-   * @access public
-   * @static
-   */
-  public static function disable($id) {
-    if (empty($id)) {
-      throw new Exception('id can not be empty when attempting to disable a data processor');
+    $sql = "SELECT COUNT(*) FROM `civicrm_data_processor` WHERE `name` = %1";
+    $sqlParams[1] = array($name, 'String');
+    if ($id) {
+      $sql .= " AND `id` != %2";
+      $sqlParams[2] = array($id, 'Integer');
     }
-    $dataProcessor = new CRM_Dataprocessor_BAO_DataProcessor();
-    $dataProcessor->id = $id;
-    $dataProcessor->find(true);
-    self::add(array('id' => $dataProcessor->id, 'is_active' => 0));
-  }
 
-  /**
-   * Function to enable a data processor
-   *
-   * @param int $id
-   * @throws Exception when id is empty
-   * @access public
-   * @static
-   */
-  public static function enable($id) {
-    if (empty($id)) {
-      throw new Exception('id can not be empty when attempting to enable a data processor');
+    $i = 1;
+    while(CRM_Core_DAO::singleValueQuery($sql, $sqlParams) > 0) {
+      $i++;
+      $name = $name_part .'_'.$i;
+      $sqlParams[1] = array($name, 'String');
     }
-    $dataProcessor = new CRM_Dataprocessor_BAO_DataProcessor();
-    $dataProcessor->id = $id;
-    $dataProcessor->find(true);
-    self::add(array('id' => $dataProcessor->id, 'is_active' => 1));
-  }
-
-  /**
-   * Public function to generate name from title
-   *
-   * @param $label
-   * @return string
-   * @access public
-   * @static
-   */
-  public static function buildNameFromTitle($title) {
-    return preg_replace('@[^a-z0-9_]+@','_', strtolower($title));
+    return $name;
   }
 
   /**
@@ -185,10 +36,6 @@ class CRM_Dataprocessor_BAO_DataProcessor extends CRM_Dataprocessor_DAO_DataProc
    * @static
    */
   public static function isNameValid($name, $id=null) {
-    $invalidNames = array('getactions', 'getfields', 'get', 'create', 'delete');
-    if (in_array(strtolower($name), $invalidNames)) {
-      return false;
-    }
     $sql = "SELECT COUNT(*) FROM `civicrm_data_processor` WHERE `name` = %1";
     $params[1] = array($name, 'String');
     if ($id) {
@@ -202,282 +49,49 @@ class CRM_Dataprocessor_BAO_DataProcessor extends CRM_Dataprocessor_DAO_DataProc
   /**
    * Returns a configured data processor instance.
    *
-   * @param String $output_type
-   * @param String $name
-   * @return \Civi\DataProcessor\ProcessorType\AbstractProcessorType
-   * @throws \Exception when no data processor is found.
-   */
-  public static function getDataProcessorById($id) {
-    $sql = "
-      SELECT civicrm_data_processor.* 
-      FROM civicrm_data_processor 
-      WHERE id = %1
-    ";
-    $params[1] = [$id, 'Integer'];
-    $dao = CRM_Dataprocessor_BAO_DataProcessor::executeQuery($sql, $params, TRUE, 'CRM_Dataprocessor_BAO_DataProcessor');
-    if ($dao->N != 1) {
-      throw new \Exception('Could not find Data Processor');
-    }
-    $dao->fetch();
-    return $dao->getDataProcessor();
-  }
-
-  /**
-   * Returns a configured data processor instance.
-   *
-   * @param String $output_type
-   * @param String $name
-   * @return \Civi\DataProcessor\ProcessorType\AbstractProcessorType
-   * @throws \Exception when no data processor is found.
-   */
-  public static function getDataProcessorByOutputTypeAndName($output_type, $name) {
-    $sql = "
-      SELECT civicrm_data_processor.* 
-      FROM civicrm_data_processor 
-      INNER JOIN civicrm_data_processor_output ON civicrm_data_processor.id = civicrm_data_processor_output.data_processor_id
-      WHERE is_active = 1 AND civicrm_data_processor.name = %1 AND civicrm_data_processor_output.type = %2
-    ";
-    $params[1] = array($name, 'String');
-    $params[2] = array($output_type, 'String');
-    $dao = CRM_Dataprocessor_BAO_DataProcessor::executeQuery($sql, $params, TRUE, 'CRM_Dataprocessor_BAO_DataProcessor');
-    if ($dao->N != 1) {
-      throw new \Exception('Could not find Data Processor');
-    }
-    $dao->fetch();
-    return $dao->getDataProcessor();
-  }
-
-  /**
-   * Returns a configured data processor instance.
-   *
+   * @param array $dataProcessor
    * @return \Civi\DataProcessor\ProcessorType\AbstractProcessorType
+   * @throws \Exception
    */
-  public function getDataProcessor() {
+  public static function dataProcessorToClass($dataProcessor) {
     $factory = dataprocessor_get_factory();
-    $dataProcessor = $factory->getDataProcessorTypeByName($this->type);
-    $sources = civicrm_api3('DataProcessorSource', 'get', array('data_processor_id' => $this->id, 'options' => array('limit' => 0)));
+    $dataProcessorClass = $factory->getDataProcessorTypeByName($dataProcessor['type']);
+    $sources = civicrm_api3('DataProcessorSource', 'get', array('data_processor_id' => $dataProcessor['id'], 'options' => array('limit' => 0)));
     foreach($sources['values'] as $sourceDao) {
-      CRM_Dataprocessor_BAO_DataProcessorSource::addSourceToDataProcessor($sourceDao, $dataProcessor);
+      CRM_Dataprocessor_BAO_DataProcessorSource::addSourceToDataProcessor($sourceDao, $dataProcessorClass);
     }
 
-    $aggregationFields = CRM_Dataprocessor_BAO_DataProcessor::getAvailableAggregationFields($this->id);
-    if (is_string($this->aggregation)) {
-      $this->aggregation = json_decode($this->aggregation, true);
-    }
-    if (!is_array($this->aggregation)) {
-      $this->aggregation = array();
+    $aggregationFields = array();
+    foreach($dataProcessorClass->getDataSources() as $source) {
+      $aggregationFields = array_merge($aggregationFields, $source->getAvailableAggregationFields());
     }
-    foreach($this->aggregation as $alias) {
-      $dataSource = $dataProcessor->getDataSourceByName($aggregationFields[$alias]->dataSource->getSourceName());
+    foreach($dataProcessor['aggregation'] as $alias) {
+      $dataSource = $dataProcessorClass->getDataSourceByName($aggregationFields[$alias]->dataSource->getSourceName());
       if ($dataSource) {
         $dataSource->ensureAggregationFieldInSource($aggregationFields[$alias]->fieldSpecification);
       }
     }
 
-    $filters = civicrm_api3('DataProcessorFilter', 'get', array('data_processor_id' => $this->id, 'options' => array('limit' => 0)));
+    $filters = civicrm_api3('DataProcessorFilter', 'get', array('data_processor_id' => $dataProcessor['id'], 'options' => array('limit' => 0)));
     foreach($filters['values'] as $filter) {
       $filterHandler = $factory->getFilterByName($filter['type']);
       if ($filterHandler) {
-        $filterHandler->setDataProcessor($dataProcessor);
+        $filterHandler->setDataProcessor($dataProcessorClass);
         $filterHandler->initialize($filter['name'], $filter['title'], $filter['is_required'], $filter['configuration']);
-        $dataProcessor->addFilterHandler($filterHandler);
+        $dataProcessorClass->addFilterHandler($filterHandler);
       }
     }
 
-    $fields = civicrm_api3('DataProcessorField', 'get', array('data_processor_id' => $this->id, 'options' => array('limit' => 0)));
-    $outputHandlers = $dataProcessor->getAvailableOutputHandlers();
+    $fields = civicrm_api3('DataProcessorField', 'get', array('data_processor_id' => $dataProcessor['id'], 'options' => array('limit' => 0)));
+    $outputHandlers = $dataProcessorClass->getAvailableOutputHandlers();
     foreach($fields['values'] as $field) {
       if (isset($outputHandlers[$field['type']])) {
         $outputHandler = $outputHandlers[$field['type']];
         $outputHandler->initialize($field['name'], $field['title'], $field['configuration']);
-        $dataProcessor->addOutputFieldHandlers($outputHandler);
-      }
-    }
-    return $dataProcessor;
-  }
-
-  public static function getAvailableOutputHandlers($data_processor_id) {
-    $dao = new CRM_Dataprocessor_BAO_DataProcessor();
-    $dao->id = $data_processor_id;
-    $dao->find(true);
-    $factory = dataprocessor_get_factory();
-    $dataProcessor = $factory->getDataProcessorTypeByName($dao->type);
-    $sources = civicrm_api3('DataProcessorSource', 'get', array('data_processor_id' => $data_processor_id, 'options' => array('limit' => 0)));
-    foreach($sources['values'] as $sourceDao) {
-      CRM_Dataprocessor_BAO_DataProcessorSource::addSourceToDataProcessor($sourceDao, $dataProcessor);
-    }
-
-    return $dataProcessor->getAvailableOutputHandlers();
-  }
-
-  public static function getAvailableFilterHandlers($data_processor_id) {
-    $dao = new CRM_Dataprocessor_BAO_DataProcessor();
-    $dao->id = $data_processor_id;
-    $dao->find(true);
-    $factory = dataprocessor_get_factory();
-    $dataProcessor = $factory->getDataProcessorTypeByName($dao->type);
-    $sources = civicrm_api3('DataProcessorSource', 'get', array('data_processor_id' => $dao->id, 'options' => array('limit' => 0)));
-    foreach($sources['values'] as $sourceDao) {
-      CRM_Dataprocessor_BAO_DataProcessorSource::addSourceToDataProcessor($sourceDao, $dataProcessor);
-    }
-
-    return $dataProcessor->getAvailableFilterHandlers();
-  }
-
-  /**
-   * Returns an array with all available fields for aggregation
-   *
-   * @param $data_processor_id
-   *
-   * @return array
-   */
-  public static function getAvailableAggregationFields($data_processor_id) {
-    $availableAggregationFields = array();
-    $dao = new CRM_Dataprocessor_BAO_DataProcessor();
-    $dao->id = $data_processor_id;
-    $dao->find(true);
-    $factory = dataprocessor_get_factory();
-    $dataProcessor = $factory->getDataProcessorTypeByName($dao->type);
-    $sources = civicrm_api3('DataProcessorSource', 'get', array('data_processor_id' => $dao->id, 'options' => array('limit' => 0)));
-    foreach($sources['values'] as $sourceDao) {
-      $source = CRM_Dataprocessor_BAO_DataProcessorSource::sourceToSourceClass($sourceDao);
-      $availableAggregationFields = array_merge($availableAggregationFields, $source->getAvailableAggregationFields());
-    }
-
-    return $availableAggregationFields;
-  }
-
-  /**
-   * Returns the id of the data processor.
-   *
-   * @param string $dataProcessorName
-   *   The name of the data processor.
-   * @return int
-   *   The id of the data processor.
-   */
-  public static function getId($dataProcessorName) {
-    $sql = "SELECT `id` FROM `civicrm_data_processor` WHERE `name` = %1";
-    $params[1] = array($dataProcessorName, 'String');
-    $id = CRM_Core_DAO::singleValueQuery($sql, $params);
-    return $id;
-  }
-
-  /**
-   * Returns the status of the data processor.
-   * @See CRM_Dataprocessor_DAO_DataProcessor for possible values.
-   *
-   * @param string $dataProcessorName
-   *   The name of the data processor.
-   * @return int
-   *   The status of the data processor.
-   */
-  public static function getStatus($dataProcessorName) {
-    $sql = "SELECT `status` FROM `civicrm_data_processor` WHERE `name` = %1";
-    $params[1] = array($dataProcessorName, 'String');
-    $status = CRM_Core_DAO::singleValueQuery($sql, $params);
-    return $status;
-  }
-
-  /**
-   * Update the status from in code to overriden when a data processor has been changed
-   *
-   * @param $dataProcessorId
-   */
-  public static function updateAndChekStatus($dataProcessorId) {
-    $sql = "SELECT `status`, `name` FROM `civicrm_data_processor` WHERE `id` = %1";
-    $params[1] = array($dataProcessorId, 'Integer');
-    $dao = CRM_Core_DAO::executeQuery($sql, $params);
-    if ($dao->fetch()) {
-      if (!in_array($dao->name, self::$importingDataProcessors) && $dao->status == self::STATUS_IN_CODE) {
-        $sql = "UPDATE `civicrm_data_processor` SET `status` = %2 WHERE `id` = %1";
-        $params[1] = array($dataProcessorId, 'String');
-        $params[2] = array(self::STATUS_OVERRIDDEN, 'Integer');
-        CRM_Core_DAO::executeQuery($sql, $params);
+        $dataProcessorClass->addOutputFieldHandlers($outputHandler);
       }
     }
-  }
-
-  /**
-   * Store the data processor name so we know that we are importing this data processor
-   * and should not update its status on the way.
-   *
-   * @param $dataProcessorName
-   */
-  public static function setDataProcessorToImportingState($dataProcessorName) {
-    self::$importingDataProcessors[] = $dataProcessorName;
-  }
-
-  /**
-   * Updates the status and source file of the data processor.
-   * @See CRM_Dataprocessor_DAO_DataProcessor for possible status values.
-   *
-   * @param string $dataProcessorName
-   *   The name of the data processor.
-   * @param int $status
-   *   The status value.
-   * @param string $source_file
-   *   The source file. Leave empty when status is IN_DATABASE.
-   */
-  public static function setStatusAndSourceFile($dataProcessorName, $status, $source_file) {
-    $sql = "UPDATE `civicrm_data_processor` SET `status` = %2, `source_file` = %3 WHERE `name` = %1";
-    $params[1] = array($dataProcessorName, 'String');
-    $params[2] = array($status, 'Integer');
-    $params[3] = array($source_file, 'String');
-    CRM_Core_DAO::executeQuery($sql, $params);
-  }
-
-  /**
-   * Exports a data processor
-   *
-   * Returns the array with the whole configuration.
-   *
-   * @param $id
-   * @return array
-   */
-  public static function export($id) {
-    $dataProcessors = self::getValues(array('id' => $id));
-    if (!isset($dataProcessors[$id])) {
-      return array();
-    }
-    $dataProcessor = $dataProcessors[$id];
-    unset($dataProcessor['id']);
-    unset($dataProcessor['status']);
-    unset($dataProcessor['source_file']);
-
-    $sources = civicrm_api3('DataProcessorSource', 'get', array('data_processor_id' => $id, 'options' => array('limit' => 0)));
-    $dataProcessor['data_sources'] = array();
-    foreach($sources['values'] as $i => $datasource) {
-      unset($datasource['id']);
-      unset($datasource['data_processor_id']);
-      $dataProcessor['data_sources'][] = $datasource;
-    }
-    $filters = civicrm_api3('DataProcessorFilter', 'get', array('data_processor_id' => $id, 'options' => array('limit' => 0)));
-    $dataProcessor['filters']  = array();
-    foreach($filters['values'] as $i => $filter) {
-      unset($filter['id']);
-      unset($filter['data_processor_id']);
-      $dataProcessor['filters'][] = $filter;
-    }
-    $fields = civicrm_api3('DataProcessorField', 'get', array('data_processor_id' => $id, 'options' => array('limit' => 0)));
-    $dataProcessor['fields'] = array();
-    foreach($fields['values'] as $i => $field) {
-      unset($field['id']);
-      unset($field['data_processor_id']);
-      $dataProcessor['fields'][] = $field;
-    }
-    $outputs = $outputs = civicrm_api3('DataProcessorOutput', 'get', array('data_processor_id' => $id, 'options' => array('limit' => 0)));
-    $dataProcessor['outputs'] = array();
-    foreach($outputs['values'] as $i => $output) {
-      unset($output['id']);
-      unset($output['data_processor_id']);
-      $dataProcessor['outputs'][] = $output;
-    }
-
-    $eventData['data_processor'] = &$dataProcessor;
-    $event = \Civi\Core\Event\GenericHookEvent::create($eventData);
-    \Civi::dispatcher()->dispatch('hook_civicrm_dataprocessor_export', $event);
-
-    return $dataProcessor;
+    return $dataProcessorClass;
   }
 
   /**
@@ -488,7 +102,7 @@ class CRM_Dataprocessor_BAO_DataProcessor extends CRM_Dataprocessor_DAO_DataProc
     if (!$dao->fetch()) {
       return false;
     }
-    if ($dao->status != CRM_Dataprocessor_DAO_DataProcessor::STATUS_OVERRIDDEN) {
+    if ($dao->status != CRM_Dataprocessor_Status::STATUS_OVERRIDDEN) {
       return false;
     }
     $key = substr($dao->source_file, 0, stripos($dao->source_file, "/"));
@@ -497,8 +111,8 @@ class CRM_Dataprocessor_BAO_DataProcessor extends CRM_Dataprocessor_DAO_DataProc
     $data = file_get_contents($filename);
     $data = json_decode($data, true);
 
-    CRM_Dataprocessor_Utils_Importer::importDataProcessor($data, $dao->source_file, $data_processor_id);
+    CRM_Dataprocessor_Utils_Importer::importDataProcessor($data, $dao->source_file, $data_processor_id, CRM_Dataprocessor_Status::STATUS_IN_CODE);
     return true;
   }
 
-}
\ No newline at end of file
+}
diff --git a/CRM/Dataprocessor/BAO/DataProcessorField.php b/CRM/Dataprocessor/BAO/DataProcessorField.php
index f6a45fd2f5db66a1474b6d497a385b90e2802ab5..3a2806e5f32e340f662ece38af2a7f401f6c7be7 100644
--- a/CRM/Dataprocessor/BAO/DataProcessorField.php
+++ b/CRM/Dataprocessor/BAO/DataProcessorField.php
@@ -14,7 +14,7 @@ class CRM_Dataprocessor_BAO_DataProcessorField extends CRM_Dataprocessor_DAO_Dat
     $sql = "SELECT COUNT(*) FROM `civicrm_data_processor_field` WHERE `name` = %1 AND `data_processor_id` = %2";
     $sqlParams[1] = array($name, 'String');
     $sqlParams[2] = array($data_processor_id, 'String');
-    if (isset($id)) {
+    if ($id) {
       $sql .= " AND `id` != %3";
       $sqlParams[3] = array($id, 'Integer');
     }
diff --git a/CRM/Dataprocessor/BAO/DataProcessorFilter.php b/CRM/Dataprocessor/BAO/DataProcessorFilter.php
index 12aefe4cd743f88cef5e0b03a64a0a4802dc9936..88b0d039aaa75962e906e8c99a976032b29c96cd 100644
--- a/CRM/Dataprocessor/BAO/DataProcessorFilter.php
+++ b/CRM/Dataprocessor/BAO/DataProcessorFilter.php
@@ -14,7 +14,7 @@ class CRM_Dataprocessor_BAO_DataProcessorFilter extends CRM_Dataprocessor_DAO_Da
     $sql = "SELECT COUNT(*) FROM `civicrm_data_processor_filter` WHERE `name` = %1 AND `data_processor_id` = %2";
     $sqlParams[1] = array($name, 'String');
     $sqlParams[2] = array($data_processor_id, 'String');
-    if (isset($id)) {
+    if ($id) {
       $sql .= " AND `id` != %3";
       $sqlParams[3] = array($id, 'Integer');
     }
diff --git a/CRM/Dataprocessor/BAO/DataProcessorSource.php b/CRM/Dataprocessor/BAO/DataProcessorSource.php
index 13f30d96811eb930cb79bca35481e0ed4bc05a8c..83b201ee0c25e4bce47592f2e135442b8a5903d1 100644
--- a/CRM/Dataprocessor/BAO/DataProcessorSource.php
+++ b/CRM/Dataprocessor/BAO/DataProcessorSource.php
@@ -14,7 +14,7 @@ class CRM_Dataprocessor_BAO_DataProcessorSource extends CRM_Dataprocessor_DAO_Da
     $sql = "SELECT COUNT(*) FROM `civicrm_data_processor_source` WHERE `name` = %1 AND `data_processor_id` = %2";
     $sqlParams[1] = array($name, 'String');
     $sqlParams[2] = array($data_processor_id, 'String');
-    if (isset($id)) {
+    if ($id) {
       $sql .= " AND `id` != %3";
       $sqlParams[3] = array($id, 'Integer');
     }
diff --git a/CRM/Dataprocessor/DAO/DataProcessor.php b/CRM/Dataprocessor/DAO/DataProcessor.php
index b21b9f076da5e00985c99e8f1c18703a11d25d18..cb6c049e427de40543ea85579090642318f00c58 100644
--- a/CRM/Dataprocessor/DAO/DataProcessor.php
+++ b/CRM/Dataprocessor/DAO/DataProcessor.php
@@ -1,137 +1,316 @@
 <?php
 
-use CRM_Dataprocessor_ExtensionUtil as E;
+/**
+ * @package CRM
+ * @copyright CiviCRM LLC (c) 2004-2019
+ *
+ * Generated from /buildkit/build/search/sites/default/files/civicrm/ext/dataprocessor/xml/schema/CRM/Dataprocessor/DataProcessor.xml
+ * DO NOT EDIT.  Generated by CRM_Core_CodeGen
+ * (GenCodeChecksum:28cee8d17fc4e4fca4b21a0b4dbf17ff)
+ */
 
 /**
- * @author Jaap Jansma (CiviCooP) <jaap.jansma@civicoop.org>
- * @license http://www.gnu.org/licenses/agpl-3.0.html
+ * Database access object for the DataProcessor entity.
  */
 class CRM_Dataprocessor_DAO_DataProcessor extends CRM_Core_DAO {
 
-  const STATUS_IN_DATABASE = 1;
-  const STATUS_IN_CODE = 2;
-  const STATUS_OVERRIDDEN = 3;
+  /**
+   * Static instance to hold the table name.
+   *
+   * @var string
+   */
+  static $_tableName = 'civicrm_data_processor';
+
+  /**
+   * Should CiviCRM log any modifications to this table in the civicrm_log table.
+   *
+   * @var bool
+   */
+  static $_log = FALSE;
 
   /**
-   * static instance to hold the field values
+   * Unique DataProcessor ID
    *
-   * @var array
-   * @static
+   * @var int unsigned
    */
-  static $_fields = null;
-  static $_export = null;
+  public $id;
+
   /**
-   * empty definition for virtual function
+   * @var string
    */
-  static function getTableName() {
-    return 'civicrm_data_processor';
+  public $name;
+
+  /**
+   * @var string
+   */
+  public $title;
+
+  /**
+   * @var string
+   */
+  public $type;
+
+  /**
+   * @var text
+   */
+  public $configuration;
+
+  /**
+   * @var text
+   */
+  public $aggregation;
+
+  /**
+   * @var boolean
+   */
+  public $is_active;
+
+  /**
+   * @var text
+   */
+  public $description;
+
+  /**
+   * @var string
+   */
+  public $storage_type;
+
+  /**
+   * @var text
+   */
+  public $storage_configuration;
+
+  /**
+   * @var int unsigned
+   */
+  public $status;
+
+  /**
+   * @var string
+   */
+  public $source_file;
+
+  /**
+   * Class constructor.
+   */
+  public function __construct() {
+    $this->__table = 'civicrm_data_processor';
+    parent::__construct();
   }
+
   /**
-   * returns all the column names of this table
+   * Returns all the column names of this table
    *
-   * @access public
    * @return array
    */
   public static function &fields() {
-    if (!(self::$_fields)) {
-      self::$_fields = array(
-        'id' => array(
+    if (!isset(Civi::$statics[__CLASS__]['fields'])) {
+      Civi::$statics[__CLASS__]['fields'] = [
+        'id' => [
           'name' => 'id',
-          'title' => E::ts('ID'),
           'type' => CRM_Utils_Type::T_INT,
-          'required' => true
-        ) ,
-        'type' => array(
-          'name' => 'type',
-          'title' => E::ts('Type'),
-          'type' => CRM_Utils_Type::T_STRING,
-          'maxlength' => 80,
-          'required' => true,
-        ),
-        'name' => array(
+          'description' => CRM_Dataprocessor_ExtensionUtil::ts('Unique DataProcessor ID'),
+          'required' => TRUE,
+          'table_name' => 'civicrm_data_processor',
+          'entity' => 'DataProcessor',
+          'bao' => 'CRM_Dataprocessor_DAO_DataProcessor',
+          'localizable' => 0,
+        ],
+        'name' => [
           'name' => 'name',
-          'title' => E::ts('Name'),
           'type' => CRM_Utils_Type::T_STRING,
-          'maxlength' => 128,
-          'required' => true
-        ),
-        'title' => array(
+          'title' => CRM_Dataprocessor_ExtensionUtil::ts('Name'),
+          'required' => FALSE,
+          'maxlength' => 255,
+          'size' => CRM_Utils_Type::HUGE,
+          'table_name' => 'civicrm_data_processor',
+          'entity' => 'DataProcessor',
+          'bao' => 'CRM_Dataprocessor_DAO_DataProcessor',
+          'localizable' => 0,
+        ],
+        'title' => [
           'name' => 'title',
-          'title' => E::ts('Title'),
           'type' => CRM_Utils_Type::T_STRING,
-          'maxlength' => 128,
-          'required' => true
-        ),
-        'is_active' => array(
-          'name' => 'is_active',
-          'title' => E::ts('Is active'),
-          'type' => CRM_Utils_Type::T_INT,
-        ),
-        'description' => array(
-          'name' => 'description',
-          'title' => E::ts('Description'),
+          'title' => CRM_Dataprocessor_ExtensionUtil::ts('Title'),
+          'required' => TRUE,
+          'maxlength' => 255,
+          'size' => CRM_Utils_Type::HUGE,
+          'table_name' => 'civicrm_data_processor',
+          'entity' => 'DataProcessor',
+          'bao' => 'CRM_Dataprocessor_DAO_DataProcessor',
+          'localizable' => 0,
+        ],
+        'type' => [
+          'name' => 'type',
           'type' => CRM_Utils_Type::T_STRING,
-        ),
-        'configuration' => array(
+          'title' => CRM_Dataprocessor_ExtensionUtil::ts('Type'),
+          'required' => TRUE,
+          'maxlength' => 255,
+          'size' => CRM_Utils_Type::HUGE,
+          'table_name' => 'civicrm_data_processor',
+          'entity' => 'DataProcessor',
+          'bao' => 'CRM_Dataprocessor_DAO_DataProcessor',
+          'localizable' => 0,
+        ],
+        'configuration' => [
           'name' => 'configuration',
-          'title' => E::ts('Configuration'),
           'type' => CRM_Utils_Type::T_TEXT,
-        ),
-        'aggregation' => array(
+          'title' => CRM_Dataprocessor_ExtensionUtil::ts('Configuration'),
+          'required' => FALSE,
+          'table_name' => 'civicrm_data_processor',
+          'entity' => 'DataProcessor',
+          'bao' => 'CRM_Dataprocessor_DAO_DataProcessor',
+          'localizable' => 0,
+          'serialize' => self::SERIALIZE_JSON,
+        ],
+        'aggregation' => [
           'name' => 'aggregation',
-          'title' => E::ts('Aggregation'),
           'type' => CRM_Utils_Type::T_TEXT,
-        ),
-        'storage_type' => array(
+          'title' => CRM_Dataprocessor_ExtensionUtil::ts('Aggregation Fields'),
+          'required' => FALSE,
+          'table_name' => 'civicrm_data_processor',
+          'entity' => 'DataProcessor',
+          'bao' => 'CRM_Dataprocessor_DAO_DataProcessor',
+          'localizable' => 0,
+          'serialize' => self::SERIALIZE_JSON,
+        ],
+        'is_active' => [
+          'name' => 'is_active',
+          'type' => CRM_Utils_Type::T_BOOLEAN,
+          'title' => CRM_Dataprocessor_ExtensionUtil::ts('Is active'),
+          'required' => TRUE,
+          'table_name' => 'civicrm_data_processor',
+          'entity' => 'DataProcessor',
+          'bao' => 'CRM_Dataprocessor_DAO_DataProcessor',
+          'localizable' => 0,
+        ],
+        'description' => [
+          'name' => 'description',
+          'type' => CRM_Utils_Type::T_TEXT,
+          'title' => CRM_Dataprocessor_ExtensionUtil::ts('Description'),
+          'required' => FALSE,
+          'table_name' => 'civicrm_data_processor',
+          'entity' => 'DataProcessor',
+          'bao' => 'CRM_Dataprocessor_DAO_DataProcessor',
+          'localizable' => 0,
+        ],
+        'storage_type' => [
           'name' => 'storage_type',
-          'title' => E::ts('Storage Type'),
           'type' => CRM_Utils_Type::T_STRING,
-          'maxlength' => 80,
-          'required' => true,
-        ),
-        'storage_configuration' => array(
+          'title' => CRM_Dataprocessor_ExtensionUtil::ts('Storage Type'),
+          'required' => FALSE,
+          'maxlength' => 255,
+          'size' => CRM_Utils_Type::HUGE,
+          'table_name' => 'civicrm_data_processor',
+          'entity' => 'DataProcessor',
+          'bao' => 'CRM_Dataprocessor_DAO_DataProcessor',
+          'localizable' => 0,
+        ],
+        'storage_configuration' => [
           'name' => 'storage_configuration',
-          'title' => E::ts('Storage Configuration'),
           'type' => CRM_Utils_Type::T_TEXT,
-        ),
-        'status' => array(
+          'title' => CRM_Dataprocessor_ExtensionUtil::ts('Storage Configuration'),
+          'required' => FALSE,
+          'table_name' => 'civicrm_data_processor',
+          'entity' => 'DataProcessor',
+          'bao' => 'CRM_Dataprocessor_DAO_DataProcessor',
+          'localizable' => 0,
+          'serialize' => self::SERIALIZE_JSON,
+        ],
+        'status' => [
           'name' => 'status',
           'type' => CRM_Utils_Type::T_INT,
-        ),
-        'source_file' => array(
+          'title' => CRM_Dataprocessor_ExtensionUtil::ts('Status'),
+          'required' => FALSE,
+          'default' => '0',
+          'table_name' => 'civicrm_data_processor',
+          'entity' => 'DataProcessor',
+          'bao' => 'CRM_Dataprocessor_DAO_DataProcessor',
+          'localizable' => 0,
+        ],
+        'source_file' => [
           'name' => 'source_file',
-          'title' => E::ts('Source file'),
           'type' => CRM_Utils_Type::T_STRING,
+          'title' => CRM_Dataprocessor_ExtensionUtil::ts('Source File'),
+          'required' => FALSE,
           'maxlength' => 255,
-          'required' => false,
-        ),
-      );
+          'size' => CRM_Utils_Type::HUGE,
+          'table_name' => 'civicrm_data_processor',
+          'entity' => 'DataProcessor',
+          'bao' => 'CRM_Dataprocessor_DAO_DataProcessor',
+          'localizable' => 0,
+        ],
+      ];
+      CRM_Core_DAO_AllCoreTables::invoke(__CLASS__, 'fields_callback', Civi::$statics[__CLASS__]['fields']);
     }
-    return self::$_fields;
+    return Civi::$statics[__CLASS__]['fields'];
   }
+
   /**
-   * Returns an array containing, for each field, the array key used for that
-   * field in self::$_fields.
+   * Return a mapping from field-name to the corresponding key (as used in fields()).
    *
-   * @access public
    * @return array
+   *   Array(string $name => string $uniqueName).
    */
   public static function &fieldKeys() {
-    if (!(self::$_fieldKeys)) {
-      self::$_fieldKeys = array(
-        'id' => 'id',
-        'type' => 'type',
-        'name' => 'name',
-        'title' => 'title',
-        'is_active' => 'is_active',
-        'description' => 'description',
-        'configuration' => 'configuration',
-        'storage_type' => 'storage_type',
-        'storage_configuration' => 'storage_configuration',
-        'status' => 'status',
-        'source_file' => 'source_file',
-      );
+    if (!isset(Civi::$statics[__CLASS__]['fieldKeys'])) {
+      Civi::$statics[__CLASS__]['fieldKeys'] = array_flip(CRM_Utils_Array::collect('name', self::fields()));
     }
-    return self::$_fieldKeys;
+    return Civi::$statics[__CLASS__]['fieldKeys'];
+  }
+
+  /**
+   * Returns the names of this table
+   *
+   * @return string
+   */
+  public static function getTableName() {
+    return self::$_tableName;
+  }
+
+  /**
+   * Returns if this table needs to be logged
+   *
+   * @return bool
+   */
+  public function getLog() {
+    return self::$_log;
   }
-}
\ No newline at end of file
+
+  /**
+   * Returns the list of fields that can be imported
+   *
+   * @param bool $prefix
+   *
+   * @return array
+   */
+  public static function &import($prefix = FALSE) {
+    $r = CRM_Core_DAO_AllCoreTables::getImports(__CLASS__, 'data_processor', $prefix, []);
+    return $r;
+  }
+
+  /**
+   * Returns the list of fields that can be exported
+   *
+   * @param bool $prefix
+   *
+   * @return array
+   */
+  public static function &export($prefix = FALSE) {
+    $r = CRM_Core_DAO_AllCoreTables::getExports(__CLASS__, 'data_processor', $prefix, []);
+    return $r;
+  }
+
+  /**
+   * Returns the list of indices
+   *
+   * @param bool $localize
+   *
+   * @return array
+   */
+  public static function indices($localize = TRUE) {
+    $indices = [];
+    return ($localize && !empty($indices)) ? CRM_Core_DAO_AllCoreTables::multilingualize(__CLASS__, $indices) : $indices;
+  }
+
+}
diff --git a/CRM/Dataprocessor/Form/DataProcessor.php b/CRM/Dataprocessor/Form/DataProcessor.php
index 1b3442e2216004cbbdba3606411a34ae1aba8134..ed627c30de4eebbfb10fc5c39eed265cabe4f178 100644
--- a/CRM/Dataprocessor/Form/DataProcessor.php
+++ b/CRM/Dataprocessor/Form/DataProcessor.php
@@ -11,6 +11,13 @@ class CRM_Dataprocessor_Form_DataProcessor extends CRM_Core_Form {
 
   private $dataProcessorId;
 
+  private $dataProcessor;
+
+  /**
+   * @var \Civi\DataProcessor\ProcessorType\AbstractProcessorType
+   */
+  private $dataProcessorClass;
+
   private $currentUrl;
 
   /**
@@ -26,12 +33,12 @@ class CRM_Dataprocessor_Form_DataProcessor extends CRM_Core_Form {
     $session = CRM_Core_Session::singleton();
     switch($this->_action) {
       case CRM_Core_Action::DISABLE:
-        CRM_Dataprocessor_BAO_DataProcessor::disable($this->dataProcessorId);
+        civicrm_api3('DataProcessor', 'create', array('id' => $this->dataProcessorId, 'is_active' => 0));
         $session->setStatus('Data Processor disabled', 'Disable', 'success');
         CRM_Utils_System::redirect($session->readUserContext());
         break;
       case CRM_Core_Action::ENABLE:
-        CRM_Dataprocessor_BAO_DataProcessor::enable($this->dataProcessorId);
+        civicrm_api3('DataProcessor', 'create', array('id' => $this->dataProcessorId, 'is_active' => 1));
         $session->setStatus('Data Processor enabled', 'Enable', 'success');
         CRM_Utils_System::redirect($session->readUserContext());
         break;
@@ -41,11 +48,14 @@ class CRM_Dataprocessor_Form_DataProcessor extends CRM_Core_Form {
         CRM_Utils_System::redirect($session->readUserContext());
         break;
       case CRM_Core_Action::EXPORT:
-        $this->assign('export', json_encode(CRM_Dataprocessor_BAO_DataProcessor::export($this->dataProcessorId), JSON_PRETTY_PRINT));
+        $this->assign('export', json_encode(CRM_Dataprocessor_Utils_Importer::export($this->dataProcessorId), JSON_PRETTY_PRINT));
         break;
     }
 
     if ($this->dataProcessorId) {
+      $this->dataProcessor = civicrm_api3('DataProcessor', 'getsingle', array('id' => $this->dataProcessorId));
+      $this->dataProcessorClass = CRM_Dataprocessor_BAO_DataProcessor::dataProcessorToClass($this->dataProcessor);
+      $this->assign('dataProcessor', $this->dataProcessor);
       $this->addSources();
       $this->addFields();
       $this->addFilters();
@@ -95,14 +105,14 @@ class CRM_Dataprocessor_Form_DataProcessor extends CRM_Core_Form {
   }
 
   protected function addAggregateFields() {
-    $fields = array();
-    $aggregationFields = CRM_Dataprocessor_BAO_DataProcessor::getAvailableAggregationFields($this->dataProcessorId);
     $aggregationFieldsFormatted = array();
-    foreach($aggregationFields as $field) {
-      $aggregationFieldsFormatted[$field->fieldSpecification->alias] = $field->dataSource->getSourceTitle()." :: ".$field->fieldSpecification->title;
+    foreach($this->dataProcessorClass->getDataSources() as $dataSource) {
+      foreach($dataSource->getAvailableAggregationFields() as $field) {
+        $aggregationFieldsFormatted[$field->fieldSpecification->alias] = $field->dataSource->getSourceTitle()." :: ".$field->fieldSpecification->title;
+      }
     }
-    $dataProcessor = CRM_Dataprocessor_BAO_DataProcessor::getValues(array('id' => $this->dataProcessorId));
-    $aggregation = $dataProcessor[$this->dataProcessorId]['aggregation'];
+    $aggregation = $this->dataProcessor['aggregation'];
+    $fields = array();
     foreach($aggregation as $alias) {
       $fields[$alias] = $aggregationFieldsFormatted[$alias];
     }
@@ -176,7 +186,7 @@ class CRM_Dataprocessor_Form_DataProcessor extends CRM_Core_Form {
   public function postProcess() {
     $session = CRM_Core_Session::singleton();
     if ($this->_action == CRM_Core_Action::DELETE) {
-      CRM_Dataprocessor_BAO_DataProcessor::deleteWithId($this->dataProcessorId);
+      civicrm_api3('DataProcessor', 'delete', array('id' => $this->dataProcessorId));
       $session->setStatus(E::ts('Data Processor removed'), E::ts('Removed'), 'success');
       $redirectUrl = $session->popUserContext();
       CRM_Utils_System::redirect($redirectUrl);
@@ -191,7 +201,7 @@ class CRM_Dataprocessor_Form_DataProcessor extends CRM_Core_Form {
       $params['id'] = $this->dataProcessorId;
     }
 
-    $result = CRM_Dataprocessor_BAO_DataProcessor::add($params);
+    $result = civicrm_api3('DataProcessor', 'create', $params);
     $redirectUrl = CRM_Utils_System::url('civicrm/dataprocessor/form/edit', array('reset' => 1, 'action' => 'update', 'id' => $result['id']));
     CRM_Utils_System::redirect($redirectUrl);
   }
@@ -227,18 +237,17 @@ class CRM_Dataprocessor_Form_DataProcessor extends CRM_Core_Form {
    * @access protected
    */
   protected function setUpdateDefaults(&$defaults) {
-    $dataProcessor = CRM_Dataprocessor_BAO_DataProcessor::getValues(array('id' => $this->dataProcessorId));
-    if (!empty($dataProcessor) && !empty($this->dataProcessorId)) {
-      $defaults['title'] = $dataProcessor[$this->dataProcessorId]['title'];
-      if (isset($dataProcessor[$this->dataProcessorId]['name'])) {
-        $defaults['name'] = $dataProcessor[$this->dataProcessorId]['name'];
+    if (!empty($this->dataProcessor) && !empty($this->dataProcessorId)) {
+      $defaults['title'] = $this->dataProcessor['title'];
+      if (isset($this->dataProcessor['name'])) {
+        $defaults['name'] = $this->dataProcessor['name'];
       }
-      if (isset($dataProcessor[$this->dataProcessorId]['description'])) {
-        $defaults['description'] = $dataProcessor[$this->dataProcessorId]['description'];
+      if (isset($this->dataProcessor['description'])) {
+        $defaults['description'] = $this->dataProcessor['description'];
       } else {
         $defaults['description'] = '';
       }
-      $defaults['is_active'] = $dataProcessor[$this->dataProcessorId]['is_active'];
+      $defaults['is_active'] = $this->dataProcessor['is_active'];
     }
   }
 
@@ -258,9 +267,9 @@ class CRM_Dataprocessor_Form_DataProcessor extends CRM_Core_Form {
       $id = $fields['id'];
     }
     if (empty($fields['name'])) {
-      $fields['name'] = CRM_Dataprocessor_BAO_DataProcessor::buildNameFromTitle($fields['title']);
+      $fields['name'] = CRM_Dataprocessor_BAO_DataProcessor::checkName($fields['title'], $id);
     }
-    if (!CRM_Dataprocessor_BAO_DataProcessor::isNameValid($fields['name'], $id)) {
+    if (!CRM_Dataprocessor_BAO_DataProcessorSource::isNameValid($fields['name'], $id)) {
       $errors['name'] = E::ts('There is already a data processor with this name');
       return $errors;
     }
diff --git a/CRM/Dataprocessor/Form/Import.php b/CRM/Dataprocessor/Form/Import.php
index 039c4d50bb9517b902bbfe43917a2b6ddf992c5d..54d39d3d34b4053921e6cb5ca151c6ee409debdf 100644
--- a/CRM/Dataprocessor/Form/Import.php
+++ b/CRM/Dataprocessor/Form/Import.php
@@ -29,7 +29,7 @@ class CRM_Dataprocessor_Form_Import extends CRM_Core_Form {
   public function postProcess() {
     $values = $this->exportValues();
     $importCode = json_decode($values['code'], true);
-    $importResult = CRM_Dataprocessor_Utils_Importer::import($importCode, '');
+    $importResult = CRM_Dataprocessor_Utils_Importer::import($importCode, '', true);
 
     CRM_Core_Session::setStatus(E::ts('Imported data processor'), '', 'success');
 
diff --git a/CRM/Dataprocessor/Form/Join/Simple.php b/CRM/Dataprocessor/Form/Join/Simple.php
deleted file mode 100644
index e4c4d0c99f0dd1139ec99a57062c0e4ee7dc91e0..0000000000000000000000000000000000000000
--- a/CRM/Dataprocessor/Form/Join/Simple.php
+++ /dev/null
@@ -1,130 +0,0 @@
-<?php
-
-use CRM_Dataprocessor_ExtensionUtil as E;
-
-/**
- * Form controller class
- *
- * @see https://wiki.civicrm.org/confluence/display/CRMDOC/QuickForm+Reference
- */
-class CRM_Dataprocessor_Form_Join_Simple extends CRM_Core_Form {
-
-  private $dataProcessorId;
-
-  private $source_id;
-
-  /**
-   * Function to perform processing before displaying form (overrides parent function)
-   *
-   * @access public
-   */
-  function preProcess() {
-    $this->dataProcessorId = CRM_Utils_Request::retrieve('data_processor_id', 'Integer');
-    $this->assign('data_processor_id', $this->dataProcessorId);
-
-    $this->source_id = CRM_Utils_Request::retrieve('source_id', 'Integer', CRM_Core_DAO::$_nullObject, TRUE);
-    $this->assign('source_id', $this->source_id);
-
-    $source = CRM_Dataprocessor_BAO_Source::getValues(array('id' => $this->source_id));
-    $this->assign('source', $source[$this->source_id]);
-
-    $title = E::ts('Data Processor Source Join Conifuration');
-    CRM_Utils_System::setTitle($title);
-  }
-
-  public function buildQuickForm() {
-    $this->add('hidden', 'data_processor_id');
-    $this->add('hidden', 'source_id');
-
-    $fields = $this->buildFieldList();
-
-    $this->add('select', 'left_field', ts('Select field'), $fields, true, array(
-      'style' => 'min-width:250px',
-      'class' => 'crm-select2 huge',
-      'placeholder' => E::ts('- select -'),
-    ));
-    $this->add('select', 'right_field', ts('Select field'), $fields, true, array(
-      'style' => 'min-width:250px',
-      'class' => 'crm-select2 huge',
-      'placeholder' => E::ts('- select -'),
-    ));
-
-    if ($this->_action == CRM_Core_Action::ADD) {
-      $this->addButtons(array(
-        array('type' => 'next', 'name' => E::ts('Next'), 'isDefault' => TRUE,),
-        array('type' => 'cancel', 'name' => E::ts('Cancel'))));
-    } elseif ($this->_action == CRM_Core_Action::DELETE) {
-      $this->addButtons(array(
-        array('type' => 'next', 'name' => E::ts('Delete'), 'isDefault' => TRUE,),
-        array('type' => 'cancel', 'name' => E::ts('Cancel'))));
-    } else {
-      $this->addButtons(array(
-        array('type' => 'next', 'name' => E::ts('Save'), 'isDefault' => TRUE,),
-        array('type' => 'cancel', 'name' => E::ts('Cancel'))));
-    }
-    parent::buildQuickForm();
-  }
-
-  function setDefaultValues() {
-    $defaults = [];
-    $defaults['data_processor_id'] = $this->dataProcessorId;
-    $defaults['source_id'] = $this->source_id;
-
-    $source = CRM_Dataprocessor_BAO_Source::getValues(array('id' => $this->source_id));
-    if (isset($source[$this->source_id]['join_configuration']['left_prefix'])) {
-      $defaults['left_field'] = $source[$this->source_id]['join_configuration']['left_prefix'].".".$source[$this->source_id]['join_configuration']['left_field'];
-    }
-    if (isset($source[$this->source_id]['join_configuration']['right_prefix'])) {
-      $defaults['right_field'] = $source[$this->source_id]['join_configuration']['right_prefix'].".".$source[$this->source_id]['join_configuration']['right_field'];
-    }
-
-    return $defaults;
-  }
-
-  public function postProcess() {
-    $session = CRM_Core_Session::singleton();
-
-    $values = $this->exportValues();
-    list($left_prefix, $left_field) = explode(".",$values['left_field'], 2);
-    list($right_prefix, $right_field) = explode(".",$values['right_field'], 2);
-
-    $params['join_configuration'] = array(
-      'left_prefix' => $left_prefix,
-      'left_field' => $left_field,
-      'right_prefix' => $right_prefix,
-      'right_field' => $right_field
-    );
-    if ($this->dataProcessorId) {
-      $params['data_processor_id'] = $this->dataProcessorId;
-    }
-    if ($this->source_id) {
-      $params['id'] = $this->source_id;
-    }
-    CRM_Dataprocessor_BAO_Source::add($params);
-    CRM_Utils_System::redirect($session->readUserContext());
-    parent::postProcess();
-  }
-
-  function buildFieldList() {
-    $factory = dataprocessor_get_factory();
-    $fields = array();
-    $dataProcessor = CRM_Dataprocessor_BAO_DataProcessor::getDataProcessorById($this->dataProcessorId);
-    $sources = CRM_Dataprocessor_BAO_Source::getValues(array('data_processor_id' => $this->dataProcessorId));
-    foreach($sources as $source) {
-      $sourceClass = $factory->getDataSourceByName($source['type']);
-      $sourceClass->setDataProcessor($dataProcessor);
-      $sourceClass->initialize($source['configuration'], $source['name']);
-      $sourceFields = $sourceClass->getAvailableFields()->getFields();
-      foreach($sourceFields as $sourceField) {
-        $fields[$source['name'] . '.' . $sourceField->name] = $source['title'] . ' :: ' . $sourceField->title;
-      }
-
-      if ($source['id'] == $this->source_id) {
-        break;
-      }
-    }
-    asort($fields);
-    return $fields;
-  }
-
-}
\ No newline at end of file
diff --git a/CRM/Dataprocessor/Form/ManageDataProcessors.php b/CRM/Dataprocessor/Form/ManageDataProcessors.php
index f03174ec62c45cb4e1aee24eea9184390eb21f46..5d5c8c7ccee63692b8d46507777ad22327a95bca 100644
--- a/CRM/Dataprocessor/Form/ManageDataProcessors.php
+++ b/CRM/Dataprocessor/Form/ManageDataProcessors.php
@@ -15,38 +15,24 @@ class CRM_Dataprocessor_Form_ManageDataProcessors extends CRM_Core_Form {
 
     $this->setTitle(E::ts('Manage Data Processors'));
 
-    $whereClauses = array("1");
+    $apiParams = array();
     if (isset($formValues['title']) && !empty($formValues['title'])) {
-      $whereClauses[] = "`title` LIKE '%". CRM_Utils_Type::escape($formValues['title'], 'String')."%'";
+      $apiParams['title']['LIKE'] = $formValues['title'];
     }
     if (isset($formValues['description']) && !empty($formValues['description'])) {
-      $whereClauses[]  = "`description` LIKE '%". CRM_Utils_Type::escape($formValues['description'], 'String')."%'";
+      $apiParams['description']['LIKE'] = $formValues['description'];
     }
     if (isset($formValues['is_active']) && $formValues['is_active'] == '0') {
-      $whereClauses[] = "`is_active` = 0";
+      $apiParams['is_active'] = 0;
     } elseif (isset($formValues['is_active']) && $formValues['is_active'] == '1') {
-      $whereClauses[] = "`is_active` = 1";
+      $apiParams['is_active'] = 1;
     }
+    $apiParams['options']['limit'] = 0;
+    $dataProcessors = civicrm_api3('DataProcessor', 'get', $apiParams);
+    $dataProcessors = $dataProcessors['values'];
 
-    $whereStatement = implode(" AND ", $whereClauses);
-    $sql = "SELECT * FROM civicrm_data_processor WHERE {$whereStatement} ORDER BY is_active, title";
-    $dataProcessors = array();
-    $dao = CRM_Core_DAO::executeQuery($sql, array(), false, 'CRM_Dataprocessor_DAO_DataProcessor');
-    while($dao->fetch()) {
-      $row = array();
-      CRM_Dataprocessor_DAO_DataProcessor::storeValues($dao, $row);
-      switch ($row['status']) {
-        case CRM_Dataprocessor_DAO_DataProcessor::STATUS_IN_CODE:
-          $row['status_label'] = E::ts('In code');
-          break;
-        case CRM_Dataprocessor_DAO_DataProcessor::STATUS_OVERRIDDEN:
-          $row['status_label'] = E::ts('Overridden');
-          break;
-        case CRM_Dataprocessor_DAO_DataProcessor::STATUS_IN_DATABASE:
-          $row['status_label'] = E::ts('In database');
-          break;
-      }
-      $dataProcessors[] = $row;
+    foreach($dataProcessors as $idx => $dataProcessor) {
+      $dataProcessors[$idx]['status_label'] = CRM_Dataprocessor_Status::statusToLabel($dataProcessor['status']);
     }
     $this->assign('data_processors', $dataProcessors);
 
diff --git a/CRM/Dataprocessor/Form/Output/AbstractUIOutputForm.php b/CRM/Dataprocessor/Form/Output/AbstractUIOutputForm.php
index e38fe3519aa0a1a95975c92304b1b4d8012441fc..27a04c7cd9a55d0feea5257273a89e5cd75856e9 100644
--- a/CRM/Dataprocessor/Form/Output/AbstractUIOutputForm.php
+++ b/CRM/Dataprocessor/Form/Output/AbstractUIOutputForm.php
@@ -9,19 +9,19 @@ use CRM_Dataprocessor_ExtensionUtil as E;
 abstract class CRM_Dataprocessor_Form_Output_AbstractUIOutputForm extends CRM_Core_Form_Search {
 
   /**
-   * @var \Civi\DataProcessor\ProcessorType\AbstractProcessorType;
+   * @var array
    */
   protected $dataProcessor;
 
   /**
-   * @var int
+   * @var \Civi\DataProcessor\ProcessorType\AbstractProcessorType;
    */
-  protected $dataProcessorId;
+  protected $dataProcessorClass;
 
   /**
-   * @var array
+   * @var int
    */
-  protected $dataProcessorBAO;
+  protected $dataProcessorId;
 
   /**
    * @var \CRM_Dataprocessor_BAO_Output
@@ -74,11 +74,10 @@ abstract class CRM_Dataprocessor_Form_Output_AbstractUIOutputForm extends CRM_Co
       if (!$dao->fetch()) {
         throw new \Exception('Could not find Data Processor "' . $dataProcessorName.'"');
       }
-      $this->dataProcessor = CRM_Dataprocessor_BAO_DataProcessor::getDataProcessorById($dao->data_processor_id);
-      $this->dataProcessorId = $dao->data_processor_id;
 
-      $dataProcessorBAO = CRM_Dataprocessor_BAO_DataProcessor::getValues(array('id' => $this->dataProcessorId));
-      $this->dataProcessorBAO = $dataProcessorBAO[$this->dataProcessorId];
+      $this->dataProcessor = civicrm_api3('DataProcessor', 'getsingle', array('id' => $dao->data_processor_id));
+      $this->dataProcessorClass = \CRM_Dataprocessor_BAO_DataProcessor::dataProcessorToClass($this->dataProcessor);
+      $this->dataProcessorId = $dao->data_processor_id;
 
       $output = CRM_Dataprocessor_BAO_Output::getValues(['id' => $dao->output_id]);
       $this->dataProcessorOutput = $output[$dao->output_id];
@@ -96,8 +95,8 @@ abstract class CRM_Dataprocessor_Form_Output_AbstractUIOutputForm extends CRM_Co
    * @return bool
    */
   protected function hasRequiredFilters() {
-    if ($this->dataProcessor->getFilterHandlers()) {
-      foreach ($this->dataProcessor->getFilterHandlers() as $filter) {
+    if ($this->dataProcessorClass->getFilterHandlers()) {
+      foreach ($this->dataProcessorClass->getFilterHandlers() as $filter) {
         if ($filter->isRequired()) {
           return true;
         }
@@ -113,8 +112,8 @@ abstract class CRM_Dataprocessor_Form_Output_AbstractUIOutputForm extends CRM_Co
    */
   protected function validateFilters() {
     $errors = array();
-    if ($this->dataProcessor->getFilterHandlers()) {
-      foreach ($this->dataProcessor->getFilterHandlers() as $filter) {
+    if ($this->dataProcessorClass->getFilterHandlers()) {
+      foreach ($this->dataProcessorClass->getFilterHandlers() as $filter) {
         $errors = array_merge($errors, $filter->validateSubmittedFilterParams($this->_formValues));
       }
     }
@@ -139,8 +138,8 @@ abstract class CRM_Dataprocessor_Form_Output_AbstractUIOutputForm extends CRM_Co
    */
   protected function buildCriteriaForm() {
     $filterElements = array();
-    if ($this->dataProcessor->getFilterHandlers()) {
-      foreach ($this->dataProcessor->getFilterHandlers() as $filterHandler) {
+    if ($this->dataProcessorClass->getFilterHandlers()) {
+      foreach ($this->dataProcessorClass->getFilterHandlers() as $filterHandler) {
         $fieldSpec = $filterHandler->getFieldSpecification();
         if (!$fieldSpec) {
           continue;
diff --git a/CRM/Dataprocessor/Form/Source.php b/CRM/Dataprocessor/Form/Source.php
index dd343ab329979bd41ec78966a802d5527f9aaad6..e89fbb7c970936db1f432dc88bfc143bacf76146 100644
--- a/CRM/Dataprocessor/Form/Source.php
+++ b/CRM/Dataprocessor/Form/Source.php
@@ -11,10 +11,12 @@ class CRM_Dataprocessor_Form_Source extends CRM_Core_Form {
 
   private $dataProcessorId;
 
+  private $dataProcessor;
+
   /**
    * @var Civi\DataProcessor\ProcessorType\AbstractProcessorType
    */
-  private $dataProcessor;
+  private $dataProcessorClass;
 
   private $id;
 
@@ -54,7 +56,8 @@ class CRM_Dataprocessor_Form_Source extends CRM_Core_Form {
     $this->dataProcessorId = CRM_Utils_Request::retrieve('data_processor_id', 'Integer');
     $this->assign('data_processor_id', $this->dataProcessorId);
     if ($this->dataProcessorId) {
-      $this->dataProcessor = CRM_Dataprocessor_BAO_DataProcessor::getDataProcessorById($this->dataProcessorId);
+      $this->dataProcessor = civicrm_api3('DataProcessor', 'getsingle', array('id' => $this->dataProcessorId));
+      $this->dataProcessorClass = CRM_Dataprocessor_BAO_DataProcessor::dataProcessorToClass($this->dataProcessor);
     }
 
     $this->id = CRM_Utils_Request::retrieve('id', 'Integer');
@@ -143,8 +146,7 @@ class CRM_Dataprocessor_Form_Source extends CRM_Core_Form {
         ));
         if ($this->joinClass && $this->joinClass->hasConfiguration()) {
           $joinableToSources = array();
-          $dataProcessor = CRM_Dataprocessor_BAO_DataProcessor::getDataProcessorById($this->dataProcessorId);
-          foreach($dataProcessor->getDataSources() as $source) {
+          foreach($this->dataProcessorClass->getDataSources() as $source) {
             if ($this->sourceClass && $this->sourceClass->getSourceName() == $source->getSourceName()) {
               break;
             }
@@ -225,24 +227,6 @@ class CRM_Dataprocessor_Form_Source extends CRM_Core_Form {
     }
 
     $result = civicrm_api3('DataProcessorSource', 'create', $params);
-
-    if (!$this->isFirstDataSource && $this->_action == CRM_Core_Action::ADD) {
-      $joinClass = $factory->getJoinByName($values['join_type']);
-      if ($joinClass->getConfigurationUrl()) {
-        $joinUrl = CRM_Utils_System::url($joinClass->getConfigurationUrl(), [
-          'reset' => 1,
-          'action' => 'add',
-          'source_id' => $result['id'],
-          'data_processor_id' => $this->dataProcessorId
-        ]);
-        $session->pushUserContext($backUrl);
-        $redirectUrl = $joinUrl;
-      } else {
-        $session->pushUserContext($backUrl);
-      }
-    } elseif ($this->_action == CRM_Core_Action::ADD) {
-      $session->pushUserContext($backUrl);
-    }
     CRM_Utils_System::redirect($redirectUrl);
     parent::postProcess();
   }
diff --git a/CRM/Dataprocessor/Status.php b/CRM/Dataprocessor/Status.php
new file mode 100644
index 0000000000000000000000000000000000000000..ebe8295d332f15febc1f9db3dbb8eb17f048b020
--- /dev/null
+++ b/CRM/Dataprocessor/Status.php
@@ -0,0 +1,36 @@
+<?php
+/**
+ * @author Jaap Jansma <jaap.jansma@civicoop.org>
+ * @license AGPL-3.0
+ */
+
+use CRM_Dataprocessor_ExtensionUtil as E;
+
+class CRM_Dataprocessor_Status {
+
+  const STATUS_IN_DATABASE = 1;
+  const STATUS_IN_CODE = 2;
+  const STATUS_OVERRIDDEN = 3;
+
+  /**
+   * Returns a textual representation of the status
+   *
+   * @param $status
+   * @return string
+   */
+  public static function statusToLabel($status) {
+    switch ($status) {
+      case CRM_Dataprocessor_Status::STATUS_IN_CODE:
+        return E::ts('In code');
+        break;
+      case CRM_Dataprocessor_Status::STATUS_OVERRIDDEN:
+        return E::ts('Overridden');
+        break;
+      case CRM_Dataprocessor_Status::STATUS_IN_DATABASE:
+        return E::ts('In database');
+        break;
+    }
+    return E::ts('Unknown');
+  }
+
+}
\ No newline at end of file
diff --git a/CRM/Dataprocessor/Utils/DataSourceFields.php b/CRM/Dataprocessor/Utils/DataSourceFields.php
index 5c4ff066a88714bea7b42a748e4510b02534a05b..acd5a9e19809358956a4c7d113f4fe7bc52731b7 100644
--- a/CRM/Dataprocessor/Utils/DataSourceFields.php
+++ b/CRM/Dataprocessor/Utils/DataSourceFields.php
@@ -16,9 +16,10 @@ class CRM_Dataprocessor_Utils_DataSourceFields {
    * @throws \Exception
    */
   public static function getAvailableFieldsInDataSources($dataProcessorId) {
-    $dataProcessor = CRM_Dataprocessor_BAO_DataProcessor::getDataProcessorById($dataProcessorId);
+    $dataProcessor = civicrm_api3('DataProcessor', 'getsingle', array('id' => $dataProcessorId));
+    $dataProcessorClass = \CRM_Dataprocessor_BAO_DataProcessor::dataProcessorToClass($dataProcessor);
     $fieldSelect = array();
-    foreach($dataProcessor->getDataSources() as $dataSource) {
+    foreach($dataProcessorClass->getDataSources() as $dataSource) {
       $fieldSelect = array_merge($fieldSelect, self::getAvailableFieldsInDataSource($dataSource, $dataSource->getSourceTitle().' :: ', $dataSource->getSourceName().'::'));
     }
     return $fieldSelect;
diff --git a/CRM/Dataprocessor/Utils/Importer.php b/CRM/Dataprocessor/Utils/Importer.php
index 238362040888576f4e09f910c3f6d7141b222241..1d88647f45a897f1e145e05beb6d61db3ae12d57 100644
--- a/CRM/Dataprocessor/Utils/Importer.php
+++ b/CRM/Dataprocessor/Utils/Importer.php
@@ -6,28 +6,103 @@
 
 class CRM_Dataprocessor_Utils_Importer {
 
-  public static function import($data, $filename) {
-    $data_processor_id = CRM_Dataprocessor_BAO_DataProcessor::getId($data['name']);
-    $status = CRM_Dataprocessor_BAO_DataProcessor::getStatus($data['name']);
+  /**
+   * Exports a data processor
+   *
+   * Returns the array with the whole configuration.
+   *
+   * @param $data_processor_id
+   * @return array
+   * @throws \Exception
+   */
+  public static function export($data_processor_id) {
+    $dataProcessor = civicrm_api3('DataProcessor', 'getsingle', array('id' => $data_processor_id));
+    unset($dataProcessor['id']);
+    unset($dataProcessor['status']);
+    unset($dataProcessor['source_file']);
+
+    $sources = civicrm_api3('DataProcessorSource', 'get', array('data_processor_id' => $data_processor_id, 'options' => array('limit' => 0)));
+    $dataProcessor['data_sources'] = array();
+    foreach($sources['values'] as $i => $datasource) {
+      unset($datasource['id']);
+      unset($datasource['data_processor_id']);
+      $dataProcessor['data_sources'][] = $datasource;
+    }
+    $filters = civicrm_api3('DataProcessorFilter', 'get', array('data_processor_id' => $data_processor_id, 'options' => array('limit' => 0)));
+    $dataProcessor['filters']  = array();
+    foreach($filters['values'] as $i => $filter) {
+      unset($filter['id']);
+      unset($filter['data_processor_id']);
+      $dataProcessor['filters'][] = $filter;
+    }
+    $fields = civicrm_api3('DataProcessorField', 'get', array('data_processor_id' => $data_processor_id, 'options' => array('limit' => 0)));
+    $dataProcessor['fields'] = array();
+    foreach($fields['values'] as $i => $field) {
+      unset($field['id']);
+      unset($field['data_processor_id']);
+      $dataProcessor['fields'][] = $field;
+    }
+    $outputs = $outputs = civicrm_api3('DataProcessorOutput', 'get', array('data_processor_id' => $data_processor_id, 'options' => array('limit' => 0)));
+    $dataProcessor['outputs'] = array();
+    foreach($outputs['values'] as $i => $output) {
+      unset($output['id']);
+      unset($output['data_processor_id']);
+      $dataProcessor['outputs'][] = $output;
+    }
+
+    $eventData['data_processor'] = &$dataProcessor;
+    $event = \Civi\Core\Event\GenericHookEvent::create($eventData);
+    \Civi::dispatcher()->dispatch('hook_civicrm_dataprocessor_export', $event);
+
+    return $dataProcessor;
+  }
+
+  public static function import($data, $filename, $overWriteInDatabase=false) {
     $new_status = null;
     $new_id = null;
-
-    CRM_Dataprocessor_BAO_DataProcessor::setDataProcessorToImportingState($data['name']);
+    $data_processor_id = null;
+    $status = null;
+    try {
+      $dataProcessor = civicrm_api3('DataProcessor', 'getsingle', ['name' => $data['name']]);
+      $data_processor_id = $dataProcessor['id'];
+      $status = $dataProcessor['status'] ? $dataProcessor['status'] : CRM_Dataprocessor_Status::STATUS_IN_DATABASE;
+    } catch (Exception $e) {
+      // Do nothing
+    }
 
     switch ($status) {
-      case CRM_Dataprocessor_DAO_DataProcessor::STATUS_IN_DATABASE:
+      case CRM_Dataprocessor_Status::STATUS_IN_DATABASE:
         // Update to overriden
-        CRM_Dataprocessor_BAO_DataProcessor::setStatusAndSourceFile($data['name'], CRM_Dataprocessor_DAO_DataProcessor::STATUS_OVERRIDDEN, $filename);
-        $new_id = $data_processor_id;
-        $new_status = CRM_Dataprocessor_DAO_DataProcessor::STATUS_OVERRIDDEN;
+        if (!$overWriteInDatabase) {
+          civicrm_api3('DataProcessor', 'create', array(
+            'id' => $data_processor_id,
+            'status' => CRM_Dataprocessor_Status::STATUS_OVERRIDDEN,
+            'source_file' => $filename,
+          ));
+          $new_id = $data_processor_id;
+          $new_status = CRM_Dataprocessor_Status::STATUS_OVERRIDDEN;
+        } else {
+          $new_id = self::importDataProcessor($data, $filename, $data_processor_id, CRM_Dataprocessor_Status::STATUS_IN_DATABASE);
+          $new_status = CRM_Dataprocessor_Status::STATUS_IN_DATABASE;
+        }
         break;
-      case CRM_Dataprocessor_DAO_DataProcessor::STATUS_OVERRIDDEN:
-        $new_id = $data_processor_id;
-        $new_status = CRM_Dataprocessor_DAO_DataProcessor::STATUS_OVERRIDDEN;
+      case CRM_Dataprocessor_Status::STATUS_OVERRIDDEN:
+        if (!$overWriteInDatabase) {
+          $new_id = $data_processor_id;
+          $new_status = CRM_Dataprocessor_Status::STATUS_OVERRIDDEN;
+        } else {
+          $new_id = self::importDataProcessor($data, $filename, $data_processor_id, CRM_Dataprocessor_Status::STATUS_OVERRIDDEN);
+          $new_status = CRM_Dataprocessor_Status::STATUS_OVERRIDDEN;
+        }
         break;
       default:
-        $new_id = self::importDataProcessor($data, $filename, $data_processor_id);
-        $new_status = CRM_Dataprocessor_DAO_DataProcessor::STATUS_IN_CODE;
+        if (!$overWriteInDatabase) {
+          $new_id = self::importDataProcessor($data, $filename, $data_processor_id, CRM_Dataprocessor_Status::STATUS_IN_CODE);
+          $new_status = CRM_Dataprocessor_Status::STATUS_IN_CODE;
+        } else {
+          $new_id = self::importDataProcessor($data, $filename, $data_processor_id, CRM_Dataprocessor_Status::STATUS_OVERRIDDEN);
+          $new_status = CRM_Dataprocessor_Status::STATUS_OVERRIDDEN;
+        }
         break;
     }
 
@@ -52,10 +127,12 @@ class CRM_Dataprocessor_Utils_Importer {
    * @return mixed
    * @throws \Exception
    */
-  public static function importDataProcessor($data, $filename, $data_processor_id) {
+  public static function importDataProcessor($data, $filename, $data_processor_id, $status) {
     $params = $data;
     unset($params['data_sources']);
     unset($params['outputs']);
+    unset($params['fields']);
+    unset($params['filters']);
     if ($data_processor_id) {
       $params['id'] = $data_processor_id;
     }
@@ -65,14 +142,13 @@ class CRM_Dataprocessor_Utils_Importer {
     if (!isset($params['storage_configuration'])) {
       $params['storage_configuration'] = array();
     }
-    $params['status'] = CRM_Dataprocessor_DAO_DataProcessor::STATUS_IN_CODE;
-    $params['source_file'] = $filename;
-    CRM_Dataprocessor_BAO_DataProcessor::setDataProcessorToImportingState($params['name']);
-    $result = CRM_Dataprocessor_BAO_DataProcessor::add($params);
+    $params['status'] = $status;
+    $params['source_file'] = $filename ? $filename : null;
+    $result = civicrm_api3('DataProcessor', 'create', $params);
     $id = $result['id'];
 
     // Clear all existing data sources and outputs
-    CRM_Dataprocessor_BAO_Source::deleteWithDataProcessorId($id);
+    CRM_Dataprocessor_BAO_DataProcessorSource::deleteWithDataProcessorId($id);
     CRM_Dataprocessor_BAO_DataProcessorFilter::deleteWithDataProcessorId($id);
     CRM_Dataprocessor_BAO_DataProcessorField::deleteWithDataProcessorId($id);
     CRM_Dataprocessor_BAO_DataProcessorOutput::deleteWithDataProcessorId($id);
@@ -80,7 +156,13 @@ class CRM_Dataprocessor_Utils_Importer {
     foreach($data['data_sources'] as $data_source) {
       $params = $data_source;
       $params['data_processor_id'] = $id;
-      $result = CRM_Dataprocessor_BAO_Source::add($params);
+      $params['debug'] = 1;
+      var_dump($params);
+      try {
+        civicrm_api3('DataProcessorSource', 'create', $params);
+      } catch (\CiviCRM_API3_Exception $e) {
+        echo $e->getTraceAsString(); exit();
+      }
     }
     foreach($data['filters'] as $filter) {
       $params = $filter;
diff --git a/CRM/DataprocessorOutputExport/CSV.php b/CRM/DataprocessorOutputExport/CSV.php
index 6f269250306817343d625224121e21dbf3afdef2..49386c7f1374a8604d7cdb55eb9b941e58ea3398 100644
--- a/CRM/DataprocessorOutputExport/CSV.php
+++ b/CRM/DataprocessorOutputExport/CSV.php
@@ -90,32 +90,32 @@ class CRM_DataprocessorOutputExport_CSV implements ExportOutputInterface {
   /**
    * Download export
    *
-   * @param \Civi\DataProcessor\ProcessorType\AbstractProcessorType $dataProcessor
-   * @param array $dataProcessorBAO
+   * @param \Civi\DataProcessor\ProcessorType\AbstractProcessorType $dataProcessorClass
+   * @param array $dataProcessor
    * @param array $outputBAO
    * @param array $formValues
    * @return string
    * @throws \Exception
    */
-  public function downloadExport(\Civi\DataProcessor\ProcessorType\AbstractProcessorType $dataProcessor, $dataProcessorBAO, $outputBAO, $formValues) {
-    if ($dataProcessor->getDataFlow()->recordCount() > self::MAX_DIRECT_SIZE) {
-      $this->startBatchJob($dataProcessor, $dataProcessorBAO, $outputBAO, $formValues);
+  public function downloadExport(\Civi\DataProcessor\ProcessorType\AbstractProcessorType $dataProcessorClass, $dataProcessor, $outputBAO, $formValues) {
+    if ($dataProcessorClass->getDataFlow()->recordCount() > self::MAX_DIRECT_SIZE) {
+      $this->startBatchJob($dataProcessorClass, $dataProcessor, $outputBAO, $formValues);
     } else {
-      $this->doDirectDownload($dataProcessor, $dataProcessorBAO, $outputBAO);
+      $this->doDirectDownload($dataProcessorClass, $dataProcessor, $outputBAO);
     }
   }
 
-  protected function doDirectDownload(\Civi\DataProcessor\ProcessorType\AbstractProcessorType $dataProcessor, $dataProcessorBAO, $outputBAO) {
-    $filename = date('Ymdhis').'_'.$dataProcessorBAO['id'].'_'.$outputBAO['id'].'_'.CRM_Core_Session::getLoggedInContactID().'_'.$dataProcessorBAO['name'].'.csv';
-    $download_name = date('Ymdhis').'_'.$dataProcessorBAO['name'].'.csv';
+  protected function doDirectDownload(\Civi\DataProcessor\ProcessorType\AbstractProcessorType $dataProcessorClass, $dataProcessor, $outputBAO) {
+    $filename = date('Ymdhis').'_'.$dataProcessor['id'].'_'.$outputBAO['id'].'_'.CRM_Core_Session::getLoggedInContactID().'_'.$dataProcessor['name'].'.csv';
+    $download_name = date('Ymdhis').'_'.$dataProcessor['name'].'.csv';
     $basePath = CRM_Core_Config::singleton()->templateCompileDir . 'dataprocessor_export_csv';
     CRM_Utils_File::createDir($basePath);
     CRM_Utils_File::restrictAccess($basePath.'/');
 
     $path = CRM_Core_Config::singleton()->templateCompileDir . 'dataprocessor_export_csv/'. $filename;
 
-    self::createHeaderLine($path, $dataProcessor);
-    self::exportDataProcessor($path, $dataProcessor);
+    self::createHeaderLine($path, $dataProcessorClass);
+    self::exportDataProcessor($path, $dataProcessorClass);
 
     $mimeType = CRM_Utils_Request::retrieveValue('mime-type', 'String', '', FALSE);
 
@@ -138,10 +138,10 @@ class CRM_DataprocessorOutputExport_CSV implements ExportOutputInterface {
     );
   }
 
-  protected function startBatchJob(\Civi\DataProcessor\ProcessorType\AbstractProcessorType $dataProcessor, $dataProcessorBAO, $outputBAO, $formValues) {
+  protected function startBatchJob(\Civi\DataProcessor\ProcessorType\AbstractProcessorType $dataProcessorClass, $dataProcessor, $outputBAO, $formValues) {
     $session = CRM_Core_Session::singleton();
 
-    $name = date('Ymdhis').'_'.$dataProcessorBAO['id'].'_'.$outputBAO['id'].'_'.CRM_Core_Session::getLoggedInContactID().'_'.$dataProcessorBAO['name'];
+    $name = date('Ymdhis').'_'.$dataProcessor['id'].'_'.$outputBAO['id'].'_'.CRM_Core_Session::getLoggedInContactID().'_'.$dataProcessor['name'];
 
     $queue = CRM_Queue_Service::singleton()->create(array(
       'type' => 'Sql',
@@ -154,9 +154,9 @@ class CRM_DataprocessorOutputExport_CSV implements ExportOutputInterface {
     CRM_Utils_File::restrictAccess($basePath.'/');
     $filename = $basePath.'/'. $name.'.csv';
 
-    self::createHeaderLine($filename, $dataProcessor);
+    self::createHeaderLine($filename, $dataProcessorClass);
 
-    $count = $dataProcessor->getDataFlow()->recordCount();
+    $count = $dataProcessorClass->getDataFlow()->recordCount();
     $recordsPerJob = self::RECORDS_PER_JOB;
     for($i=0; $i < $count; $i = $i + $recordsPerJob) {
       $title = E::ts('Exporting records %1/%2', array(
@@ -170,7 +170,7 @@ class CRM_DataprocessorOutputExport_CSV implements ExportOutputInterface {
           'CRM_DataprocessorOutputExport_CSV',
           'exportBatch'
         ), //call back method
-        array($filename,$formValues, $dataProcessorBAO['id'], $i, $recordsPerJob), //parameters,
+        array($filename,$formValues, $dataProcessor['id'], $i, $recordsPerJob), //parameters,
         $title
       );
       //now add this task to the queue
@@ -218,11 +218,12 @@ class CRM_DataprocessorOutputExport_CSV implements ExportOutputInterface {
   }
 
   public static function exportBatch(CRM_Queue_TaskContext $ctx, $filename, $params, $dataProcessorId, $offset, $limit) {
-    $dataProcessor = CRM_Dataprocessor_BAO_DataProcessor::getDataProcessorById($dataProcessorId);
-    CRM_Dataprocessor_Form_Output_AbstractUIOutputForm::applyFilters($dataProcessor, $params);
-    $dataProcessor->getDataFlow()->setOffset($offset);
-    $dataProcessor->getDataFlow()->setLimit($limit);
-    self::exportDataProcessor($filename, $dataProcessor);
+    $dataProcessor = civicrm_api3('DataProcessor', 'getsingle', array('id' => $dataProcessorId));
+    $dataProcessorClass = \CRM_Dataprocessor_BAO_DataProcessor::dataProcessorToClass($dataProcessor);
+    CRM_Dataprocessor_Form_Output_AbstractUIOutputForm::applyFilters($dataProcessorClass, $params);
+    $dataProcessorClass->getDataFlow()->setOffset($offset);
+    $dataProcessorClass->getDataFlow()->setLimit($limit);
+    self::exportDataProcessor($filename, $dataProcessorClass);
     return TRUE;
   }
 
diff --git a/CRM/DataprocessorSearch/ActivitySearch.php b/CRM/DataprocessorSearch/ActivitySearch.php
index 501953ac5d3c4e14251c8d18facf5a0d24f37bf7..aa78f8edf2ea011fc3c1e51959a8eb65734ebc95 100644
--- a/CRM/DataprocessorSearch/ActivitySearch.php
+++ b/CRM/DataprocessorSearch/ActivitySearch.php
@@ -28,9 +28,10 @@ class CRM_DataprocessorSearch_ActivitySearch implements UIOutputInterface {
    */
   public function buildConfigurationForm(\CRM_Core_Form $form, $output=array()) {
     $navigation = CRM_Dataprocessor_Utils_Navigation::singleton();
-    $dataProcessor = \CRM_Dataprocessor_BAO_DataProcessor::getDataProcessorById($output['data_processor_id']);
+    $dataProcessor = civicrm_api3('DataProcessor', 'getsingle', array('id' => $output['data_processor_id']));
+    $dataProcessorClass = \CRM_Dataprocessor_BAO_DataProcessor::dataProcessorToClass($dataProcessor);
     $fields = array();
-    foreach($dataProcessor->getDataFlow()->getOutputFieldHandlers() as $outputFieldHandler) {
+    foreach($dataProcessorClass->getDataFlow()->getOutputFieldHandlers() as $outputFieldHandler) {
       $field = $outputFieldHandler->getOutputFieldSpecification();
       $fields[$field->alias] = $field->title;
     }
diff --git a/CRM/DataprocessorSearch/ContactSearch.php b/CRM/DataprocessorSearch/ContactSearch.php
index 66ceeec511e9c1f1998c5627b17a770ef80c2230..7e34a5da2db94eda29b953fb17273820df10b485 100644
--- a/CRM/DataprocessorSearch/ContactSearch.php
+++ b/CRM/DataprocessorSearch/ContactSearch.php
@@ -27,9 +27,10 @@ class CRM_DataprocessorSearch_ContactSearch implements UIOutputInterface {
    */
   public function buildConfigurationForm(\CRM_Core_Form $form, $output=array()) {
     $navigation = CRM_Dataprocessor_Utils_Navigation::singleton();
-    $dataProcessor = \CRM_Dataprocessor_BAO_DataProcessor::getDataProcessorById($output['data_processor_id']);
+    $dataProcessor = civicrm_api3('DataProcessor', 'getsingle', array('id' => $output['data_processor_id']));
+    $dataProcessorClass = \CRM_Dataprocessor_BAO_DataProcessor::dataProcessorToClass($dataProcessor);
     $fields = array();
-    foreach($dataProcessor->getDataFlow()->getOutputFieldHandlers() as $outputFieldHandler) {
+    foreach($dataProcessorClass->getDataFlow()->getOutputFieldHandlers() as $outputFieldHandler) {
       $field = $outputFieldHandler->getOutputFieldSpecification();
       $fields[$field->alias] = $field->title;
     }
diff --git a/CRM/DataprocessorSearch/Form/AbstractSearch.php b/CRM/DataprocessorSearch/Form/AbstractSearch.php
index eb5d56008cc844c529ae3bdcaa8f68ce1998e64d..51f08b22ba16a373f4017902858f9e46f3746ac8 100644
--- a/CRM/DataprocessorSearch/Form/AbstractSearch.php
+++ b/CRM/DataprocessorSearch/Form/AbstractSearch.php
@@ -165,11 +165,11 @@ abstract class CRM_DataprocessorSearch_Form_AbstractSearch extends CRM_Dataproce
 
   protected function runExport($export_id) {
     $factory = dataprocessor_get_factory();
-    self::applyFilters($this->dataProcessor, $this->_formValues);
+    self::applyFilters($this->dataProcessorClass, $this->_formValues);
     $output = civicrm_api3("DataProcessorOutput", "getsingle", array('id' => $export_id));
     $outputClass = $factory->getOutputByName($output['type']);
     if ($outputClass instanceof \Civi\DataProcessor\Output\ExportOutputInterface) {
-      $outputClass->downloadExport($this->dataProcessor, $this->dataProcessorBAO, $output, $this->_formValues);
+      $outputClass->downloadExport($this->dataProcessorClass, $this->dataProcessor, $output, $this->_formValues);
     }
   }
 
@@ -190,9 +190,9 @@ abstract class CRM_DataprocessorSearch_Form_AbstractSearch extends CRM_Dataproce
     $this->assign('id_field', $id_field);
 
     $offset = ($pageId - 1) * $limit;
-    $this->dataProcessor->getDataFlow()->setLimit($limit);
-    $this->dataProcessor->getDataFlow()->setOffset($offset);
-    self::applyFilters($this->dataProcessor, $this->_formValues);
+    $this->dataProcessorClass->getDataFlow()->setLimit($limit);
+    $this->dataProcessorClass->getDataFlow()->setOffset($offset);
+    self::applyFilters($this->dataProcessorClass, $this->_formValues);
 
     // Set the sort
     $sortDirection = 'ASC';
@@ -201,19 +201,19 @@ abstract class CRM_DataprocessorSearch_Form_AbstractSearch extends CRM_Dataproce
       if ($this->sort->getCurrentSortDirection() == CRM_Utils_Sort::DESCENDING) {
         $sortDirection = 'DESC';
       }
-      $this->dataProcessor->getDataFlow()->addSort($sortField['name'], $sortDirection);
+      $this->dataProcessorClass->getDataFlow()->addSort($sortField['name'], $sortDirection);
     }
 
 
     $pagerParams = $this->getPagerParams();
-    $pagerParams['total'] = $this->dataProcessor->getDataFlow()->recordCount();
+    $pagerParams['total'] = $this->dataProcessorClass->getDataFlow()->recordCount();
     $pagerParams['pageID'] = $pageId;
     $this->pager = new CRM_Utils_Pager($pagerParams);
     $this->assign('pager', $this->pager);
 
     $i=0;
     try {
-      while($record = $this->dataProcessor->getDataFlow()->nextRecord()) {
+      while($record = $this->dataProcessorClass->getDataFlow()->nextRecord()) {
         $i ++;
         $row = array();
         $row['id'] = $record[$id_field]->formattedValue;
@@ -245,7 +245,7 @@ abstract class CRM_DataprocessorSearch_Form_AbstractSearch extends CRM_Dataproce
 
     $this->addElement('checkbox', 'toggleSelect', NULL, NULL, ['class' => 'select-rows']);
     $this->assign('rows', $rows);
-    $this->assign('debug_info', $this->dataProcessor->getDataFlow()->getDebugInformation());
+    $this->assign('debug_info', $this->dataProcessorClass->getDataFlow()->getDebugInformation());
     if ($this->usePrevNextCache()) {
       $cacheKey = "civicrm search {$this->controller->_key}";
       CRM_DataprocessorSearch_Utils_PrevNextCache::fillWithArray($cacheKey, $prevnextData);
@@ -263,7 +263,7 @@ abstract class CRM_DataprocessorSearch_Form_AbstractSearch extends CRM_Dataproce
     $idFieldVisible = $this->isIdFieldVisible();
     $columnHeaders = array();
     $sortColumnNr = 1;
-    foreach($this->dataProcessor->getDataFlow()->getOutputFieldHandlers() as $outputFieldHandler) {
+    foreach($this->dataProcessorClass->getDataFlow()->getOutputFieldHandlers() as $outputFieldHandler) {
       $field = $outputFieldHandler->getOutputFieldSpecification();
       $hiddenField = true;
       if ($field->alias != $id_field) {
@@ -315,9 +315,9 @@ abstract class CRM_DataprocessorSearch_Form_AbstractSearch extends CRM_Dataproce
       $outputClass = $factory->getOutputByName(($output['type']));
       if ($outputClass instanceof \Civi\DataProcessor\Output\ExportOutputInterface) {
         $otherOutput = array();
-        $otherOutput['title'] = $outputClass->getTitleForExport($output, $this->dataProcessorBAO);
+        $otherOutput['title'] = $outputClass->getTitleForExport($output, $this->dataProcessor);
         $otherOutput['url'] = $this->currentUrl.'&export_id='.$output['id'];
-        $otherOutput['icon'] = $outputClass->getExportFileIcon($output, $this->dataProcessorBAO);
+        $otherOutput['icon'] = $outputClass->getExportFileIcon($output, $this->dataProcessor);
         $otherOutputs[] = $otherOutput;
       }
     }
diff --git a/Civi/DataProcessor/FilterHandler/SimpleSqlFilter.php b/Civi/DataProcessor/FilterHandler/SimpleSqlFilter.php
index 563a93b0d5669fe62c3310d56066ea6d62a57398..87fccf17bd9d6bd30d8078bb1c787789a5469081 100644
--- a/Civi/DataProcessor/FilterHandler/SimpleSqlFilter.php
+++ b/Civi/DataProcessor/FilterHandler/SimpleSqlFilter.php
@@ -47,9 +47,11 @@ class SimpleSqlFilter extends AbstractFilterHandler {
     $this->is_required = $is_required;
 
     $this->dataSource = $this->data_processor->getDataSourceByName($configuration['datasource']);
-    $this->fieldSpecification  =  clone $this->dataSource->getAvailableFilterFields()->getFieldSpecificationByName($configuration['field']);
-    $this->fieldSpecification->alias = $alias;
-    $this->fieldSpecification->title = $title;
+    if ($this->dataSource) {
+      $this->fieldSpecification  =  clone $this->dataSource->getAvailableFilterFields()->getFieldSpecificationByName($configuration['field']);
+      $this->fieldSpecification->alias = $alias;
+      $this->fieldSpecification->title = $title;
+    }
   }
 
   /**
diff --git a/Civi/DataProcessor/Output/Api.php b/Civi/DataProcessor/Output/Api.php
index b15dd606f7f3e63d31b5cea1e098ad118e0770c5..be5c4b2bc67b6307f9144195a5a7c2d49e9ee67d 100644
--- a/Civi/DataProcessor/Output/Api.php
+++ b/Civi/DataProcessor/Output/Api.php
@@ -147,10 +147,11 @@ class Api implements OutputInterface, API_ProviderInterface, EventSubscriberInte
         if (!$dao->fetch()) {
           throw new \API_Exception("Could not find a data processor");
         }
-        $dataProcessor = \CRM_Dataprocessor_BAO_DataProcessor::getDataProcessorById($dao->data_processor_id);
+        $dataProcessor = civicrm_api3('DataProcessor', 'getsingle', array('id' => $dao->data_processor_id));
+        $dataProcessorClass = \CRM_Dataprocessor_BAO_DataProcessor::dataProcessorToClass($dataProcessor);
 
 
-        foreach ($dataProcessor->getDataFlow()->getOutputFieldHandlers() as $outputFieldHandler) {
+        foreach ($dataProcessorClass->getDataFlow()->getOutputFieldHandlers() as $outputFieldHandler) {
           $fieldSpec = $outputFieldHandler->getOutputFieldSpecification();
           $type = \CRM_Utils_Type::T_STRING;
           if (isset($types[$fieldSpec->type])) {
@@ -171,7 +172,7 @@ class Api implements OutputInterface, API_ProviderInterface, EventSubscriberInte
           }
           $result['values'][$fieldSpec->alias] = $field;
         }
-        foreach($dataProcessor->getFilterHandlers() as $filterHandler) {
+        foreach($dataProcessorClass->getFilterHandlers() as $filterHandler) {
           $fieldSpec = $filterHandler->getFieldSpecification();
           $type = \CRM_Utils_Type::T_STRING;
           if (isset($types[$fieldSpec->type])) {
@@ -236,10 +237,11 @@ class Api implements OutputInterface, API_ProviderInterface, EventSubscriberInte
     if (strtolower($dao->api_count_action) == $apiRequest['action']) {
       $isCountAction = TRUE;
     }
-    $dataProcessor = \CRM_Dataprocessor_BAO_DataProcessor::getDataProcessorById($dao->data_processor_id);
+    $dataProcessor = civicrm_api3('DataProcessor', 'getsingle', array('id' => $dao->data_processor_id));
+    $dataProcessorClass = \CRM_Dataprocessor_BAO_DataProcessor::dataProcessorToClass($dataProcessor);
 
     $params = $apiRequest['params'];
-    foreach($dataProcessor->getFilterHandlers() as $filter) {
+    foreach($dataProcessorClass->getFilterHandlers() as $filter) {
       $filterSpec = $filter->getFieldSpecification();
       if ($filter->isRequired() && !isset($params[$filterSpec->alias])) {
         throw new \API_Exception('Field '.$filterSpec->alias.' is required');
@@ -262,27 +264,27 @@ class Api implements OutputInterface, API_ProviderInterface, EventSubscriberInte
     }
 
     if ($isCountAction) {
-      $count = $dataProcessor->getDataFlow()->recordCount();
+      $count = $dataProcessorClass->getDataFlow()->recordCount();
       return array('result' => $count, 'is_error' => 0);
     } else {
       $options = _civicrm_api3_get_options_from_params($apiRequest['params']);
 
       if (isset($options['limit']) && $options['limit'] > 0) {
-        $dataProcessor->getDataFlow()->setLimit($options['limit']);
+        $dataProcessorClass->getDataFlow()->setLimit($options['limit']);
       }
       if (isset($options['offset'])) {
-        $dataProcessor->getDataFlow()->setOffset($options['offset']);
+        $dataProcessorClass->getDataFlow()->setOffset($options['offset']);
       }
       if (isset($options['sort'])) {
         $sort = explode(', ', $options['sort']);
         foreach ($sort as $index => &$sortString) {
           // Get sort field and direction
           list($sortField, $dir) = array_pad(explode(' ', $sortString), 2, 'ASC');
-          $dataProcessor->getDataFlow()->addSort($sortField, $dir);
+          $dataProcessorClass->getDataFlow()->addSort($sortField, $dir);
         }
       }
 
-      $records = $dataProcessor->getDataFlow()->allRecords();
+      $records = $dataProcessorClass->getDataFlow()->allRecords();
       $values = array();
       foreach($records as $idx => $record) {
         foreach($record as $fieldname => $field) {
@@ -295,7 +297,7 @@ class Api implements OutputInterface, API_ProviderInterface, EventSubscriberInte
         'is_error' => 0,
       );
       if (isset($apiRequest['params']['debug']) && $apiRequest['params']['debug']) {
-        $return['debug_info'] = $dataProcessor->getDataFlow()->getDebugInformation();
+        $return['debug_info'] = $dataProcessorClass->getDataFlow()->getDebugInformation();
       }
       return $return;
     }
diff --git a/Civi/DataProcessor/Output/ExportOutputInterface.php b/Civi/DataProcessor/Output/ExportOutputInterface.php
index 6f7dac9eb1f8ca887ccaefeb0a6df5076b206a26..b6962c37aee9dc34d409c75d0a3053b607d5429c 100644
--- a/Civi/DataProcessor/Output/ExportOutputInterface.php
+++ b/Civi/DataProcessor/Output/ExportOutputInterface.php
@@ -18,13 +18,13 @@ interface ExportOutputInterface extends OutputInterface {
   /**
    * Download export
    *
-   * @param \Civi\DataProcessor\ProcessorType\AbstractProcessorType $dataProcessor
-   * @param array $dataProcessorBAO
+   * @param \Civi\DataProcessor\ProcessorType\AbstractProcessorType $dataProcessorClass
+   * @param array $dataProcessor
    * @param array $outputBAO
    * @param array $formValues
    * @return string
    */
-  public function downloadExport(\Civi\DataProcessor\ProcessorType\AbstractProcessorType $dataProcessor, $dataProcessorBAO, $outputBAO, $formValues);
+  public function downloadExport(\Civi\DataProcessor\ProcessorType\AbstractProcessorType $dataProcessorClass, $dataProcessor, $outputBAO, $formValues);
 
   /**
    * Returns the mime type of the export file.
diff --git a/api/v3/DataProcessor.php b/api/v3/DataProcessor.php
new file mode 100644
index 0000000000000000000000000000000000000000..76f9a5478faa951975381d818c044fedb0c0a010
--- /dev/null
+++ b/api/v3/DataProcessor.php
@@ -0,0 +1,139 @@
+<?php
+use CRM_Dataprocessor_ExtensionUtil as E;
+
+/**
+ * DataProcessor.create API specification (optional)
+ * This is used for documentation and validation.
+ *
+ * @param array $spec description of fields supported by this API call
+ * @return void
+ * @see http://wiki.civicrm.org/confluence/display/CRMDOC/API+Architecture+Standards
+ */
+function _civicrm_api3_data_processor_create_spec(&$spec) {
+  $fields = CRM_Dataprocessor_DAO_DataProcessor::fields();
+  foreach($fields as $fieldname => $field) {
+    $spec[$fieldname] = $field;
+  }
+}
+
+/**
+ * DataProcessor.create API
+ *
+ * @param array $params
+ * @return array API result descriptor
+ * @throws API_Exception
+ */
+function civicrm_api3_data_processor_create($params) {
+  $id = null;
+  if (isset($params['id'])) {
+    $id = $params['id'];
+  }
+  if (isset($params['title'])) {
+    $params['name'] = CRM_Dataprocessor_BAO_DataProcessor::checkName($params['title'], $id, $params['name']);
+  }
+  return _civicrm_api3_basic_create(_civicrm_api3_get_BAO(__FUNCTION__), $params);
+}
+
+/**
+ * DataProcessor.delete API specification (optional)
+ * This is used for documentation and validation.
+ *
+ * @param array $spec description of fields supported by this API call
+ * @return void
+ * @see http://wiki.civicrm.org/confluence/display/CRMDOC/API+Architecture+Standards
+ */
+function civicrm_api3_data_processor_delete_spec(&$spec) {
+  $spec['id']['api.required'] = true;
+}
+
+/**
+ * DataProcessor.delete API
+ *
+ * @param array $params
+ * @return array API result descriptor
+ * @throws API_Exception
+ */
+function civicrm_api3_data_processor_delete($params) {
+  CRM_Dataprocessor_BAO_DataProcessorOutput::deleteWithDataProcessorId($params['id']);
+  CRM_Dataprocessor_BAO_DataProcessorField::deleteWithDataProcessorId($params['id']);
+  CRM_Dataprocessor_BAO_DataProcessorFilter::deleteWithDataProcessorId($params['id']);
+  CRM_Dataprocessor_BAO_DataProcessorSource::deleteWithDataProcessorId($params['id']);
+  return _civicrm_api3_basic_delete(_civicrm_api3_get_BAO(__FUNCTION__), $params);
+}
+
+/**
+ * DataProcessor.get API specification (optional)
+ * This is used for documentation and validation.
+ *
+ * @param array $spec description of fields supported by this API call
+ * @return void
+ * @see http://wiki.civicrm.org/confluence/display/CRMDOC/API+Architecture+Standards
+ */
+function civicrm_api3_data_processor_get_spec(&$spec) {
+  $fields = CRM_Dataprocessor_DAO_DataProcessor::fields();
+  foreach($fields as $fieldname => $field) {
+    $spec[$fieldname] = $field;
+  }
+}
+
+/**
+ * DataProcessor.get API
+ *
+ * @param array $params
+ * @return array API result descriptor
+ * @throws API_Exception
+ */
+function civicrm_api3_data_processor_get($params) {
+  $return = _civicrm_api3_basic_get(_civicrm_api3_get_BAO(__FUNCTION__), $params);
+  foreach($return['values'] as $id => $value) {
+    if (isset($value['configuration'])) {
+      $return['values'][$id]['configuration'] = json_decode($value['configuration'], TRUE);
+    } else {
+      $return['values'][$id]['configuration'] = array();
+    }
+    if (isset($value['aggregation'])) {
+      $return['values'][$id]['aggregation'] = json_decode($value['aggregation'], TRUE);
+    } else {
+      $return['values'][$id]['aggregation'] = array();
+    }
+    if (isset($value['storage_configuration'])) {
+      $return['values'][$id]['storage_configuration'] = json_decode($value['storage_configuration'], TRUE);
+    } else {
+      $return['values'][$id]['storage_configuration'] = array();
+    }
+  }
+  return $return;
+}
+
+/**
+ * DataProcessor.check_name API specification
+ *
+ * @param $params
+ */
+function _civicrm_api3_data_processor_check_name_spec($params) {
+  $params['id'] = array(
+    'name' => 'id',
+    'title' => E::ts('ID'),
+  );
+  $params['title'] = array(
+    'name' => 'title',
+    'title' => E::ts('Title'),
+    'api.required' => true,
+  );
+  $params['name'] = array(
+    'name' => 'name',
+    'title' => E::ts('Name'),
+  );
+}
+
+/**
+ * DataProcessor.check_name API
+ *
+ * @param $params
+ */
+function civicrm_api3_data_processor_check_name($params) {
+  $name = CRM_Dataprocessor_BAO_DataProcessor::checkName($params['title'], $params['id'], $params['name']);
+  return array(
+    'name' => $name,
+  );
+}
diff --git a/api/v3/DataProcessor/Create.php b/api/v3/DataProcessor/Create.php
deleted file mode 100644
index 268aeb3255514247196a2e4f8c1aa6172e6c2153..0000000000000000000000000000000000000000
--- a/api/v3/DataProcessor/Create.php
+++ /dev/null
@@ -1,86 +0,0 @@
-<?php
-
-use CRM_Dataprocessor_ExtensionUtil as E;
-
-/**
- * DataProcessor.Create API specification (optional)
- * This is used for documentation and validation.
- *
- * @param array $spec description of fields supported by this API call
- * @return void
- * @see http://wiki.civicrm.org/confluence/display/CRM/API+Architecture+Standards
- */
-function _civicrm_api3_data_processor_create_spec(&$spec) {
-  $spec['id'] = array(
-		'title' => E::ts('ID'),
-		'type' => CRM_Utils_Type::T_INT,
-		'api.required' => false
-	);
-	$spec['title'] = array(
-		'title' => E::ts('Title'),
-		'type' => CRM_Utils_Type::T_STRING,
-		'api.required' => true
-	);
-  $spec['name'] = array(
-    'title' => E::ts('Name'),
-    'type' => CRM_Utils_Type::T_STRING,
-    'api.required' => true
-  );
-  $spec['type'] = array(
-    'title' => E::ts('Type'),
-    'type' => CRM_Utils_Type::T_STRING,
-    'api.required' => true
-  );
-	$spec['is_active'] = array(
-		'title' => E::ts('Is active'),
-		'type' => CRM_Utils_Type::T_BOOLEAN,
-		'api.required' => true,
-		'api.default' => true,
-	);
-	$spec['description'] = array(
-		'title' => E::ts('Description'),
-		'type' => CRM_Utils_Type::T_TEXT,
-		'api.required' => false,
-	);
-  $spec['configuration'] = array(
-    'title' => E::ts('Configuration'),
-    'type' => CRM_Utils_Type::T_TEXT,
-    'api.required' => false,
-  );
-  $spec['aggregation'] = array(
-    'title' => E::ts('Aggregation'),
-    'type' => CRM_Utils_Type::T_TEXT,
-    'api.required' => false,
-  );
-  $spec['storage_type'] = array(
-    'title' => E::ts('Storage Type'),
-    'type' => CRM_Utils_Type::T_STRING,
-    'api.required' => false
-  );
-  $spec['storage_configuration'] = array(
-    'title' => E::ts('Storage Configuration'),
-    'type' => CRM_Utils_Type::T_TEXT,
-    'api.required' => false,
-  );
-}
-
-/**
- * DataProcessor.Create API
- *
- * @param array $params
- * @return array API result descriptor
- * @see civicrm_api3_create_success
- * @see civicrm_api3_create_error
- *
- *
- */
-function civicrm_api3_data_processor_create($params) {
-  if (!isset($params['id']) && empty($params['title'])) {
-    return civicrm_api3_create_error('Title can not be empty when adding a new DataProcessor');
-  }
-
-  $returnValue = CRM_Dataprocessor_BAO_DataProcessor::add($params);
-	$returnValues[$returnValue['id']] = $returnValue;
-  return civicrm_api3_create_success($returnValues, $params, 'DataProcessor', 'Create');
-}
-
diff --git a/api/v3/DataProcessor/Delete.php b/api/v3/DataProcessor/Delete.php
deleted file mode 100644
index 35dd1e3a46d7d05ab325f8687d59065980cca492..0000000000000000000000000000000000000000
--- a/api/v3/DataProcessor/Delete.php
+++ /dev/null
@@ -1,37 +0,0 @@
-<?php
-
-use CRM_Dataprocessor_ExtensionUtil as E;
-
-/**
- * DataProcessor.Delete API specification (optional)
- * This is used for documentation and validation.
- *
- * @param array $spec description of fields supported by this API call
- * @return void
- * @see http://wiki.civicrm.org/confluence/display/CRMDOC/API+Architecture+Standards
- */
-function _civicrm_api3_data_processor_Delete_spec(&$spec) {
-  $spec['id'] = array(
-		'title' => E::ts('ID'),
-		'type' => CRM_Utils_Type::T_INT,
-		'api.required' => true
-	);
-}
-
-/**
- * DataProcessor.Delete API
- *
- * @param array $params
- * @return array API result descriptor
- * @see civicrm_api3_create_success
- * @see civicrm_api3_create_error
- * @throws API_Exception
- */
-function civicrm_api3_data_processor_Delete($params) {
-  if (!array_key_exists('id', $params) || empty($params['id'])) {
-    throw new API_Exception('Parameter id is mandatory and can not be empty in ' . __METHOD__, 0010);
-  } else {
-    return civicrm_api3_create_success(CRM_Dataprocessor_BAO_DataProcessor::deleteWithId($params['id']), $params, 'DataProcessor', 'Delete');
-  }
-}
-
diff --git a/api/v3/DataProcessor/Get.php b/api/v3/DataProcessor/Get.php
deleted file mode 100644
index aab928b7534619ae13617493280efcef57017300..0000000000000000000000000000000000000000
--- a/api/v3/DataProcessor/Get.php
+++ /dev/null
@@ -1,30 +0,0 @@
-<?php
-/**
- * DataProcessor.Get API
- *
- * @param array $params
- * @return array API result descriptor
- * @see civicrm_api3_create_success
- * @see civicrm_api3_create_error
- * @throws API_Exception
- */
-function civicrm_api3_data_processor_get($params) {
-  $returnValues = CRM_Dataprocessor_BAO_DataProcessor::getValues($params);
-  return civicrm_api3_create_success($returnValues, $params, 'DataProcessor', 'Get');
-}
-
-/**
- * DataProcessor.Get API specification (optional)
- * This is used for documentation and validation.
- *
- * @param array $spec description of fields supported by this API call
- * @return void
- * @see http://wiki.civicrm.org/confluence/display/CRM/API+Architecture+Standards
- */
-function _civicrm_api3_data_processor_get_spec(&$spec) {
-	$fields = CRM_Dataprocessor_BAO_DataProcessor::fields();
-	foreach($fields as $fieldname => $field) {
-		$spec[$fieldname] = $field;
-	}
-}
-
diff --git a/api/v3/DataProcessor/Import.mgd.php b/api/v3/DataProcessor/Import.mgd.php
deleted file mode 100644
index c3b7bf019ec458a5577e877b3f7f4df71139c03c..0000000000000000000000000000000000000000
--- a/api/v3/DataProcessor/Import.mgd.php
+++ /dev/null
@@ -1,22 +0,0 @@
-<?php
-// This file declares a managed database record of type "Job".
-// The record will be automatically inserted, updated, or deleted from the
-// database as appropriate. For more details, see "hook_civicrm_managed" at:
-// http://wiki.civicrm.org/confluence/display/CRMDOC42/Hook+Reference
-return array (
-  0 => 
-  array (
-    'name' => 'Cron:DataProcessor.Import',
-    'entity' => 'Job',
-    'params' => 
-    array (
-      'version' => 3,
-      'name' => 'Import Data Processors',
-      'description' => 'Updates the data processor(s) from source files. Run this job manually if you want to update your changes into the database.',
-      'run_frequency' => 'Daily',
-      'api_entity' => 'DataProcessor',
-      'api_action' => 'Import',
-      'parameters' => '',
-    ),
-  ),
-);
diff --git a/api/v3/DataProcessor/Import.php b/api/v3/DataProcessor/Import.php
deleted file mode 100644
index b1fb4fbf9c0ea52c567a5669afbfe960b389e52f..0000000000000000000000000000000000000000
--- a/api/v3/DataProcessor/Import.php
+++ /dev/null
@@ -1,29 +0,0 @@
-<?php
-use CRM_Dataprocessor_ExtensionUtil as E;
-
-/**
- * DataProcessor.Import API specification (optional)
- * This is used for documentation and validation.
- *
- * @param array $spec description of fields supported by this API call
- * @return void
- * @see http://wiki.civicrm.org/confluence/display/CRMDOC/API+Architecture+Standards
- */
-function _civicrm_api3_data_processor_Import_spec(&$spec) {
-}
-
-/**
- * DataProcessor.Import API
- *
- * @param array $params
- * @return array API result descriptor
- * @see civicrm_api3_create_success
- * @see civicrm_api3_create_error
- * @throws API_Exception
- */
-function civicrm_api3_data_processor_Import($params) {
-  $returnValues = array();
-  $returnValues['import'] = CRM_Dataprocessor_Utils_Importer::importFromExtensions();
-  $returnValues['is_error'] = 0;
-  return $returnValues;
-}
diff --git a/dataprocessor.civix.php b/dataprocessor.civix.php
index e4599a5daf0cc1a32e52ac873ff263a46d59c72f..b4cbf227932589c2da71f7a2ad05218a89cfcefc 100644
--- a/dataprocessor.civix.php
+++ b/dataprocessor.civix.php
@@ -457,6 +457,12 @@ function _dataprocessor_civix_civicrm_alterSettingsFolders(&$metaDataFolders = N
 
 function _dataprocessor_civix_civicrm_entityTypes(&$entityTypes) {
   $entityTypes = array_merge($entityTypes, array (
+    'CRM_Dataprocessor_DAO_DataProcessor' => 
+    array (
+      'name' => 'DataProcessor',
+      'class' => 'CRM_Dataprocessor_DAO_DataProcessor',
+      'table' => 'civicrm_data_processor',
+    ),
     'CRM_Dataprocessor_DAO_DataProcessorField' => 
     array (
       'name' => 'DataProcessorField',
diff --git a/docs/hooks.md b/docs/hooks.md
new file mode 100644
index 0000000000000000000000000000000000000000..abb29d198bdc2d062db2f89ce20ff3a9ac03f5da
--- /dev/null
+++ b/docs/hooks.md
@@ -0,0 +1,3 @@
+# Available Hooks
+
+## hook_civicrm_dataprocessor_export
\ No newline at end of file
diff --git a/sql/alter.sql b/sql/alter.sql
index 2f012583f8016792fec571a10b143f68faea5b21..0f226d081a2bc0d2a7583cf962a6d1f08d98375b 100644
--- a/sql/alter.sql
+++ b/sql/alter.sql
@@ -18,4 +18,10 @@ CHANGE `title` `title` VARCHAR(255) NOT NULL,
 CHANGE `join_type` `join_type` VARCHAR(255) NOT NULL,
 ADD `weight` int NULL;
 
-UPDATE `civicrm_data_processor_source` SET `weight` = `id`;
\ No newline at end of file
+UPDATE `civicrm_data_processor_source` SET `weight` = `id`;
+
+ALTER TABLE `civicrm_data_processor_filter`
+CHANGE `name` `name` VARCHAR(255) NOT NULL,
+CHANGE `type` `type` VARCHAR(255) NOT NULL,
+CHANGE `title` `title` VARCHAR(255) NOT NULL,
+CHANGE `storage_type` `storage_type` VARCHAR(255) NOT NULL;
\ No newline at end of file
diff --git a/sql/auto_install.sql b/sql/auto_install.sql
index fe9e6fd6710a46be12f32b2938e31a4e9755c7dd..8de37b3528bf1481772a3479ca4ebbeb7f4ced39 100644
--- a/sql/auto_install.sql
+++ b/sql/auto_install.sql
@@ -66,6 +66,7 @@ DROP TABLE IF EXISTS `civicrm_data_processor_source`;
 DROP TABLE IF EXISTS `civicrm_data_processor_output`;
 DROP TABLE IF EXISTS `civicrm_data_processor_filter`;
 DROP TABLE IF EXISTS `civicrm_data_processor_field`;
+DROP TABLE IF EXISTS `civicrm_data_processor`;
 
 SET FOREIGN_KEY_CHECKS=1;
 -- /*******************************************************
@@ -74,6 +75,33 @@ SET FOREIGN_KEY_CHECKS=1;
 -- *
 -- *******************************************************/
 
+-- /*******************************************************
+-- *
+-- * civicrm_data_processor
+-- *
+-- *******************************************************/
+CREATE TABLE `civicrm_data_processor` (
+
+
+     `id` int unsigned NOT NULL AUTO_INCREMENT  COMMENT 'Unique DataProcessor ID',
+     `name` varchar(255) NULL   ,
+     `title` varchar(255) NOT NULL   ,
+     `type` varchar(255) NOT NULL   ,
+     `configuration` text NULL   ,
+     `aggregation` text NULL   ,
+     `is_active` tinyint NOT NULL   ,
+     `description` text NULL   ,
+     `storage_type` varchar(255) NULL   ,
+     `storage_configuration` text NULL   ,
+     `status` int unsigned NULL  DEFAULT 0 ,
+     `source_file` varchar(255) NULL    
+,
+        PRIMARY KEY (`id`)
+ 
+ 
+ 
+)    ;
+
 -- /*******************************************************
 -- *
 -- * civicrm_data_processor_field
diff --git a/sql/auto_uninstall.sql b/sql/auto_uninstall.sql
index 7a2aea0b512f41c6748fdc958cebdc501fd319bc..5d4ba700faf99bb819dfb1cc8c56c4d71d385c9b 100644
--- a/sql/auto_uninstall.sql
+++ b/sql/auto_uninstall.sql
@@ -37,5 +37,6 @@ DROP TABLE IF EXISTS `civicrm_data_processor_source`;
 DROP TABLE IF EXISTS `civicrm_data_processor_output`;
 DROP TABLE IF EXISTS `civicrm_data_processor_filter`;
 DROP TABLE IF EXISTS `civicrm_data_processor_field`;
+DROP TABLE IF EXISTS `civicrm_data_processor`;
 
 SET FOREIGN_KEY_CHECKS=1;
diff --git a/sql/create_civicrm_data_processor.sql b/sql/create_civicrm_data_processor.sql
deleted file mode 100644
index fecba390c460fe2192c05cd0ba3f96d9db720b5f..0000000000000000000000000000000000000000
--- a/sql/create_civicrm_data_processor.sql
+++ /dev/null
@@ -1,15 +0,0 @@
-CREATE TABLE IF NOT EXISTS `civicrm_data_processor` (
-  `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
-  `type` VARCHAR(128) NOT NULL,
-  `configuration` TEXT NULL,
-  `aggregation` TEXT NULL,
-  `name` VARCHAR(128) NOT NULL,
-  `title` VARCHAR(128) NULL,
-  `is_active` TINYINT NULL DEFAULT 1,
-  `description` TEXT NULL,
-  `storage_type` VARCHAR(128) NULL,
-  `storage_configuration` TEXT NULL,
-  `status` TINYINT NULL DEFAULT 1,
-  `source_file` VARCHAR(255) NOT NULL DEFAULT '',
-  PRIMARY KEY (`id`)
-) ENGINE = InnoDB;
\ No newline at end of file
diff --git a/sql/uninstall.sql b/sql/uninstall.sql
deleted file mode 100644
index 7fad9d6a9e220056fb55ae4806443e1c26d7881d..0000000000000000000000000000000000000000
--- a/sql/uninstall.sql
+++ /dev/null
@@ -1,3 +0,0 @@
-DROP TABLE IF EXISTS `civicrm_data_processor_output`;
-DROP TABLE IF EXISTS `civicrm_data_processor_source`;
-DROP TABLE IF EXISTS `civicrm_data_processor`;
\ No newline at end of file
diff --git a/templates/CRM/Dataprocessor/Form/DataProcessor.tpl b/templates/CRM/Dataprocessor/Form/DataProcessor.tpl
index deab84407c43b1f5a5baea02cf58fcfcfd4548ff..37fb223c35154a6857a3b2a975a16201444e5c45 100644
--- a/templates/CRM/Dataprocessor/Form/DataProcessor.tpl
+++ b/templates/CRM/Dataprocessor/Form/DataProcessor.tpl
@@ -24,10 +24,19 @@
 <div class="crm-block crm-form-block crm-data-processor_title-block">
   <div class="crm-section">
     <div class="label">{$form.title.label}</div>
-    <div class="content">{$form.title.html}</div>
+    <div class="content">
+      {$form.title.html}
+      <span class="">
+        {ts}System name:{/ts}&nbsp;
+        <span id="systemName" style="font-style: italic;">{if ($dataProcessor)}{$dataProcessor.name}{/if}</span>
+        <a href="javascript:void(0);" onclick="jQuery('#nameSection').removeClass('hiddenElement'); jQuery(this).parent().addClass('hiddenElement'); return false;">
+          {ts}Change{/ts}
+        </a>
+      </span>
+    </div>
     <div class="clear"></div>
   </div>
-  <div class="crm-section">
+  <div id="nameSection" class="crm-section hiddenElement">
     <div class="label">{$form.name.label}</div>
     <div class="content">
       {$form.name.html}
@@ -55,6 +64,26 @@
     {include file="CRM/Dataprocessor/Form/DataProcessorBlocks/Outputs.tpl"}
   {/if}
 
+  <script type="text/javascript">
+    {literal}
+    CRM.$(function($) {
+      var id = {/literal}{if ($dataProcessor)}{$dataProcessor.id}{else}false{/if}{literal};
+
+      $('#title').on('blur', function() {
+        var title = $('#title').val();
+        if ($('#nameSection').hasClass('hiddenElement') && !id) {
+          CRM.api3('DataProcessor', 'check_name', {
+            'title': title
+          }).done(function (result) {
+            $('#systemName').html(result.name);
+            $('#name').val(result.name);
+          });
+        }
+      });
+    });
+    {/literal}
+  </script>
+
 {/if}
 
 <div class="crm-submit-buttons">
diff --git a/xml/Menu/dataprocessor.xml b/xml/Menu/dataprocessor.xml
index f3b8e96762e196e63919807cb842f77deab4da34..8e58a5205603a4f8a98dd868aca0a53467efc42d 100644
--- a/xml/Menu/dataprocessor.xml
+++ b/xml/Menu/dataprocessor.xml
@@ -56,13 +56,6 @@
     <access_arguments>access CiviCRM</access_arguments>
     <access_arguments>administer CiviCRM</access_arguments>
   </item>
-  <item>
-    <path>civicrm/dataprocessor/form/joins/simple_join</path>
-    <page_callback>CRM_Dataprocessor_Form_Join_Simple</page_callback>
-    <title>DataProcessor</title>
-    <access_arguments>access CiviCRM</access_arguments>
-    <access_arguments>administer CiviCRM</access_arguments>
-  </item>
   <item>
     <path>civicrm/dataprocessor/form/output/download</path>
     <title>Browse Uploaded files</title>
diff --git a/xml/schema/CRM/Dataprocessor/DataProcessor.entityType.php b/xml/schema/CRM/Dataprocessor/DataProcessor.entityType.php
new file mode 100644
index 0000000000000000000000000000000000000000..225f3335dc629df90ec6438b340326c0f3933508
--- /dev/null
+++ b/xml/schema/CRM/Dataprocessor/DataProcessor.entityType.php
@@ -0,0 +1,11 @@
+<?php
+// This file declares a new entity type. For more details, see "hook_civicrm_entityTypes" at:
+// http://wiki.civicrm.org/confluence/display/CRMDOC/Hook+Reference
+return array (
+  0 => 
+  array (
+    'name' => 'DataProcessor',
+    'class' => 'CRM_Dataprocessor_DAO_DataProcessor',
+    'table' => 'civicrm_data_processor',
+  ),
+);
diff --git a/xml/schema/CRM/Dataprocessor/DataProcessor.xml b/xml/schema/CRM/Dataprocessor/DataProcessor.xml
new file mode 100644
index 0000000000000000000000000000000000000000..ebcc8997a3632ed5b51337cf9bf18c9213aaa244
--- /dev/null
+++ b/xml/schema/CRM/Dataprocessor/DataProcessor.xml
@@ -0,0 +1,99 @@
+<?xml version="1.0" encoding="iso-8859-1" ?>
+
+<table>
+  <base>CRM/Dataprocessor</base>
+  <class>DataProcessor</class>
+  <name>civicrm_data_processor</name>
+  <log>false</log>
+
+  <field>
+    <name>id</name>
+    <type>int unsigned</type>
+    <required>true</required>
+    <comment>Unique DataProcessor ID</comment>
+  </field>
+  <primaryKey>
+    <name>id</name>
+    <autoincrement>true</autoincrement>
+  </primaryKey>
+  <field>
+    <name>name</name>
+    <title>Name</title>
+    <type>varchar</type>
+    <required>false</required>
+    <length>255</length>
+  </field>
+  <field>
+    <name>title</name>
+    <title>Title</title>
+    <type>varchar</type>
+    <required>true</required>
+    <length>255</length>
+  </field>
+  <field>
+    <name>type</name>
+    <title>Type</title>
+    <type>varchar</type>
+    <required>true</required>
+    <length>255</length>
+  </field>
+  <field>
+    <name>configuration</name>
+    <title>Configuration</title>
+    <type>text</type>
+    <required>false</required>
+    <length>255</length>
+    <serialize>JSON</serialize>
+  </field>
+  <field>
+    <name>aggregation</name>
+    <title>Aggregation Fields</title>
+    <type>text</type>
+    <required>false</required>
+    <length>255</length>
+    <serialize>JSON</serialize>
+  </field>
+  <field>
+    <name>is_active</name>
+    <title>Is active</title>
+    <type>boolean</type>
+    <required>true</required>
+  </field>
+  <field>
+    <name>description</name>
+    <title>Description</title>
+    <type>text</type>
+    <required>false</required>
+    <length>255</length>
+  </field>
+  <field>
+    <name>storage_type</name>
+    <title>Storage Type</title>
+    <type>varchar</type>
+    <required>false</required>
+    <length>255</length>
+  </field>
+  <field>
+    <name>storage_configuration</name>
+    <title>Storage Configuration</title>
+    <type>text</type>
+    <required>false</required>
+    <length>255</length>
+    <serialize>JSON</serialize>
+  </field>
+  <field>
+    <name>status</name>
+    <title>Status</title>
+    <type>int unsigned</type>
+    <required>false</required>
+    <default>0</default>
+  </field>
+  <field>
+    <name>source_file</name>
+    <title>Source File</title>
+    <type>varchar</type>
+    <required>false</required>
+    <length>255</length>
+  </field>
+
+</table>