diff --git a/CRM/Dataprocessor/Upgrader.php b/CRM/Dataprocessor/Upgrader.php
index f829cda13b3f93bd7f7399440db850703fe0177f..0a663251837286198bc5ed64d602326d5be43ee9 100644
--- a/CRM/Dataprocessor/Upgrader.php
+++ b/CRM/Dataprocessor/Upgrader.php
@@ -11,7 +11,16 @@ class CRM_Dataprocessor_Upgrader extends CRM_Dataprocessor_Upgrader_Base {
   }
 
   public function uninstall() {
-
+    // Remove output from menu
+    $dao = CRM_Core_DAO::executeQuery("SELECT configuration FROM civicrm_data_processor_output");
+    while($dao->fetch()) {
+      $configuration = json_decode($dao->configuration, true);
+      if (isset($configuration['navigation_id']) && $configuration['navigation_id']) {
+        $navId = $configuration['navigation_id'];
+        \CRM_Core_BAO_Navigation::processDelete($navId);
+      }
+    }
+    \CRM_Core_BAO_Navigation::resetNavigation();
   }
 
 }
diff --git a/Civi/DataProcessor/Output/UIOutputHelper.php b/Civi/DataProcessor/Output/UIOutputHelper.php
index 5a3eefd66f1e47efbfeff2eaa99f8a3f3ece6044..e89a54d50ece1df360c75f861a2615f615845143 100644
--- a/Civi/DataProcessor/Output/UIOutputHelper.php
+++ b/Civi/DataProcessor/Output/UIOutputHelper.php
@@ -68,49 +68,62 @@ class UIOutputHelper {
    * @param $objectRef
    */
   public static function preHook($op, $objectName, $id, &$params) {
-    if ($objectName != 'DataProcessorOutput') {
-      return;
-    }
-    if ($op == 'delete') {
-      $output = civicrm_api3('DataProcessorOutput', 'getsingle', array('id' => $id));
-      if (isset($output['configuration']['navigation_id'])) {
-        $navId = $output['configuration']['navigation_id'];
-        \CRM_Core_BAO_Navigation::processDelete($navId);
-        \CRM_Core_BAO_Navigation::resetNavigation();
-        self::$rebuildMenu = TRUE;
+    if ($objectName == 'DataProcessorOutput') {
+      if ($op == 'delete') {
+        $output = civicrm_api3('DataProcessorOutput', 'getsingle', ['id' => $id]);
+        self::removeOutputFromNavigation($output['configuration']);
+      }
+      elseif ($op == 'edit') {
+        $output = civicrm_api3('DataProcessorOutput', 'getsingle', ['id' => $id]);
+        if (!isset($output['configuration']['navigation_id']) && !isset($params['configuration']['navigation_parent_path'])) {
+          return;
+        }
+        elseif (!isset($params['configuration']['navigation_parent_path'])) {
+          self::removeOutputFromNavigation($output['configuration']);
+        }
+        else {
+          // Merge the current output from the database with the updated values
+          $output = array_merge($output, $params);
+          $dataProcessor = civicrm_api3('DataProcessor', 'getsingle', ['id' => $output['data_processor_id']]);
+          $configuration = self::createOrUpdateNavigationItem($output, $dataProcessor);
+          if ($configuration) {
+            $params['configuration'] = $configuration;
+          }
+        }
+      }
+      elseif ($op == 'create' && isset($params['configuration']['navigation_parent_path'])) {
+        $dataProcessor = civicrm_api3('DataProcessor', 'getsingle', ['id' => $params['data_processor_id']]);
+        $configuration = self::createOrUpdateNavigationItem($params, $dataProcessor);
+        if ($configuration) {
+          $params['configuration'] = $configuration;
+        }
       }
-    } elseif ($op == 'edit') {
-      $output = civicrm_api3('DataProcessorOutput', 'getsingle', array('id' => $id));
-      if (!isset($output['configuration']['navigation_id']) && !isset($params['configuration']['navigation_parent_path'])) {
-        return;
-      } elseif (!isset($params['configuration']['navigation_parent_path'])) {
-        // Delete the navigation item
-        $navId = $output['configuration']['navigation_id'];
-        \CRM_Core_BAO_Navigation::processDelete($navId);
-        \CRM_Core_BAO_Navigation::resetNavigation();
-        self::$rebuildMenu = TRUE;
-      } else {
-        $dataProcessor = civicrm_api3('DataProcessor', 'getsingle', array('id' => $output['data_processor_id']));
-
-        // Retrieve the current navigation params.
-        $navigationParams = [];
-        if (isset($output['configuration']['navigation_id'])) {
-          // Get the default navigation parent id.
-          $navigationDefaults = [];
-          $navParams = ['id' => $output['configuration']['navigation_id']];
-          \CRM_Core_BAO_Navigation::retrieve($navParams, $navigationDefaults);
-          if (!empty($navigationDefaults['id'])) {
-            $navigationParams['id'] = $navigationDefaults['id'];
-            $navigationParams['current_parent_id'] = !empty($navigationDefaults['parent_id']) ? $navigationDefaults['parent_id'] : NULL;
-            $navigationParams['parent_id'] = !empty($navigationDefaults['parent_id']) ? $navigationDefaults['parent_id'] : NULL;
+    } elseif ($objectName == 'DataProcessor' && $op == 'edit') {
+      $dataProcessor = civicrm_api3('DataProcessor', 'getsingle', ['id' => $id]);
+      if (isset($params['is_active']) && $params['is_active'] != $dataProcessor['is_active']) {
+        // Only update navigation when is active is changed
+        $dataProcessor = array_merge($dataProcessor, $params);
+        $outputs = civicrm_api3('DataProcessorOutput', 'get', ['data_processor_id' => $id, 'options' => ['limit' => 0]]);
+        foreach($outputs['values'] as $output) {
+          if (isset($output['configuration']['navigation_id'])) {
+            self::createOrUpdateNavigationItem($output, $dataProcessor);
           }
         }
-        self::$rebuildMenu = self::newNavigationItem($params, $dataProcessor, $navigationParams, $output);
       }
     }
-    elseif ($op == 'create' && isset($params['configuration']['navigation_parent_path'])) {
-      $dataProcessor = civicrm_api3('DataProcessor', 'getsingle', array('id' => $params['data_processor_id']));
-      self::$rebuildMenu = self::newNavigationItem($params, $dataProcessor);
+  }
+
+  /**
+   * Remove an output from the navigation menu.
+   *
+   * @param array $configuration
+   */
+  private static function removeOutputFromNavigation($configuration) {
+    if (isset($configuration['navigation_id'])) {
+      $navId = $configuration['navigation_id'];
+      \CRM_Core_BAO_Navigation::processDelete($navId);
+      \CRM_Core_BAO_Navigation::resetNavigation();
+      self::$rebuildMenu = TRUE;
     }
   }
 
@@ -155,46 +168,63 @@ class UIOutputHelper {
    * Inserts/updates an navigation item.
    * @param $params
    * @param $dataProcessor
-   * @param array $navigationParams
    *
-   * @return bool
+   * @return array
    */
-  private static function newNavigationItem(&$params, $dataProcessor, $navigationParams=array(), $output=null) {
+  private static function createOrUpdateNavigationItem($output, $dataProcessor) {
     $url = "";
     $factory = dataprocessor_get_factory();
-    $outputClass = FALSE;
-    if (isset($params['type'])) {
-      $outputClass = $factory->getOutputByName($params['type']);
-    } elseif(isset($output['type'])) {
-      $outputClass = $factory->getOutputByName($output['type']);
+    if (!isset($output['type'])) {
+      return false;
     }
+    $outputClass = $factory->getOutputByName($output['type']);
+    $configuration = $output['configuration'];
 
     if ($outputClass && $outputClass instanceof \Civi\DataProcessor\Output\UIOutputInterface) {
-      $url = $outputClass->getUrlToUi($params, $dataProcessor);
+      $url = $outputClass->getUrlToUi($output, $dataProcessor);
     }
 
     $navigation = \CRM_Dataprocessor_Utils_Navigation::singleton();
+    $navigationParams = array();
+
+    // Retrieve the current navigation ID.
+    if (isset($configuration['navigation_id'])) {
+      // Get the default navigation parent id.
+      $navigationDefaults = [];
+      $retrieveNavParams = ['id' => $configuration['navigation_id']];
+      \CRM_Core_BAO_Navigation::retrieve($retrieveNavParams, $navigationDefaults);
+      if (!empty($navigationDefaults['id'])) {
+        $navigationParams['id'] = $navigationDefaults['id'];
+        $navigationParams['current_parent_id'] = !empty($navigationDefaults['parent_id']) ? $navigationDefaults['parent_id'] : NULL;
+        $navigationParams['parent_id'] = !empty($navigationDefaults['parent_id']) ? $navigationDefaults['parent_id'] : NULL;
+      }
+    }
+
     $navigationParams['domain_id'] = \CRM_Core_Config::domainID();
     $navigationParams['permission'] = array();
-    $navigationParams['label'] = isset($params['configuration']['title']) ? $params['configuration']['title'] : $dataProcessor['title'];
+    $navigationParams['label'] = isset($configuration['title']) ? $configuration['title'] : $dataProcessor['title'];
     $navigationParams['name'] = $dataProcessor['name'];
 
-    $navigationParams['parent_id'] = $navigation->getNavigationIdByPath($params['configuration']['navigation_parent_path']);
-    $navigationParams['is_active'] = 1;
+    if (!isset($navigationParams['parent_id']) && isset($configuration['navigation_parent_path'])) {
+      $navigationParams['parent_id'] = $navigation->getNavigationIdByPath($configuration['navigation_parent_path']);
+    }
+    $navigationParams['is_active'] = $dataProcessor['is_active'];
 
-    if (isset($params['permission'])) {
-      $navigationParams['permission'][] = $params['permission'];
+    if (isset($output['permission'])) {
+      $navigationParams['permission'][] = $output['permission'];
     }
 
-    unset($params['configuration']['navigation_parent_path']);
+    unset($configuration['navigation_parent_path']);
 
     $navigationParams['url'] = $url.'?reset=1';
     $navigation = \CRM_Core_BAO_Navigation::add($navigationParams);
     \CRM_Core_BAO_Navigation::resetNavigation();
 
-    $params['configuration']['navigation_id'] = $navigation->id;
+    $configuration['navigation_id'] = $navigation->id;
+
+    self::$rebuildMenu = TRUE;
 
-    return true;
+    return $configuration;
   }
 
 }
\ No newline at end of file