diff --git a/provider/lib/utils.js b/provider/lib/utils.js
index a4d5072..3714b73 100644
--- a/provider/lib/utils.js
+++ b/provider/lib/utils.js
@@ -71,7 +71,7 @@
         utils.postTrigger(dataTrigger, auth, 0)
         .then(triggerId => {
             logger.info(method, 'Trigger', triggerId, 'was successfully fired');
-            utils.handleFiredTrigger(dataTrigger, dataTrigger.monitor !== undefined);
+            utils.handleFiredTrigger(dataTrigger);
         })
         .catch(err => {
             logger.error(method, err);
@@ -159,23 +159,21 @@
     };
 
     this.shouldFireTrigger = function(trigger) {
-        if (!trigger.monitor && utils.activeHost === utils.host) {
-           return true;
-        }
-        else if (trigger.monitor === utils.host) {
-            return true;
-        }
-        return false;
+        return trigger.monitor || utils.activeHost === utils.host;
     };
 
     this.hasTriggersRemaining = function(trigger) {
         return !trigger.maxTriggers || trigger.maxTriggers === -1 || trigger.triggersLeft > 0;
     };
 
-    this.handleFiredTrigger = function(dataTrigger, isMonitorTrigger) {
+    this.isMonitoringTrigger = function(monitor, triggerName) {
+        return monitor && utils.monitorStatus.triggerName === triggerName;
+    };
+
+    this.handleFiredTrigger = function(dataTrigger) {
         var method = 'handleFiredTrigger';
 
-        if (isMonitorTrigger && utils.monitorStatus.triggerName === dataTrigger.name) {
+        if (utils.isMonitoringTrigger(dataTrigger.monitor, dataTrigger.name)) {
             utils.monitorStatus.triggerFired = "success";
         }
 
@@ -283,7 +281,7 @@
                     var triggerIdentifier = trigger.id;
                     var doc = trigger.doc;
 
-                    if (!(triggerIdentifier in utils.triggers)) {
+                    if (!(triggerIdentifier in utils.triggers) && !doc.monitor) {
                         //check if trigger still exists in whisk db
                         var namespace = doc.namespace;
                         var name = doc.name;
@@ -354,20 +352,20 @@
                 if (utils.triggers[triggerIdentifier]) {
                     if (doc.status && doc.status.active === false) {
                         utils.stopTrigger(triggerIdentifier);
-                        if (doc.monitor && doc.monitor === utils.host && utils.monitorStatus.triggerName === doc.name) {
+                        if (utils.isMonitoringTrigger(doc.monitor, doc.name)) {
                             utils.monitorStatus.triggerStopped = "success";
                         }
                     }
                 }
                 else {
                     //ignore changes to disabled triggers
-                    if (!doc.status || doc.status.active === true) {
+                    if ((!doc.status || doc.status.active === true) && (!doc.monitor || doc.monitor === utils.host)) {
                         utils.createTrigger(triggerIdentifier, doc)
                         .then(cachedTrigger => {
                             utils.triggers[triggerIdentifier] = cachedTrigger;
                             logger.info(method, triggerIdentifier, 'created successfully');
 
-                            if (doc.monitor && doc.monitor === utils.host && utils.monitorStatus.triggerName === cachedTrigger.name) {
+                            if (utils.isMonitoringTrigger(cachedTrigger.monitor, cachedTrigger.name)) {
                                 utils.monitorStatus.triggerStarted = "success";
                             }
 
