diff --git a/CRM/Contact/DataProcessorContactSearch.php b/CRM/Contact/DataProcessorContactSearch.php
index 2227c2830017d6436d51cb174d93827a41f31da3..1ab18301a9bad9759c67d7b6afadff815c2bde67 100644
--- a/CRM/Contact/DataProcessorContactSearch.php
+++ b/CRM/Contact/DataProcessorContactSearch.php
@@ -36,7 +36,7 @@ class CRM_Contact_DataProcessorContactSearch implements UIOutputInterface {
     }
 
     $form->add('text', 'title', E::ts('Title'),NULL, true);
-    
+
     // form elements for adding Dashlet
     // $output['dashlet'] 1-> Yes 2->No
 
@@ -70,7 +70,7 @@ class CRM_Contact_DataProcessorContactSearch implements UIOutputInterface {
 
     $defaults = array();
     if ($output) {
-      
+
       if (isset($output['permission'])) {
         $defaults['permission'] = $output['permission'];
       }
@@ -103,7 +103,7 @@ class CRM_Contact_DataProcessorContactSearch implements UIOutputInterface {
     if (empty($defaults['title'])) {
       $defaults['title'] = civicrm_api3('DataProcessor', 'getvalue', array('id' => $output['data_processor_id'], 'return' => 'title'));
     }
-    
+
     $form->setDefaults($defaults);
   }
 
@@ -136,22 +136,13 @@ class CRM_Contact_DataProcessorContactSearch implements UIOutputInterface {
   }
 
   /**
-   * Process the submitted values and create a configuration array
+   * This function is called prior to removing an output
    *
-   * @param $submittedValues
    * @param array $output
-   * @return array
+   * @return void
    */
-  public function processDashletConfiguration($submittedValues) {
-
-    $configuration['domain_id'] = 1;
-    $configuration['name'] = $submittedValues['dashlet_name'];
-    $configuration['label'] = $submittedValues['dashlet_title'];
-    $configuration['permission'] = $submittedValues['permission'];
-    $configuration['is_active'] = $submittedValues['dashlet_active'];
-    $configuration['cache_minutes'] = 60;
-
-    return $configuration;
+  public function deleteOutput($output) {
+    // Do nothing
   }
 
   /**
@@ -208,4 +199,4 @@ class CRM_Contact_DataProcessorContactSearch implements UIOutputInterface {
       $output['permission']
     ));
   }
-}
\ No newline at end of file
+}
diff --git a/CRM/Dataprocessor/BAO/DataProcessorOutput.php b/CRM/Dataprocessor/BAO/DataProcessorOutput.php
index 4771f0769a6ae97c09bdaf3a2dadd5eac3123724..b502b1ec03305826d795e86ac5559ede033ea7a3 100644
--- a/CRM/Dataprocessor/BAO/DataProcessorOutput.php
+++ b/CRM/Dataprocessor/BAO/DataProcessorOutput.php
@@ -30,11 +30,16 @@ class CRM_Dataprocessor_BAO_DataProcessorOutput extends CRM_Dataprocessor_DAO_Da
    * @param $id
    */
   public static function del($id) {
+    $factory = dataprocessor_get_factory();
     CRM_Utils_Hook::pre('delete', 'DataProcessorOutput', $id, CRM_Core_DAO::$_nullArray);
 
     $dao = new CRM_Dataprocessor_BAO_DataProcessorOutput();
     $dao->id = $id;
     if ($dao->find(true)) {
+      $output = array();
+      CRM_Core_DAO::storeValues($dao, $output);
+      $outputTypeClass = $factory->getOutputByName($output['type']);
+      $outputTypeClass->deleteOutput($output);
       $dao->delete();
     }
 
diff --git a/CRM/Dataprocessor/Form/Output.php b/CRM/Dataprocessor/Form/Output.php
index 1fc2c49366a12e861a21298462b728b5e318e3a0..554572666cb286a9b6ccee1588e8d1f4590f5161 100644
--- a/CRM/Dataprocessor/Form/Output.php
+++ b/CRM/Dataprocessor/Form/Output.php
@@ -13,10 +13,6 @@ class CRM_Dataprocessor_Form_Output extends CRM_Core_Form {
 
   private $id;
 
-  private $dashlet;
-
-  private $dashlet_id;
-
   private $output;
 
   /**
@@ -55,26 +51,6 @@ class CRM_Dataprocessor_Form_Output extends CRM_Core_Form {
       $this->assign('output', $this->output);
       $this->outputTypeClass = $factory->getOutputByName($this->output['type']);
       $this->assign('has_configuration', $this->outputTypeClass->hasConfiguration());
-
-
-      // Check for Dashlet
-      $dashlet_url = $this->createDashletUrl($this->id,$this->dataProcessorId);
-      try{
-        $result_dashlet = civicrm_api3('Dashboard', 'getsingle', [
-          'url' => $dashlet_url,
-        ]);
-        $this->dashlet = 1;
-        $this->dashlet_id = $result_dashlet['id'];
-        $this->output['dashlet'] = $this->dashlet;
-        $this->output['dashlet_name'] = $result_dashlet['name'];
-        $this->output['dashlet_title'] = $result_dashlet['label'];
-        $this->output['dashlet_active'] = $result_dashlet['is_active'];
-      }
-      catch(Exception $e){
-        $this->dashlet = 2;
-        $this->output['dashlet'] = $this->dashlet;
-      }
-
     }
 
     $type = CRM_Utils_Request::retrieve('type', 'String');
@@ -106,7 +82,6 @@ class CRM_Dataprocessor_Form_Output extends CRM_Core_Form {
       $factory = dataprocessor_get_factory();
       $types = array(' - select - ')  + $factory->getOutputs();
       $this->add('select', 'type', ts('Select output'), $types, true, array('class' => 'crm-select2'));
-      $this->add('select', 'dashlet', E::ts('Add Output as Dashlet'), array(''=>' - select - ', 1=>'Yes', 2=> 'No'), true,array('id' => 'dashlet'));
       if ($this->outputTypeClass && $this->outputTypeClass->hasConfiguration()) {
         $this->outputTypeClass->buildConfigurationForm($this, $this->output);
         $this->assign('configuration_template', $this->outputTypeClass->getConfigurationTemplateFileName());
@@ -127,9 +102,6 @@ class CRM_Dataprocessor_Form_Output extends CRM_Core_Form {
     if (isset($this->output['type'])) {
       $defaults['type'] = $this->output['type'];
     }
-    if (isset($this->output['dashlet'])) {
-      $defaults['dashlet'] = $this->output['dashlet'];
-    }
     return $defaults;
   }
 
@@ -168,41 +140,11 @@ class CRM_Dataprocessor_Form_Output extends CRM_Core_Form {
       $params['id'] = $this->id;
     }
     $params['configuration'] = $this->outputTypeClass->processConfiguration($values, $params);
-    
-    $result = civicrm_api3('DataProcessorOutput', 'create', $params);
-    
-    if($this->dashlet == 1){
 
-      $dashlet_params = $this->outputTypeClass->processDashletConfiguration($values);
-      $dashlet_params['url'] = $this->createDashletUrl($result['id'],$this->dataProcessorId);
-      if ($this->dashlet_id) {
-        $dashlet_params['id'] = $this->dashlet_id;
-      }
-      $dashlet_result = civicrm_api3('Dashboard', 'create', $dashlet_params);
-    }
-    elseif($this->dashlet == 2){
-      if ($this->dashlet_id) {
-        $dashlet_params['id'] = $this->dashlet_id;
-        $dashlet_result = civicrm_api3('Dashboard', 'delete', $dashlet_params); 
-      }
-    }
+    $result = civicrm_api3('DataProcessorOutput', 'create', $params);
 
     CRM_Utils_System::redirect($redirectUrl);
     parent::postProcess();
   }
 
-  /**
-   * Returns the url for the dashlet url
-   *
-   * @param array $outputId
-   * @param array $dataProcessorId
-   * @return string
-   */
-
-  public function createDashletUrl($outputId,$dataProcessorId){
-    $url = CRM_Utils_System::url('civicrm/dataprocessor/form/dashlet', array('outputId' => $outputId, 'dataProcessorId' => $dataProcessorId));
-    //substr is used to remove starting slash
-    return substr($url, 1);
-  }
-
 }
diff --git a/CRM/Dataprocessor/Page/AJAX.php b/CRM/Dataprocessor/Page/AJAX.php
index c6521c18338b3d3e0a8de159369bb7fd3d29f0bf..13a21261675f251615f9df124be21058770eb553 100644
--- a/CRM/Dataprocessor/Page/AJAX.php
+++ b/CRM/Dataprocessor/Page/AJAX.php
@@ -32,6 +32,9 @@
  *
  */
 
+use Civi\DataProcessor\FieldOutputHandler\FieldOutput;
+use Civi\DataProcessor\FieldOutputHandler\Markupable;
+
 /**
  * This class contains all contact related functions that are called using AJAX (jQuery)
  */
@@ -39,31 +42,33 @@ class CRM_Dataprocessor_Page_AJAX {
 
   public static function getDashlet() {
 
-  	$outputId = CRM_Utils_Request::retrieve('outputId', 'Integer');
-  	$dataProcessorId = CRM_Utils_Request::retrieve('dataProcessorId', 'Integer');
-  	$dataProcessor = civicrm_api3('DataProcessor', 'getsingle', array('id' => $dataProcessorId));
+  	$dataProcessorName = CRM_Utils_Request::retrieve('dataProcessorName', 'String');
+  	$dataProcessor = civicrm_api3('DataProcessor', 'getsingle', array('name' => $dataProcessorName));
   	$dataProcessorClass = CRM_Dataprocessor_BAO_DataProcessor::dataProcessorToClass($dataProcessor);
 
   	$results = [];
 
   	try {
       while($record = $dataProcessorClass->getDataFlow()->nextRecord()) {
-			$row = array();
-			$row['record'] = $record;
-			$result = array();
-			foreach($record as $key => $value) {
-				$result[$key] = $value->formattedValue;
-			}
-
-			$results[] = $result;
+        $row = [];
+        $row['record'] = $record;
+        $result = [];
+        foreach ($record as $key => $value) {
+          if ($value instanceof Markupable) {
+            $result[$key] = $value->getMarkupOut();
+          }
+          elseif ($value instanceof FieldOutput) {
+            $result[$key] = $value->formattedValue;
+          }
         }
-    }
-     catch (\Civi\DataProcessor\DataFlow\EndOfFlowException $e) {
+        $results[] = $result;
+      }
+    } catch (\Civi\DataProcessor\DataFlow\EndOfFlowException $e) {
       // Do nothing
-    }  	
+    }
 
     $return_output['data'] = $results;
-    
+
     CRM_Utils_JSON::output($return_output);
 
   }
diff --git a/CRM/Dataprocessor/Page/Dashlet.php b/CRM/Dataprocessor/Page/Dashlet.php
index 9f8cc95b0c17c0e12aeefce5460fdc3dafb91228..d91983378dcb1a107dd86bb340bd3167dd7c826e 100644
--- a/CRM/Dataprocessor/Page/Dashlet.php
+++ b/CRM/Dataprocessor/Page/Dashlet.php
@@ -7,16 +7,16 @@ use CRM_Dataprocessor_ExtensionUtil as E;
  *
  */
 class CRM_Dataprocessor_Page_Dashlet extends CRM_Core_Page {
-  
+
   /**
    * @var int
    */
   private $outputId;
 
   /**
-   * @var int
+   * @var String
    */
-  private $dataProcessorId;
+  private $dataProcessorName;
 
   /**
    * @var array
@@ -35,13 +35,11 @@ class CRM_Dataprocessor_Page_Dashlet extends CRM_Core_Page {
    */
 
   protected function preProcess() {
-    $this->outputId = CRM_Utils_Request::retrieve('outputId', 'Integer');
-    $this->dataProcessorId = CRM_Utils_Request::retrieve('dataProcessorId', 'Integer');
+    $this->dataProcessorName = CRM_Utils_Request::retrieve('data_processor', 'String');
 
-    $this->dataProcessor = civicrm_api3('DataProcessor', 'getsingle', array('id' => $this->dataProcessorId));
+    $this->dataProcessor = civicrm_api3('DataProcessor', 'getsingle', array('name' => $this->dataProcessorName));
     $this->dataProcessorClass = CRM_Dataprocessor_BAO_DataProcessor::dataProcessorToClass($this->dataProcessor);
-    $this->assign('dataProcessorId', $this->dataProcessorId);
-    $this->assign('outputId', $this->outputId);
+    $this->assign('dataProcessorName', $this->dataProcessorName);
   }
 
   /**
@@ -69,4 +67,5 @@ class CRM_Dataprocessor_Page_Dashlet extends CRM_Core_Page {
     }
     $this->assign('columnHeaders', $columnHeaders);
   }
+
 }
diff --git a/CRM/DataprocessorOutputExport/CSV.php b/CRM/DataprocessorOutputExport/CSV.php
index a91d710ee2ad1d6cee44854d3fdfc47a8a403249..7f4cfd7407e82ebd9f7c6ff9caf799bd3b37bb78 100644
--- a/CRM/DataprocessorOutputExport/CSV.php
+++ b/CRM/DataprocessorOutputExport/CSV.php
@@ -83,6 +83,17 @@ class CRM_DataprocessorOutputExport_CSV implements ExportOutputInterface {
     return $configuration;
   }
 
+  /**
+   * This function is called prior to removing an output
+   *
+   * @param array $output
+   * @return void
+   */
+  public function deleteOutput($output) {
+    // Do nothing
+  }
+
+
   /**
    * Returns the mime type of the export file.
    *
@@ -273,4 +284,4 @@ class CRM_DataprocessorOutputExport_CSV implements ExportOutputInterface {
   }
 
 
-}
\ No newline at end of file
+}
diff --git a/CRM/DataprocessorSearch/ActivitySearch.php b/CRM/DataprocessorSearch/ActivitySearch.php
index aa78f8edf2ea011fc3c1e51959a8eb65734ebc95..950deb5c8cfe0fec5687ceb05c313ac341287ae7 100644
--- a/CRM/DataprocessorSearch/ActivitySearch.php
+++ b/CRM/DataprocessorSearch/ActivitySearch.php
@@ -120,6 +120,16 @@ class CRM_DataprocessorSearch_ActivitySearch implements UIOutputInterface {
     return $configuration;
   }
 
+  /**
+   * This function is called prior to removing an output
+   *
+   * @param array $output
+   * @return void
+   */
+  public function deleteOutput($output) {
+    // Do nothing
+  }
+
   /**
    * Returns the url for the page/form this output will show to the user
    *
@@ -175,4 +185,4 @@ class CRM_DataprocessorSearch_ActivitySearch implements UIOutputInterface {
     ));
   }
 
-}
\ No newline at end of file
+}
diff --git a/CRM/DataprocessorSearch/CaseSearch.php b/CRM/DataprocessorSearch/CaseSearch.php
index 7bd42b42a469bb9be3a4d4e69720e39763a40154..4585fdf462887e803526ef2edeb2626402bbb379 100644
--- a/CRM/DataprocessorSearch/CaseSearch.php
+++ b/CRM/DataprocessorSearch/CaseSearch.php
@@ -129,6 +129,16 @@ class CRM_DataprocessorSearch_CaseSearch implements UIOutputInterface {
     return $configuration;
   }
 
+  /**
+   * This function is called prior to removing an output
+   *
+   * @param array $output
+   * @return void
+   */
+  public function deleteOutput($output) {
+    // Do nothing
+  }
+
   /**
    * Returns the url for the page/form this output will show to the user
    *
@@ -184,4 +194,4 @@ class CRM_DataprocessorSearch_CaseSearch implements UIOutputInterface {
     ));
   }
 
-}
\ No newline at end of file
+}
diff --git a/CRM/DataprocessorSearch/ParticipantSearch.php b/CRM/DataprocessorSearch/ParticipantSearch.php
index bd71f3b5f959de9d6a3fd2bf2fc6948538c2a823..c198146ccc278ccaad09f22677ae06890341c3a9 100644
--- a/CRM/DataprocessorSearch/ParticipantSearch.php
+++ b/CRM/DataprocessorSearch/ParticipantSearch.php
@@ -121,6 +121,16 @@ class CRM_DataprocessorSearch_ParticipantSearch implements UIOutputInterface {
     return $configuration;
   }
 
+  /**
+   * This function is called prior to removing an output
+   *
+   * @param array $output
+   * @return void
+   */
+  public function deleteOutput($output) {
+    // Do nothing
+  }
+
   /**
    * Returns the url for the page/form this output will show to the user
    *
@@ -176,4 +186,4 @@ class CRM_DataprocessorSearch_ParticipantSearch implements UIOutputInterface {
     ));
   }
 
-}
\ No newline at end of file
+}
diff --git a/CRM/DataprocessorSearch/Search.php b/CRM/DataprocessorSearch/Search.php
index ac76532489e51152662ef8db5aed69eafee94e10..daac662eb1c390cbfa13de63a62a18ea3c4a2da0 100644
--- a/CRM/DataprocessorSearch/Search.php
+++ b/CRM/DataprocessorSearch/Search.php
@@ -121,6 +121,16 @@ class CRM_DataprocessorSearch_Search implements UIOutputInterface {
     return $configuration;
   }
 
+  /**
+   * This function is called prior to removing an output
+   *
+   * @param array $output
+   * @return void
+   */
+  public function deleteOutput($output) {
+    // Do nothing
+  }
+
   /**
    * Returns the url for the page/form this output will show to the user
    *
@@ -176,4 +186,4 @@ class CRM_DataprocessorSearch_Search implements UIOutputInterface {
     ));
   }
 
-}
\ No newline at end of file
+}
diff --git a/Civi/DataProcessor/Factory.php b/Civi/DataProcessor/Factory.php
index 24224c87cca101906e282d9562d85c6a2cdf6682..591b751d1dd2ca494cdae0b2a0fe12d575fba851 100644
--- a/Civi/DataProcessor/Factory.php
+++ b/Civi/DataProcessor/Factory.php
@@ -119,6 +119,7 @@ class Factory {
     $this->addDataSource('membership_status', 'Civi\DataProcessor\Source\Member\MembershipStatusSource', E::ts('Membership Status'));
     $this->addDataSource('csv', 'Civi\DataProcessor\Source\CSV', E::ts('CSV File'));
     $this->addOutput('api', 'Civi\DataProcessor\Output\Api', E::ts('API'));
+    $this->addOutput('dashlet', 'Civi\DataProcessor\Output\Dashlet', E::ts('Dashlet'));
     $this->addOutput('search', 'CRM_DataprocessorSearch_Search', E::ts('Search'));
     $this->addOutput('contact_search', 'CRM_Contact_DataProcessorContactSearch', E::ts('Contact Search'));
     $this->addOutput('activity_search', 'CRM_DataprocessorSearch_ActivitySearch', E::ts('Activity Search'));
@@ -330,4 +331,4 @@ class Factory {
     return $this->sortCompareFactory;
   }
 
-}
\ No newline at end of file
+}
diff --git a/Civi/DataProcessor/Output/Api.php b/Civi/DataProcessor/Output/Api.php
index c878dc2f0d32c467d838dcb9b936abce274b2742..8b12c1477b05678d6d7262a7f6e00204cc7aadc9 100644
--- a/Civi/DataProcessor/Output/Api.php
+++ b/Civi/DataProcessor/Output/Api.php
@@ -104,6 +104,16 @@ class Api implements OutputInterface, API_ProviderInterface, EventSubscriberInte
     return array();
   }
 
+  /**
+   * This function is called prior to removing an output
+   *
+   * @param array $output
+   * @return void
+   */
+  public function deleteOutput($output) {
+    // Do nothing
+  }
+
   /**
    * @return array
    */
@@ -518,4 +528,4 @@ class Api implements OutputInterface, API_ProviderInterface, EventSubscriberInte
   }
 
 
-}
\ No newline at end of file
+}
diff --git a/Civi/DataProcessor/Output/Dashlet.php b/Civi/DataProcessor/Output/Dashlet.php
new file mode 100644
index 0000000000000000000000000000000000000000..7b5c0146be27869c0e78ccf30d2281ec22178ec3
--- /dev/null
+++ b/Civi/DataProcessor/Output/Dashlet.php
@@ -0,0 +1,129 @@
+<?php
+/**
+ * @author Jaap Jansma <jaap.jansma@civicoop.org>
+ * @license AGPL-3.0
+ */
+
+namespace Civi\DataProcessor\Output;
+
+use \CRM_Dataprocessor_ExtensionUtil as E;
+
+class Dashlet implements OutputInterface {
+
+  /**
+   * Returns true when this output has additional configuration
+   *
+   * @return bool
+   */
+  public function hasConfiguration() {
+    return true;
+  }
+
+  /**
+   * When this output type has additional configuration you can add
+   * the fields on the form with this function.
+   *
+   * @param \CRM_Core_Form $form
+   * @param array $output
+   */
+  public function buildConfigurationForm(\CRM_Core_Form $form, $output = []) {
+    $form->add('text', 'title', E::ts('Title'), true);
+    $form->add('select','permission', E::ts('Permission'), \CRM_Core_Permission::basicPermissions(), true, array(
+      'style' => 'min-width:250px',
+      'class' => 'crm-select2 huge',
+      'placeholder' => E::ts('- select -'),
+    ));
+
+    $defaults = array();
+    if ($output) {
+      if (isset($output['permission'])) {
+        $defaults['permission'] = $output['permission'];
+      }
+      if (isset($output['configuration']) && is_array($output['configuration'])) {
+        if (isset($output['configuration']['title'])) {
+          $defaults['title'] = $output['configuration']['title'];
+        }
+      }
+    }
+    if (!isset($defaults['permission'])) {
+      $defaults['permission'] = 'access CiviCRM';
+    }
+    if (empty($defaults['title'])) {
+      $defaults['title'] = civicrm_api3('DataProcessor', 'getvalue', array('id' => $output['data_processor_id'], 'return' => 'title'));
+    }
+    $form->setDefaults($defaults);
+  }
+
+  /**
+   * When this output type has configuration specify the template file name
+   * for the configuration form.
+   *
+   * @return false|string
+   */
+  public function getConfigurationTemplateFileName() {
+    return "CRM/Dataprocessor/Form/Output/Dashlet.tpl";
+  }
+
+  /**
+   * Process the submitted values and create a configuration array
+   *
+   * @param $submittedValues
+   * @param array $output
+   *
+   * @return array $output
+   * @throws \Exception
+   */
+  public function processConfiguration($submittedValues, &$output) {
+    $dataProcessor = civicrm_api3('DataProcessor', 'getsingle', array('id' => $output['data_processor_id']));
+    $dashletName = 'dataprocessor_'.$dataProcessor['name'];
+    $dashletUrl = \CRM_Utils_System::url('civicrm/dataprocessor/form/dashlet', array('data_processor' => $dataProcessor['name']));
+    $fullScreenUrl = \CRM_Utils_System::url('civicrm/dataprocessor/form/dashlet', array('data_processor' => $dataProcessor['name'], 'context' => 'dashletFullscreen'));
+    $dashletParams['url'] = $dashletUrl;
+    $dashletParams['fullscreen_url'] = $fullScreenUrl;
+    $dashletParams['name'] = $dashletName;
+    $dashletParams['label'] = $submittedValues['title'];
+    $dashletParams['permission'] = $submittedValues['permission'];
+    $dashletParams['is_active'] = 1;
+    $dashletParams['cache_minutes'] = 60;
+
+    try {
+      $id = civicrm_api3('Dashboard', 'getvalue', ['name' => $dashletName, 'return' => 'id']);
+      if ($id) {
+        $dashletParams['id'] = $id;
+      }
+    } catch (\Exception $e) {
+      // Do nothing
+    }
+
+    civicrm_api3('Dashboard', 'create', $dashletParams);
+
+    $output['permission'] = $submittedValues['permission'];
+    $configuration['title'] = $submittedValues['title'];
+    return $configuration;
+  }
+
+  /**
+   * This function is called prior to removing an output
+   *
+   * @param array $output
+   * @return void
+   * @throws \Exception
+   */
+  public function deleteOutput($output) {
+    $dataProcessor = civicrm_api3('DataProcessor', 'getsingle', array('id' => $output['data_processor_id']));
+    $dashletName = 'dataprocessor_'.$dataProcessor['name'];
+    $dashlets = civicrm_api3('Dashboard', 'get', [
+      'name' => $dashletName,
+      'options' => ['limit' => 0]
+    ]);
+    foreach ($dashlets['values'] as $dashlet) {
+      try {
+        civicrm_api3('Dashlet', 'delete', ['id' => $dashlet['id']]);
+      } catch (\Exception $e) {
+        // Do nothing
+      }
+    }
+  }
+
+
+}
diff --git a/Civi/DataProcessor/Output/OutputInterface.php b/Civi/DataProcessor/Output/OutputInterface.php
index 89e871be0377cb10c961c9e1d261d18e8abf54e1..0238b50916c3d9d47719397ee5543e574606658d 100644
--- a/Civi/DataProcessor/Output/OutputInterface.php
+++ b/Civi/DataProcessor/Output/OutputInterface.php
@@ -42,4 +42,12 @@ interface OutputInterface {
    */
   public function processConfiguration($submittedValues, &$output);
 
-}
\ No newline at end of file
+  /**
+   * This function is called prior to removing an output
+   *
+   * @param array $output
+   * @return void
+   */
+  public function deleteOutput($output);
+
+}
diff --git a/api/v3/DataProcessorOutput.php b/api/v3/DataProcessorOutput.php
index 1cc82abcc299f46b63a331ff434db8df42b8076a..ff25aceaaed3ef1e76cfc6ab7f790d69fb7d5cd3 100644
--- a/api/v3/DataProcessorOutput.php
+++ b/api/v3/DataProcessorOutput.php
@@ -43,8 +43,9 @@ function civicrm_api3_data_processor_output_create($params) {
 function civicrm_api3_data_processor_output_delete($params) {
   $dataProcessorId = civicrm_api3('DataProcessorOutput', 'getvalue', array('id' => $params['id'], 'return' => 'data_processor_id'));
   CRM_Dataprocessor_BAO_DataProcessor::updateAndChekStatus($dataProcessorId);
+  $return = _civicrm_api3_basic_delete(_civicrm_api3_get_BAO(__FUNCTION__), $params);
   CRM_Dataprocessor_Utils_Cache::clearAllDataProcessorCaches();
-  return _civicrm_api3_basic_delete(_civicrm_api3_get_BAO(__FUNCTION__), $params);
+  return $return;
 }
 
 /**
diff --git a/templates/CRM/Dataprocessor/Form/Output/Dashlet.tpl b/templates/CRM/Dataprocessor/Form/Output/Dashlet.tpl
new file mode 100644
index 0000000000000000000000000000000000000000..56a1a996b4d7cd065568052416b79d578ff26989
--- /dev/null
+++ b/templates/CRM/Dataprocessor/Form/Output/Dashlet.tpl
@@ -0,0 +1,15 @@
+{crmScope extensionKey='dataprocessor'}
+
+    <div class="crm-section">
+        <div class="label">{$form.title.label}</div>
+        <div class="content">{$form.title.html}</div>
+        <div class="clear"></div>
+    </div>
+
+  <div class="crm-section">
+    <div class="label">{$form.permission.label}</div>
+    <div class="content">{$form.permission.html}</div>
+    <div class="clear"></div>
+  </div>
+
+{/crmScope}
diff --git a/templates/CRM/Dataprocessor/Page/Dashlet.tpl b/templates/CRM/Dataprocessor/Page/Dashlet.tpl
index cb1d82ea21e50a376806a7d530b158decf4342d0..7c359d9da933f1174da69866d551612af51195d9 100644
--- a/templates/CRM/Dataprocessor/Page/Dashlet.tpl
+++ b/templates/CRM/Dataprocessor/Page/Dashlet.tpl
@@ -1,5 +1,5 @@
 <div>
-	<table class="case-selector">
+	<table class="dataprocessor_{$dataProcessorName}">
 	<thead>
 	  <tr>
 	  	{foreach from=$columnHeaders key=headerName item=headerTitle}
@@ -15,15 +15,15 @@
 {literal}
 <script type="text/javascript">
 (function($) {
-$('table.case-selector').DataTable({
+$('table.dataprocessor_{/literal}{$dataProcessorName}{literal}').DataTable({
 		"pageLength":5,
 		"order":[],
 		"lengthMenu": [[5, 10, 20], [5, 10, 20]],
-		"searching": true,
+		"searching": false,
         "ajax": {
-          "url": {/literal}'{crmURL p="civicrm/ajax/getDashlet" q="dataProcessorId=$dataProcessorId&outputId=$outputId"}'{literal},
+          "url": {/literal}'{crmURL p="civicrm/ajax/getDashlet" q="dataProcessorName=$dataProcessorName"}'{literal},
         }
       });
 })(CRM.$);
 </script>
-{/literal}
\ No newline at end of file
+{/literal}
diff --git a/xml/Menu/dataprocessor.xml b/xml/Menu/dataprocessor.xml
index 84e26d4da71768cd4de520a5f713891e4accd4ec..52ca1835c8f8500c2f2aa6690482ccadc9c74763 100644
--- a/xml/Menu/dataprocessor.xml
+++ b/xml/Menu/dataprocessor.xml
@@ -68,7 +68,6 @@
     <page_callback>CRM_Dataprocessor_Page_Dashlet</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>