diff --git a/.jshintrc b/.jshintrc
index f8e9dc9..d6a6c55 100644
--- a/.jshintrc
+++ b/.jshintrc
@@ -1,5 +1,6 @@
 {
   "esversion"     : 6,
   "module"        : true,
-  "node"          : true
+  "node"          : true,
+  "predef" : ["emit"]
 }
diff --git a/provider/app.js b/provider/app.js
index 28787e0..c6845cb 100644
--- a/provider/app.js
+++ b/provider/app.js
@@ -48,6 +48,7 @@
 var dbProtocol = process.env.DB_PROTOCOL;
 var dbPrefix = process.env.DB_PREFIX;
 var databaseName = dbPrefix + constants.TRIGGER_DB_SUFFIX;
+var ddname = '_design/filters';
 
 // Create the Provider Server
 var server = http.createServer(app);
@@ -56,32 +57,55 @@
 });
 
 function createDatabase (nanop) {
+    logger.info(tid, 'createDatabase', 'creating the trigger database');
+    return new Promise(function(resolve, reject) {
+        nanop.db.create(databaseName, function (err, body) {
+            if (!err) {
+                logger.info(tid, databaseName, ' database for triggers was created.');
+            }
+            else {
+                logger.info(tid, databaseName, 'failed to create the trigger database.  it might already exist ',err);
+            }
+            var db = nanop.db.use(databaseName);
+            var only_triggers = {
+                map: function (doc) {
+                    if (doc.maxTriggers) {
+                        emit(doc._id, 1);
+                    }
+                }.toString()
+            };
 
-  logger.info(tid, 'createDatabase', 'creating the trigger database');
-  if (nanop !== null) {
-    nanop.db.create(databaseName, function(err, body, header) {
-        if (!err) {
-          logger.info(tid, databaseName, ' database for triggers was created.');
-        } else {
-          logger.info(tid, databaseName, 'failed to create the trigger database.  it might already exist ',err);
-        }
+            db.get(ddname, function (error, body) {
+                if (error) {
+                    //new design doc
+                    db.insert({
+                        views: {
+                            only_triggers: only_triggers
+                        },
+                    }, ddname, function (error, body) {
+                        if (error) {
+                            reject("view could not be created: " + error);
+                        }
+                        resolve(db);
+                    });
+                }
+                else {
+                    resolve(db);
+                }
+            });
+        });
     });
-    var chDb = nanop.db.use(databaseName);
-    return chDb;
-  } else {
-    logger.info(tid, databaseName, 'failed to create the trigger database.  nano provider did not get created.  check db URL: ' + dbHost);
-    return null;
-  }
-
 }
 
 function createTriggerDb () {
-
-  logger.info('url is ' +  dbProtocol + '://' + dbUsername + ':' + dbPassword + '@' + dbHost);
-  var nanop = require('nano')(dbProtocol + '://' + dbUsername + ':' + dbPassword + '@' + dbHost);
-
-  return createDatabase (nanop);
-
+    logger.info('url is ' +  dbProtocol + '://' + dbUsername + ':' + dbPassword + '@' + dbHost);
+    var nanop = require('nano')(dbProtocol + '://' + dbUsername + ':' + dbPassword + '@' + dbHost);
+    if (nanop !== null) {
+        return createDatabase (nanop);
+    }
+    else {
+        Promise.reject('nano provider did not get created.  check db URL: ' + dbHost);
+    }
 }
 
 // Initialize the Provider Server
@@ -95,34 +119,33 @@
         }
     }
 
-    var nanoDb = createTriggerDb();
-    if (nanoDb === null) {
-    	logger.error(tid, 'init', 'an error occurred creating database');
-    } else {
+    createTriggerDb()
+    .then(nanoDb => {
+        logger.info(tid, 'init', 'trigger storage database details: ', nanoDb);
 
-      logger.info(tid, 'init', 'trigger storage database details: ', nanoDb);
+        var providerUtils = new ProviderUtils(tid, logger, app, retriesBeforeDelete, nanoDb, routerHost, supportIncludeDocs);
+        var providerRAS = new ProviderRAS(tid, logger, providerUtils);
+        var providerHealth = new ProviderHealth(tid, logger, providerUtils);
+        var providerUpdate = new ProviderUpdate(tid, logger, providerUtils);
+        var providerDelete = new ProviderDelete(tid, logger, providerUtils);
 
-      var providerUtils = new ProviderUtils (tid, logger, app, retriesBeforeDelete, nanoDb, routerHost, supportIncludeDocs);
-      var providerRAS = new ProviderRAS (tid, logger, providerUtils);
-      var providerHealth = new ProviderHealth (tid, logger, providerUtils);
-      var providerUpdate = new ProviderUpdate (tid, logger, providerUtils);
-      var providerDelete = new ProviderDelete (tid, logger, providerUtils);
+        // RAS Endpoint
+        app.get(providerRAS.endPoint, providerRAS.ras);
 
-      // RAS Endpoint
-      app.get(providerRAS.endPoint, providerRAS.ras);
+        // Health Endpoint
+        app.get(providerHealth.endPoint, providerHealth.health);
 
-      // Health Endpoint
-      app.get(providerHealth.endPoint, providerHealth.health);
+        // Endpoint for Update OR Create a Trigger
+        app.put(providerUpdate.endPoint, providerUtils.authorize, providerUpdate.update);
 
-      // Endpoint for Update OR Create a Trigger
-      app.put(providerUpdate.endPoint, providerUtils.authorize, providerUpdate.update);
+        // Endpoint for Deleting an existing Trigger.
+        app.delete(providerDelete.endPoint, providerUtils.authorize, providerDelete.delete);
 
-      // Endpoint for Deleting an existing Trigger.
-      app.delete(providerDelete.endPoint, providerUtils.authorize, providerDelete.delete);
+        providerUtils.initAllTriggers();
 
-      providerUtils.initAllTriggers();
-
-    }
+    }).catch(err => {
+        logger.error(tid, 'init', 'an error occurred creating database:', err);
+    });
 
 }
 
diff --git a/provider/lib/utils.js b/provider/lib/utils.js
index bf758ab..8c5db12 100644
--- a/provider/lib/utils.js
+++ b/provider/lib/utils.js
@@ -213,7 +213,7 @@
         var method = 'initAllTriggers';
         logger.info(tid, that.module, method, 'Initializing all cloudant triggers from database.');
 
-        triggerDB.list({include_docs: true}, function(err, body) {
+        triggerDB.view('filters', 'only_triggers', {include_docs: true}, function(err, body) {
             if (!err) {
                 body.rows.forEach(function(trigger) {
 
