add trigger rules to existing tests (#157)

diff --git a/actions/changesWebAction.js b/actions/changesWebAction.js
index 7078b73..3f02994 100644
--- a/actions/changesWebAction.js
+++ b/actions/changesWebAction.js
@@ -145,7 +145,7 @@
                 return getTrigger(db, triggerID);
             })
             .then(trigger => {
-                if (!trigger.status.active) {
+                if (trigger.status && trigger.status.active === false) {
                     reject(sendError(400, `${params.triggerName} cannot be updated because it is disabled`));
                 }
                 if (params.filter || params.query_params) {
@@ -380,9 +380,7 @@
     })
     .then(trigger => {
         for (var key in params) {
-            if (params[key]) {
-                trigger[key] = params[key];
-            }
+            trigger[key] = params[key];
         }
         var status = {
             'active': true,
diff --git a/installCatalog.sh b/installCatalog.sh
index 0aef5a6..cfa5521 100755
--- a/installCatalog.sh
+++ b/installCatalog.sh
@@ -74,7 +74,7 @@
 
 # Cloudant feed action
 
-$WSK_CLI -i --apihost "$EDGEHOST" action update --auth "$AUTH" cloudant/changes "$PACKAGE_HOME/actions/changes.js" \
+$WSK_CLI -i --apihost "$EDGEHOST" action update --kind nodejs:6 --auth "$AUTH" cloudant/changes "$PACKAGE_HOME/actions/changes.js" \
     -t 90000 \
     -a feed true \
     -a description 'Database change feed' \
@@ -83,102 +83,102 @@
 
 # Cloudant web feed action
 
-$WSK_CLI -i --apihost "$EDGEHOST" action update --auth "$AUTH" cloudantWeb/changesWebAction "$PACKAGE_HOME/actions/changesWebAction.js" \
+$WSK_CLI -i --apihost "$EDGEHOST" action update --kind nodejs:6 --auth "$AUTH" cloudantWeb/changesWebAction "$PACKAGE_HOME/actions/changesWebAction.js" \
     -a description 'Create/Delete a trigger in cloudant provider Database' \
     --web true
 
 # Cloudant account actions
 
-$WSK_CLI -i --apihost "$EDGEHOST" action update --auth "$AUTH" cloudant/create-database \
+$WSK_CLI -i --apihost "$EDGEHOST" action update --kind nodejs:6 --auth "$AUTH" cloudant/create-database \
     "$PACKAGE_HOME/actions/account-actions/create-database.js" \
     -a description 'Create Cloudant database' \
     -a parameters '[ {"name":"dbname", "required":true} ]'
 
-$WSK_CLI -i --apihost "$EDGEHOST" action update --auth "$AUTH" cloudant/read-database \
+$WSK_CLI -i --apihost "$EDGEHOST" action update --kind nodejs:6 --auth "$AUTH" cloudant/read-database \
     "$PACKAGE_HOME/actions/account-actions/read-database.js" \
     -a description 'Read Cloudant database' \
     -a parameters '[ {"name":"dbname", "required":true} ]'
 
-$WSK_CLI -i --apihost "$EDGEHOST" action update --auth "$AUTH" cloudant/delete-database \
+$WSK_CLI -i --apihost "$EDGEHOST" action update --kind nodejs:6 --auth "$AUTH" cloudant/delete-database \
     "$PACKAGE_HOME/actions/account-actions/delete-database.js" \
     -a description 'Delete Cloudant database' \
     -a parameters '[ {"name":"dbname", "required":true} ]'
 
-$WSK_CLI -i --apihost "$EDGEHOST" action update --auth "$AUTH" cloudant/list-all-databases \
+$WSK_CLI -i --apihost "$EDGEHOST" action update --kind nodejs:6 --auth "$AUTH" cloudant/list-all-databases \
     "$PACKAGE_HOME/actions/account-actions/list-all-databases.js" \
     -a description 'List all Cloudant databases'
 
-$WSK_CLI -i --apihost "$EDGEHOST" action update --auth "$AUTH" cloudant/read-updates-feed \
+$WSK_CLI -i --apihost "$EDGEHOST" action update --kind nodejs:6 --auth "$AUTH" cloudant/read-updates-feed \
     "$PACKAGE_HOME/actions/account-actions/read-updates-feed.js" \
     -a description 'Read updates feed from Cloudant account (non-continuous)' \
     -a parameters '[ {"name":"dbname", "required":true}, {"name":"params", "required":false} ]'
 
 # Cloudant database actions
 
-$WSK_CLI -i --apihost "$EDGEHOST" action update --auth "$AUTH" cloudant/create-document \
+$WSK_CLI -i --apihost "$EDGEHOST" action update --kind nodejs:6 --auth "$AUTH" cloudant/create-document \
     "$PACKAGE_HOME/actions/database-actions/create-document.js" \
     -a description 'Create document in database' \
     -a parameters '[ {"name":"dbname", "required":true}, {"name":"doc", "required":true, "description": "The JSON document to insert"}, {"name":"params", "required":false} ]' \
 
-$WSK_CLI -i --apihost "$EDGEHOST" action update --auth "$AUTH" cloudant/read \
+$WSK_CLI -i --apihost "$EDGEHOST" action update --kind nodejs:6 --auth "$AUTH" cloudant/read \
     "$PACKAGE_HOME/actions/database-actions/read-document.js" \
     -a description 'Read document from database' \
     -a parameters '[ {"name":"dbname", "required":true}, {"name":"id", "required":true, "description": "The Cloudant document id to fetch"}, {"name":"params", "required":false}]' \
     -p id ''
 
-$WSK_CLI -i --apihost "$EDGEHOST" action update --auth "$AUTH" cloudant/read-document \
+$WSK_CLI -i --apihost "$EDGEHOST" action update --kind nodejs:6 --auth "$AUTH" cloudant/read-document \
     "$PACKAGE_HOME/actions/database-actions/read-document.js" \
     -a description 'Read document from database' \
     -a parameters '[ {"name":"dbname", "required":true}, {"name":"docid", "required":true, "description": "The Cloudant document id to fetch"}, {"name":"params", "required":false}]' \
     -p docid ''
 
-$WSK_CLI -i --apihost "$EDGEHOST" action update --auth "$AUTH" cloudant/write \
+$WSK_CLI -i --apihost "$EDGEHOST" action update --kind nodejs:6 --auth "$AUTH" cloudant/write \
     "$PACKAGE_HOME/actions/database-actions/write-document.js" \
     -a description 'Write document in database' \
     -a parameters '[ {"name":"dbname", "required":true}, {"name":"doc", "required":true} ]' \
     -p doc '{}'
 
-$WSK_CLI -i --apihost "$EDGEHOST" action update --auth "$AUTH" cloudant/update-document \
+$WSK_CLI -i --apihost "$EDGEHOST" action update --kind nodejs:6 --auth "$AUTH" cloudant/update-document \
     "$PACKAGE_HOME/actions/database-actions/update-document.js" \
     -a description 'Update document in database' \
     -a parameters '[ {"name":"dbname", "required":true}, {"name":"doc", "required":true}, {"name":"params", "required":false} ]' \
     -p doc '{}'
 
-$WSK_CLI -i --apihost "$EDGEHOST" action update --auth "$AUTH" cloudant/delete-document \
+$WSK_CLI -i --apihost "$EDGEHOST" action update --kind nodejs:6 --auth "$AUTH" cloudant/delete-document \
     "$PACKAGE_HOME/actions/database-actions/delete-document.js" \
     -a description 'Delete document from database' \
     -a parameters '[ {"name":"dbname", "required":true}, {"name":"docid", "required":true, "description": "The Cloudant document id to delete"},  {"name":"docrev", "required":true, "description": "The document revision number"} ]' \
     -p docid '' \
     -p docrev ''
 
-$WSK_CLI -i --apihost "$EDGEHOST" action update --auth "$AUTH" cloudant/list-documents \
+$WSK_CLI -i --apihost "$EDGEHOST" action update --kind nodejs:6 --auth "$AUTH" cloudant/list-documents \
     "$PACKAGE_HOME/actions/database-actions/list-documents.js" \
     -a description 'List all docs from database' \
     -a parameters '[ {"name":"dbname", "required":true}, {"name":"params", "required":false} ]'
 
-$WSK_CLI -i --apihost "$EDGEHOST" action update --auth "$AUTH" cloudant/list-design-documents \
+$WSK_CLI -i --apihost "$EDGEHOST" action update --kind nodejs:6 --auth "$AUTH" cloudant/list-design-documents \
     "$PACKAGE_HOME/actions/database-actions/list-design-documents.js" \
     -a description 'List design documents from database' \
     -a parameters '[ {"name":"dbname", "required":true}, {"name":"includedocs", "required":false} ]' \
 
-$WSK_CLI -i --apihost "$EDGEHOST" action update --auth "$AUTH" cloudant/create-query-index \
+$WSK_CLI -i --apihost "$EDGEHOST" action update --kind nodejs:6 --auth "$AUTH" cloudant/create-query-index \
     "$PACKAGE_HOME/actions/database-actions/create-query-index.js" \
     -a description 'Create a Cloudant Query index into database' \
     -a parameters '[ {"name":"dbname", "required":true}, {"name":"index", "required":true} ]' \
     -p index ''
 
-$WSK_CLI -i --apihost "$EDGEHOST" action update --auth "$AUTH" cloudant/list-query-indexes \
+$WSK_CLI -i --apihost "$EDGEHOST" action update --kind nodejs:6 --auth "$AUTH" cloudant/list-query-indexes \
     "$PACKAGE_HOME/actions/database-actions/list-query-indexes.js" \
     -a description 'List Cloudant Query indexes from database' \
     -a parameters '[ {"name":"dbname", "required":true} ]' \
 
-$WSK_CLI -i --apihost "$EDGEHOST" action update --auth "$AUTH" cloudant/exec-query-find \
+$WSK_CLI -i --apihost "$EDGEHOST" action update --kind nodejs:6 --auth "$AUTH" cloudant/exec-query-find \
     "$PACKAGE_HOME/actions/database-actions/exec-query-find.js" \
     -a description 'Execute query against Cloudant Query index' \
     -a parameters '[ {"name":"dbname", "required":true}, {"name":"query", "required":true} ]' \
     -p query ''
 
-$WSK_CLI -i --apihost "$EDGEHOST" action update --auth "$AUTH" cloudant/exec-query-search \
+$WSK_CLI -i --apihost "$EDGEHOST" action update --kind nodejs:6 --auth "$AUTH" cloudant/exec-query-search \
     "$PACKAGE_HOME/actions/database-actions/exec-query-search.js" \
     -a description 'Execute query against Cloudant search' \
     -a parameters '[ {"name":"dbname", "required":true}, {"name":"docid", "required":true}, {"name":"indexname", "required":true}, {"name":"search", "required":true} ]' \
@@ -186,39 +186,39 @@
     -p indexname '' \
     -p search ''
 
-$WSK_CLI -i --apihost "$EDGEHOST" action update --auth "$AUTH" cloudant/exec-query-view \
+$WSK_CLI -i --apihost "$EDGEHOST" action update --kind nodejs:6 --auth "$AUTH" cloudant/exec-query-view \
     "$PACKAGE_HOME/actions/database-actions/exec-query-view.js" \
     -a description 'Call view in design document from database' \
     -a parameters '[ {"name":"dbname", "required":true}, {"name":"docid", "required":true}, {"name":"viewname", "required":true}, {"name":"params", "required":false} ]' \
     -p docid '' \
     -p viewname ''
 
-$WSK_CLI -i --apihost "$EDGEHOST" action update --auth "$AUTH" cloudant/manage-bulk-documents \
+$WSK_CLI -i --apihost "$EDGEHOST" action update --kind nodejs:6 --auth "$AUTH" cloudant/manage-bulk-documents \
     "$PACKAGE_HOME/actions/database-actions/manage-bulk-documents.js" \
     -a description 'Create, Update, and Delete documents in bulk' \
     -a parameters '[ {"name":"dbname", "required":true}, {"name":"docs", "required":true}, {"name":"params", "required":false} ]' \
     -p docs '{}'
 
-$WSK_CLI -i --apihost "$EDGEHOST" action update --auth "$AUTH" cloudant/delete-view \
+$WSK_CLI -i --apihost "$EDGEHOST" action update --kind nodejs:6 --auth "$AUTH" cloudant/delete-view \
     "$PACKAGE_HOME/actions/database-actions/delete-view.js" \
     -a description 'Delete view from design document' \
     -a parameters '[ {"name":"dbname", "required":true}, {"name":"docid", "required":true}, {"name":"viewname", "required":true}, {"name":"params", "required":false} ]' \
     -p docid '' \
     -p viewname ''
 
-$WSK_CLI -i --apihost "$EDGEHOST" action update --auth "$AUTH" cloudant/delete-query-index \
+$WSK_CLI -i --apihost "$EDGEHOST" action update --kind nodejs:6 --auth "$AUTH" cloudant/delete-query-index \
     "$PACKAGE_HOME/actions/database-actions/delete-query-index.js" \
     -a description 'Delete index from design document' \
     -a parameters '[ {"name":"dbname", "required":true}, {"name":"docid", "required":true}, {"name":"indexname", "required":true}, {"name":"params", "required":false} ]' \
     -p docid '' \
     -p indexname ''
 
-$WSK_CLI -i --apihost "$EDGEHOST" action update --auth "$AUTH" cloudant/read-changes-feed \
+$WSK_CLI -i --apihost "$EDGEHOST" action update --kind nodejs:6 --auth "$AUTH" cloudant/read-changes-feed \
     "$PACKAGE_HOME/actions/database-actions/read-changes-feed.js" \
     -a description 'Read Cloudant database changes feed (non-continuous)' \
     -a parameters '[ {"name":"dbname", "required":true}, {"name":"params", "required":false} ]'
 
-$WSK_CLI -i --apihost "$EDGEHOST" action update --auth "$AUTH" cloudant/create-attachment \
+$WSK_CLI -i --apihost "$EDGEHOST" action update --kind nodejs:6 --auth "$AUTH" cloudant/create-attachment \
     "$PACKAGE_HOME/actions/database-actions/create-update-attachment.js" \
     -a description 'Create document attachment in database' \
     -a parameters '[ {"name":"dbname", "required":true}, {"name":"docid", "required":true}, {"name":"docrev", "required":true}, {"name":"attachment", "required":true}, {"name":"attachmentname", "required":true}, {"name":"contenttype", "required":true}, {"name":"params", "required":false} ]' \
@@ -228,14 +228,14 @@
     -p attachmentname '' \
     -p contenttype ''
 
-$WSK_CLI -i --apihost "$EDGEHOST" action update --auth "$AUTH" cloudant/read-attachment \
+$WSK_CLI -i --apihost "$EDGEHOST" action update --kind nodejs:6 --auth "$AUTH" cloudant/read-attachment \
     "$PACKAGE_HOME/actions/database-actions/read-attachment.js" \
     -a description 'Read document attachment from database' \
     -a parameters '[ {"name":"dbname", "required":true}, {"name":"docid", "required":true}, {"name":"attachmentname", "required":true}, {"name":"params", "required":false} ]' \
     -p docid '' \
     -p attachmentname ''
 
-$WSK_CLI -i --apihost "$EDGEHOST" action update --auth "$AUTH" cloudant/update-attachment \
+$WSK_CLI -i --apihost "$EDGEHOST" action update --kind nodejs:6 --auth "$AUTH" cloudant/update-attachment \
     "$PACKAGE_HOME/actions/database-actions/create-update-attachment.js" \
     -a description 'Update document attachment in database' \
     -a parameters '[ {"name":"dbname", "required":true}, {"name":"docid", "required":true}, {"name":"docrev", "required":true}, {"name":"attachment", "required":true}, {"name":"attachmentname", "required":true}, {"name":"contenttype", "required":true}, {"name":"params", "required":false} ]' \
@@ -245,7 +245,7 @@
     -p attachmentname '' \
     -p contenttype ''
 
-$WSK_CLI -i --apihost "$EDGEHOST" action update --auth "$AUTH" cloudant/delete-attachment \
+$WSK_CLI -i --apihost "$EDGEHOST" action update --kind nodejs:6 --auth "$AUTH" cloudant/delete-attachment \
     "$PACKAGE_HOME/actions/database-actions/delete-attachment.js" \
     -a description 'Delete document attachment from database' \
     -a parameters '[ {"name":"dbname", "required":true}, {"name":"docid", "required":true}, {"name":"docrev", "required":true}, {"name":"attachmentname", "required":true}, {"name":"params", "required":false} ]' \
diff --git a/tests/src/test/scala/system/health/CloudantHealthFeedTests.scala b/tests/src/test/scala/system/health/CloudantHealthFeedTests.scala
index c9e3d01..42e842c 100644
--- a/tests/src/test/scala/system/health/CloudantHealthFeedTests.scala
+++ b/tests/src/test/scala/system/health/CloudantHealthFeedTests.scala
@@ -21,11 +21,7 @@
 import org.junit.runner.RunWith
 import org.scalatest.{BeforeAndAfterEach, FlatSpec, Inside}
 import org.scalatest.junit.JUnitRunner
-import common.TestHelpers
-import common.Wsk
-import common.WskActorSystem
-import common.WskProps
-import common.WskTestHelpers
+import common._
 import spray.json.DefaultJsonProtocol.IntJsonFormat
 import spray.json.DefaultJsonProtocol.StringJsonFormat
 import spray.json.DefaultJsonProtocol.BooleanJsonFormat
@@ -46,6 +42,7 @@
 
     val wskprops = WskProps()
     val wsk = new Wsk
+    val defaultAction = Some(TestUtils.getTestActionFilename("hello.js"))
     val myCloudantCreds = CloudantUtil.Credential.makeFromVCAPFile("cloudantNoSQLDB", this.getClass.getSimpleName)
 
     behavior of "Cloudant Health trigger service"
@@ -66,6 +63,8 @@
         (wp, assetHelper) =>
             implicit val wskprops = wp // shadow global props and make implicit
             val triggerName = s"dummyCloudantTrigger-${System.currentTimeMillis}"
+            val ruleName = s"dummyAlarmsRule-${System.currentTimeMillis}"
+            val actionName = s"dummyAlarmsAction-${System.currentTimeMillis}"
             val packageName = "dummyCloudantPackage"
             val feed = "changes"
 
@@ -79,6 +78,11 @@
                 (pkg, name) => pkg.bind("/whisk.system/cloudant", name)
             }
 
+            // create action
+            assetHelper.withCleaner(wsk.action, actionName) { (action, name) =>
+                action.create(name, defaultAction)
+            }
+
             // create whisk stuff
             println(s"Creating trigger: $triggerName")
             val feedCreationResult = assetHelper.withCleaner(wsk.trigger, triggerName) {
@@ -89,7 +93,11 @@
                         "host" -> myCloudantCreds.host().toJson,
                         "dbname" -> myCloudantCreds.dbname.toJson))
             }
-            feedCreationResult.stdout should include("ok")
+
+            // create rule
+            assetHelper.withCleaner(wsk.rule, ruleName) { (rule, name) =>
+                rule.create(name, trigger = triggerName, action = actionName)
+            }
 
             val activationsBeforeChange = wsk.activation.pollFor(N = 1, Some(triggerName)).length
             activationsBeforeChange should be(0)
@@ -121,43 +129,12 @@
             activationsAfterDelete should be(1)
     }
 
-    it should "fire changes since sequence 0 of DB" in withAssetCleaner(wskprops) {
-        (wp, assetHelper) =>
-            implicit val wskprops = wp // shadow global props and make implicit
-            val triggerName = s"dummyCloudantTrigger-${System.currentTimeMillis}"
-            val packageName = "dummyCloudantPackage"
-            val feed = "changes"
-
-            val packageGetResult = wsk.pkg.get("/whisk.system/cloudant")
-            println("Fetching cloudant package.")
-            packageGetResult.stdout should include("ok")
-
-            println("Creating cloudant package binding.")
-            assetHelper.withCleaner(wsk.pkg, packageName) {
-                (pkg, name) => pkg.bind("/whisk.system/cloudant", name)
-            }
-
-            println(s"Creating trigger: $triggerName")
-            val feedCreationResult = assetHelper.withCleaner(wsk.trigger, triggerName) {
-                (trigger, name) =>
-                    trigger.create(name, feed = Some(s"$packageName/$feed"), parameters = Map(
-                        "username" -> myCloudantCreds.user.toJson,
-                        "password" -> myCloudantCreds.password.toJson,
-                        "host" -> myCloudantCreds.host().toJson,
-                        "dbname" -> myCloudantCreds.dbname.toJson,
-                        "maxTriggers" -> 100000000.toJson,
-                        "since" -> "0".toJson))
-            }
-            feedCreationResult.stdout should include("ok")
-
-            val activations = wsk.activation.pollFor(N = 1, Some(triggerName), retries = 60).length
-            activations should be(1)
-    }
-
     it should "fire changes when a document is deleted" in withAssetCleaner(wskprops) {
         (wp, assetHelper) =>
             implicit val wskprops = wp // shadow global props and make implicit
             val triggerName = s"dummyCloudantTrigger-${System.currentTimeMillis}"
+            val ruleName = s"dummyAlarmsRule-${System.currentTimeMillis}"
+            val actionName = s"dummyAlarmsAction-${System.currentTimeMillis}"
             val packageName = "dummyCloudantPackage"
             val feed = "changes"
 
@@ -170,6 +147,11 @@
                 (pkg, name) => pkg.bind("/whisk.system/cloudant", name)
             }
 
+            // create action
+            assetHelper.withCleaner(wsk.action, actionName) { (action, name) =>
+                action.create(name, defaultAction)
+            }
+
             println(s"Creating trigger: $triggerName")
             val feedCreationResult = assetHelper.withCleaner(wsk.trigger, triggerName) {
                 (trigger, name) =>
@@ -180,7 +162,11 @@
                         "dbname" -> myCloudantCreds.dbname.toJson,
                         "maxTriggers" -> (-1).toJson))
             }
-            feedCreationResult.stdout should include("ok")
+
+            // create rule
+            assetHelper.withCleaner(wsk.rule, ruleName) { (rule, name) =>
+                rule.create(name, trigger = triggerName, action = actionName)
+            }
 
             val activationsBeforeDelete = wsk.activation.pollFor(N = 1, Some(triggerName)).length
             activationsBeforeDelete should be(0)
@@ -200,7 +186,7 @@
             val packageName = "dummyCloudantPackage"
             val feed = "changes"
 
-            // the package alarms should be there
+            // the package cloudant should be there
             val packageGetResult = wsk.pkg.get("/whisk.system/cloudant")
             println("fetched package cloudant")
             packageGetResult.stdout should include("ok")
@@ -225,7 +211,7 @@
             val filter = "test_filter/fruit"
             val queryParams = JsObject("type" -> JsString("tomato"))
 
-            // create whisk stuff
+            // create trigger feed
             val feedCreationResult = assetHelper.withCleaner(wsk.trigger, triggerName, confirmDelete = false) {
                 (trigger, name) =>
                     trigger.create(name, feed = Some(s"$packageName/$feed"), parameters = Map(
@@ -286,7 +272,7 @@
             val packageName = "dummyCloudantPackage"
             val feed = "changes"
 
-            // the package alarms should be there
+            // the package cloudant should be there
             val packageGetResult = wsk.pkg.get("/whisk.system/cloudant")
             println("fetched package cloudant")
             packageGetResult.stdout should include("ok")
@@ -308,7 +294,7 @@
             val filter = "test_filter/fruit"
             val queryParams = JsObject("type" -> JsString("tomato"))
 
-            // create whisk stuff
+            // create trigger feed
             val feedCreationResult = assetHelper.withCleaner(wsk.trigger, triggerName, confirmDelete = false) {
                 (trigger, name) =>
                     trigger.create(name, feed = Some(s"$packageName/$feed"), parameters = Map(
diff --git a/tests/src/test/scala/system/packages/CloudantFeedTests.scala b/tests/src/test/scala/system/packages/CloudantFeedTests.scala
index f6f1c9e..e0be2db 100644
--- a/tests/src/test/scala/system/packages/CloudantFeedTests.scala
+++ b/tests/src/test/scala/system/packages/CloudantFeedTests.scala
@@ -39,6 +39,7 @@
     val wskprops = WskProps()
     val wsk = new Wsk
     val myCloudantCreds = CloudantUtil.Credential.makeFromVCAPFile("cloudantNoSQLDB", this.getClass.getSimpleName)
+    val defaultAction = Some(TestUtils.getTestActionFilename("hello.js"))
 
     behavior of "Cloudant trigger service"
 
@@ -203,6 +204,8 @@
         (wp, assetHelper) =>
             implicit val wskprops = wp // shadow global props and make implicit
             val triggerName = s"dummyCloudantTrigger-${System.currentTimeMillis}"
+            val ruleName = s"dummyAlarmsRule-${System.currentTimeMillis}"
+            val actionName = s"dummyAlarmsAction-${System.currentTimeMillis}"
             val packageName = "dummyCloudantPackage"
             val feed = "changes"
 
@@ -218,6 +221,11 @@
                     (pkg, name) => pkg.bind("/whisk.system/cloudant", name)
                 }
 
+                // create action
+                assetHelper.withCleaner(wsk.action, actionName) { (action, name) =>
+                    action.create(name, defaultAction)
+                }
+
                 println("Creating cloudant trigger feed.")
                 val feedCreationResult = assetHelper.withCleaner(wsk.trigger, triggerName, confirmDelete = false) {
                     (trigger, name) =>
@@ -228,7 +236,11 @@
                             "dbname" -> myCloudantCreds.dbname.toJson,
                             "maxTriggers" -> 1.toJson))
                 }
-                feedCreationResult.stdout should include("ok")
+
+                // create rule
+                assetHelper.withCleaner(wsk.rule, ruleName) { (rule, name) =>
+                    rule.create(name, trigger = triggerName, action = actionName)
+                }
 
                 // Create test docs in cloudant and assert that document was inserted successfully
                 println("Creating a test doc-1 in the cloudant")
@@ -258,6 +270,8 @@
         (wp, assetHelper) =>
             implicit val wskprops = wp // shadow global props and make implicit
             val triggerName = s"dummyCloudantTrigger-${System.currentTimeMillis}"
+            val ruleName = s"dummyAlarmsRule-${System.currentTimeMillis}"
+            val actionName = s"dummyAlarmsAction-${System.currentTimeMillis}"
             val packageName = "dummyCloudantPackage"
             val feed = "changes"
 
@@ -273,6 +287,11 @@
                     (pkg, name) => pkg.bind("/whisk.system/cloudant", name)
                 }
 
+                // create action
+                assetHelper.withCleaner(wsk.action, actionName) { (action, name) =>
+                    action.create(name, defaultAction)
+                }
+
                 //Create filter design doc
                 val filterDesignDoc = CloudantUtil.createDesignFromFile(CloudantUtil.FILTER_DDOC_PATH).toString
                 val getResponse = CloudantUtil.createDocument(myCloudantCreds, filterDesignDoc)
@@ -289,7 +308,11 @@
                             "filter" -> "test_filter/fruit".toJson,
                             "query_params" -> JsObject("type" -> JsString("tomato"))))
                 }
-                feedCreationResult.stdout should include("ok")
+
+                // create rule
+                assetHelper.withCleaner(wsk.rule, ruleName) { (rule, name) =>
+                    rule.create(name, trigger = triggerName, action = actionName)
+                }
 
                 // Create test docs in cloudant and assert that document was inserted successfully
                 println("Creating a test doc-1 in the cloudant")
@@ -513,9 +536,10 @@
         (wp, assetHelper) =>
             implicit val wskProps = wp // shadow global props and make implicit
             val triggerName = s"dummyCloudantTrigger-${System.currentTimeMillis}"
+            val ruleName = s"dummyAlarmsRule-${System.currentTimeMillis}"
+            val actionName = s"dummyAlarmsAction-${System.currentTimeMillis}"
             val packageName = "dummyCloudantPackage"
             val feed = "changes"
-            val actionName = s"$packageName/$feed"
 
             try {
                 CloudantUtil.setUp(myCloudantCreds)
@@ -529,6 +553,11 @@
                     (pkg, name) => pkg.bind("/whisk.system/cloudant", name)
                 }
 
+                // create action
+                assetHelper.withCleaner(wsk.action, actionName) { (action, name) =>
+                    action.create(name, defaultAction)
+                }
+
                 //Create filter design doc
                 val filterDesignDoc = CloudantUtil.createDesignFromFile(CloudantUtil.FILTER_DDOC_PATH).toString
                 val getResponse = CloudantUtil.createDocument(myCloudantCreds, filterDesignDoc)
@@ -545,7 +574,11 @@
                             "filter" -> "test_filter/fruit".toJson,
                             "query_params" -> JsObject("type" -> JsString("tomato"))))
                 }
-                feedCreationResult.stdout should include("ok")
+
+                // create rule
+                assetHelper.withCleaner(wsk.rule, ruleName) { (rule, name) =>
+                    rule.create(name, trigger = triggerName, action = actionName)
+                }
 
                 // Create test docs in cloudant and assert that document was inserted successfully
                 println("Creating a test doc-1 in the cloudant")
@@ -567,7 +600,7 @@
                 noNewActivations should be(1)
 
                 println("Updating trigger query_params.")
-                val feedUpdateResult = wsk.action.invoke(actionName, parameters = Map(
+                val feedUpdateResult = wsk.action.invoke(s"$packageName/$feed", parameters = Map(
                     "triggerName" -> triggerName.toJson,
                     "lifecycleEvent" -> "UPDATE".toJson,
                     "authKey" -> wskProps.authKey.toJson,
@@ -582,7 +615,7 @@
                 println("Giving the trigger service a moment to process the update")
                 Thread.sleep(10000)
 
-                val runResult = wsk.action.invoke(actionName, parameters = Map(
+                val runResult = wsk.action.invoke(s"$packageName/$feed", parameters = Map(
                     "triggerName" -> triggerName.toJson,
                     "lifecycleEvent" -> "READ".toJson,
                     "authKey" -> wskProps.authKey.toJson
diff --git a/tests/src/test/scala/system/redundancy/CloudantRedundancyTests.scala b/tests/src/test/scala/system/redundancy/CloudantRedundancyTests.scala
index c029aee..e78cc24 100644
--- a/tests/src/test/scala/system/redundancy/CloudantRedundancyTests.scala
+++ b/tests/src/test/scala/system/redundancy/CloudantRedundancyTests.scala
@@ -18,7 +18,7 @@
 
 import com.jayway.restassured.RestAssured
 import com.jayway.restassured.config.SSLConfig
-import common.{WhiskProperties, Wsk, WskProps, WskTestHelpers}
+import common._
 import org.junit.runner.RunWith
 import org.scalatest.junit.JUnitRunner
 import org.scalatest.{BeforeAndAfterAll, FlatSpec, Matchers}
@@ -47,12 +47,13 @@
     val wskprops = WskProps()
     val wsk = new Wsk
     val myCloudantCreds = CloudantUtil.Credential.makeFromVCAPFile("cloudantNoSQLDB", this.getClass.getSimpleName)
-    var edgeHost = WhiskProperties.getEdgeHost
+    val edgeHost = WhiskProperties.getEdgeHost
     val auth = WhiskProperties.getBasicAuth
     val user = auth.fst
     val password = auth.snd
 
-    var endpointPrefix = s"https://$user:$password@$edgeHost/cloudanttrigger/worker0/"
+    val endpointPrefix = s"https://$user:$password@$edgeHost/cloudanttrigger/worker0/"
+    val defaultAction = Some(TestUtils.getTestActionFilename("hello.js"))
 
     behavior of "Cloudant redundancy tests"
 
@@ -60,6 +61,8 @@
         (wp, assetHelper) =>
             implicit val wskprops = wp // shadow global props and make implicit
             val triggerName = s"dummyCloudantTrigger-${System.currentTimeMillis}"
+            val ruleName = s"dummyAlarmsRule-${System.currentTimeMillis}"
+            val actionName = s"dummyAlarmsAction-${System.currentTimeMillis}"
             val packageName = "dummyCloudantPackage"
             val feed = "changes"
 
@@ -76,6 +79,11 @@
                     (pkg, name) => pkg.bind("/whisk.system/cloudant", name)
                 }
 
+                // create action
+                assetHelper.withCleaner(wsk.action, actionName) { (action, name) =>
+                    action.create(name, defaultAction)
+                }
+
                 // create whisk stuff
                 val feedCreationResult = assetHelper.withCleaner(wsk.trigger, triggerName, confirmDelete = false) {
                     (trigger, name) =>
@@ -85,7 +93,11 @@
                             "host" -> myCloudantCreds.host().toJson,
                             "dbname" -> myCloudantCreds.dbname.toJson))
                 }
-                feedCreationResult.stdout should include("ok")
+
+                // create rule
+                assetHelper.withCleaner(wsk.rule, ruleName) { (rule, name) =>
+                    rule.create(name, trigger = triggerName, action = actionName)
+                }
 
                 Thread.sleep(3000)
 
@@ -131,6 +143,8 @@
         (wp, assetHelper) =>
             implicit val wskprops = wp // shadow global props and make implicit
             val triggerName = s"dummyCloudantTrigger-${System.currentTimeMillis}"
+            val ruleName = s"dummyAlarmsRule-${System.currentTimeMillis}"
+            val actionName = s"dummyAlarmsAction-${System.currentTimeMillis}"
             val packageName = "dummyCloudantPackage"
             val feed = "changes"
 
@@ -147,6 +161,11 @@
                     (pkg, name) => pkg.bind("/whisk.system/cloudant", name)
                 }
 
+                // create action
+                assetHelper.withCleaner(wsk.action, actionName) { (action, name) =>
+                    action.create(name, defaultAction)
+                }
+
                 // create whisk stuff
                 val feedCreationResult = assetHelper.withCleaner(wsk.trigger, triggerName, confirmDelete = false) {
                     (trigger, name) =>
@@ -156,7 +175,11 @@
                             "host" -> myCloudantCreds.host().toJson,
                             "dbname" -> myCloudantCreds.dbname.toJson))
                 }
-                feedCreationResult.stdout should include("ok")
+
+                // create rule
+                assetHelper.withCleaner(wsk.rule, ruleName) { (rule, name) =>
+                    rule.create(name, trigger = triggerName, action = actionName)
+                }
 
                 Thread.sleep(3000)