diff --git a/provider/app.js b/provider/app.js
index 0bfd33d..fc9149d 100644
--- a/provider/app.js
+++ b/provider/app.js
@@ -35,7 +35,7 @@
 var databaseName = dbPrefix + constants.TRIGGER_DB_SUFFIX;
 var redisUrl = process.env.REDIS_URL;
 var monitoringAuth = process.env.MONITORING_AUTH;
-var monitoringInterval = process.env.MONITORING_INTERVAL;
+var monitoringInterval = process.env.MONITORING_INTERVAL || constants.MONITOR_INTERVAL;
 var filterDDName = '_design/' + constants.FILTERS_DESIGN_DOC;
 var viewDDName = '_design/' + constants.VIEWS_DESIGN_DOC;
 
@@ -219,8 +219,8 @@
 
         if (monitoringAuth) {
             setInterval(function () {
-                providerHealth.monitor(monitoringAuth);
-            }, monitoringInterval || constants.MONITOR_INTERVAL);
+                providerHealth.monitor(monitoringAuth, monitoringInterval);
+            }, monitoringInterval);
         }
     })
     .catch(err => {
diff --git a/provider/lib/health.js b/provider/lib/health.js
index eb2832d..b13d6ad 100644
--- a/provider/lib/health.js
+++ b/provider/lib/health.js
@@ -45,7 +45,7 @@
         });
     };
 
-    this.monitor = function(apikey) {
+    this.monitor = function(apikey, monitoringInterval) {
         var method = 'monitor';
 
         var auth = apikey.split(':');
@@ -63,9 +63,6 @@
             var existingTriggerID = `:_:${triggerName}`;
             var existingCanaryID = canaryDocID;
 
-            //delete trigger feed from database
-            healthMonitor.deleteDocFromDB(existingTriggerID, 0);
-
             //delete the trigger
             var uri = utils.uriHost + '/api/v1/namespaces/_/triggers/' + triggerName;
             healthMonitor.deleteTrigger(existingTriggerID, uri, auth, 0);
@@ -89,7 +86,14 @@
         .then(info => {
             logger.info(method, triggerID, info);
             var newTrigger = healthMonitor.createCloudantTrigger(triggerID, apikey);
-            healthMonitor.createDocInDB(triggerID, newTrigger);
+            utils.createTrigger(newTrigger);
+            setTimeout(function () {
+                var canaryDoc = {
+                    isCanaryDoc: true,
+                    host: utils.host
+                };
+                healthMonitor.createDocInDB(canaryDocID, canaryDoc);
+            }, monitoringInterval / 3);
         })
         .catch(err => {
             logger.error(method, triggerID, err);
@@ -114,6 +118,8 @@
             filter: constants.MONITOR_DESIGN_DOC + '/' + constants.DOCS_FOR_MONITOR,
             query_params: {host: utils.host},
             maxTriggers: 1,
+            triggersLeft: 1,
+            since: 'now',
             worker: utils.worker,
             monitor: utils.host
         };
@@ -151,15 +157,6 @@
         utils.db.insert(doc, docID, function (err) {
             if (!err) {
                 logger.info(method, docID, 'was successfully inserted');
-                if (doc.monitor) {
-                    setTimeout(function () {
-                        var canaryDoc = {
-                            isCanaryDoc: true,
-                            host: utils.host
-                        };
-                        healthMonitor.createDocInDB(canaryDocID, canaryDoc);
-                    }, 1000 * 60);
-                }
             }
             else {
                 logger.error(method, docID, err);
diff --git a/provider/lib/utils.js b/provider/lib/utils.js
index 7906c36..3e38e1a 100644
--- a/provider/lib/utils.js
+++ b/provider/lib/utils.js
@@ -73,6 +73,9 @@
 
                 feed.on('confirm', function () {
                     logger.info(method, 'Added cloudant data trigger', dataTrigger.id, 'listening for changes in database', dataTrigger.dbname);
+                    if (utils.isMonitoringTrigger(dataTrigger.monitor, dataTrigger.id)) {
+                        utils.monitorStatus.triggerStarted = "success";
+                    }
                     resolve(dataTrigger.id);
                 });
             });
@@ -100,8 +103,7 @@
             maxTriggers: maxTriggers,
             triggersLeft: maxTriggers,
             filter: newTrigger.filter,
-            query_params: newTrigger.query_params,
-            monitor: newTrigger.monitor
+            query_params: newTrigger.query_params
         };
 
         return trigger;
@@ -157,7 +159,7 @@
     };
 
     // Delete a trigger: stop listening for changes and remove it.
-    this.deleteTrigger = function(triggerIdentifier) {
+    this.deleteTrigger = function(triggerIdentifier, isMonitoringTrigger) {
         var method = 'deleteTrigger';
 
         if (utils.triggers[triggerIdentifier]) {
@@ -167,6 +169,10 @@
 
             delete utils.triggers[triggerIdentifier];
             logger.info(method, 'trigger', triggerIdentifier, 'successfully deleted from memory');
+
+            if (utils.isMonitoringTrigger(isMonitoringTrigger, triggerIdentifier)) {
+                utils.monitorStatus.triggerStopped = "success";
+            }
         }
     };
 
@@ -192,8 +198,13 @@
                 utils.monitorStatus.triggerFired = "success";
             }
             if (dataTrigger.triggersLeft === 0) {
-                utils.disableTrigger(triggerId, undefined, 'Automatically disabled after reaching max triggers');
-                logger.warn(method, 'no more triggers left, disabled', triggerId);
+                if (dataTrigger.monitor) {
+                    utils.deleteTrigger(triggerId, dataTrigger.monitor);
+                }
+                else {
+                    utils.disableTrigger(triggerId, undefined, 'Automatically disabled after reaching max triggers');
+                    logger.warn(method, 'no more triggers left, disabled', triggerId);
+                }
             }
         })
         .catch(err => {
@@ -276,7 +287,7 @@
                     var triggerIdentifier = trigger.id;
                     var doc = trigger.doc;
 
-                    if (!(triggerIdentifier in utils.triggers) && !doc.monitor) {
+                    if (!(triggerIdentifier in utils.triggers)) {
                         //check if trigger still exists in whisk db
                         var triggerObj = utils.parseQName(triggerIdentifier);
                         var host = 'https://' + utils.routerHost + ':' + 443;
@@ -336,20 +347,14 @@
                 if (utils.triggers[triggerIdentifier]) {
                     if (doc.status && doc.status.active === false) {
                         utils.deleteTrigger(triggerIdentifier);
-                        if (utils.isMonitoringTrigger(doc.monitor, triggerIdentifier)) {
-                            utils.monitorStatus.triggerStopped = "success";
-                        }
                     }
                 }
                 else {
                     //ignore changes to disabled triggers
-                    if ((!doc.status || doc.status.active === true) && (!doc.monitor || doc.monitor === utils.host)) {
+                    if (!doc.status || doc.status.active === true) {
                         utils.createTrigger(utils.initTrigger(doc))
                         .then(triggerIdentifier => {
                             logger.info(method, triggerIdentifier, 'created successfully');
-                            if (utils.isMonitoringTrigger(doc.monitor, triggerIdentifier)) {
-                                utils.monitorStatus.triggerStarted = "success";
-                            }
                         })
                         .catch(err => {
                             var message = 'Automatically disabled after receiving exception on create trigger: ' + err;
